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,238 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestJsonStringifySpecialKeyTransform pins json.createStringify (and the
12
+ // guarded isStringify / assertStringify / validateStringify variants) against a
13
+ // static object key that contains a double quote, a backslash, a control
14
+ // character, a `${` interpolation sequence, an empty string, or a backtick
15
+ // (#2201).
16
+ //
17
+ // StringifyJoinder emits each static key by JSON-escaping it with
18
+ // json.Marshal, then splicing the JSON bytes into a *template literal* through
19
+ // TemplateFactory.Generate. JSON escaping and template-literal escaping
20
+ // disagree, so at runtime `\"`->`"`, `\\`->`\`, a control char stays raw, a raw
21
+ // backtick closes the template (a SyntaxError in the emitted module), and `${`
22
+ // starts a live interpolation (a serialize-time ReferenceError / injection).
23
+ // The result is invalid JSON, or a crash, for exactly these keys, while
24
+ // ordinary keys, dynamic Record keys, and all string values stay correct.
25
+ //
26
+ // 1. Transform a fixture that exports json.createStringify (plus the guarded
27
+ // variants) for an object whose keys are `q"k`, `back\slash`, a TAB,
28
+ // `interp${bad}here`, the empty string, and a backtick.
29
+ // 2. Execute the emitted serializer in Node with a faithful
30
+ // _jsonStringifyNumber stub.
31
+ // 3. Require the serialized document to JSON.parse back to the original object
32
+ // for every key, and report the exact executed case count so a runner that
33
+ // silently skipped a key cannot pass as a false green.
34
+ func TestJsonStringifySpecialKeyTransform(t *testing.T) {
35
+ project := jsonStringifySpecialKeyProject(t)
36
+ js := jsonStringifySpecialKeyTransform(t, project)
37
+ jsonStringifySpecialKeyRunRuntime(t, project, js)
38
+ }
39
+
40
+ func jsonStringifySpecialKeyProject(t *testing.T) string {
41
+ t.Helper()
42
+ root := ttscTypiaTestRepoRoot(t)
43
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
44
+ if err := os.MkdirAll(base, 0o755); err != nil {
45
+ t.Fatalf("mkdir temp base: %v", err)
46
+ }
47
+ dir, err := os.MkdirTemp(base, "json-stringify-special-key-")
48
+ if err != nil {
49
+ t.Fatalf("create temp fixture: %v", err)
50
+ }
51
+ t.Cleanup(func() {
52
+ _ = os.RemoveAll(dir)
53
+ })
54
+ src := filepath.Join(dir, "src")
55
+ if err := os.MkdirAll(src, 0o755); err != nil {
56
+ t.Fatalf("mkdir fixture src: %v", err)
57
+ }
58
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(jsonStringifySpecialKeyTSConfig), 0o644); err != nil {
59
+ t.Fatalf("write tsconfig: %v", err)
60
+ }
61
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(jsonStringifySpecialKeySource), 0o644); err != nil {
62
+ t.Fatalf("write source: %v", err)
63
+ }
64
+ return dir
65
+ }
66
+
67
+ func jsonStringifySpecialKeyTransform(t *testing.T, project string) string {
68
+ t.Helper()
69
+ payload := `[{"config":{"transform":"typia/lib/transform"},"name":"typia","stage":"transform"}]`
70
+ out, errText, code := ttscTypiaTestCapture(func() int {
71
+ return runTransform([]string{
72
+ "--cwd", project,
73
+ "--tsconfig", "tsconfig.json",
74
+ "--file", "src/main.ts",
75
+ "--output", "js",
76
+ "--plugins-json", payload,
77
+ })
78
+ })
79
+ if code != 0 {
80
+ t.Fatalf("json stringify special-key transform failed: code=%d stderr=\n%s", code, errText)
81
+ }
82
+ return out
83
+ }
84
+
85
+ func jsonStringifySpecialKeyRunRuntime(t *testing.T, project string, js string) {
86
+ t.Helper()
87
+ node, err := exec.LookPath("node")
88
+ if err != nil {
89
+ t.Skip("node executable not found")
90
+ }
91
+ runtimeDir := filepath.Join(project, "runtime")
92
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
93
+ t.Fatalf("mkdir runtime dir: %v", err)
94
+ }
95
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
96
+ stubs := map[string]string{
97
+ "json-stringify-number-stub.cjs": jsonStringifySpecialKeyNumberStub,
98
+ "json-stringify-string-stub.cjs": jsonStringifySpecialKeyStringStub,
99
+ "throw-type-guard-error-stub.cjs": jsonStringifySpecialKeyThrowStub,
100
+ }
101
+ for name, content := range stubs {
102
+ if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
103
+ t.Fatalf("write %s: %v", name, err)
104
+ }
105
+ }
106
+ runtimeJS := strings.ReplaceAll(js, `require("typia/lib/internal/_jsonStringifyNumber")`, `require("./json-stringify-number-stub.cjs")`)
107
+ runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_jsonStringifyString")`, `require("./json-stringify-string-stub.cjs")`)
108
+ runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_throwTypeGuardError")`, `require("./throw-type-guard-error-stub.cjs")`)
109
+ runtimeJS = ttscTypiaTestRewriteCommonJS(t, runtimeJS)
110
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
111
+ t.Fatalf("write runtime module: %v", err)
112
+ }
113
+ runner := filepath.Join(runtimeDir, "run.cjs")
114
+ if err := os.WriteFile(runner, []byte(jsonStringifySpecialKeyRunner), 0o644); err != nil {
115
+ t.Fatalf("write runtime runner: %v", err)
116
+ }
117
+ cmd := exec.Command(node, runner)
118
+ cmd.Dir = runtimeDir
119
+ output, err := cmd.CombinedOutput()
120
+ if err != nil {
121
+ t.Fatalf("json stringify special-key runtime failed: %v\n%s", err, output)
122
+ }
123
+ const expected = "RAN 24 CASES"
124
+ if !strings.Contains(string(output), expected) {
125
+ t.Fatalf("json stringify special-key runner did not report %q; got:\n%s", expected, output)
126
+ }
127
+ }
128
+
129
+ const jsonStringifySpecialKeyTSConfig = `{
130
+ "compilerOptions": {
131
+ "target": "ES2022",
132
+ "module": "commonjs",
133
+ "moduleResolution": "bundler",
134
+ "ignoreDeprecations": "6.0",
135
+ "types": ["*"],
136
+ "esModuleInterop": true,
137
+ "strict": true,
138
+ "skipLibCheck": true
139
+ },
140
+ "include": ["src"]
141
+ }
142
+ `
143
+
144
+ const jsonStringifySpecialKeySource = `import typia from "typia";
145
+
146
+ interface Special {
147
+ "q\"k": number;
148
+ "back\\slash": number;
149
+ "\t": number;
150
+ "interp${bad}here": number;
151
+ "": number;
152
+ "` + "`" + `": number;
153
+ }
154
+
155
+ export const stringifySpecial = typia.json.createStringify<Special>();
156
+ export const isStringifySpecial = typia.json.createIsStringify<Special>();
157
+ export const assertStringifySpecial = typia.json.createAssertStringify<Special>();
158
+ export const validateStringifySpecial = typia.json.createValidateStringify<Special>();
159
+ `
160
+
161
+ const jsonStringifySpecialKeyNumberStub = `module.exports._jsonStringifyNumber = (value) => (Number.isFinite(value) ? String(value) : "null");
162
+ `
163
+
164
+ const jsonStringifySpecialKeyStringStub = `module.exports._jsonStringifyString = (value) => JSON.stringify(value);
165
+ `
166
+
167
+ const jsonStringifySpecialKeyThrowStub = `module.exports._throwTypeGuardError = (props) => {
168
+ const error = new Error(props.expected);
169
+ Object.assign(error, props);
170
+ throw error;
171
+ };
172
+ `
173
+
174
+ const jsonStringifySpecialKeyRunner = `const mod = require("./main.cjs");
175
+
176
+ const TAB = String.fromCharCode(9);
177
+ const BQ = String.fromCharCode(96);
178
+
179
+ const makeInput = () => {
180
+ const input = {};
181
+ input['q"k'] = 1;
182
+ input['back\\slash'] = 2;
183
+ input[TAB] = 3;
184
+ input['interp${bad}here'] = 4;
185
+ input[''] = 5;
186
+ input[BQ] = 6;
187
+ return input;
188
+ };
189
+
190
+ const entries = [
191
+ ['q"k', 1],
192
+ ['back\\slash', 2],
193
+ [TAB, 3],
194
+ ['interp${bad}here', 4],
195
+ ['', 5],
196
+ [BQ, 6],
197
+ ];
198
+
199
+ let ran = 0;
200
+
201
+ const roundTrip = (label, text) => {
202
+ const parsed = JSON.parse(text);
203
+ for (const [key, expected] of entries) {
204
+ ran += 1;
205
+ if (parsed[key] !== expected) {
206
+ throw new Error(
207
+ label + ": key " + JSON.stringify(key) + " round-trip failed; got " +
208
+ JSON.stringify(parsed[key]) + " in " + text,
209
+ );
210
+ }
211
+ }
212
+ if (Object.keys(parsed).length !== entries.length) {
213
+ throw new Error(label + ": unexpected key count in " + text);
214
+ }
215
+ };
216
+
217
+ // json.createStringify: the raw serializer must emit valid JSON for every key.
218
+ roundTrip("createStringify", mod.stringifySpecial(makeInput()));
219
+
220
+ // json.createIsStringify: valid input serializes; the document must round-trip.
221
+ const isText = mod.isStringifySpecial(makeInput());
222
+ if (isText === null) {
223
+ throw new Error("isStringify rejected a valid special-key object");
224
+ }
225
+ roundTrip("isStringify", isText);
226
+
227
+ // json.createAssertStringify: valid input passes the guard, then serializes.
228
+ roundTrip("assertStringify", mod.assertStringifySpecial(makeInput()));
229
+
230
+ // json.createValidateStringify: success carries the serialized document.
231
+ const validated = mod.validateStringifySpecial(makeInput());
232
+ if (validated.success !== true) {
233
+ throw new Error("validateStringify rejected a valid special-key object: " + JSON.stringify(validated));
234
+ }
235
+ roundTrip("validateStringify", validated.data);
236
+
237
+ console.log("RAN " + ran + " CASES");
238
+ `
@@ -0,0 +1,277 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "os"
6
+ "os/exec"
7
+ "path/filepath"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ // TestLibReplacementNativeIdentityTransform keeps a `libReplacement` project's
13
+ // natives native even though their declaration file lives in node_modules
14
+ // (#2200).
15
+ //
16
+ // Runtime-native identity requires a runtime authority to declare the global, so
17
+ // which files count as a TypeScript default library became load-bearing. Under
18
+ // `libReplacement` the compiler resolves `lib.es2015.collection.d.ts` to
19
+ // `@typescript/lib-es2015/collection`, an ordinary package file whose name does
20
+ // not even begin with `lib.` — so a file-name rule answers "not a default
21
+ // library" and would demote Map, Set, WeakMap, and WeakSet to structural checks
22
+ // that accept any object. Only the program's own classification is right here,
23
+ // and this fixture is what proves the transform consults it.
24
+ //
25
+ // 1. Publish `@typescript/lib-es2015/collection.d.ts` carrying the real
26
+ // Map/Set/WeakMap/WeakSet declarations plus a probe interface that exists
27
+ // nowhere else, and enable `libReplacement`.
28
+ // 2. Transform validators for the four replaced collection natives, for Date
29
+ // and Uint8Array as bundled-library controls, and for the probe.
30
+ // 3. Require the probe to transform at all, which fails unless the replacement
31
+ // file — not the bundled lib — is what the program loaded.
32
+ // 4. Require every native to keep its `instanceof` check and execute all of
33
+ // them in Node against real instances and plain objects.
34
+ func TestLibReplacementNativeIdentityTransform(t *testing.T) {
35
+ project := libReplacementNativeIdentityProject(t)
36
+ js, errText, code := ttscTypiaTestCapture(func() int {
37
+ return runTransform([]string{
38
+ "--cwd", project,
39
+ "--tsconfig", "tsconfig.json",
40
+ "--file", "src/input.ts",
41
+ "--output", "js",
42
+ })
43
+ })
44
+ if code != 0 {
45
+ t.Fatalf("lib replacement transform failed: code=%d stderr=\n%s", code, errText)
46
+ }
47
+
48
+ failures := []string{}
49
+ if !strings.Contains(js, "libReplacementMarker") {
50
+ failures = append(failures, "emit lost the replacement-only probe member; the project did not load the replaced lib file")
51
+ }
52
+ for _, kept := range []string{
53
+ "instanceof Map",
54
+ "instanceof Set",
55
+ "instanceof WeakMap",
56
+ "instanceof WeakSet",
57
+ "instanceof Date",
58
+ "instanceof Uint8Array",
59
+ } {
60
+ if !strings.Contains(js, kept) {
61
+ failures = append(failures, fmt.Sprintf("replaced or bundled default library native lost %q", kept))
62
+ }
63
+ }
64
+
65
+ output, runtimeErr := libReplacementNativeIdentityRun(t, project, js)
66
+ if runtimeErr != nil {
67
+ failures = append(failures, fmt.Sprintf("runtime matrix failed: %v\n%s", runtimeErr, output))
68
+ }
69
+ if expected := "RAN 13 REPLACEMENT CASES"; !strings.Contains(output, expected) {
70
+ failures = append(failures, fmt.Sprintf("replacement runner did not report %q; got:\n%s", expected, output))
71
+ }
72
+ if len(failures) != 0 {
73
+ t.Fatalf("lib replacement native identity mismatches:\n%s\n\nemit:\n%s", strings.Join(failures, "\n"), js)
74
+ }
75
+ }
76
+
77
+ func libReplacementNativeIdentityProject(t *testing.T) string {
78
+ t.Helper()
79
+ root := ttscTypiaTestRepoRoot(t)
80
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
81
+ if err := os.MkdirAll(base, 0o755); err != nil {
82
+ t.Fatalf("mkdir temp base: %v", err)
83
+ }
84
+ dir, err := os.MkdirTemp(base, "lib-replacement-native-identity-")
85
+ if err != nil {
86
+ t.Fatalf("create temp fixture: %v", err)
87
+ }
88
+ t.Cleanup(func() {
89
+ _ = os.RemoveAll(dir)
90
+ })
91
+ for name, content := range map[string]string{
92
+ "tsconfig.json": libReplacementNativeIdentityTSConfig,
93
+ "node_modules/@typescript/lib-es2015/package.json": libReplacementNativeIdentityPackageJSON,
94
+ "node_modules/@typescript/lib-es2015/collection.d.ts": libReplacementNativeIdentityCollectionLib,
95
+ "src/input.ts": libReplacementNativeIdentitySource,
96
+ } {
97
+ path := filepath.Join(dir, filepath.FromSlash(name))
98
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
99
+ t.Fatalf("mkdir fixture path %s: %v", filepath.Dir(path), err)
100
+ }
101
+ if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
102
+ t.Fatalf("write fixture file %s: %v", path, err)
103
+ }
104
+ }
105
+ return dir
106
+ }
107
+
108
+ func libReplacementNativeIdentityRun(t *testing.T, project string, js string) (string, error) {
109
+ t.Helper()
110
+ node, err := exec.LookPath("node")
111
+ if err != nil {
112
+ t.Skip("node executable not found")
113
+ return "", nil
114
+ }
115
+ runtimeDir := filepath.Join(project, "runtime")
116
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
117
+ t.Fatalf("mkdir runtime dir: %v", err)
118
+ }
119
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
120
+ for name, content := range map[string]string{
121
+ "input.cjs": ttscTypiaTestRewriteCommonJS(t, js),
122
+ "run.cjs": libReplacementNativeIdentityRuntimeRunner,
123
+ } {
124
+ if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
125
+ t.Fatalf("write runtime file %s: %v", name, err)
126
+ }
127
+ }
128
+ cmd := exec.Command(node, filepath.Join(runtimeDir, "run.cjs"))
129
+ cmd.Dir = runtimeDir
130
+ output, err := cmd.CombinedOutput()
131
+ return string(output), err
132
+ }
133
+
134
+ const libReplacementNativeIdentityTSConfig = `{
135
+ "compilerOptions": {
136
+ "target": "ES2022",
137
+ "module": "commonjs",
138
+ "moduleResolution": "bundler",
139
+ "ignoreDeprecations": "6.0",
140
+ "lib": ["ES2022"],
141
+ "types": [],
142
+ "libReplacement": true,
143
+ "esModuleInterop": true,
144
+ "strict": true,
145
+ "skipLibCheck": true
146
+ },
147
+ "include": ["src"]
148
+ }
149
+ `
150
+
151
+ const libReplacementNativeIdentityPackageJSON = `{
152
+ "name": "@typescript/lib-es2015",
153
+ "version": "1.0.0"
154
+ }
155
+ `
156
+
157
+ // libReplacementNativeIdentityCollectionLib is the replacement TypeScript loads
158
+ // instead of its bundled `lib.es2015.collection.d.ts`. The collection
159
+ // declarations are transcribed from that file so the rest of the standard
160
+ // library still typechecks against them; `LibReplacementProbe` is the one
161
+ // addition, and it is what proves the program loaded this file.
162
+ const libReplacementNativeIdentityCollectionLib = `interface LibReplacementProbe {
163
+ libReplacementMarker: string;
164
+ }
165
+
166
+ interface Map<K, V> {
167
+ clear(): void;
168
+ delete(key: K): boolean;
169
+ forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;
170
+ get(key: K): V | undefined;
171
+ has(key: K): boolean;
172
+ set(key: K, value: V): this;
173
+ readonly size: number;
174
+ }
175
+
176
+ interface MapConstructor {
177
+ new (): Map<any, any>;
178
+ new <K, V>(entries?: readonly (readonly [K, V])[] | null): Map<K, V>;
179
+ readonly prototype: Map<any, any>;
180
+ }
181
+ declare var Map: MapConstructor;
182
+
183
+ interface ReadonlyMap<K, V> {
184
+ forEach(callbackfn: (value: V, key: K, map: ReadonlyMap<K, V>) => void, thisArg?: any): void;
185
+ get(key: K): V | undefined;
186
+ has(key: K): boolean;
187
+ readonly size: number;
188
+ }
189
+
190
+ interface WeakMap<K extends WeakKey, V> {
191
+ delete(key: K): boolean;
192
+ get(key: K): V | undefined;
193
+ has(key: K): boolean;
194
+ set(key: K, value: V): this;
195
+ }
196
+
197
+ interface WeakMapConstructor {
198
+ new <K extends WeakKey = WeakKey, V = any>(entries?: readonly (readonly [K, V])[] | null): WeakMap<K, V>;
199
+ readonly prototype: WeakMap<WeakKey, any>;
200
+ }
201
+ declare var WeakMap: WeakMapConstructor;
202
+
203
+ interface Set<T> {
204
+ add(value: T): this;
205
+ clear(): void;
206
+ delete(value: T): boolean;
207
+ forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void;
208
+ has(value: T): boolean;
209
+ readonly size: number;
210
+ }
211
+
212
+ interface SetConstructor {
213
+ new <T = any>(values?: readonly T[] | null): Set<T>;
214
+ readonly prototype: Set<any>;
215
+ }
216
+ declare var Set: SetConstructor;
217
+
218
+ interface ReadonlySet<T> {
219
+ forEach(callbackfn: (value: T, value2: T, set: ReadonlySet<T>) => void, thisArg?: any): void;
220
+ has(value: T): boolean;
221
+ readonly size: number;
222
+ }
223
+
224
+ interface WeakSet<T extends WeakKey> {
225
+ add(value: T): this;
226
+ delete(value: T): boolean;
227
+ has(value: T): boolean;
228
+ }
229
+
230
+ interface WeakSetConstructor {
231
+ new <T extends WeakKey = WeakKey>(values?: readonly T[] | null): WeakSet<T>;
232
+ readonly prototype: WeakSet<WeakKey>;
233
+ }
234
+ declare var WeakSet: WeakSetConstructor;
235
+ `
236
+
237
+ const libReplacementNativeIdentitySource = `import typia from "typia";
238
+
239
+ export const createdIsProbe = typia.createIs<LibReplacementProbe>();
240
+ export const createdIsMap = typia.createIs<Map<string, number>>();
241
+ export const createdIsSet = typia.createIs<Set<string>>();
242
+ export const createdIsWeakMap = typia.createIs<WeakMap<object, string>>();
243
+ export const createdIsWeakSet = typia.createIs<WeakSet<object>>();
244
+ export const createdIsDate = typia.createIs<Date>();
245
+ export const createdIsBytes = typia.createIs<Uint8Array>();
246
+ `
247
+
248
+ const libReplacementNativeIdentityRuntimeRunner = `const validators = require("./input.cjs");
249
+
250
+ let ran = 0;
251
+ const failures = [];
252
+ const eq = (name, actual, expected) => {
253
+ ran += 1;
254
+ if (actual !== expected) {
255
+ failures.push(name + ": expected " + expected + " but got " + actual);
256
+ }
257
+ };
258
+
259
+ eq("probe structural", validators.createdIsProbe({ libReplacementMarker: "x" }), true);
260
+ eq("Map real", validators.createdIsMap(new Map([["x", 1]])), true);
261
+ eq("Map plain", validators.createdIsMap({}), false);
262
+ eq("Set real", validators.createdIsSet(new Set(["x"])), true);
263
+ eq("Set plain", validators.createdIsSet({}), false);
264
+ eq("WeakMap real", validators.createdIsWeakMap(new WeakMap()), true);
265
+ eq("WeakMap plain", validators.createdIsWeakMap({}), false);
266
+ eq("WeakSet real", validators.createdIsWeakSet(new WeakSet()), true);
267
+ eq("WeakSet plain", validators.createdIsWeakSet({}), false);
268
+ eq("Date real", validators.createdIsDate(new Date()), true);
269
+ eq("Date plain", validators.createdIsDate({}), false);
270
+ eq("Uint8Array real", validators.createdIsBytes(new Uint8Array(1)), true);
271
+ eq("Uint8Array plain", validators.createdIsBytes({}), false);
272
+
273
+ console.log("RAN " + ran + " REPLACEMENT CASES");
274
+ if (failures.length !== 0) {
275
+ throw new Error("MISMATCHES:\n" + failures.join("\n"));
276
+ }
277
+ `
@@ -74,6 +74,7 @@ func jsVersion(this js.Value, args []js.Value) any {
74
74
  // file?: string, // absolute path of the .ts file to rewrite. Omit
75
75
  // // for project-wide JSON output.
76
76
  // output?: "ts"|"js",
77
+ // "plugins-json"?: string, // ttsc's resolved plugin manifest; see buildArgs
77
78
  // }
78
79
  //
79
80
  // JS output: Promise<{ code: number, stdout: string, stderr: string }>.
@@ -154,9 +155,11 @@ func transformArgs(opts js.Value) []string {
154
155
  } else {
155
156
  out = append(out, "--output=ts")
156
157
  }
157
- return out
158
+ return append(out, pluginsJSONArgs(opts)...)
158
159
  }
