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,57 @@
1
+ package factories
2
+
3
+ import (
4
+ "testing"
5
+
6
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
7
+ )
8
+
9
+ // TestFormatAliasResolvesToCheatSheet verifies every `@format` alias generates the cheat sheet validator it emits.
10
+ //
11
+ // An alias that carries its own validator string is not an alias; it is a
12
+ // second implementation sharing a name, free to drift from the format it
13
+ // claims. `@format datetime` did exactly that: it emitted `format: "date-time"`
14
+ // while validating with `!isNaN(new Date($input).getTime())`, so it accepted
15
+ // February 30th and rejected the RFC 3339 leap second the cheat sheet handles.
16
+ // This pins the alias to the cheat sheet as the single owner of the validator.
17
+ //
18
+ // 1. Parse each alias spelling of the `date-time` format as a JSDoc comment tag.
19
+ // 2. Require the emitted format name, schema, and tag name to be the canonical one.
20
+ // 3. Require the generated validator to be the cheat sheet entry verbatim.
21
+ func TestFormatAliasResolvesToCheatSheet(t *testing.T) {
22
+ canonical := "date-time"
23
+ expected, ok := FormatCheatSheet[canonical]
24
+ if ok == false {
25
+ t.Fatalf("the cheat sheet must own the %s format", canonical)
26
+ }
27
+ for _, alias := range []string{"datetime", "dateTime", "date-time"} {
28
+ record := metadataCommentTagFactory_parse(struct {
29
+ Report func(msg string) any
30
+ Tag schemametadata.IJsDocTagInfo
31
+ }{
32
+ Report: func(msg string) any { return nil },
33
+ Tag: schemametadata.IJsDocTagInfo{
34
+ Name: "format",
35
+ Text: []schemametadata.IJsDocTagInfo_IText{{Text: alias}},
36
+ },
37
+ })
38
+ tags := record["string"]
39
+ if len(tags) != 1 {
40
+ t.Fatalf("@format %s should generate exactly one string tag, generated %d", alias, len(tags))
41
+ }
42
+ tag := tags[0]
43
+ if tag.Value != canonical {
44
+ t.Fatalf("@format %s should carry the canonical %s value, carried %v", alias, canonical, tag.Value)
45
+ }
46
+ if tag.Name != "Format<\""+canonical+"\">" {
47
+ t.Fatalf("@format %s should name the canonical format tag, named %s", alias, tag.Name)
48
+ }
49
+ schema, ok := tag.Schema.(map[string]any)
50
+ if ok == false || schema["format"] != canonical {
51
+ t.Fatalf("@format %s should emit format %s, emitted %v", alias, canonical, tag.Schema)
52
+ }
53
+ if tag.Validate != expected {
54
+ t.Fatalf("@format %s must validate as the cheat sheet %s entry does, validated with %s", alias, canonical, tag.Validate)
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,44 @@
1
+ package factories
2
+
3
+ import "testing"
4
+
5
+ // TestFormatAliasTableTargetsTheCheatSheet verifies every declared `@format` alias names a real cheat sheet format.
6
+ //
7
+ // The original defect was structural, not arithmetic: the aliases were appended
8
+ // after a loop that copied the cheat sheet, so they were invisible to any sweep
9
+ // that enumerated the cheat sheet's entries and could drift from the format they
10
+ // emit without contradicting anything. The alias table now holds only cheat
11
+ // sheet keys, and this pins that shape — an alias pointing nowhere, or shadowing
12
+ // a real format with a different meaning, fails here rather than at a user's
13
+ // call site.
14
+ //
15
+ // 1. Require every alias to resolve to an existing cheat sheet entry.
16
+ // 2. Require no alias to shadow a cheat sheet key of its own name.
17
+ // 3. Require resolution to reject a format the cheat sheet does not own.
18
+ func TestFormatAliasTableTargetsTheCheatSheet(t *testing.T) {
19
+ if len(formatCheatSheet_ALIASES) == 0 {
20
+ t.Fatal("the alias table should stay the enumerable owner of every alternative spelling")
21
+ }
22
+ for alias, canonical := range formatCheatSheet_ALIASES {
23
+ expected, ok := FormatCheatSheet[canonical]
24
+ if ok == false {
25
+ t.Fatalf("the alias %s targets %s, which the cheat sheet does not own", alias, canonical)
26
+ }
27
+ if _, ok := FormatCheatSheet[alias]; ok {
28
+ t.Fatalf("the alias %s shadows a cheat sheet format of the same name", alias)
29
+ }
30
+ name, validate, ok := formatCheatSheet_resolve(alias)
31
+ if ok == false || name != canonical || validate != expected {
32
+ t.Fatalf("the alias %s must resolve to the cheat sheet %s entry, resolved to %s", alias, canonical, name)
33
+ }
34
+ }
35
+ for name, validate := range FormatCheatSheet {
36
+ resolvedName, resolvedValidate, ok := formatCheatSheet_resolve(name)
37
+ if ok == false || resolvedName != name || resolvedValidate != validate {
38
+ t.Fatalf("the canonical format %s must resolve to itself", name)
39
+ }
40
+ }
41
+ if _, _, ok := formatCheatSheet_resolve("not-a-format"); ok {
42
+ t.Fatal("an unsupported format must not resolve")
43
+ }
44
+ }
@@ -0,0 +1,147 @@
1
+ package factories
2
+
3
+ import (
4
+ "encoding/json"
5
+ "strings"
6
+ "testing"
7
+ )
8
+
9
+ // TestIdentifierFactoryPostfixEscapesEveryKey verifies emitted accessor paths.
10
+ //
11
+ // Postfix returns JavaScript source that callers splice into the emit as
12
+ // `_path + <postfix>`, so it carries two nested escaping levels: the key becomes
13
+ // a JSON literal, and that literal sits inside the JavaScript literal returned.
14
+ // Escaping one level and not the other emitted a file that does not parse for a
15
+ // `"` key, and a path that JSON.parse rejects inside _createStandardSchema for a
16
+ // control-character key. The expected strings below come from the contract that
17
+ // typia's own runtime helper _accessExpressionAsString implements for dynamic
18
+ // keys, `variable(str) ? ".{str}" : "[{JSON.stringify(str)}]"`, not from what
19
+ // the emitter happens to produce.
20
+ //
21
+ // 1. Assert the exact source text Postfix returns for identifier keys, quoting
22
+ // keys, escape-sensitive keys, control characters, and non-ASCII keys.
23
+ // 2. Decode every result as JSON twice and assert the original key survives.
24
+ // 3. Assert the identifier fast path stays a dotted accessor, so ordinary keys
25
+ // and prototype-shadowing keys keep their existing output.
26
+ func TestIdentifierFactoryPostfixEscapesEveryKey(t *testing.T) {
27
+ for _, item := range []struct {
28
+ name string
29
+ key string
30
+ expected string
31
+ }{
32
+ // Identifier fast path: no escaping is possible, so output is unchanged.
33
+ {"identifier", "field", `".field"`},
34
+ {"underscore", "_private", `"._private"`},
35
+ {"dollar", "$ref", `".$ref"`},
36
+ // A prototype-shadowing key is still a plain property access, because the
37
+ // emitted accessor reads the property and never the prototype.
38
+ {"proto", "__proto__", `".__proto__"`},
39
+ {"constructor", "constructor", `".constructor"`},
40
+ {"toString", "toString", `".toString"`},
41
+ // Ordinary quoted keys: byte-identical to the pre-fix output.
42
+ {"hyphen", "a-b", `"[\"a-b\"]"`},
43
+ {"space", "not valid", `"[\"not valid\"]"`},
44
+ {"empty", "", `"[\"\"]"`},
45
+ {"digit first", "0abc", `"[\"0abc\"]"`},
46
+ {"dotted", "a.b", `"[\"a.b\"]"`},
47
+ {"bracket", "a[0]", `"[\"a[0]\"]"`},
48
+ {"reserved", "for", `"[\"for\"]"`},
49
+ // Neither quote nor backslash, so no escape applies at either level.
50
+ {"single quote", "a'b", `"[\"a'b\"]"`},
51
+ {"backtick", "a`b", "\"[\\\"a`b\\\"]\""},
52
+ {"template hole", "a${b}c", `"[\"a${b}c\"]"`},
53
+ // The double quote is escaped once per level: `"` -> `\"` -> `\\\"`.
54
+ {"double quote", `a"b`, `"[\"a\\\"b\"]"`},
55
+ {"only double quote", `"`, `"[\"\\\"\"]"`},
56
+ // The backslash likewise. Escaping it once left the emitted path saying
57
+ // `["a\b"]`, which JSON.parse reads back as a backspace, not a backslash.
58
+ {"backslash", `a\b`, `"[\"a\\\\b\"]"`},
59
+ {"only backslash", `\`, `"[\"\\\\\"]"`},
60
+ {"quote and backslash", `a"\b`, `"[\"a\\\"\\\\b\"]"`},
61
+ // Control characters need a JSON escape; a raw one makes JSON.parse throw.
62
+ {"newline", "a\nb", `"[\"a\\nb\"]"`},
63
+ {"tab", "a\tb", `"[\"a\\tb\"]"`},
64
+ {"carriage return", "a\rb", `"[\"a\\rb\"]"`},
65
+ {"backspace", "a\bb", `"[\"a\\bb\"]"`},
66
+ {"form feed", "a\fb", `"[\"a\\fb\"]"`},
67
+ {"null", "a\x00b", `"[\"a\\u0000b\"]"`},
68
+ {"unit separator", "a\x1fb", `"[\"a\\u001fb\"]"`},
69
+ // strconv.Quote wrote `\a` and `\v` here. JavaScript has no `\a`, so it
70
+ // decoded to a plain "a" and silently changed the key.
71
+ {"bell", "a\x07b", `"[\"a\\u0007b\"]"`},
72
+ {"vertical tab", "a\x0bb", `"[\"a\\u000bb\"]"`},
73
+ // A line terminator to JavaScript but an ordinary character to JSON, so the
74
+ // escape belongs in the source and must not reach the path itself: the
75
+ // emitted `\u2028` decodes back to the raw character JSON.stringify writes.
76
+ {"line separator", "a\u2028b", `"[\"a\u2028b\"]"`},
77
+ {"paragraph separator", "a\u2029b", `"[\"a\u2029b\"]"`},
78
+ // Printable non-ASCII stays raw, exactly as JSON.stringify leaves it.
79
+ {"non ascii", "한글", `"[\"한글\"]"`},
80
+ {"emoji", "a\U0001F600b", "\"[\\\"a\U0001F600b\\\"]\""},
81
+ // strconv.Quote wrote `\U0001d173` for a non-printable astral rune, and
82
+ // JavaScript has no `\U` escape at all; it read back as "U0001d173".
83
+ {"astral format", "a\U0001D173b", "\"[\\\"a\U0001D173b\\\"]\""},
84
+ // A lone surrogate arrives WTF-8 encoded and has no valid UTF-8 form, so an
85
+ // escape is the only way to carry it.
86
+ {"lone surrogate", "a\xed\xa0\x80b", `"[\"a\\ud800b\"]"`},
87
+ // No escape denotes a byte that is not UTF-8 at all.
88
+ {"invalid utf8", "a\xffb", `"[\"a\\ufffdb\"]"`},
89
+ } {
90
+ t.Run(item.name, func(t *testing.T) {
91
+ output := IdentifierFactory.Postfix(item.key)
92
+ if output != item.expected {
93
+ t.Fatalf("Postfix(%q)\n got: %s\nwant: %s", item.key, output, item.expected)
94
+ }
95
+ identifierFactoryPostfixRoundTrip(t, item.key, output)
96
+ })
97
+ }
98
+ }
99
+
100
+ // identifierFactoryPostfixRoundTrip decodes the emitted source the way the
101
+ // runtime does: JavaScript reads the outer literal, then _createStandardSchema
102
+ // hands the bracketed key to JSON.parse. encoding/json stands in for both,
103
+ // which makes this an independent check that the escaping is real rather than a
104
+ // restatement of the emitter's own logic.
105
+ func identifierFactoryPostfixRoundTrip(t *testing.T, key string, output string) {
106
+ t.Helper()
107
+ var path string
108
+ if err := json.Unmarshal([]byte(output), &path); err != nil {
109
+ t.Fatalf("Postfix(%q) is not a JavaScript string literal: %s (%v)", key, output, err)
110
+ }
111
+ if strings.HasPrefix(path, ".") {
112
+ if path[1:] != key {
113
+ t.Fatalf("Postfix(%q) dotted accessor lost the key: %q", key, path)
114
+ }
115
+ return
116
+ }
117
+ if !strings.HasPrefix(path, "[") || !strings.HasSuffix(path, "]") {
118
+ t.Fatalf("Postfix(%q) is neither a dotted nor a bracketed accessor: %q", key, path)
119
+ }
120
+ var decoded string
121
+ if err := json.Unmarshal([]byte(path[1:len(path)-1]), &decoded); err != nil {
122
+ t.Fatalf("Postfix(%q) bracketed key is not JSON: %q (%v)", key, path, err)
123
+ }
124
+ if want := identifierFactoryPostfixDecodable(key); decoded != want {
125
+ t.Fatalf("Postfix(%q) round-tripped to %q, want %q", key, decoded, want)
126
+ }
127
+ }
128
+
129
+ // identifierFactoryPostfixDecodable states what a JSON decoder can return for
130
+ // `key`. encoding/json replaces an unpaired surrogate and never yields invalid
131
+ // UTF-8, so those two inputs come back as the replacement character even though
132
+ // the emitted escape itself is exact.
133
+ func identifierFactoryPostfixDecodable(key string) string {
134
+ var builder strings.Builder
135
+ for i := 0; i < len(key); {
136
+ // Detect a WTF-8 surrogate here rather than calling the factory's own
137
+ // helper, so this expectation stays independent of the code under test.
138
+ if len(key)-i >= 3 && key[i] == 0xed && key[i+1] >= 0xa0 && key[i+1] <= 0xbf {
139
+ builder.WriteRune('�')
140
+ i += 3
141
+ continue
142
+ }
143
+ builder.WriteByte(key[i])
144
+ i++
145
+ }
146
+ return strings.ToValidUTF8(builder.String(), "�")
147
+ }
@@ -0,0 +1,86 @@
1
+ package factories
2
+
3
+ import (
4
+ "encoding/json"
5
+ "fmt"
6
+ "strings"
7
+ "testing"
8
+ "unicode/utf8"
9
+ )
10
+
11
+ // TestIdentifierFactoryPostfixSurvivesEveryCodePoint verifies total escaping.
12
+ //
13
+ // The emitted accessor is spliced into the emit as source text, and nothing
14
+ // downstream parses the file, so a key the escaper mishandles ships as a broken
15
+ // artifact behind a successful build. The table-driven case list pins the
16
+ // characters that actually regressed; this one closes the class by sweeping the
17
+ // whole input space, because the escape decision is per rune and a sampled
18
+ // matrix cannot prove a per-rune rule. encoding/json decodes the result, which
19
+ // is an implementation typia does not own and therefore a real oracle: JSON
20
+ // string syntax is a subset of JavaScript string syntax, so a literal it accepts
21
+ // also parses in the emitted file.
22
+ //
23
+ // 1. Sweep every scalar value and assert the key round-trips exactly.
24
+ // 2. Sweep every surrogate code unit and assert the WTF-8 form survives as an
25
+ // escape rather than corrupting the literal.
26
+ // 3. Sweep every single byte, including the ones that are not UTF-8, and assert
27
+ // the emitted literal still decodes.
28
+ func TestIdentifierFactoryPostfixSurvivesEveryCodePoint(t *testing.T) {
29
+ for code := rune(0); code <= utf8.MaxRune; code++ {
30
+ if code >= 0xd800 && code <= 0xdfff {
31
+ continue // Not a scalar value; covered by the surrogate sweep below.
32
+ }
33
+ key := "a" + string(code) + "b"
34
+ if decoded := identifierFactoryPostfixDecode(t, key); decoded != key {
35
+ t.Fatalf("U+%04X: Postfix round-tripped to %q, want %q", code, decoded, key)
36
+ }
37
+ }
38
+
39
+ for unit := rune(0xd800); unit <= 0xdfff; unit++ {
40
+ key := "a" + string([]byte{
41
+ 0xe0 | byte(unit>>12),
42
+ 0x80 | byte((unit>>6)&0x3f),
43
+ 0x80 | byte(unit&0x3f),
44
+ }) + "b"
45
+ output := IdentifierFactory.Postfix(key)
46
+ // The inner level writes `\ud800` and the outer level escapes that
47
+ // backslash, so the emitted source carries `\\ud800`.
48
+ if want := fmt.Sprintf(`\\u%04x`, unit); !strings.Contains(output, want) {
49
+ t.Fatalf("U+%04X: lone surrogate was not escaped as %s: %s", unit, want, output)
50
+ }
51
+ // The decoder replaces an unpaired surrogate, so assert the literal stays
52
+ // well formed rather than demanding the original bytes back.
53
+ identifierFactoryPostfixDecode(t, key)
54
+ }
55
+
56
+ for value := 0; value <= 0xff; value++ {
57
+ key := "a" + string([]byte{byte(value)}) + "b"
58
+ decoded := identifierFactoryPostfixDecode(t, key)
59
+ if utf8.ValidString(key) && decoded != key {
60
+ t.Fatalf("byte 0x%02X: Postfix round-tripped to %q, want %q", value, decoded, key)
61
+ }
62
+ }
63
+ }
64
+
65
+ // identifierFactoryPostfixDecode reads the emitted source the way the runtime
66
+ // does and fails the test if any layer rejects it: JavaScript parses the outer
67
+ // literal, then _createStandardSchema hands the bracketed key to JSON.parse.
68
+ func identifierFactoryPostfixDecode(t *testing.T, key string) string {
69
+ t.Helper()
70
+ output := IdentifierFactory.Postfix(key)
71
+ var path string
72
+ if err := json.Unmarshal([]byte(output), &path); err != nil {
73
+ t.Fatalf("Postfix(%q) is not a string literal: %s (%v)", key, output, err)
74
+ }
75
+ if strings.HasPrefix(path, ".") {
76
+ return path[1:]
77
+ }
78
+ if !strings.HasPrefix(path, "[") || !strings.HasSuffix(path, "]") {
79
+ t.Fatalf("Postfix(%q) is not an accessor: %q", key, path)
80
+ }
81
+ var decoded string
82
+ if err := json.Unmarshal([]byte(path[1:len(path)-1]), &decoded); err != nil {
83
+ t.Fatalf("Postfix(%q) bracketed key is not JSON: %q (%v)", key, path, err)
84
+ }
85
+ return decoded
86
+ }
@@ -129,19 +129,17 @@ func metadata_explore_symbol_name(node *nativeast.Node, name string) string {
129
129
  return name
130
130
  }
131
131
 
132
- func metadata_get_type_arguments(checker *nativechecker.Checker, typ *nativechecker.Type) (output []*nativechecker.Type) {
132
+ func metadata_get_type_arguments(checker *nativechecker.Checker, typ *nativechecker.Type) []*nativechecker.Type {
133
133
  if checker == nil || typ == nil {
134
134
  return nil
135
135
  }
136
- defer func() {
137
- if recover() != nil {
138
- output = nil
139
- }
140
- }()
136
+ if typ.Flags()&nativechecker.TypeFlagsObject == 0 || typ.ObjectFlags()&nativechecker.ObjectFlagsReference == 0 {
137
+ return nil
138
+ }
141
139
  return checker.GetTypeArguments(typ)
142
140
  }
143
141
 
144
- func metadata_get_function_node(typ *nativechecker.Type) *nativeast.Node {
142
+ func metadata_get_function_node(checker *nativechecker.Checker, typ *nativechecker.Type) *nativeast.Node {
145
143
  if typ == nil {
146
144
  return nil
147
145
  }
@@ -153,6 +151,24 @@ func metadata_get_function_node(typ *nativechecker.Type) *nativeast.Node {
153
151
  if nativeast.IsFunctionLike(node) {
154
152
  return node
155
153
  }
154
+ // The global `Function` interface (declared in a default `lib.*.d.ts`) is
155
+ // callable and newable at runtime, so a `Function`-typed member is a function,
156
+ // not a structural object: `constructor: Function` on the global `Object`
157
+ // interface, an explicit `x: Function`, or any member inherited through
158
+ // `extends Object`. Its symbol resolves to an `InterfaceDeclaration` rather
159
+ // than a function-like node, so without this branch it is expanded
160
+ // structurally (`{ prototype, length, arguments, caller, name }`) and its
161
+ // `typeof` is checked as `"object"` even though a real function reports
162
+ // `"function"`, making `is<Object>` universally false (#2178). Returning the
163
+ // interface declaration routes the member through the same function path typia
164
+ // already uses for `() => void` members: a lenient pass under default options
165
+ // and a signature-based check under `functional`.
166
+ if metadata_is_global_function_interface(symbol, node) {
167
+ return node
168
+ }
169
+ if metadata_is_pure_function_declaration(checker, typ, node) {
170
+ return node
171
+ }
156
172
  if nativeast.IsPropertyAssignment(node) {
157
173
  initializer := node.AsPropertyAssignment().Initializer
158
174
  if nativeast.IsFunctionLike(initializer) {
@@ -268,28 +284,221 @@ func metadata_node_type_js_doc_tags(symbol *nativeast.Symbol) []schemametadata.I
268
284
  return metadata_node_js_doc_tags(symbol)
269
285
  }
270
286
 
287
+ // metadata_is_global_function_interface reports whether the type behind `symbol`
288
+ // is the global `Function` interface from a TypeScript default library. The
289
+ // match is intentionally narrow — the symbol name is exactly `"Function"`, its
290
+ // first declaration is an `InterfaceDeclaration`, and that declaration lives in a
291
+ // `lib.*.d.ts` — so it recognizes only the lib `Function` and never a
292
+ // user-declared `interface Function`, a `function Function()` value, or any
293
+ // other callable object type. See metadata_get_function_node for why the lib
294
+ // `Function` must be treated as a function type (#2178).
295
+ func metadata_is_global_function_interface(symbol *nativeast.Symbol, node *nativeast.Node) bool {
296
+ if symbol == nil || symbol.Name != "Function" {
297
+ return false
298
+ }
299
+ if node == nil || node.Kind != nativeast.KindInterfaceDeclaration {
300
+ return false
301
+ }
302
+ return metadata_symbol_from_default_lib(symbol)
303
+ }
304
+
305
+ // metadata_is_pure_function_declaration reports whether an object-type
306
+ // declaration describes only call and/or construct signatures. TypeScript
307
+ // augments every callable object's apparent properties with the global Function
308
+ // members, so the raw properties and index infos are the boundary: a declaration
309
+ // that carries members of its own keeps its declared data shape, while a
310
+ // member-free callable or constructable one follows the same metadata path as
311
+ // the function type alias it is mutually assignable with (#2238).
312
+ //
313
+ // An interface body and a type literal are the two spellings TypeScript has for
314
+ // one object-type body, and `interface F { (v: number): string }`, `type F = { (v:
315
+ // number): string }`, and the anonymous `{ (v: number): string }` written at a
316
+ // call site are one type. The declaration's node kind is the only thing that
317
+ // separates them, so answering them differently is exactly the
318
+ // declaration-spelling dependency this predicate exists to remove. Both kinds
319
+ // are admitted and nothing else is: a function type or constructor type is
320
+ // already `IsFunctionLike` and never reaches here, and every other declaration
321
+ // kind that can back a callable type carries a runtime value binding whose
322
+ // declared shape is a different question.
323
+ //
324
+ // No member class is admitted, not even one the emitted validator ignores.
325
+ // #2238's invariant is that mutually assignable spellings agree, and a
326
+ // member-carrying callable has no plain function type to be assignable with:
327
+ // `{ (): void; cancel(): void }` accepts no bare `() => void`, so routing it
328
+ // through the function path would answer against no twin while erasing `cancel`
329
+ // from the declaration. It would also split two spellings that are mutually
330
+ // assignable with each other — `cancel(): void` and `cancel: () => void` are the
331
+ // same type, and only the first carries SymbolFlagsMethod — so admitting methods
332
+ // would make the method form a function while the property form stayed
333
+ // structural. Hybrid callables are #2250's merged boundary and #2238's declared
334
+ // negative boundary; both leave them structural.
335
+ func metadata_is_pure_function_declaration(
336
+ checker *nativechecker.Checker,
337
+ typ *nativechecker.Type,
338
+ node *nativeast.Node,
339
+ ) bool {
340
+ if checker == nil || typ == nil || node == nil ||
341
+ (node.Kind != nativeast.KindInterfaceDeclaration && node.Kind != nativeast.KindTypeLiteral) {
342
+ return false
343
+ }
344
+ if len(nativechecker.Checker_getPropertiesOfType(checker, typ)) != 0 ||
345
+ len(nativechecker.Checker_getIndexInfosOfType(checker, typ)) != 0 {
346
+ return false
347
+ }
348
+ return len(checker.GetSignaturesOfType(typ, nativechecker.SignatureKindCall)) != 0 ||
349
+ len(checker.GetSignaturesOfType(typ, nativechecker.SignatureKindConstruct)) != 0
350
+ }
351
+
271
352
  // metadata_symbol_from_default_lib reports whether the symbol's first locatable
272
- // declaration lives in a TypeScript default library file. Default library files
273
- // are always named `lib.<target>.d.ts` regardless of the install directory, so
274
- // the base name alone is a stable signal.
353
+ // declaration lives in a TypeScript default library file, judged by file name
354
+ // alone because its callers answer without a checker. Default library files are
355
+ // conventionally named `lib.<target>.d.ts`, which is enough for the JSDoc and
356
+ // global-`Function` questions that use this: both are about what a library
357
+ // declaration means, and neither grants a type an identity a lookalike could
358
+ // claim. Runtime-native identity does grant one, so it asks the program instead
359
+ // through schemametadata.MetadataDefaultLibrary_is.
275
360
  func metadata_symbol_from_default_lib(symbol *nativeast.Symbol) bool {
276
361
  for _, node := range metadata_node_declarations(symbol) {
277
362
  src := nativeast.GetSourceFileOfNode(node)
278
363
  if src == nil {
279
364
  continue
280
365
  }
281
- return metadata_is_default_lib_file_name(src.FileName())
366
+ return schemametadata.MetadataDefaultLibrary_isFileNamed(src.FileName())
367
+ }
368
+ return false
369
+ }
370
+
371
+ // metadata_symbol_is_global_type reports whether symbol is the type that the
372
+ // checker resolves from its global symbol table under name. Pointer identity is
373
+ // deliberate: default-library natives and ambient-package globals such as
374
+ // Node's File and Blob resolve to that shared global symbol, while an exported
375
+ // package declaration remains a distinct module symbol even when its name and
376
+ // `.d.ts` source form are identical (#2239).
377
+ func metadata_symbol_is_global_type(checker *nativechecker.Checker, symbol *nativeast.Symbol, name string) bool {
378
+ if checker == nil || symbol == nil || name == "" {
379
+ return false
380
+ }
381
+ return checker.ResolveName(name, nil, nativeast.SymbolFlagsType, false) == symbol
382
+ }
383
+
384
+ // metadata_symbol_is_runtime_global_type reports whether a global name is the
385
+ // runtime built-in rather than a user-authored global of the same name.
386
+ //
387
+ // Global-table resolution alone answers a weaker question than the one native
388
+ // classification asks. `declare global { interface File { ... } }` in a project
389
+ // with neither DOM nor Node declarations also wins that lookup, so a
390
+ // resolution-only gate promotes a purely user-authored type to native identity:
391
+ // its members are erased, `input instanceof File` replaces them, and the check
392
+ // throws `ReferenceError` wherever no runtime provides that constructor (#2200).
393
+ //
394
+ // The added question is therefore provenance of the runtime constructor, not the
395
+ // existence of a declaration: a global qualifies only when one of the two
396
+ // authorities that actually describe a JavaScript runtime — a TypeScript default
397
+ // library, or Node's `node:buffer` / `buffer` core module — puts it in scope.
398
+ func metadata_symbol_is_runtime_global_type(checker *nativechecker.Checker, symbol *nativeast.Symbol, name string) bool {
399
+ return metadata_symbol_is_global_type(checker, symbol, name) &&
400
+ metadata_symbol_has_runtime_provider(checker, symbol)
401
+ }
402
+
403
+ // metadata_symbol_is_runtime_native_type applies the shared identity boundary
404
+ // for simple runtime-native classes. Most natives are the runtime-provided
405
+ // symbol resolved from the checker's global type table. Node's Blob and File
406
+ // module exports are a second symbol for those same runtime constructors, so
407
+ // their declarations qualify through the value-bearing shape shared by the
408
+ // supported Node type definitions (#1568, #2200, #2239).
409
+ func metadata_symbol_is_runtime_native_type(checker *nativechecker.Checker, symbol *nativeast.Symbol, name string) bool {
410
+ return metadata_symbol_is_runtime_global_type(checker, symbol, name) ||
411
+ metadata_symbol_is_node_buffer_native_export(symbol, name)
412
+ }
413
+
414
+ // metadata_symbol_has_runtime_provider reports whether a runtime authority is
415
+ // what puts this symbol's constructor in scope.
416
+ //
417
+ // A provider does not have to declare the interface itself. @types/node bridges
418
+ // its module classes to the bare globals with `interface Blob extends _Blob {}`
419
+ // plus `var Blob: ... typeof buffer.Blob` in an ordinary package `.d.ts`, so the
420
+ // interface declaration carries no runtime provenance at all while the value
421
+ // binding resolves straight into the ambient `node:buffer` module. Reading the
422
+ // constructor binding therefore recognizes that bridge — and every respelling of
423
+ // it, including the 18/20 `typeof NodeBlob` class alias and the 25 `typeof
424
+ // buffer.Blob` variable alias — without matching declaration text or package
425
+ // paths, which node_modules placement, custom typeRoots, symlinks, and
426
+ // virtualized package layouts all make unreliable.
427
+ //
428
+ // A user-authored global fails both halves: its interface lives in the user's
429
+ // own file, and any `declare var` it pairs with resolves to the user's own type
430
+ // literal rather than into a default library or the Node core module.
431
+ func metadata_symbol_has_runtime_provider(checker *nativechecker.Checker, symbol *nativeast.Symbol) bool {
432
+ if symbol == nil {
433
+ return false
434
+ }
435
+ for _, declaration := range metadata_node_declarations(symbol) {
436
+ if metadata_declaration_is_runtime_provided(checker, declaration) {
437
+ return true
438
+ }
439
+ }
440
+ if checker == nil || symbol.Flags&nativeast.SymbolFlagsValue == 0 {
441
+ return false
442
+ }
443
+ constructor := checker.GetTypeOfSymbol(symbol)
444
+ if constructor == nil {
445
+ return false
446
+ }
447
+ for _, declaration := range metadata_node_declarations(constructor.Symbol()) {
448
+ if metadata_declaration_is_runtime_provided(checker, declaration) {
449
+ return true
450
+ }
282
451
  }
283
452
  return false
284
453
  }
285
454
 
286
- func metadata_is_default_lib_file_name(fileName string) bool {
287
- slash := strings.ReplaceAll(fileName, "\\", "/")
288
- base := slash
289
- if idx := strings.LastIndex(slash, "/"); idx >= 0 {
290
- base = slash[idx+1:]
455
+ // metadata_declaration_is_runtime_provided reports whether a declaration belongs
456
+ // to one of the two authorities that describe a runtime-native global: a
457
+ // TypeScript default library file, or the `node:buffer` / `buffer` core module
458
+ // that owns Node's Blob and File constructors. The default-library half comes
459
+ // from the program (see schemametadata.MetadataDefaultLibrary) rather than from
460
+ // the declaration's file name, which under `libReplacement` is an ordinary
461
+ // `node_modules/@typescript/lib-*/index.d.ts` and which any dependency may
462
+ // otherwise imitate.
463
+ func metadata_declaration_is_runtime_provided(checker *nativechecker.Checker, declaration *nativeast.Node) bool {
464
+ if declaration == nil {
465
+ return false
466
+ }
467
+ if schemametadata.MetadataDefaultLibrary_is(checker, nativeast.GetSourceFileOfNode(declaration)) {
468
+ return true
469
+ }
470
+ return metadata_node_in_node_buffer_module(declaration)
471
+ }
472
+
473
+ func metadata_node_in_node_buffer_module(node *nativeast.Node) bool {
474
+ for current := node; current != nil; current = current.Parent {
475
+ if current.Kind == nativeast.KindModuleDeclaration && current.Name() != nil {
476
+ module := strings.Trim(current.Name().Text(), "\"'")
477
+ if module == "node:buffer" || module == "buffer" {
478
+ return true
479
+ }
480
+ }
481
+ if current.Kind == nativeast.KindSourceFile {
482
+ return false
483
+ }
484
+ }
485
+ return false
486
+ }
487
+
488
+ func metadata_symbol_is_node_buffer_native_export(symbol *nativeast.Symbol, name string) bool {
489
+ if symbol == nil || symbol.ValueDeclaration == nil || (name != "Blob" && name != "File") {
490
+ return false
491
+ }
492
+ declaration := symbol.ValueDeclaration
493
+ if declaration.Kind != nativeast.KindClassDeclaration && declaration.Kind != nativeast.KindVariableDeclaration {
494
+ return false
291
495
  }
292
- return strings.HasPrefix(base, "lib.") && strings.HasSuffix(base, ".d.ts")
496
+ // @types/node 18/20 declare these constructor values as classes and 25
497
+ // declares merged interface/var pairs. The value declaration and exact core
498
+ // module together distinguish those runtime constructors from structural
499
+ // same-name interfaces without depending on node_modules placement, custom
500
+ // typeRoots, symlink targets, or virtualized package paths.
501
+ return metadata_node_in_node_buffer_module(declaration)
293
502
  }
294
503
 
295
504
  func metadata_is_internal(symbol *nativeast.Symbol) bool {