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,279 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestSymbolKeyMemberFilterTransform verifies a `symbol`-keyed data member is
12
+ // excluded from a type's validated shape and from its emitted JSON schema, so a
13
+ // real object carrying that member passes its own `is`/`assert`/`validate` guard
14
+ // (#2226).
15
+ //
16
+ // A symbol-keyed member is unreachable through the string index access typia
17
+ // emits, is ignored by `JSON.stringify`, and has no JSON-Schema representation.
18
+ // Before the fix the member filter excluded only keyword `private`/`protected`
19
+ // and ES `#private` members, so a symbol key leaked into the validated shape
20
+ // under the checker's internal escaped name (`input["\xFE@sym@5"]`) — a string
21
+ // key no runtime object carries, making the guard unconditionally false — and
22
+ // into the schema as an uninhabitable required property.
23
+ //
24
+ // 1. Emit `is`/`assert`/`validate` plus `json.schemas` for a `unique symbol`
25
+ // key, a well-known symbol key, a symbol key inside an intersection, a type
26
+ // whose only member is symbol-keyed, a symbol-keyed method, and
27
+ // string/number/computed-string keys as positive controls.
28
+ // 2. Assert neither the validators nor the schemas reference a mangled key.
29
+ // 3. Execute the emitted JavaScript against real objects carrying the symbol
30
+ // members, proving each passes on its string-keyed shape.
31
+ func TestSymbolKeyMemberFilterTransform(t *testing.T) {
32
+ project := symbolKeyMemberFilterProject(t)
33
+
34
+ ts := symbolKeyMemberFilterTransform(t, project, "ts")
35
+ // The checker escapes a symbol-keyed member name with a leading 0xFE byte
36
+ // (`InternalSymbolNamePrefix`), an invalid UTF-8 lead unit that never begins a
37
+ // real string property name, followed by `@<name>@<id>`; the printer renders
38
+ // that byte as `�` (or the replacement character itself). None of those,
39
+ // nor the `@<name>@` infix, can appear in the fixture source echoed alongside
40
+ // the validators, so each is an exact byte signature of the leak.
41
+ for _, marker := range []string{
42
+ string([]byte{0xFE}),
43
+ "\uFFFD",
44
+ `\uFFFD`,
45
+ `\ufffd`,
46
+ "@sym@",
47
+ "@toStringTag@",
48
+ "@joined@",
49
+ "@solo@",
50
+ "@invoke@",
51
+ } {
52
+ if strings.Contains(ts, marker) {
53
+ t.Fatalf("emit references a mangled symbol key (marker %q leaked into the validated shape):\n%s", marker, ts)
54
+ }
55
+ }
56
+ // The string-keyed shape must still be validated.
57
+ for _, needle := range []string{"input.name", "input.id", "input.plain"} {
58
+ if !strings.Contains(ts, needle) {
59
+ t.Fatalf("emit dropped a string-keyed property %q:\n%s", needle, ts)
60
+ }
61
+ }
62
+
63
+ symbolKeyMemberFilterRunRuntimeCases(
64
+ t,
65
+ project,
66
+ symbolKeyMemberFilterTransform(t, project, "js"),
67
+ )
68
+ }
69
+
70
+ func symbolKeyMemberFilterProject(t *testing.T) string {
71
+ t.Helper()
72
+ root := ttscTypiaTestRepoRoot(t)
73
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
74
+ if err := os.MkdirAll(base, 0o755); err != nil {
75
+ t.Fatalf("mkdir temp base: %v", err)
76
+ }
77
+ dir, err := os.MkdirTemp(base, "symbol-key-member-filter-")
78
+ if err != nil {
79
+ t.Fatalf("create temp fixture: %v", err)
80
+ }
81
+ t.Cleanup(func() {
82
+ _ = os.RemoveAll(dir)
83
+ })
84
+ src := filepath.Join(dir, "src")
85
+ if err := os.MkdirAll(src, 0o755); err != nil {
86
+ t.Fatalf("mkdir fixture src: %v", err)
87
+ }
88
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(symbolKeyMemberFilterTSConfig), 0o644); err != nil {
89
+ t.Fatalf("write tsconfig: %v", err)
90
+ }
91
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(symbolKeyMemberFilterSource), 0o644); err != nil {
92
+ t.Fatalf("write source: %v", err)
93
+ }
94
+ return dir
95
+ }
96
+
97
+ func symbolKeyMemberFilterTransform(t *testing.T, project string, output string) string {
98
+ t.Helper()
99
+ out, errText, code := ttscTypiaTestCapture(func() int {
100
+ return runTransform([]string{
101
+ "--cwd", project,
102
+ "--tsconfig", "tsconfig.json",
103
+ "--file", "src/main.ts",
104
+ "--output", output,
105
+ })
106
+ })
107
+ if code != 0 {
108
+ t.Fatalf("symbol key member filter transform failed: output=%s code=%d stderr=\n%s", output, code, errText)
109
+ }
110
+ return out
111
+ }
112
+
113
+ func symbolKeyMemberFilterRunRuntimeCases(t *testing.T, project string, js string) {
114
+ t.Helper()
115
+ node, err := exec.LookPath("node")
116
+ if err != nil {
117
+ t.Skip("node executable not found")
118
+ }
119
+ runtimeDir := filepath.Join(project, "runtime")
120
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
121
+ t.Fatalf("mkdir runtime dir: %v", err)
122
+ }
123
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
124
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
125
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
126
+ t.Fatalf("write runtime module: %v", err)
127
+ }
128
+ runner := filepath.Join(runtimeDir, "run.cjs")
129
+ if err := os.WriteFile(runner, []byte(symbolKeyMemberFilterRuntimeRunner), 0o644); err != nil {
130
+ t.Fatalf("write runtime runner: %v", err)
131
+ }
132
+ cmd := exec.Command(node, runner)
133
+ cmd.Dir = runtimeDir
134
+ if output, err := cmd.CombinedOutput(); err != nil {
135
+ t.Fatalf("symbol key member filter runtime cases failed: %v\n%s", err, output)
136
+ }
137
+ }
138
+
139
+ const symbolKeyMemberFilterTSConfig = `{
140
+ "compilerOptions": {
141
+ "target": "ES2022",
142
+ "module": "commonjs",
143
+ "moduleResolution": "bundler",
144
+ "ignoreDeprecations": "6.0",
145
+ "types": ["*"],
146
+ "esModuleInterop": true,
147
+ "strict": true,
148
+ "skipLibCheck": true
149
+ },
150
+ "include": ["src"]
151
+ }
152
+ `
153
+
154
+ const symbolKeyMemberFilterSource = `import typia from "typia";
155
+
156
+ declare const sym: unique symbol;
157
+ declare const joined: unique symbol;
158
+ declare const solo: unique symbol;
159
+ declare const invoke: unique symbol;
160
+ declare const COMPUTED: "computed";
161
+
162
+ export interface Symbolic {
163
+ name: string;
164
+ [sym]: number;
165
+ [Symbol.toStringTag]: string;
166
+ }
167
+
168
+ export interface Controlled {
169
+ plain: string;
170
+ "quoted-key": number;
171
+ 42: boolean;
172
+ [COMPUTED]: string;
173
+ }
174
+
175
+ export type Joined = { id: string } & { [joined]: number };
176
+
177
+ export interface SoloSymbol {
178
+ [solo]: number;
179
+ }
180
+
181
+ export interface Methodic {
182
+ id: string;
183
+ [invoke](): number;
184
+ }
185
+
186
+ export const isSymbolic = typia.createIs<Symbolic>();
187
+ export const assertSymbolic = typia.createAssert<Symbolic>();
188
+ export const validateSymbolic = typia.createValidate<Symbolic>();
189
+ export const isControlled = typia.createIs<Controlled>();
190
+ export const isJoined = typia.createIs<Joined>();
191
+ export const isSolo = typia.createIs<SoloSymbol>();
192
+ export const isMethodic = typia.createIs<Methodic>();
193
+ export const schemas = typia.json.schemas<[Symbolic, Joined, SoloSymbol, Methodic]>();
194
+ `
195
+
196
+ const symbolKeyMemberFilterRuntimeRunner = `const mod = require("./main.cjs");
197
+
198
+ const sym = Symbol("sym");
199
+ const joined = Symbol("joined");
200
+ const solo = Symbol("solo");
201
+ const invoke = Symbol("invoke");
202
+
203
+ const expect = (label, actual, expected) => {
204
+ if (actual !== expected) {
205
+ throw new Error(label + ": expected " + expected + " but got " + actual);
206
+ }
207
+ };
208
+
209
+ // A real object carrying every declared member — including the symbol-keyed
210
+ // ones — passes its own guard.
211
+ expect(
212
+ "is real Symbolic value",
213
+ mod.isSymbolic({ name: "x", [sym]: 1, [Symbol.toStringTag]: "Symbolic" }),
214
+ true,
215
+ );
216
+ expect("is real Joined value", mod.isJoined({ id: "x", [joined]: 1 }), true);
217
+ expect("is real SoloSymbol value", mod.isSolo({ [solo]: 1 }), true);
218
+ expect("is real Methodic value", mod.isMethodic({ id: "x", [invoke]: () => 1 }), true);
219
+
220
+ // A symbol-keyed member is not part of the structural JSON shape, so a plain
221
+ // object carrying only the string keys is accepted too.
222
+ expect("is plain Symbolic shape", mod.isSymbolic({ name: "x" }), true);
223
+ expect("is plain Joined shape", mod.isJoined({ id: "x" }), true);
224
+ expect("is empty SoloSymbol shape", mod.isSolo({}), true);
225
+ expect("is plain Methodic shape", mod.isMethodic({ id: "x" }), true);
226
+
227
+ // The string-keyed shape is still validated structurally.
228
+ expect("reject wrong Symbolic name type", mod.isSymbolic({ name: 1 }), false);
229
+ expect("reject missing Symbolic name", mod.isSymbolic({}), false);
230
+ expect("reject missing Joined id", mod.isJoined({ [joined]: 1 }), false);
231
+ expect("reject non-object SoloSymbol", mod.isSolo(null), false);
232
+
233
+ // Positive controls: string / number / computed-string keys still resolve.
234
+ expect(
235
+ "is Controlled value",
236
+ mod.isControlled({ plain: "a", "quoted-key": 1, 42: true, computed: "c" }),
237
+ true,
238
+ );
239
+ expect(
240
+ "reject missing computed-string key",
241
+ mod.isControlled({ plain: "a", "quoted-key": 1, 42: true }),
242
+ false,
243
+ );
244
+ expect(
245
+ "reject missing numeric key",
246
+ mod.isControlled({ plain: "a", "quoted-key": 1, computed: "c" }),
247
+ false,
248
+ );
249
+
250
+ // assert / validate accept a real value without touching a mangled key.
251
+ expect(
252
+ "assert real Symbolic returns input",
253
+ typeof mod.assertSymbolic({ name: "x", [sym]: 1, [Symbol.toStringTag]: "Symbolic" }),
254
+ "object",
255
+ );
256
+ expect(
257
+ "validate real Symbolic succeeds",
258
+ mod.validateSymbolic({ name: "x", [sym]: 1, [Symbol.toStringTag]: "Symbolic" }).success,
259
+ true,
260
+ );
261
+
262
+ let threw = false;
263
+ try {
264
+ mod.assertSymbolic({ name: 1 });
265
+ } catch (_exp) {
266
+ threw = true;
267
+ }
268
+ expect("assert rejects wrong name type", threw, true);
269
+
270
+ // The emitted schemas carry no mangled symbol key.
271
+ const serialized = JSON.stringify(mod.schemas);
272
+ for (const marker of ["@sym@", "@toStringTag@", "@joined@", "@solo@", "@invoke@", "�"]) {
273
+ if (serialized.includes(marker)) {
274
+ throw new Error("schema references a mangled symbol key (" + marker + "): " + serialized);
275
+ }
276
+ }
277
+ const required = JSON.stringify(mod.schemas.components.schemas.Symbolic.required);
278
+ expect("Symbolic schema requires only its string key", required, JSON.stringify(["name"]));
279
+ `
@@ -100,8 +100,10 @@ func templateInterpolationTypeTagsRunRuntimeCases(t *testing.T, project string,
100
100
  // common stub set covers; stub them before the shared rewrite asserts that no
101
101
  // `typia/lib/internal/*` import survives.
102
102
  extraStubs := map[string]string{
103
- "is-type-int32-stub.cjs": "module.exports._isTypeInt32 = (value) => Number.isInteger(value) && -2147483648 <= value && value <= 2147483647;\n",
104
- "random-number-stub.cjs": templateInterpolationTypeTagsRandomNumberStub,
103
+ "is-type-int32-stub.cjs": "module.exports._isTypeInt32 = (value) => Number.isInteger(value) && -2147483648 <= value && value <= 2147483647;\n",
104
+ "random-number-stub.cjs": templateInterpolationTypeTagsRandomNumberStub,
105
+ "random-string-stub.cjs": "module.exports._randomString = () => 'prefix';\n",
106
+ "json-stringify-string-stub.cjs": "module.exports._jsonStringifyString = (value) => JSON.stringify(value);\n",
105
107
  }
106
108
  for name, content := range extraStubs {
107
109
  if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
@@ -110,6 +112,8 @@ func templateInterpolationTypeTagsRunRuntimeCases(t *testing.T, project string,
110
112
  }
111
113
  runtimeJS := strings.ReplaceAll(js, `require("typia/lib/internal/_isTypeInt32")`, `require("./is-type-int32-stub.cjs")`)
112
114
  runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_randomNumber")`, `require("./random-number-stub.cjs")`)
115
+ runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_randomString")`, `require("./random-string-stub.cjs")`)
116
+ runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_jsonStringifyString")`, `require("./json-stringify-string-stub.cjs")`)
113
117
  runtimeJS = ttscTypiaTestRewriteCommonJS(t, runtimeJS)
114
118
  if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
115
119
  t.Fatalf("write runtime module: %v", err)
@@ -153,9 +157,14 @@ type StrNum = ` + "`${string & tags.MaxLength<2>}-${number}`" + `;
153
157
  type NumStr = ` + "`${number & tags.Maximum<9>}-${string & tags.MinLength<2>}`" + `;
154
158
  type Dec = ` + "`${number & tags.Maximum<1.2>}.${number}`" + `;
155
159
  type BigDot = ` + "`${bigint}.${number & tags.Minimum<5>}`" + `;
160
+ type Triple = ` + "`${string & tags.MaxLength<2>}${string & tags.MinLength<2>}${number & tags.Minimum<10>}`" + `;
161
+ type AmbiguousUnion = Adjacent | NonAdj;
156
162
  interface DynKey {
157
163
  [key: ` + "`slot${number & tags.Minimum<0> & tags.Maximum<9>}`" + `]: string;
158
164
  }
165
+ interface AmbiguousDynKey {
166
+ [key: ` + "`${string}${number & tags.Minimum<10>}`" + `]: string;
167
+ }
159
168
 
160
169
  export const isPercent = typia.createIs<Percent>();
161
170
  export const validatePercent = typia.createValidate<Percent>();
@@ -168,14 +177,22 @@ export const isMultiline = typia.createIs<Multiline>();
168
177
  export const isBigRange = typia.createIs<BigRange>();
169
178
  export const isBigExcl = typia.createIs<BigExcl>();
170
179
  export const isAdjacent = typia.createIs<Adjacent>();
180
+ export const validateAdjacent = typia.createValidate<Adjacent>();
181
+ export const assertAdjacent = typia.createAssert<Adjacent>();
171
182
  export const isInfix = typia.createIs<Infix>();
172
183
  export const isNonAdj = typia.createIs<NonAdj>();
173
184
  export const isStrNum = typia.createIs<StrNum>();
174
185
  export const isNumStr = typia.createIs<NumStr>();
175
186
  export const isDec = typia.createIs<Dec>();
176
187
  export const isBigDot = typia.createIs<BigDot>();
188
+ export const isTriple = typia.createIs<Triple>();
189
+ export const isAmbiguousUnion = typia.createIs<AmbiguousUnion>();
177
190
  export const equalsDynKey = typia.createEquals<DynKey>();
191
+ export const equalsAmbiguousDynKey = typia.createEquals<AmbiguousDynKey>();
178
192
  export const randomPercent = typia.createRandom<Percent>();
193
+ export const randomAdjacent = typia.createRandom<Adjacent>();
194
+ export const stringifyAdjacent = typia.json.createValidateStringify<{ value: Adjacent }>();
195
+ export const schemaAdjacent = typia.json.schemas<[Adjacent]>();
179
196
  `
180
197
 
181
198
  const templateInterpolationTypeTagsRuntimeRunner = `const mod = require("./main.cjs");
@@ -248,11 +265,13 @@ expect("bigint excluded value", mod.isBigExcl("#5"), false);
248
265
  expect("bigint allowed value", mod.isBigExcl("#3"), true);
249
266
  expect("bigint exclude negative", mod.isBigExcl("#-1"), false);
250
267
 
251
- // Adjacent variable-width placeholders fall back (tag unenforced) rather than a
252
- // greedy-split false negative: "abc123" is a valid string-then-number(>=10)
253
- // split (string="abc", number=123). If the number tag were wrongly enforced on
254
- // the greedy split, the number group would be "3" and this would be false.
255
- expect("adjacent placeholders fall back", mod.isAdjacent("abc123"), true);
268
+ // Adjacent variable-width placeholders accept a non-greedy split when it is the
269
+ // split that satisfies the number tag.
270
+ expect("adjacent placeholders backtrack", mod.isAdjacent("abc123"), true);
271
+ expect("adjacent placeholders edge split", mod.isAdjacent("123"), true);
272
+ expect("adjacent placeholders no valid split", mod.isAdjacent("abc9"), false);
273
+ expect("adjacent placeholders structural failure", mod.isAdjacent("abc"), false);
274
+ expect("adjacent placeholders long invalid input", mod.isAdjacent("x".repeat(2048) + "9"), false);
256
275
 
257
276
  // A sole string fenced by literals is enforced: the ^/$ anchors pin "a" and the
258
277
  // final "b", so the split string="XbY" (length 3) is unique and exceeds
@@ -260,15 +279,13 @@ expect("adjacent placeholders fall back", mod.isAdjacent("abc123"), true);
260
279
  expect("sole string fenced by literals, too long", mod.isInfix("aXbYb"), false);
261
280
  expect("sole string fenced by literals, in range", mod.isInfix("aXb"), true);
262
281
 
263
- // A string with a placeholder sibling falls back (greedy ([\s\S]*) could overrun
264
- // the fence), so its tag is unenforced rather than a false negative: "aXbXcd" is
265
- // a valid string-X-string(>=3) split (second="bXcd") and stays true.
266
- expect("string with sibling falls back", mod.isNonAdj("aXbXcd"), true);
282
+ // A repeated literal fence tries each split until the tagged suffix is valid.
283
+ expect("string sibling backtracks", mod.isNonAdj("aXbXcd"), true);
284
+ expect("string sibling no valid split", mod.isNonAdj("aXbc"), false);
267
285
 
268
- // string-first across a separator the number's exponent can absorb: the string
269
- // falls back (greedy could capture "xy-1e"), so "xy-1e-9" is no longer a false
270
- // negative (string="xy" length 2 <= 2 is a valid split).
271
- expect("strnum string-first falls back", mod.isStrNum("xy-1e-9"), true);
286
+ // A separator that can also occur in an exponent is tried at each position.
287
+ expect("strnum string-first backtracks", mod.isStrNum("xy-1e-9"), true);
288
+ expect("strnum no valid bounded prefix", mod.isStrNum("toolong-1"), false);
272
289
 
273
290
  // number-first: "-" is not number-extendable, so both placeholders are pinned
274
291
  // and enforced — number=50 > 9 fails, string="a" length 1 < 2 fails.
@@ -276,15 +293,35 @@ expect("numstr ok", mod.isNumStr("5-ab"), true);
276
293
  expect("numstr number violated", mod.isNumStr("50-ab"), false);
277
294
  expect("numstr string violated", mod.isNumStr("5-a"), false);
278
295
 
279
- // number-"."-number: "." is a decimal extension, so the split slides ("1.9.0"
280
- // splits as 1.9|0 or 1|9.0); the placeholder falls back, so the valid first="1"
281
- // (<= 1.2) split is no longer a false negative.
282
- expect("dec decimal-separator falls back", mod.isDec("1.9.0"), true);
296
+ // A decimal point can be part of either number; any fully valid split passes.
297
+ expect("dec decimal-separator backtracks", mod.isDec("1.9.0"), true);
298
+ expect("dec no valid bounded first number", mod.isDec("2.0.3"), false);
299
+
300
+ // A bigint/number mix keeps the bigint side integral while trying dot fences.
301
+ expect("bigint-dot-number backtracks", mod.isBigDot("1.9.4"), true);
302
+ expect("bigint-dot-number no valid suffix", mod.isBigDot("1.4.0"), false);
303
+ expect("three adjacent placeholders backtrack", mod.isTriple("abcd12"), true);
304
+ expect("three adjacent placeholders no valid split", mod.isTriple("abcd9"), false);
305
+ expect("ambiguous union adjacent branch", mod.isAmbiguousUnion("prefix123"), true);
306
+ expect("ambiguous union fenced branch", mod.isAmbiguousUnion("aXbXcd"), true);
307
+ expect("ambiguous union no valid branch", mod.isAmbiguousUnion("prefix9"), false);
283
308
 
284
- // An untagged bigint lowers to the decimal NUMBER span, so it absorbs the ".";
285
- // the number after it falls back, so "1.9.4" (valid as bigint=1 | number=9.4 >=
286
- // 5) is not a false negative.
287
- expect("bigint-dot-number falls back", mod.isBigDot("1.9.4"), true);
309
+ const adjacentFailure = mod.validateAdjacent("abc9");
310
+ if (
311
+ adjacentFailure.success !== false ||
312
+ adjacentFailure.errors.every((error) => error.expected.includes("Minimum<10>") === false)
313
+ ) {
314
+ throw new Error("ambiguous validate error should name Minimum<10>: " + JSON.stringify(adjacentFailure));
315
+ }
316
+ let adjacentAsserted = false;
317
+ try {
318
+ mod.assertAdjacent("abc9");
319
+ } catch (error) {
320
+ adjacentAsserted = String(error && error.message).includes("Minimum<10>");
321
+ }
322
+ if (adjacentAsserted !== true) {
323
+ throw new Error("ambiguous assert error should name Minimum<10>");
324
+ }
288
325
 
289
326
  // A dynamic index key typed as a tagged-interpolation template (the
290
327
  // check_dynamic_key path): a key whose number violates the tag no longer
@@ -293,6 +330,8 @@ expect("dynkey in range", mod.equalsDynKey({ slot5: "x" }), true);
293
330
  expect("dynkey both ends", mod.equalsDynKey({ slot0: "x", slot9: "y" }), true);
294
331
  expect("dynkey out of range", mod.equalsDynKey({ slot50: "x" }), false);
295
332
  expect("dynkey non-number", mod.equalsDynKey({ slotABC: "x" }), false);
333
+ expect("ambiguous dynkey valid split", mod.equalsAmbiguousDynKey({ slot123: "x" }), true);
334
+ expect("ambiguous dynkey invalid split", mod.equalsAmbiguousDynKey({ slot9: "x" }), false);
296
335
 
297
336
  // validate must name the violated placeholder tag, not just the template.
298
337
  const tooBig = mod.validatePercent("150%");
@@ -319,4 +358,28 @@ for (let i = 0; i < 100; ++i) {
319
358
  throw new Error("random percent did not round-trip: " + JSON.stringify(value));
320
359
  }
321
360
  }
361
+ for (let i = 0; i < 25; ++i) {
362
+ const value = mod.randomAdjacent(generator);
363
+ if (mod.isAdjacent(value) !== true) {
364
+ throw new Error("random adjacent template did not round-trip: " + JSON.stringify(value));
365
+ }
366
+ }
367
+ const stringifiedAdjacent = mod.stringifyAdjacent({ value: "prefix123" });
368
+ if (
369
+ stringifiedAdjacent.success !== true ||
370
+ JSON.parse(stringifiedAdjacent.data).value !== "prefix123"
371
+ ) {
372
+ throw new Error("validated stringify rejected an existentially valid split");
373
+ }
374
+ const invalidStringifiedAdjacent = mod.stringifyAdjacent({ value: "prefix9" });
375
+ if (
376
+ invalidStringifiedAdjacent.success !== false ||
377
+ invalidStringifiedAdjacent.errors.every((error) => error.expected.includes("Minimum<10>") === false)
378
+ ) {
379
+ throw new Error("validated stringify did not preserve the ambiguous placeholder tag diagnostic");
380
+ }
381
+ const adjacentSchema = JSON.stringify(mod.schemaAdjacent);
382
+ if (adjacentSchema.includes("Minimum<10>")) {
383
+ throw new Error("template interpolation tags must remain intentionally absent from JSON Schema");
384
+ }
322
385
  `
@@ -34,7 +34,9 @@ func TestTemplateLiteralTypeTagsTransform(t *testing.T) {
34
34
  if code != 0 {
35
35
  t.Fatalf("template literal tags transform failed: code=%d stderr=\n%s", code, errText)
36
36
  }
37
- if !strings.Contains(out, "length <= 30") || !strings.Contains(out, "RegExp(/^prefix(.*)postfix$/)") {
37
+ if !strings.Contains(out, `require("typia/lib/internal/_stringLength")`) ||
38
+ !strings.Contains(out, "._stringLength(input) <= 30") ||
39
+ !strings.Contains(out, "RegExp(/^prefix(.*)postfix$/)") {
38
40
  t.Fatalf("emitted checker should combine the template pattern with its tags:\n%s", out)
39
41
  }
40
42
  templateLiteralTypeTagsRunRuntimeCases(t, project, out)