159
160
 
161
+ // buildArgs renders the JS options object into `runBuild`'s argv. Input mirrors
162
+ // jsTransform but carries `outDir`/`emit`/`noEmit` instead of `file`/`output`.
160
163
  func buildArgs(opts js.Value) []string {
161
164
  out := []string{}
162
165
  if v := stringProp(opts, "cwd"); v != "" {
@@ -176,7 +179,23 @@ func buildArgs(opts js.Value) []string {
176
179
  if boolProp(opts, "noEmit") {
177
180
  out = append(out, "--noEmit")
178
181
  }
179
- return out
182
+ return append(out, pluginsJSONArgs(opts)...)
183
+ }
184
+
185
+ // pluginsJSONArgs forwards ttsc's resolved plugin manifest, when the caller
186
+ // supplied one.
187
+ //
188
+ // typia's options come from the entry its host resolved and handed it, never
189
+ // from re-reading tsconfig.json (samchon/typia#1887). A JS host driving this
190
+ // wasm is that host: it owns the virtual filesystem the tsconfig lives in, so it
191
+ // is the one that knows the resolved entry. Without this pass-through the wasm
192
+ // could only ever run typia at its defaults, because there would be no channel
193
+ // left to state anything else.
194
+ func pluginsJSONArgs(opts js.Value) []string {
195
+ if v := stringProp(opts, "plugins-json"); v != "" {
196
+ return []string{"--plugins-json=" + v}
197
+ }
198
+ return nil
180
199
  }
181
200
 
182
201
  func runWithCapturedIO(task func() int) any {