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,160 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "strings"
7
+ "testing"
8
+ )
9
+
10
+ // TestTransformSingleFileJSLocatesOutputAcrossLayouts verifies `--output js`
11
+ // finds its artifact wherever the compiler places the emit.
12
+ //
13
+ // `transformSingleToJavaScript` captures the emit by matching the write callback
14
+ // against the requested source. Comparing whole path stems made that match ask
15
+ // whether `dist/main` equals `src/main`, so every project with an `outDir` --
16
+ // which is every realistic layout -- reported "no output produced" and exited 3
17
+ // over a transform that had in fact succeeded (samchon/typia#2134). `outDir` is
18
+ // only one of the settings that reposition an emit, so this pins the whole class
19
+ // rather than the reported witness: the match must come from the compiler's own
20
+ // output-path resolution, the same one the emitter uses to choose where to
21
+ // write, so no combination of `outDir`, `rootDir`, `rootDirs`, or source nesting
22
+ // can desynchronize the two.
23
+ //
24
+ // 1. Build the same typia-valid source under each output-path layout.
25
+ // 2. Transform it with `--output js --out`.
26
+ // 3. Require exit 0, a silent stderr, and a published artifact carrying the
27
+ // lowered validator rather than the untransformed call.
28
+ func TestTransformSingleFileJSLocatesOutputAcrossLayouts(t *testing.T) {
29
+ for _, layout := range []struct {
30
+ name string
31
+ extra []string
32
+ file string
33
+ }{
34
+ // The reported regression. With no `rootDir` the common source directory is
35
+ // the tsconfig's own directory, so the emit lands at `dist/src/main.js`.
36
+ {
37
+ name: "out_dir",
38
+ extra: []string{`"outDir": "dist"`},
39
+ file: "src/main.ts",
40
+ },
41
+ // `rootDir` re-bases the emit again, to `dist/main.js`, so a fix keyed on
42
+ // `outDir` alone would still put the artifact somewhere else than expected.
43
+ {
44
+ name: "root_dir_and_out_dir",
45
+ extra: []string{`"rootDir": "src"`, `"outDir": "dist"`},
46
+ file: "src/main.ts",
47
+ },
48
+ // Nesting below the root dir carries into the output as `dist/deep/nested/
49
+ // main.js`: the emitted path differs from the source path in more than its
50
+ // leading directory.
51
+ {
52
+ name: "nested_source_directory",
53
+ extra: []string{`"rootDir": "src"`, `"outDir": "dist"`},
54
+ file: "src/deep/nested/main.ts",
55
+ },
56
+ // `rootDirs` is a module-resolution feature and must not reposition the
57
+ // emit. Pin that the resolution agrees instead of assuming it.
58
+ {
59
+ name: "root_dirs_and_out_dir",
60
+ extra: []string{`"rootDirs": ["src", "generated"]`, `"outDir": "dist"`},
61
+ file: "src/main.ts",
62
+ },
63
+ // One source, three writes through the one callback: `dist/main.js`,
64
+ // `dist/main.js.map`, and `dist/main.d.ts`. Finding the artifact is not
65
+ // enough here -- the check has to tell it apart from its own siblings. The
66
+ // map is the trap, since its `sourcesContent` embeds the original
67
+ // TypeScript, so capturing it would publish text still carrying
68
+ // `typia.is<` behind exit 0.
69
+ {
70
+ name: "declaration_and_source_map",
71
+ extra: []string{
72
+ `"rootDir": "src"`,
73
+ `"outDir": "dist"`,
74
+ `"declaration": true`,
75
+ `"sourceMap": true`,
76
+ },
77
+ file: "src/main.ts",
78
+ },
79
+ // The one layout that already worked, because the emit lands beside its
80
+ // source. It must keep working.
81
+ {
82
+ name: "no_out_dir",
83
+ extra: nil,
84
+ file: "src/main.ts",
85
+ },
86
+ } {
87
+ t.Run(layout.name, func(t *testing.T) {
88
+ project := transformSingleFileLayoutProject(t, layout.extra, map[string]string{
89
+ layout.file: transformSingleFileValidSource,
90
+ })
91
+ outPath := filepath.Join(project, "artifact", "main.js")
92
+ _, errText, code := ttscTypiaTestCapture(func() int {
93
+ return runTransform([]string{
94
+ "--cwd", project,
95
+ "--tsconfig", "tsconfig.json",
96
+ "--file", filepath.FromSlash(layout.file),
97
+ "--output", "js",
98
+ "--out", outPath,
99
+ })
100
+ })
101
+ if code != 0 {
102
+ t.Fatalf("`--output js` should publish under this layout, got %d\nstderr=%s", code, errText)
103
+ }
104
+ if errText != "" {
105
+ t.Fatalf("`--output js` reported diagnostics under this layout:\n%s", errText)
106
+ }
107
+ data, err := os.ReadFile(outPath)
108
+ if err != nil {
109
+ t.Fatalf("`--output js` published no artifact: %v", err)
110
+ }
111
+ text := string(data)
112
+ if strings.Contains(text, "typia.is<") {
113
+ t.Fatalf("published artifact still carries the untransformed call:\n%s", text)
114
+ }
115
+ if !strings.Contains(text, `"number"`) {
116
+ t.Fatalf("published artifact does not carry the lowered validator:\n%s", text)
117
+ }
118
+ })
119
+ }
120
+ }
121
+
122
+ // transformSingleFileLayoutProject writes a project whose tsconfig carries the
123
+ // given extra `compilerOptions` entries and whose sources are the given
124
+ // project-relative slash paths, sharing the typia stub the other transform
125
+ // fixtures use. It exists so one fixture can vary only the output-path settings.
126
+ func transformSingleFileLayoutProject(
127
+ t *testing.T,
128
+ extra []string,
129
+ sources map[string]string,
130
+ ) string {
131
+ t.Helper()
132
+ project := t.TempDir()
133
+ options := append([]string{
134
+ `"target": "ES2022"`,
135
+ `"module": "commonjs"`,
136
+ `"moduleResolution": "bundler"`,
137
+ `"ignoreDeprecations": "6.0"`,
138
+ `"types": ["*"]`,
139
+ `"esModuleInterop": true`,
140
+ `"strict": true`,
141
+ `"skipLibCheck": true`,
142
+ }, extra...)
143
+ tsconfig := "{\n \"compilerOptions\": {\n " +
144
+ strings.Join(options, ",\n ") +
145
+ "\n },\n \"include\": [\"src\"]\n}\n"
146
+ if err := os.WriteFile(filepath.Join(project, "tsconfig.json"), []byte(tsconfig), 0o644); err != nil {
147
+ t.Fatalf("write tsconfig: %v", err)
148
+ }
149
+ transformDiagnosticWriteTypiaStub(t, project)
150
+ for rel, body := range sources {
151
+ path := filepath.Join(project, filepath.FromSlash(rel))
152
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
153
+ t.Fatalf("mkdir %s: %v", rel, err)
154
+ }
155
+ if err := os.WriteFile(path, []byte(body), 0o644); err != nil {
156
+ t.Fatalf("write %s: %v", rel, err)
157
+ }
158
+ }
159
+ return project
160
+ }
@@ -0,0 +1,54 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "strings"
7
+ "testing"
8
+ )
9
+
10
+ // TestTransformSingleFileSuccessPublishesArtifact verifies the positive twin.
11
+ //
12
+ // Consulting the diagnostics before publishing must not make a clean transform
13
+ // withhold its artifact: the guard has to key on a reported diagnostic, not on
14
+ // merely having run. This pins the success side of the same decision in both
15
+ // output modes, including that the call was actually rewritten rather than
16
+ // copied through as an untransformed stub.
17
+ //
18
+ // 1. Transform a typia-valid source with `--out` in `ts` and `js`.
19
+ // 2. Require exit 0 and a silent stderr.
20
+ // 3. Require the published artifact to exist and carry the lowered validator.
21
+ func TestTransformSingleFileSuccessPublishesArtifact(t *testing.T) {
22
+ for _, output := range []string{"ts", "js"} {
23
+ t.Run(output, func(t *testing.T) {
24
+ project := transformSingleFileProject(t, transformSingleFileValidSource)
25
+ outPath := filepath.Join(project, "dist", "main."+output)
26
+ _, errText, code := ttscTypiaTestCapture(func() int {
27
+ return runTransform([]string{
28
+ "--cwd", project,
29
+ "--tsconfig", "tsconfig.json",
30
+ "--file", filepath.Join("src", "main.ts"),
31
+ "--output", output,
32
+ "--out", outPath,
33
+ })
34
+ })
35
+ if code != 0 {
36
+ t.Fatalf("valid single-file transform should succeed, got %d\nstderr=%s", code, errText)
37
+ }
38
+ if errText != "" {
39
+ t.Fatalf("valid single-file transform reported diagnostics:\n%s", errText)
40
+ }
41
+ data, err := os.ReadFile(outPath)
42
+ if err != nil {
43
+ t.Fatalf("valid single-file transform published no artifact: %v", err)
44
+ }
45
+ text := string(data)
46
+ if strings.Contains(text, "typia.is<") {
47
+ t.Fatalf("published artifact still carries the untransformed call:\n%s", text)
48
+ }
49
+ if !strings.Contains(text, `"number"`) {
50
+ t.Fatalf("published artifact does not carry the lowered validator:\n%s", text)
51
+ }
52
+ })
53
+ }
54
+ }
@@ -0,0 +1,39 @@
1
+ package main
2
+
3
+ import (
4
+ "path/filepath"
5
+ "strings"
6
+ "testing"
7
+ )
8
+
9
+ // TestTransformWasmHostArgvReportsDiagnostics verifies the wasm host contract.
10
+ //
11
+ // `main_wasm.go` is `js && wasm` only, so its `jsTransform` cannot be called
12
+ // here. It carries no decision of its own: it renders the JS options object into
13
+ // argv via `transformArgs`, hands that to this same `runTransform`, and returns
14
+ // the resulting `{ code, stdout, stderr }`. Driving the exact argv it builds --
15
+ // `--cwd=`/`--tsconfig=`/`--file=` with its `--output=ts` default -- therefore
16
+ // pins what a playground caller observes: the typia error, not a stub.
17
+ //
18
+ // 1. Build the argv `transformArgs` produces for a single-file request.
19
+ // 2. Run it against a typia-invalid source.
20
+ // 3. Require code 3, the diagnostic in stderr, and no stub in stdout.
21
+ func TestTransformWasmHostArgvReportsDiagnostics(t *testing.T) {
22
+ project := transformSingleFileProject(t, transformDiagnosticSource)
23
+ argv := []string{
24
+ "--cwd=" + project,
25
+ "--tsconfig=tsconfig.json",
26
+ "--file=" + filepath.Join(project, "src", "main.ts"),
27
+ "--output=ts",
28
+ }
29
+ outText, errText, code := ttscTypiaTestCapture(func() int { return runTransform(argv) })
30
+ if code != 3 {
31
+ t.Fatalf("wasm host argv should surface code 3, got %d\nstdout=%s\nstderr=%s", code, outText, errText)
32
+ }
33
+ if !strings.Contains(errText, "non-specified generic argument") {
34
+ t.Fatalf("wasm host argv did not surface the typia diagnostic:\n%s", errText)
35
+ }
36
+ if outText != "" {
37
+ t.Fatalf("wasm host argv returned an untransformed stub as stdout:\n%s", outText)
38
+ }
39
+ }
@@ -0,0 +1,227 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "testing"
8
+ )
9
+
10
+ // TestTupleOptionalCompareCloneTransform pins optional-trailing tuple semantics
11
+ // across is / compare.equals / plain.clone / plain.classify.
12
+ //
13
+ // Issue #2202: for a tuple with an omitted optional trailing element, `is`
14
+ // correctly validates with a length range (`1 <= length && 2 >= length`), but
15
+ // `compare.equals` emitted a hard `x.length === 2` gate and `plain.clone` /
16
+ // `plain.classify` materialized the absent element as a phantom `undefined`
17
+ // (`[input[0], input[1]]`). So `equals(["a"], ["a"])` was false (reflexivity
18
+ // broken; disagrees with `is`) and `clone(["a"])` was `["a", undefined]`
19
+ // (length 2), not deep-equal to its input. The three must honor the same
20
+ // optional-trailing semantics as `is`.
21
+ //
22
+ // 1. Transform is / equals / clone / classify over `[string, number?]` and
23
+ // `[string, number?, boolean?]`, plus fully-required and rest controls.
24
+ // 2. Require equals reflexive over omitted-optional values, clone/classify to
25
+ // produce the correct length with no phantom slot, and `equals(x, clone(x))`
26
+ // to hold for every is-valid x.
27
+ // 3. Require fully-populated tuples and rest tuples to be unchanged.
28
+ func TestTupleOptionalCompareCloneTransform(t *testing.T) {
29
+ project := tupleOptionalCompareCloneProject(t)
30
+ out, errText, code := ttscTypiaTestCapture(func() int {
31
+ return runTransform([]string{
32
+ "--cwd", project,
33
+ "--tsconfig", "tsconfig.json",
34
+ "--file", "src/main.ts",
35
+ "--output", "js",
36
+ })
37
+ })
38
+ if code != 0 {
39
+ t.Fatalf("tuple optional compare/clone transform failed: code=%d stderr=\n%s", code, errText)
40
+ }
41
+ tupleOptionalCompareCloneRunRuntimeCases(t, project, out)
42
+ }
43
+
44
+ func tupleOptionalCompareCloneProject(t *testing.T) string {
45
+ t.Helper()
46
+ root := ttscTypiaTestRepoRoot(t)
47
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
48
+ if err := os.MkdirAll(base, 0o755); err != nil {
49
+ t.Fatalf("mkdir temp base: %v", err)
50
+ }
51
+ dir, err := os.MkdirTemp(base, "tuple-optional-")
52
+ if err != nil {
53
+ t.Fatalf("create temp fixture: %v", err)
54
+ }
55
+ t.Cleanup(func() {
56
+ _ = os.RemoveAll(dir)
57
+ })
58
+ src := filepath.Join(dir, "src")
59
+ if err := os.MkdirAll(src, 0o755); err != nil {
60
+ t.Fatalf("mkdir fixture src: %v", err)
61
+ }
62
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(tupleOptionalCompareCloneTSConfig), 0o644); err != nil {
63
+ t.Fatalf("write tsconfig: %v", err)
64
+ }
65
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(tupleOptionalCompareCloneSource), 0o644); err != nil {
66
+ t.Fatalf("write source: %v", err)
67
+ }
68
+ return dir
69
+ }
70
+
71
+ func tupleOptionalCompareCloneRunRuntimeCases(t *testing.T, project string, js string) {
72
+ t.Helper()
73
+ node, err := exec.LookPath("node")
74
+ if err != nil {
75
+ t.Skip("node executable not found")
76
+ }
77
+ runtimeDir := filepath.Join(project, "runtime")
78
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
79
+ t.Fatalf("mkdir runtime dir: %v", err)
80
+ }
81
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
82
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
83
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
84
+ t.Fatalf("write runtime module: %v", err)
85
+ }
86
+ runner := filepath.Join(runtimeDir, "run.cjs")
87
+ if err := os.WriteFile(runner, []byte(tupleOptionalCompareCloneRuntimeRunner), 0o644); err != nil {
88
+ t.Fatalf("write runtime runner: %v", err)
89
+ }
90
+ cmd := exec.Command(node, runner)
91
+ cmd.Dir = runtimeDir
92
+ output, err := cmd.CombinedOutput()
93
+ if err != nil {
94
+ t.Fatalf("tuple optional compare/clone runtime cases failed: %v\n%s", err, output)
95
+ }
96
+ }
97
+
98
+ const tupleOptionalCompareCloneTSConfig = `{
99
+ "compilerOptions": {
100
+ "target": "ES2022",
101
+ "module": "commonjs",
102
+ "moduleResolution": "bundler",
103
+ "ignoreDeprecations": "6.0",
104
+ "types": ["*"],
105
+ "esModuleInterop": true,
106
+ "strict": true,
107
+ "skipLibCheck": true
108
+ },
109
+ "include": ["src"]
110
+ }
111
+ `
112
+
113
+ const tupleOptionalCompareCloneSource = `import typia from "typia";
114
+
115
+ export const isPair = typia.createIs<[string, number?]>();
116
+ export const equalsPair = typia.compare.createEquals<[string, number?]>();
117
+ export const clonePair = typia.plain.createClone<[string, number?]>();
118
+ export const classifyPair = typia.plain.createClassify<[string, number?]>();
119
+
120
+ export const isTriple = typia.createIs<[string, number?, boolean?]>();
121
+ export const equalsTriple = typia.compare.createEquals<[string, number?, boolean?]>();
122
+ export const cloneTriple = typia.plain.createClone<[string, number?, boolean?]>();
123
+ export const classifyTriple = typia.plain.createClassify<[string, number?, boolean?]>();
124
+
125
+ // boundary: a tuple whose only element is optional.
126
+ export const equalsSolo = typia.compare.createEquals<[number?]>();
127
+ export const cloneSolo = typia.plain.createClone<[number?]>();
128
+
129
+ // boundary: an optional trailing element that is itself a nested tuple.
130
+ export const equalsNested = typia.compare.createEquals<[string, [number, boolean]?]>();
131
+ export const cloneNested = typia.plain.createClone<[string, [number, boolean]?]>();
132
+
133
+ // control: a fully-required tuple must stay byte-identical.
134
+ export const equalsFixed = typia.compare.createEquals<[string, number]>();
135
+ export const cloneFixed = typia.plain.createClone<[string, number]>();
136
+
137
+ // control: a rest tuple must stay byte-identical.
138
+ export const equalsRest = typia.compare.createEquals<[string, ...number[]]>();
139
+ export const cloneRest = typia.plain.createClone<[string, ...number[]]>();
140
+ `
141
+
142
+ const tupleOptionalCompareCloneRuntimeRunner = `const mod = require("./main.cjs");
143
+
144
+ const expect = (label, actual, expected) => {
145
+ if (actual !== expected) {
146
+ throw new Error(label + ": expected " + expected + ", got " + actual);
147
+ }
148
+ };
149
+
150
+ // A clone must be a distinct array, deep-equal to expected, with no phantom
151
+ // trailing slot (length matches, and the first out-of-range index is absent).
152
+ const expectClone = (label, result, expected) => {
153
+ if (!Array.isArray(result)) throw new Error(label + ": not an array");
154
+ if (result.length !== expected.length)
155
+ throw new Error(label + ": length " + result.length + " !== " + expected.length);
156
+ if (expected.length in result)
157
+ throw new Error(label + ": phantom slot at index " + expected.length);
158
+ for (let i = 0; i < expected.length; ++i)
159
+ if (result[i] !== expected[i])
160
+ throw new Error(label + ": [" + i + "] " + result[i] + " !== " + expected[i]);
161
+ };
162
+
163
+ // --- is: the reference range semantics (unchanged) ---
164
+ expect("is pair omitted", mod.isPair(["a"]), true);
165
+ expect("is pair present", mod.isPair(["a", 1]), true);
166
+ expect("is pair too long", mod.isPair(["a", 1, 2]), false);
167
+ expect("is triple omitted", mod.isTriple(["a"]), true);
168
+
169
+ // --- equals: reflexive over omitted optional; matches is ---
170
+ expect("equals pair omitted reflexive", mod.equalsPair(["a"], ["a"]), true);
171
+ expect("equals pair omitted vs present", mod.equalsPair(["a"], ["a", 1]), false);
172
+ expect("equals pair present reflexive", mod.equalsPair(["a", 1], ["a", 1]), true);
173
+ expect("equals pair present differ", mod.equalsPair(["a", 1], ["a", 2]), false);
174
+ expect("equals triple omitted reflexive", mod.equalsTriple(["a"], ["a"]), true);
175
+ expect("equals triple mid present reflexive", mod.equalsTriple(["a", 1], ["a", 1]), true);
176
+ expect("equals triple full reflexive", mod.equalsTriple(["a", 1, true], ["a", 1, true]), true);
177
+ expect("equals triple omitted vs present", mod.equalsTriple(["a"], ["a", 1]), false);
178
+
179
+ // --- clone: correct length, no phantom undefined ---
180
+ expectClone("clone pair omitted", mod.clonePair(["a"]), ["a"]);
181
+ expectClone("clone pair present", mod.clonePair(["a", 1]), ["a", 1]);
182
+ expectClone("clone triple omitted", mod.cloneTriple(["a"]), ["a"]);
183
+ expectClone("clone triple mid present", mod.cloneTriple(["a", 1]), ["a", 1]);
184
+ expectClone("clone triple full", mod.cloneTriple(["a", 1, true]), ["a", 1, true]);
185
+
186
+ // --- classify: same tuple-inline path as clone ---
187
+ expectClone("classify pair omitted", mod.classifyPair(["a"]), ["a"]);
188
+ expectClone("classify triple omitted", mod.classifyTriple(["a"]), ["a"]);
189
+
190
+ // --- equals(x, clone(x)) holds for every is-valid x ---
191
+ for (const x of [["a"], ["a", 1]]) {
192
+ if (mod.isPair(x)) expect("equals pair (x, clone x) " + JSON.stringify(x), mod.equalsPair(x, mod.clonePair(x)), true);
193
+ }
194
+ for (const x of [["a"], ["a", 1], ["a", 1, true]]) {
195
+ if (mod.isTriple(x)) expect("equals triple (x, clone x) " + JSON.stringify(x), mod.equalsTriple(x, mod.cloneTriple(x)), true);
196
+ }
197
+
198
+ // --- boundary: only-optional tuple ---
199
+ expect("equals solo empty reflexive", mod.equalsSolo([], []), true);
200
+ expect("equals solo empty vs present", mod.equalsSolo([], [1]), false);
201
+ expect("equals solo present reflexive", mod.equalsSolo([1], [1]), true);
202
+ expectClone("clone solo empty", mod.cloneSolo([]), []);
203
+ expectClone("clone solo present", mod.cloneSolo([1]), [1]);
204
+
205
+ // --- boundary: nested tuple as the optional trailing element ---
206
+ expect("equals nested omitted reflexive", mod.equalsNested(["a"], ["a"]), true);
207
+ expect("equals nested present reflexive", mod.equalsNested(["a", [1, true]], ["a", [1, true]]), true);
208
+ expect("equals nested omitted vs present", mod.equalsNested(["a"], ["a", [1, true]]), false);
209
+ expectClone("clone nested omitted", mod.cloneNested(["a"]), ["a"]);
210
+ {
211
+ const nested = mod.cloneNested(["a", [1, true]]);
212
+ if (nested.length !== 2) throw new Error("clone nested present: outer length " + nested.length);
213
+ if (1 in nested === false) throw new Error("clone nested present: missing inner tuple");
214
+ expectClone("clone nested inner", nested[1], [1, true]);
215
+ }
216
+
217
+ // --- controls: fully-required and rest tuples unchanged ---
218
+ expect("equals fixed reflexive", mod.equalsFixed(["a", 1], ["a", 1]), true);
219
+ expect("equals fixed differ", mod.equalsFixed(["a", 1], ["a", 2]), false);
220
+ expectClone("clone fixed", mod.cloneFixed(["a", 1]), ["a", 1]);
221
+
222
+ expect("equals rest solo", mod.equalsRest(["a"], ["a"]), true);
223
+ expect("equals rest multi", mod.equalsRest(["a", 1, 2], ["a", 1, 2]), true);
224
+ expect("equals rest length differ", mod.equalsRest(["a", 1], ["a", 1, 2]), false);
225
+ expectClone("clone rest solo", mod.cloneRest(["a"]), ["a"]);
226
+ expectClone("clone rest multi", mod.cloneRest(["a", 1, 2]), ["a", 1, 2]);
227
+ `