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,151 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "strings"
7
+ "testing"
8
+ )
9
+
10
+ // TestJsonApplicationAliasFunctionValidation verifies that a function property
11
+ // written through a `type` alias reaches the same #2195 guards as an inline one.
12
+ //
13
+ // `json.application` keeps the alias on the property value it validates but
14
+ // unaliases the one it emits, so before #2216 the two disagreed: `Validate` read
15
+ // `p.Value.Functions` (empty for an aliased member) and skipped every per-function
16
+ // check, while `WriteApplication` unaliased and silently dropped the malformed
17
+ // function. The mirror case rejected a valid aliased application with a spurious
18
+ // "must have at least a function type." This pins both directions.
19
+ //
20
+ // 1. Reject an aliased union / optional / nullable function with its exact
21
+ // #2195 diagnostic, matching the inline sibling fixtures.
22
+ // 2. Accept an aliased required single function (direct and through a deep
23
+ // alias chain), emitting it and reporting no "at least a function" error.
24
+ func TestJsonApplicationAliasFunctionValidation(t *testing.T) {
25
+ for _, tt := range []struct {
26
+ name string
27
+ source string
28
+ fragment string
29
+ }{
30
+ {
31
+ name: "alias-union",
32
+ source: `import typia from "typia";
33
+ type BadUnion = (() => number) | ((value: number) => string);
34
+ typia.json.application<{ good(): number; bad: BadUnion; }>();
35
+ `,
36
+ fragment: "JSON application's function type does not allow union type.",
37
+ },
38
+ {
39
+ name: "alias-optional",
40
+ source: `import typia from "typia";
41
+ type BadFn = () => number;
42
+ typia.json.application<{ good(): number; bad?: BadFn; }>();
43
+ `,
44
+ fragment: "JSON application's function type must be required.",
45
+ },
46
+ {
47
+ name: "alias-nullable",
48
+ source: `import typia from "typia";
49
+ type BadFn = () => number;
50
+ typia.json.application<{ good(): number; bad: BadFn | null; }>();
51
+ `,
52
+ fragment: "JSON application's function type must not be nullable.",
53
+ },
54
+ } {
55
+ jsonApplicationAliasExpectDiagnostic(t, tt.name, tt.source, tt.fragment)
56
+ }
57
+
58
+ for _, tt := range []struct {
59
+ name string
60
+ source string
61
+ function string
62
+ }{
63
+ {
64
+ name: "alias-required-single",
65
+ source: `import typia from "typia";
66
+ type GoodFn = () => number;
67
+ typia.json.application<{ only: GoodFn; }>();
68
+ `,
69
+ function: "only",
70
+ },
71
+ {
72
+ name: "alias-deep-chain",
73
+ source: `import typia from "typia";
74
+ type A = B;
75
+ type B = () => number;
76
+ typia.json.application<{ deep: A; }>();
77
+ `,
78
+ function: "deep",
79
+ },
80
+ } {
81
+ jsonApplicationAliasExpectInclusion(t, tt.name, tt.source, tt.function)
82
+ }
83
+ }
84
+
85
+ func jsonApplicationAliasExpectDiagnostic(t *testing.T, name string, source string, fragment string) {
86
+ t.Helper()
87
+ project := jsonApplicationAliasProject(t, name, source)
88
+ _, errText, code := ttscTypiaTestCapture(func() int {
89
+ return runBuild([]string{
90
+ "--cwd", project,
91
+ "--tsconfig", "tsconfig.json",
92
+ "--emit",
93
+ "--outDir", filepath.Join(project, "dist"),
94
+ })
95
+ })
96
+ if code != 3 {
97
+ t.Fatalf("%s aliased application build should fail with code 3, got %d\nstderr=%s", name, code, errText)
98
+ }
99
+ for _, want := range []string{"error TS(typia.json.application):", fragment} {
100
+ if !strings.Contains(errText, want) {
101
+ t.Fatalf("%s aliased application diagnostic missing %q:\n%s", name, want, errText)
102
+ }
103
+ }
104
+ }
105
+
106
+ func jsonApplicationAliasExpectInclusion(t *testing.T, name string, source string, function string) {
107
+ t.Helper()
108
+ project := jsonApplicationAliasProject(t, name, source)
109
+ out, errText, code := ttscTypiaTestCapture(func() int {
110
+ return runTransform([]string{
111
+ "--cwd", project,
112
+ "--tsconfig", "tsconfig.json",
113
+ "--file", "src/main.ts",
114
+ "--output", "js",
115
+ })
116
+ })
117
+ if code != 0 {
118
+ t.Fatalf("%s valid aliased application should transform, got code %d\nstderr=%s", name, code, errText)
119
+ }
120
+ if !strings.Contains(out, `name: "`+function+`"`) {
121
+ t.Fatalf("%s valid aliased application dropped its function %q:\n%s", name, function, out)
122
+ }
123
+ if strings.Contains(out, "at least a function") {
124
+ t.Fatalf("%s valid aliased application reported a spurious empty-application error:\n%s", name, out)
125
+ }
126
+ }
127
+
128
+ func jsonApplicationAliasProject(t *testing.T, name string, source string) string {
129
+ t.Helper()
130
+ root := ttscTypiaTestRepoRoot(t)
131
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
132
+ if err := os.MkdirAll(base, 0o755); err != nil {
133
+ t.Fatalf("mkdir temp base: %v", err)
134
+ }
135
+ dir, err := os.MkdirTemp(base, "json-application-alias-"+name+"-")
136
+ if err != nil {
137
+ t.Fatalf("create temp fixture: %v", err)
138
+ }
139
+ t.Cleanup(func() { _ = os.RemoveAll(dir) })
140
+ src := filepath.Join(dir, "src")
141
+ if err := os.MkdirAll(src, 0o755); err != nil {
142
+ t.Fatalf("mkdir fixture src: %v", err)
143
+ }
144
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(randomRecursiveMinItemsTSConfig), 0o644); err != nil {
145
+ t.Fatalf("write tsconfig: %v", err)
146
+ }
147
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(source), 0o644); err != nil {
148
+ t.Fatalf("write source: %v", err)
149
+ }
150
+ return dir
151
+ }
@@ -0,0 +1,198 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestJsonIsStringifyFiniteNumberTransform pins json.isStringify against a bare
12
+ // number leaf so a non-finite value cannot leak into the serialized text (#2196).
13
+ //
14
+ // json.isStringify forces Options.Finite on its inner `__is` guard precisely to
15
+ // keep NaN and Infinity out of JSON. Because `is` dropped `finite`, that guard
16
+ // accepted NaN, so `__is(input) ? __stringify(input) : null` serialized the input
17
+ // instead of returning the top-level null it owes an invalid value. Both option
18
+ // rows reproduce a distinct failure the fix must close:
19
+ //
20
+ // - default options: the validated stringify folds the number through
21
+ // _jsonStringifyNumber, so NaN silently became `{"value":null}` -- an accepted
22
+ // invalid input rather than a rejected one.
23
+ // - finite:true: the validated stringify emits raw `String(input)` for the
24
+ // number, so NaN became the literal `{"value":NaN}` token -- invalid JSON that
25
+ // JSON.parse throws on. This is the corruption hole the guard closes.
26
+ //
27
+ // 1. Transform a `json.isStringify<{ value: number }>` fixture per option row.
28
+ // 2. Execute the emitted serializer in Node.
29
+ // 3. Require a finite value to serialize and NaN/Infinity/-Infinity to yield null.
30
+ func TestJsonIsStringifyFiniteNumberTransform(t *testing.T) {
31
+ for _, tc := range jsonIsStringifyFiniteNumberCases() {
32
+ t.Run(tc.name, func(t *testing.T) {
33
+ project := jsonIsStringifyFiniteNumberProject(t)
34
+ js := jsonIsStringifyFiniteNumberTransform(t, project, tc.payload)
35
+ jsonIsStringifyFiniteNumberRunRuntime(t, project, js)
36
+ })
37
+ }
38
+ }
39
+
40
+ type jsonIsStringifyFiniteNumberCase struct {
41
+ name string
42
+ payload string
43
+ }
44
+
45
+ func jsonIsStringifyFiniteNumberCases() []jsonIsStringifyFiniteNumberCase {
46
+ return []jsonIsStringifyFiniteNumberCase{
47
+ {
48
+ name: "default options",
49
+ payload: `[{"config":{"transform":"typia/lib/transform"},"name":"typia","stage":"transform"}]`,
50
+ },
51
+ {
52
+ name: "finite option on",
53
+ payload: `[{"config":{"transform":"typia/lib/transform","finite":true},"name":"typia","stage":"transform"}]`,
54
+ },
55
+ }
56
+ }
57
+
58
+ func jsonIsStringifyFiniteNumberProject(t *testing.T) string {
59
+ t.Helper()
60
+ root := ttscTypiaTestRepoRoot(t)
61
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
62
+ if err := os.MkdirAll(base, 0o755); err != nil {
63
+ t.Fatalf("mkdir temp base: %v", err)
64
+ }
65
+ dir, err := os.MkdirTemp(base, "json-is-stringify-finite-number-")
66
+ if err != nil {
67
+ t.Fatalf("create temp fixture: %v", err)
68
+ }
69
+ t.Cleanup(func() {
70
+ _ = os.RemoveAll(dir)
71
+ })
72
+ src := filepath.Join(dir, "src")
73
+ if err := os.MkdirAll(src, 0o755); err != nil {
74
+ t.Fatalf("mkdir fixture src: %v", err)
75
+ }
76
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(jsonIsStringifyFiniteNumberTSConfig), 0o644); err != nil {
77
+ t.Fatalf("write tsconfig: %v", err)
78
+ }
79
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(jsonIsStringifyFiniteNumberSource), 0o644); err != nil {
80
+ t.Fatalf("write source: %v", err)
81
+ }
82
+ return dir
83
+ }
84
+
85
+ func jsonIsStringifyFiniteNumberTransform(t *testing.T, project string, payload string) string {
86
+ t.Helper()
87
+ out, errText, code := ttscTypiaTestCapture(func() int {
88
+ return runTransform([]string{
89
+ "--cwd", project,
90
+ "--tsconfig", "tsconfig.json",
91
+ "--file", "src/main.ts",
92
+ "--output", "js",
93
+ "--plugins-json", payload,
94
+ })
95
+ })
96
+ if code != 0 {
97
+ t.Fatalf("json isStringify finite transform failed: code=%d stderr=\n%s", code, errText)
98
+ }
99
+ return out
100
+ }
101
+
102
+ func jsonIsStringifyFiniteNumberRunRuntime(t *testing.T, project string, js string) {
103
+ t.Helper()
104
+ node, err := exec.LookPath("node")
105
+ if err != nil {
106
+ t.Skip("node executable not found")
107
+ }
108
+ runtimeDir := filepath.Join(project, "runtime")
109
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
110
+ t.Fatalf("mkdir runtime dir: %v", err)
111
+ }
112
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
113
+ stubs := map[string]string{
114
+ "json-stringify-number-stub.cjs": jsonIsStringifyScopedCheckerNumberStub,
115
+ "json-stringify-string-stub.cjs": jsonIsStringifyScopedCheckerStringStub,
116
+ "throw-type-guard-error-stub.cjs": jsonIsStringifyScopedCheckerThrowStub,
117
+ }
118
+ for name, content := range stubs {
119
+ if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
120
+ t.Fatalf("write %s: %v", name, err)
121
+ }
122
+ }
123
+ runtimeJS := strings.ReplaceAll(js, `require("typia/lib/internal/_jsonStringifyNumber")`, `require("./json-stringify-number-stub.cjs")`)
124
+ runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_jsonStringifyString")`, `require("./json-stringify-string-stub.cjs")`)
125
+ runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_throwTypeGuardError")`, `require("./throw-type-guard-error-stub.cjs")`)
126
+ runtimeJS = ttscTypiaTestRewriteCommonJS(t, runtimeJS)
127
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
128
+ t.Fatalf("write runtime module: %v", err)
129
+ }
130
+ runner := filepath.Join(runtimeDir, "run.cjs")
131
+ if err := os.WriteFile(runner, []byte(jsonIsStringifyFiniteNumberRunner), 0o644); err != nil {
132
+ t.Fatalf("write runtime runner: %v", err)
133
+ }
134
+ cmd := exec.Command(node, runner)
135
+ cmd.Dir = runtimeDir
136
+ output, err := cmd.CombinedOutput()
137
+ if err != nil {
138
+ t.Fatalf("json isStringify finite runtime failed: %v\n%s", err, output)
139
+ }
140
+ const expected = "RAN 4 CASES"
141
+ if !strings.Contains(string(output), expected) {
142
+ t.Fatalf("json isStringify finite runner did not report %q; got:\n%s", expected, output)
143
+ }
144
+ }
145
+
146
+ const jsonIsStringifyFiniteNumberTSConfig = `{
147
+ "compilerOptions": {
148
+ "target": "ES2022",
149
+ "module": "commonjs",
150
+ "moduleResolution": "bundler",
151
+ "ignoreDeprecations": "6.0",
152
+ "types": ["*"],
153
+ "esModuleInterop": true,
154
+ "strict": true,
155
+ "skipLibCheck": true
156
+ },
157
+ "include": ["src"]
158
+ }
159
+ `
160
+
161
+ const jsonIsStringifyFiniteNumberSource = `import typia from "typia";
162
+
163
+ interface Box {
164
+ value: number;
165
+ }
166
+
167
+ export const stringify = (input: unknown): string | null =>
168
+ typia.json.isStringify<Box>(input);
169
+ `
170
+
171
+ const jsonIsStringifyFiniteNumberRunner = `const mod = require("./main.cjs");
172
+
173
+ const finite = mod.stringify({ value: 1 });
174
+ if (finite === null) {
175
+ throw new Error("json.isStringify rejected a finite number");
176
+ }
177
+ const parsed = JSON.parse(finite);
178
+ if (parsed.value !== 1) {
179
+ throw new Error("json.isStringify serialized the wrong value: " + finite);
180
+ }
181
+
182
+ let ran = 1;
183
+ for (const [name, value] of [
184
+ ["NaN", Number.NaN],
185
+ ["Infinity", Number.POSITIVE_INFINITY],
186
+ ["-Infinity", Number.NEGATIVE_INFINITY],
187
+ ]) {
188
+ const out = mod.stringify({ value });
189
+ ran += 1;
190
+ if (out !== null) {
191
+ throw new Error(
192
+ name + " leaked into json.isStringify output instead of null: " + JSON.stringify(out),
193
+ );
194
+ }
195
+ }
196
+
197
+ console.log("RAN " + ran + " CASES");
198
+ `
@@ -0,0 +1,246 @@
1
+ package main
2
+
3
+ import (
4
+ "bytes"
5
+ "crypto/sha256"
6
+ "os"
7
+ "os/exec"
8
+ "path/filepath"
9
+ "testing"
10
+ )
11
+
12
+ // TestJsonSchemaDynamicKeyDeterminismTransform verifies dynamic-key schemas emit deterministically.
13
+ //
14
+ // Multiple template and numeric index signatures used to reach a Go map before
15
+ // their value metadata was merged. Repeating one unchanged transform therefore
16
+ // has to compare the complete output bytes, while runtime checks ensure a stable
17
+ // order is not achieved by losing, duplicating, or broadening schema branches.
18
+ //
19
+ // 1. Transform unchanged tag-free dynamic-key fixtures repeatedly to TypeScript and JavaScript.
20
+ // 2. Require every complete emit to match the first emit byte for byte.
21
+ // 3. Execute the JavaScript and assert branch completeness plus unrelated ordering controls.
22
+ func TestJsonSchemaDynamicKeyDeterminismTransform(t *testing.T) {
23
+ project := jsonSchemaDynamicKeyDeterminismProject(t)
24
+ var javascript string
25
+ for _, output := range []string{"ts", "js"} {
26
+ baseline := jsonSchemaDynamicKeyDeterminismTransform(t, project, output)
27
+ for iteration := 1; iteration < 32; iteration++ {
28
+ current := jsonSchemaDynamicKeyDeterminismTransform(t, project, output)
29
+ if bytes.Equal([]byte(current), []byte(baseline)) == false {
30
+ t.Fatalf(
31
+ "%s emit %d changed for unchanged input: baseline=%x current=%x first-difference=%d",
32
+ output,
33
+ iteration+1,
34
+ sha256.Sum256([]byte(baseline)),
35
+ sha256.Sum256([]byte(current)),
36
+ jsonSchemaDynamicKeyDeterminismFirstDifference(baseline, current),
37
+ )
38
+ }
39
+ }
40
+ t.Logf("%s emit remained byte-identical across 32 transforms: sha256=%x", output, sha256.Sum256([]byte(baseline)))
41
+ if output == "js" {
42
+ javascript = baseline
43
+ }
44
+ }
45
+ jsonSchemaDynamicKeyDeterminismRunRuntimeCases(t, project, javascript)
46
+ }
47
+
48
+ func jsonSchemaDynamicKeyDeterminismProject(t *testing.T) string {
49
+ t.Helper()
50
+ root := ttscTypiaTestRepoRoot(t)
51
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
52
+ if err := os.MkdirAll(base, 0o755); err != nil {
53
+ t.Fatalf("mkdir temp base: %v", err)
54
+ }
55
+ dir, err := os.MkdirTemp(base, "json-schema-dynamic-key-determinism-")
56
+ if err != nil {
57
+ t.Fatalf("create temp fixture: %v", err)
58
+ }
59
+ t.Cleanup(func() {
60
+ _ = os.RemoveAll(dir)
61
+ })
62
+ src := filepath.Join(dir, "src")
63
+ if err := os.MkdirAll(src, 0o755); err != nil {
64
+ t.Fatalf("mkdir fixture src: %v", err)
65
+ }
66
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(jsonSchemaDynamicKeyDeterminismTSConfig), 0o644); err != nil {
67
+ t.Fatalf("write tsconfig: %v", err)
68
+ }
69
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(jsonSchemaDynamicKeyDeterminismSource), 0o644); err != nil {
70
+ t.Fatalf("write source: %v", err)
71
+ }
72
+ return dir
73
+ }
74
+
75
+ func jsonSchemaDynamicKeyDeterminismTransform(t *testing.T, project string, output string) string {
76
+ t.Helper()
77
+ out, errText, code := ttscTypiaTestCapture(func() int {
78
+ return runTransform([]string{
79
+ "--cwd", project,
80
+ "--tsconfig", "tsconfig.json",
81
+ "--file", "src/main.ts",
82
+ "--output", output,
83
+ })
84
+ })
85
+ if code != 0 {
86
+ t.Fatalf("dynamic-key schema transform failed: output=%s code=%d stderr=\n%s", output, code, errText)
87
+ }
88
+ return out
89
+ }
90
+
91
+ func jsonSchemaDynamicKeyDeterminismFirstDifference(x string, y string) int {
92
+ limit := len(x)
93
+ if len(y) < limit {
94
+ limit = len(y)
95
+ }
96
+ for i := 0; i < limit; i++ {
97
+ if x[i] != y[i] {
98
+ return i
99
+ }
100
+ }
101
+ return limit
102
+ }
103
+
104
+ func jsonSchemaDynamicKeyDeterminismRunRuntimeCases(t *testing.T, project string, javascript string) {
105
+ t.Helper()
106
+ node, err := exec.LookPath("node")
107
+ if err != nil {
108
+ t.Skip("node executable not found")
109
+ }
110
+ runtimeDir := filepath.Join(project, "runtime")
111
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
112
+ t.Fatalf("mkdir runtime dir: %v", err)
113
+ }
114
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
115
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, javascript)
116
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
117
+ t.Fatalf("write runtime module: %v", err)
118
+ }
119
+ runner := filepath.Join(runtimeDir, "run.cjs")
120
+ if err := os.WriteFile(runner, []byte(jsonSchemaDynamicKeyDeterminismRuntimeRunner), 0o644); err != nil {
121
+ t.Fatalf("write runtime runner: %v", err)
122
+ }
123
+ cmd := exec.Command(node, runner)
124
+ cmd.Dir = runtimeDir
125
+ output, err := cmd.CombinedOutput()
126
+ if err != nil {
127
+ t.Fatalf("dynamic-key schema runtime cases failed: %v\n%s", err, output)
128
+ }
129
+ }
130
+
131
+ const jsonSchemaDynamicKeyDeterminismTSConfig = `{
132
+ "compilerOptions": {
133
+ "target": "ES2022",
134
+ "module": "commonjs",
135
+ "moduleResolution": "bundler",
136
+ "ignoreDeprecations": "6.0",
137
+ "types": ["*"],
138
+ "esModuleInterop": true,
139
+ "strict": true,
140
+ "skipLibCheck": true
141
+ },
142
+ "include": ["src"]
143
+ }
144
+ `
145
+
146
+ const jsonSchemaDynamicKeyDeterminismSource = `import typia from "typia";
147
+
148
+ interface DynamicComposite {
149
+ id: string;
150
+ name: string;
151
+ [index: number]: number;
152
+ [key: ` + "`prefix_${string}`" + `]: string;
153
+ [key: ` + "`${string}_postfix`" + `]: string;
154
+ [key: ` + "`value_${number}`" + `]: boolean | string | number;
155
+ [key: ` + "`between_${string}_and_${number}`" + `]: boolean;
156
+ }
157
+
158
+ interface DynamicTemplate {
159
+ [key: ` + "`prefix_${string}`" + `]: string;
160
+ [key: ` + "`${string}_postfix`" + `]: string;
161
+ [key: ` + "`value_${number}`" + `]: number;
162
+ [key: ` + "`between_${string}_and_${number}`" + `]: boolean;
163
+ }
164
+
165
+ interface DynamicUnion {
166
+ [key: number | ` + "`prefix_${string}`" + ` | ` + "`${string}_postfix`" + `]: string;
167
+ [key: ` + "`value_between_${number}_and_${number}`" + `]: number;
168
+ }
169
+
170
+ interface LiteralOnly {
171
+ z: string;
172
+ a: number;
173
+ }
174
+
175
+ interface SingleDynamic {
176
+ [key: ` + "`only_${string}`" + `]: string;
177
+ }
178
+
179
+ type OrdinaryUnion = string | number;
180
+
181
+ export const schemas = typia.json.schemas<[
182
+ DynamicComposite,
183
+ DynamicTemplate,
184
+ DynamicUnion,
185
+ LiteralOnly,
186
+ SingleDynamic,
187
+ OrdinaryUnion,
188
+ ]>();
189
+ `
190
+
191
+ const jsonSchemaDynamicKeyDeterminismRuntimeRunner = `const unit = require("./main.cjs").schemas;
192
+
193
+ const components = unit.components?.schemas ?? {};
194
+ const assertTypes = (name, expected) => {
195
+ const additional = components[name]?.additionalProperties;
196
+ const actual = Array.isArray(additional?.oneOf)
197
+ ? additional.oneOf.map((schema) => schema.type)
198
+ : [additional?.type];
199
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) {
200
+ throw new Error(name + " branches were " + JSON.stringify(actual) + ", expected " + JSON.stringify(expected));
201
+ }
202
+ };
203
+
204
+ assertTypes("DynamicComposite", ["number", "string", "boolean"]);
205
+ assertTypes("DynamicTemplate", ["string", "number", "boolean"]);
206
+ assertTypes("DynamicUnion", ["string", "number"]);
207
+
208
+ const literal = components.LiteralOnly;
209
+ const literalShape = {
210
+ type: literal?.type,
211
+ propertyKeys: Object.keys(literal?.properties ?? {}),
212
+ propertyTypes: Object.values(literal?.properties ?? {}).map((schema) => schema.type),
213
+ required: literal?.required,
214
+ additionalProperties: literal?.additionalProperties,
215
+ };
216
+ const expectedLiteralShape = {
217
+ type: "object",
218
+ propertyKeys: ["z", "a"],
219
+ propertyTypes: ["string", "number"],
220
+ required: ["z", "a"],
221
+ additionalProperties: false,
222
+ };
223
+ if (JSON.stringify(literalShape) !== JSON.stringify(expectedLiteralShape)) {
224
+ throw new Error("zero-dynamic literal schema changed: " + JSON.stringify(literalShape));
225
+ }
226
+ if (components.SingleDynamic?.additionalProperties?.type !== "string") {
227
+ throw new Error("single dynamic-key schema changed: " + JSON.stringify(components.SingleDynamic));
228
+ }
229
+ const ordinaryTypes = components.OrdinaryUnion?.oneOf?.map((schema) => schema.type) ?? [];
230
+ if (JSON.stringify(ordinaryTypes) !== JSON.stringify(["string", "number"])) {
231
+ throw new Error("ordinary union branches changed: " + JSON.stringify(ordinaryTypes));
232
+ }
233
+
234
+ const refs = unit.schemas.map((schema) => schema.$ref);
235
+ const expectedRefs = [
236
+ "#/components/schemas/DynamicComposite",
237
+ "#/components/schemas/DynamicTemplate",
238
+ "#/components/schemas/DynamicUnion",
239
+ "#/components/schemas/LiteralOnly",
240
+ "#/components/schemas/SingleDynamic",
241
+ "#/components/schemas/OrdinaryUnion",
242
+ ];
243
+ if (JSON.stringify(refs) !== JSON.stringify(expectedRefs)) {
244
+ throw new Error("schema order changed: " + JSON.stringify(refs));
245
+ }
246
+ `