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,556 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "os"
6
+ "os/exec"
7
+ "path/filepath"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ // TestJsonStringifyContextualUndefinedTransform pins every json stringify family
13
+ // against ECMAScript JSON.stringify wherever a child serialization evaluates to
14
+ // JavaScript undefined (#2253).
15
+ //
16
+ // A child can serialize to undefined while the value itself is present: `any`
17
+ // and `unknown` delegate to JSON.stringify, which answers undefined for a
18
+ // function, a symbol, and a toJSON that returns undefined; a property typed
19
+ // `undefined` has nothing to serialize; and an array hole reads as undefined at
20
+ // any element type. The object joiner decided omission from a test on the input
21
+ // and the array joiner joined the mapped results, so those children concatenated
22
+ // the token `undefined` into a static property, produced `{"k":undefined}` for a
23
+ // dynamic one, and left an empty array slot - text that fails JSON.parse, which
24
+ // the is/assert/validate families then reported as success.
25
+ //
26
+ // 1. Transform one fixture that exports the direct and factory forms of
27
+ // stringify, isStringify, assertStringify, and validateStringify for `any`
28
+ // and `unknown` in static, optional, dynamic, array, tuple, rest, and nested
29
+ // positions, plus the toJSON, sparse-array, and typed controls beside them.
30
+ // 2. Execute the emitted serializers in Node and compare every success payload
31
+ // with native JSON.stringify of the same input, parsing both so the
32
+ // comparison is contextual equivalence rather than the current emit.
33
+ // 3. Require the guarded families to reject each one-axis invalid twin, run the
34
+ // whole matrix again under `undefined: false`, and report the exact executed
35
+ // case count so a runner that silently skipped cells cannot pass as green.
36
+ func TestJsonStringifyContextualUndefinedTransform(t *testing.T) {
37
+ for _, row := range jsonStringifyContextualUndefinedRows() {
38
+ t.Run(row.name, func(t *testing.T) {
39
+ project := jsonStringifyContextualUndefinedProject(t)
40
+ js := jsonStringifyContextualUndefinedTransform(t, project, row.payload())
41
+ jsonStringifyContextualUndefinedRunRuntime(t, project, js, row)
42
+ })
43
+ }
44
+ }
45
+
46
+ type jsonStringifyContextualUndefinedRow struct {
47
+ name string
48
+ // config is the JSON fragment appended to typia's resolved plugin entry.
49
+ config string
50
+ // strict marks the row where `undefined: false` makes the checkers reject an
51
+ // explicitly undefined optional property. The serialized text of everything
52
+ // the checkers still accept must not move.
53
+ strict bool
54
+ }
55
+
56
+ func (row jsonStringifyContextualUndefinedRow) payload() string {
57
+ return `[{"config":{"transform":"typia/lib/transform"` + row.config + `},"name":"typia","stage":"transform"}]`
58
+ }
59
+
60
+ func jsonStringifyContextualUndefinedRows() []jsonStringifyContextualUndefinedRow {
61
+ return []jsonStringifyContextualUndefinedRow{
62
+ {name: "default options", config: ``, strict: false},
63
+ {name: "undefined false", config: `,"undefined":false`, strict: true},
64
+ }
65
+ }
66
+
67
+ // jsonStringifyContextualUndefinedTypes names every fixture type the runner
68
+ // drives. The Go side owns the list so the exported symbol names and the
69
+ // runner's lookup keys cannot drift apart.
70
+ var jsonStringifyContextualUndefinedTypes = []struct{ Key, TS string }{
71
+ {"anyProperty", "IAnyProperty"},
72
+ {"unknownProperty", "IUnknownProperty"},
73
+ {"undefinedProperty", "IUndefinedProperty"},
74
+ {"optionalAny", "IOptionalAny"},
75
+ {"recordAny", "IRecordAny"},
76
+ {"recordUnknown", "IRecordUnknown"},
77
+ {"mixedRecord", "IMixedRecord"},
78
+ {"anyArray", "IAnyArray"},
79
+ {"unknownArray", "IUnknownArray"},
80
+ {"numberArray", "INumberArray"},
81
+ {"tuple", "ITuple"},
82
+ {"restTuple", "IRestTuple"},
83
+ {"nested", "INested"},
84
+ {"jsonableProperty", "IJsonableProperty"},
85
+ {"maybeJsonableProperty", "IMaybeJsonableProperty"},
86
+ }
87
+
88
+ func jsonStringifyContextualUndefinedProject(t *testing.T) string {
89
+ t.Helper()
90
+ root := ttscTypiaTestRepoRoot(t)
91
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
92
+ if err := os.MkdirAll(base, 0o755); err != nil {
93
+ t.Fatalf("mkdir temp base: %v", err)
94
+ }
95
+ dir, err := os.MkdirTemp(base, "json-stringify-contextual-undefined-")
96
+ if err != nil {
97
+ t.Fatalf("create temp fixture: %v", err)
98
+ }
99
+ t.Cleanup(func() {
100
+ _ = os.RemoveAll(dir)
101
+ })
102
+ src := filepath.Join(dir, "src")
103
+ if err := os.MkdirAll(src, 0o755); err != nil {
104
+ t.Fatalf("mkdir fixture src: %v", err)
105
+ }
106
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(jsonStringifyContextualUndefinedTSConfig), 0o644); err != nil {
107
+ t.Fatalf("write tsconfig: %v", err)
108
+ }
109
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(jsonStringifyContextualUndefinedSource()), 0o644); err != nil {
110
+ t.Fatalf("write source: %v", err)
111
+ }
112
+ return dir
113
+ }
114
+
115
+ func jsonStringifyContextualUndefinedTransform(t *testing.T, project string, payload string) string {
116
+ t.Helper()
117
+ out, errText, code := ttscTypiaTestCapture(func() int {
118
+ return runTransform([]string{
119
+ "--cwd", project,
120
+ "--tsconfig", "tsconfig.json",
121
+ "--file", "src/main.ts",
122
+ "--output", "js",
123
+ "--plugins-json", payload,
124
+ })
125
+ })
126
+ if code != 0 {
127
+ t.Fatalf("json stringify contextual-undefined transform failed: code=%d stderr=\n%s", code, errText)
128
+ }
129
+ return out
130
+ }
131
+
132
+ func jsonStringifyContextualUndefinedRunRuntime(t *testing.T, project string, js string, row jsonStringifyContextualUndefinedRow) {
133
+ t.Helper()
134
+ node, err := exec.LookPath("node")
135
+ if err != nil {
136
+ t.Skip("node executable not found")
137
+ }
138
+ runtimeDir := filepath.Join(project, "runtime-"+strings.ReplaceAll(row.name, " ", "-"))
139
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
140
+ t.Fatalf("mkdir runtime dir: %v", err)
141
+ }
142
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
143
+ stubs := map[string]string{
144
+ "json-stringify-number-stub.cjs": jsonStringifyContextualUndefinedNumberStub,
145
+ "json-stringify-string-stub.cjs": jsonStringifyContextualUndefinedStringStub,
146
+ "json-stringify-tail-stub.cjs": jsonStringifyContextualUndefinedTailStub,
147
+ "json-stringify-rest-stub.cjs": jsonStringifyContextualUndefinedRestStub,
148
+ "throw-type-guard-error-stub.cjs": jsonStringifyContextualUndefinedThrowStub,
149
+ }
150
+ for name, content := range stubs {
151
+ if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
152
+ t.Fatalf("write %s: %v", name, err)
153
+ }
154
+ }
155
+ runtimeJS := js
156
+ for from, to := range map[string]string{
157
+ `require("typia/lib/internal/_jsonStringifyNumber")`: `require("./json-stringify-number-stub.cjs")`,
158
+ `require("typia/lib/internal/_jsonStringifyString")`: `require("./json-stringify-string-stub.cjs")`,
159
+ `require("typia/lib/internal/_jsonStringifyTail")`: `require("./json-stringify-tail-stub.cjs")`,
160
+ `require("typia/lib/internal/_jsonStringifyRest")`: `require("./json-stringify-rest-stub.cjs")`,
161
+ `require("typia/lib/internal/_throwTypeGuardError")`: `require("./throw-type-guard-error-stub.cjs")`,
162
+ } {
163
+ runtimeJS = strings.ReplaceAll(runtimeJS, from, to)
164
+ }
165
+ runtimeJS = ttscTypiaTestRewriteCommonJS(t, runtimeJS)
166
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
167
+ t.Fatalf("write runtime module: %v", err)
168
+ }
169
+ runner := filepath.Join(runtimeDir, "run.cjs")
170
+ prelude := fmt.Sprintf("const STRICT_UNDEFINED = %v;\n", row.strict)
171
+ if err := os.WriteFile(runner, []byte(prelude+jsonStringifyContextualUndefinedRunner), 0o644); err != nil {
172
+ t.Fatalf("write runtime runner: %v", err)
173
+ }
174
+ cmd := exec.Command(node, runner)
175
+ cmd.Dir = runtimeDir
176
+ output, err := cmd.CombinedOutput()
177
+ if err != nil {
178
+ t.Fatalf("json stringify contextual-undefined runtime failed (%s): %v\n%s", row.name, err, output)
179
+ }
180
+ // The count is asserted rather than the exit code so a row that silently stops
181
+ // running cannot pass as a row that ran and agreed with the oracle. 59 value
182
+ // rows x 6 executions each: direct and factory forms across stringify,
183
+ // isStringify, assertStringify, and validateStringify, minus the two guarded
184
+ // entry points for rows whose contract is rejection.
185
+ const expected = "RAN 354 CASES"
186
+ if !strings.Contains(string(output), expected) {
187
+ t.Fatalf("json stringify contextual-undefined runner did not report %q (%s); got:\n%s", expected, row.name, output)
188
+ }
189
+ }
190
+
191
+ const jsonStringifyContextualUndefinedTSConfig = `{
192
+ "compilerOptions": {
193
+ "target": "ES2022",
194
+ "module": "commonjs",
195
+ "moduleResolution": "bundler",
196
+ "ignoreDeprecations": "6.0",
197
+ "types": ["*"],
198
+ "esModuleInterop": true,
199
+ "strict": true,
200
+ "skipLibCheck": true
201
+ },
202
+ "include": ["src"]
203
+ }
204
+ `
205
+
206
+ const jsonStringifyContextualUndefinedDeclarations = `import typia from "typia";
207
+
208
+ interface IAnyProperty {
209
+ keep: number;
210
+ value: any;
211
+ }
212
+ interface IUnknownProperty {
213
+ keep: number;
214
+ value: unknown;
215
+ }
216
+ interface IUndefinedProperty {
217
+ keep: number;
218
+ value: undefined;
219
+ }
220
+ interface IOptionalAny {
221
+ keep: number;
222
+ value?: any;
223
+ }
224
+ type IRecordAny = Record<string, any>;
225
+ type IRecordUnknown = Record<string, unknown>;
226
+ interface IMixedRecord {
227
+ keep: number;
228
+ [key: string]: any;
229
+ }
230
+ type IAnyArray = any[];
231
+ type IUnknownArray = unknown[];
232
+ type INumberArray = number[];
233
+ type ITuple = [any, unknown, number];
234
+ type IRestTuple = [number, ...any[]];
235
+ interface INested {
236
+ outer: { inner: any }[];
237
+ }
238
+ interface IJsonable {
239
+ toJSON(): string;
240
+ }
241
+ interface IMaybeJsonable {
242
+ toJSON(): string | undefined;
243
+ }
244
+ interface IJsonableProperty {
245
+ keep: number;
246
+ value: IJsonable;
247
+ }
248
+ interface IMaybeJsonableProperty {
249
+ keep: number;
250
+ value: IMaybeJsonable;
251
+ }
252
+
253
+ `
254
+
255
+ // jsonStringifyContextualUndefinedSource emits the direct and factory form of
256
+ // all four stringify families for every fixture type, so one transform covers
257
+ // the whole family x form axis of the matrix.
258
+ func jsonStringifyContextualUndefinedSource() string {
259
+ var builder strings.Builder
260
+ builder.WriteString(jsonStringifyContextualUndefinedDeclarations)
261
+ for _, entry := range jsonStringifyContextualUndefinedTypes {
262
+ for _, family := range []string{"stringify", "isStringify", "assertStringify", "validateStringify"} {
263
+ creator := "create" + strings.ToUpper(family[:1]) + family[1:]
264
+ fmt.Fprintf(
265
+ &builder,
266
+ "export const factory_%s_%s = typia.json.%s<%s>();\n",
267
+ family, entry.Key, creator, entry.TS,
268
+ )
269
+ fmt.Fprintf(
270
+ &builder,
271
+ "export const direct_%s_%s = (input: %s) => typia.json.%s<%s>(input);\n",
272
+ family, entry.Key, entry.TS, family, entry.TS,
273
+ )
274
+ }
275
+ builder.WriteString("\n")
276
+ }
277
+ return builder.String()
278
+ }
279
+
280
+ const jsonStringifyContextualUndefinedNumberStub = `module.exports._jsonStringifyNumber = (value) => (Number.isFinite(value) ? value : null);
281
+ `
282
+
283
+ const jsonStringifyContextualUndefinedStringStub = `module.exports._jsonStringifyString = (value) => JSON.stringify(value);
284
+ `
285
+
286
+ // The tail and rest stubs are transcriptions of
287
+ // packages/typia/src/internal/_jsonStringifyTail.ts and _jsonStringifyRest.ts.
288
+ const jsonStringifyContextualUndefinedTailStub = `module.exports._jsonStringifyTail = (str) =>
289
+ str[str.length - 1] === "," ? str.substring(0, str.length - 1) : str;
290
+ `
291
+
292
+ const jsonStringifyContextualUndefinedRestStub = `module.exports._jsonStringifyRest = (str) =>
293
+ str.length === 2 ? "" : "," + str.substring(1, str.length - 1);
294
+ `
295
+
296
+ const jsonStringifyContextualUndefinedThrowStub = `module.exports._throwTypeGuardError = (props) => {
297
+ const error = new Error(props.expected);
298
+ Object.assign(error, props);
299
+ throw error;
300
+ };
301
+ `
302
+
303
+ const jsonStringifyContextualUndefinedRunner = `const mod = require("./main.cjs");
304
+
305
+ // deepEqual compares two JSON.parse results. Objects are compared by key set and
306
+ // value, never by text, because typia is free to order the properties it emits
307
+ // differently from ECMAScript while still producing an equivalent document.
308
+ const deepEqual = (x, y) => {
309
+ if (x === y) return true;
310
+ if (x === null || y === null) return false;
311
+ if (typeof x !== "object" || typeof y !== "object") return false;
312
+ if (Array.isArray(x) !== Array.isArray(y)) return false;
313
+ if (Array.isArray(x)) {
314
+ if (x.length !== y.length) return false;
315
+ return x.every((v, i) => deepEqual(v, y[i]));
316
+ }
317
+ const xk = Object.keys(x).sort();
318
+ const yk = Object.keys(y).sort();
319
+ if (xk.length !== yk.length) return false;
320
+ if (!xk.every((k, i) => k === yk[i])) return false;
321
+ return xk.every((k) => deepEqual(x[k], y[k]));
322
+ };
323
+
324
+ const sparse = (assign) => {
325
+ const array = [];
326
+ assign(array);
327
+ return array;
328
+ };
329
+
330
+ const CASES = [
331
+ // Static any property: every value whose serialization is undefined must
332
+ // vanish exactly the way ECMAScript drops it, and the valid neighbors beside
333
+ // it must survive.
334
+ ["anyProperty", "function value", () => ({ keep: 1, value: () => 0 })],
335
+ ["anyProperty", "symbol value", () => ({ keep: 1, value: Symbol("s") })],
336
+ ["anyProperty", "undefined value", () => ({ keep: 1, value: undefined })],
337
+ ["anyProperty", "null value", () => ({ keep: 1, value: null })],
338
+ ["anyProperty", "number value", () => ({ keep: 1, value: 2 })],
339
+ ["anyProperty", "nested function member", () => ({
340
+ keep: 1,
341
+ value: { a: 1, b: () => 0, c: Symbol("x"), d: undefined },
342
+ })],
343
+ ["anyProperty", "nested array member", () => ({
344
+ keep: 1,
345
+ value: [() => 0, 1, Symbol("y"), undefined],
346
+ })],
347
+ ["anyProperty", "toJSON returning undefined", () => ({
348
+ keep: 1,
349
+ value: { toJSON: () => undefined },
350
+ })],
351
+ ["anyProperty", "toJSON returning a value", () => ({
352
+ keep: 1,
353
+ value: { toJSON: () => 3 },
354
+ })],
355
+ ["anyProperty", "invalid keep twin", () => ({ keep: "x", value: 1 }), "reject"],
356
+
357
+ // unknown must behave exactly like any.
358
+ ["unknownProperty", "function value", () => ({ keep: 1, value: () => 0 })],
359
+ ["unknownProperty", "symbol value", () => ({ keep: 1, value: Symbol("s") })],
360
+ ["unknownProperty", "undefined value", () => ({ keep: 1, value: undefined })],
361
+ ["unknownProperty", "number value", () => ({ keep: 1, value: 2 })],
362
+ ["unknownProperty", "invalid keep twin", () => ({ keep: "x", value: 1 }), "reject"],
363
+
364
+ // A required property typed undefined has nothing to serialize at all.
365
+ ["undefinedProperty", "undefined value", () => ({ keep: 1, value: undefined })],
366
+
367
+ // Optional any: absent, explicitly undefined, and present.
368
+ ["optionalAny", "absent", () => ({ keep: 1 })],
369
+ ["optionalAny", "explicit undefined", () => ({ keep: 1, value: undefined }), "strictReject"],
370
+ ["optionalAny", "function value", () => ({ keep: 1, value: () => 0 })],
371
+ ["optionalAny", "number value", () => ({ keep: 1, value: 2 })],
372
+
373
+ // Dynamic (index signature) properties.
374
+ ["recordAny", "mixed omitted and kept", () => ({
375
+ keep: 1,
376
+ omit: () => 0,
377
+ sym: Symbol("s"),
378
+ nil: null,
379
+ undef: undefined,
380
+ })],
381
+ ["recordAny", "every entry omitted", () => ({ omit: () => 0, sym: Symbol("s") })],
382
+ ["recordAny", "empty object", () => ({})],
383
+ ["recordUnknown", "mixed omitted and kept", () => ({
384
+ keep: 1,
385
+ omit: () => 0,
386
+ sym: Symbol("s"),
387
+ nil: null,
388
+ })],
389
+ ["mixedRecord", "static neighbor with omitted dynamic", () => ({
390
+ keep: 1,
391
+ omit: () => 0,
392
+ sym: Symbol("s"),
393
+ nil: null,
394
+ })],
395
+ ["mixedRecord", "static neighbor only", () => ({ keep: 1 })],
396
+
397
+ // Arrays: a serialization of undefined is null in array context, and a hole
398
+ // reads as undefined at every element type.
399
+ ["anyArray", "leading function", () => [() => 0, 1]],
400
+ ["anyArray", "all element kinds", () => [() => 0, 1, Symbol("s"), undefined, null]],
401
+ ["anyArray", "single function", () => [() => 0]],
402
+ ["anyArray", "empty", () => []],
403
+ ["anyArray", "sparse tail", () => sparse((a) => {
404
+ a[0] = 1;
405
+ a[3] = 4;
406
+ })],
407
+ ["unknownArray", "leading function", () => [() => 0, 1]],
408
+ ["numberArray", "dense control", () => [1, 2, 3]],
409
+ ["numberArray", "sparse leading holes", () => sparse((a) => {
410
+ a[2] = 3;
411
+ })],
412
+
413
+ // Tuples and rest tuples.
414
+ ["tuple", "function and symbol elements", () => [() => 0, Symbol("s"), 1]],
415
+ ["tuple", "undefined elements", () => [undefined, undefined, 1]],
416
+ ["tuple", "valid control", () => [1, 2, 3]],
417
+ ["tuple", "invalid last element twin", () => [1, 2, "x"], "reject"],
418
+ ["restTuple", "function inside rest", () => [1, () => 0, 2]],
419
+ ["restTuple", "empty rest", () => [1]],
420
+
421
+ // Nested containers.
422
+ ["nested", "function inside nested object", () => ({
423
+ outer: [{ inner: () => 0 }, { inner: 1 }],
424
+ })],
425
+
426
+ // toJSON controls: present, inherited, returning undefined, and non-callable.
427
+ ["jsonableProperty", "own toJSON", () => ({ keep: 1, value: { toJSON: () => "x" } })],
428
+ ["jsonableProperty", "inherited toJSON", () => {
429
+ class Jsonable {
430
+ toJSON() {
431
+ return "x";
432
+ }
433
+ }
434
+ return { keep: 1, value: new Jsonable() };
435
+ }],
436
+ // A non-callable toJSON twin belongs here by shape but not by cause: the
437
+ // checker fails to reject it and the serializer then throws
438
+ // "input.value.toJSON is not a function", so isStringify and validateStringify
439
+ // throw where their contract is to answer. That is a callability rule, not the
440
+ // contextual "decide omission from the serialized result" rule this regression
441
+ // pins, and fixing it here would mix two root causes into one diff. It is
442
+ // tracked in samchon/typia#2271 and keeps its own twin there.
443
+ ["maybeJsonableProperty", "toJSON returning undefined", () => ({
444
+ keep: 1,
445
+ value: { toJSON: () => undefined },
446
+ })],
447
+ ["maybeJsonableProperty", "toJSON returning a value", () => ({
448
+ keep: 1,
449
+ value: { toJSON: () => "x" },
450
+ })],
451
+ ];
452
+
453
+ let ran = 0;
454
+ const failures = [];
455
+
456
+ const fail = (label, message) => failures.push(label + ": " + message);
457
+
458
+ const parse = (label, text) => {
459
+ try {
460
+ return { ok: true, value: JSON.parse(text) };
461
+ } catch (error) {
462
+ fail(label, "produced text that is not JSON: " + JSON.stringify(text));
463
+ return { ok: false };
464
+ }
465
+ };
466
+
467
+ const compare = (label, text, oracle) => {
468
+ if (typeof text !== "string") {
469
+ fail(label, "produced " + String(text) + " instead of JSON text");
470
+ return;
471
+ }
472
+ const parsed = parse(label, text);
473
+ if (parsed.ok !== true) return;
474
+ if (!deepEqual(parsed.value, oracle.value))
475
+ fail(
476
+ label,
477
+ "produced " + text + " but JSON.stringify produced " + oracle.text,
478
+ );
479
+ };
480
+
481
+ const run = (fn, argument) => {
482
+ try {
483
+ return { thrown: false, value: fn(argument) };
484
+ } catch (error) {
485
+ return { thrown: true, error };
486
+ }
487
+ };
488
+
489
+ for (const [key, label, make, kind] of CASES) {
490
+ const reject = kind === "reject";
491
+ const strictReject = kind === "strictReject" && STRICT_UNDEFINED === true;
492
+ const oracleText = JSON.stringify(make());
493
+ const oracle = { text: oracleText, value: undefined };
494
+ if (reject !== true) {
495
+ if (typeof oracleText !== "string")
496
+ throw new Error(key + " / " + label + ": oracle produced no text");
497
+ oracle.value = JSON.parse(oracleText);
498
+ }
499
+ for (const form of ["factory", "direct"]) {
500
+ const name = key + " / " + label + " / " + form;
501
+
502
+ // json.stringify never validates, so its text must match the oracle for
503
+ // every statically accepted input, in both option rows.
504
+ if (reject !== true) {
505
+ ran += 1;
506
+ const raw = run(mod[form + "_stringify_" + key], make());
507
+ if (raw.thrown === true)
508
+ fail(name + " / stringify", "threw " + String(raw.error && raw.error.message));
509
+ else compare(name + " / stringify", raw.value, oracle);
510
+ }
511
+
512
+ // json.isStringify: null means rejected.
513
+ ran += 1;
514
+ const is = run(mod[form + "_isStringify_" + key], make());
515
+ if (is.thrown === true)
516
+ fail(name + " / isStringify", "threw " + String(is.error && is.error.message));
517
+ else if (reject === true) {
518
+ if (is.value !== null)
519
+ fail(name + " / isStringify", "accepted an invalid value: " + String(is.value));
520
+ } else if (is.value === null) {
521
+ if (strictReject !== true)
522
+ fail(name + " / isStringify", "rejected a valid value");
523
+ } else compare(name + " / isStringify", is.value, oracle);
524
+
525
+ // json.assertStringify: a throw means rejected.
526
+ ran += 1;
527
+ const asserted = run(mod[form + "_assertStringify_" + key], make());
528
+ if (reject === true) {
529
+ if (asserted.thrown !== true)
530
+ fail(name + " / assertStringify", "accepted an invalid value: " + String(asserted.value));
531
+ } else if (asserted.thrown === true) {
532
+ if (strictReject !== true)
533
+ fail(name + " / assertStringify", "rejected a valid value: " + String(asserted.error && asserted.error.message));
534
+ } else compare(name + " / assertStringify", asserted.value, oracle);
535
+
536
+ // json.validateStringify: success must never carry malformed text.
537
+ ran += 1;
538
+ const validated = run(mod[form + "_validateStringify_" + key], make());
539
+ if (validated.thrown === true)
540
+ fail(name + " / validateStringify", "threw " + String(validated.error && validated.error.message));
541
+ else if (reject === true) {
542
+ if (validated.value.success !== false)
543
+ fail(name + " / validateStringify", "accepted an invalid value: " + JSON.stringify(validated.value));
544
+ } else if (validated.value.success === false) {
545
+ if (strictReject !== true)
546
+ fail(name + " / validateStringify", "rejected a valid value: " + JSON.stringify(validated.value.errors));
547
+ } else compare(name + " / validateStringify", validated.value.data, oracle);
548
+ }
549
+ }
550
+
551
+ if (failures.length !== 0) {
552
+ for (const line of failures) console.log(line);
553
+ throw new Error(failures.length + " contextual serialization failures");
554
+ }
555
+ console.log("RAN " + ran + " CASES");
556
+ `