typia 13.1.1 → 13.1.19

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 (515) hide show
  1. package/README.md +3 -0
  2. package/lib/_virtual/_rolldown/runtime.mjs +1 -5
  3. package/lib/executable/FileSystemIdentity.d.ts +21 -0
  4. package/lib/executable/FileSystemIdentity.js +183 -0
  5. package/lib/executable/FileSystemIdentity.js.map +1 -0
  6. package/lib/executable/FileSystemIdentity.mjs +129 -0
  7. package/lib/executable/FileSystemIdentity.mjs.map +1 -0
  8. package/lib/executable/TypiaGenerateWizard.js +264 -104
  9. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  10. package/lib/executable/TypiaGenerateWizard.mjs +233 -93
  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 +17 -0
  16. package/lib/internal/_ProtobufReader.js +117 -45
  17. package/lib/internal/_ProtobufReader.js.map +1 -1
  18. package/lib/internal/_ProtobufReader.mjs +108 -39
  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/_notationAny.js +8 -1
  87. package/lib/internal/_notationAny.js.map +1 -1
  88. package/lib/internal/_notationAny.mjs +7 -1
  89. package/lib/internal/_notationAny.mjs.map +1 -1
  90. package/lib/internal/_notationAssign.d.ts +1 -0
  91. package/lib/internal/_notationAssign.js +18 -0
  92. package/lib/internal/_notationAssign.js.map +1 -0
  93. package/lib/internal/_notationAssign.mjs +17 -0
  94. package/lib/internal/_notationAssign.mjs.map +1 -0
  95. package/lib/internal/_notationCamel.js +30 -9
  96. package/lib/internal/_notationCamel.js.map +1 -1
  97. package/lib/internal/_notationCamel.mjs +13 -5
  98. package/lib/internal/_notationCamel.mjs.map +1 -1
  99. package/lib/internal/_notationKebab.d.ts +1 -0
  100. package/lib/internal/_notationKebab.js +15 -0
  101. package/lib/internal/_notationKebab.js.map +1 -0
  102. package/lib/internal/_notationKebab.mjs +15 -0
  103. package/lib/internal/_notationKebab.mjs.map +1 -0
  104. package/lib/internal/_notationKeyCollision.d.ts +1 -0
  105. package/lib/internal/_notationKeyCollision.js +8 -0
  106. package/lib/internal/_notationKeyCollision.js.map +1 -0
  107. package/lib/internal/_notationKeyCollision.mjs +8 -0
  108. package/lib/internal/_notationKeyCollision.mjs.map +1 -0
  109. package/lib/internal/_notationPascal.js +20 -5
  110. package/lib/internal/_notationPascal.js.map +1 -1
  111. package/lib/internal/_notationPascal.mjs +10 -5
  112. package/lib/internal/_notationPascal.mjs.map +1 -1
  113. package/lib/internal/_notationSnake.js +25 -22
  114. package/lib/internal/_notationSnake.js.map +1 -1
  115. package/lib/internal/_notationSnake.mjs +11 -11
  116. package/lib/internal/_notationSnake.mjs.map +1 -1
  117. package/lib/internal/_plainCloneAny.js +174 -38
  118. package/lib/internal/_plainCloneAny.js.map +1 -1
  119. package/lib/internal/_plainCloneAny.mjs +126 -22
  120. package/lib/internal/_plainCloneAny.mjs.map +1 -1
  121. package/lib/internal/_randomArray.d.ts +1 -1
  122. package/lib/internal/_randomArray.js +11 -4
  123. package/lib/internal/_randomArray.js.map +1 -1
  124. package/lib/internal/_randomArray.mjs +9 -3
  125. package/lib/internal/_randomArray.mjs.map +1 -1
  126. package/lib/internal/_randomFormatByte.d.ts +2 -1
  127. package/lib/internal/_randomFormatByte.js +2 -1
  128. package/lib/internal/_randomFormatByte.js.map +1 -1
  129. package/lib/internal/_randomFormatByte.mjs +2 -1
  130. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  131. package/lib/internal/_randomFormatDate.d.ts +2 -0
  132. package/lib/internal/_randomFormatDate.js +3 -2
  133. package/lib/internal/_randomFormatDate.js.map +1 -1
  134. package/lib/internal/_randomFormatDate.mjs +3 -2
  135. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  136. package/lib/internal/_randomFormatDatetime.d.ts +2 -0
  137. package/lib/internal/_randomFormatDatetime.js +3 -2
  138. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  139. package/lib/internal/_randomFormatDatetime.mjs +3 -2
  140. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  141. package/lib/internal/_randomFormatDuration.d.ts +2 -1
  142. package/lib/internal/_randomFormatDuration.js +3 -2
  143. package/lib/internal/_randomFormatDuration.js.map +1 -1
  144. package/lib/internal/_randomFormatDuration.mjs +3 -2
  145. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  146. package/lib/internal/_randomFormatEmail.d.ts +2 -1
  147. package/lib/internal/_randomFormatEmail.js +8 -1
  148. package/lib/internal/_randomFormatEmail.js.map +1 -1
  149. package/lib/internal/_randomFormatEmail.mjs +5 -1
  150. package/lib/internal/_randomFormatEmail.mjs.map +1 -1
  151. package/lib/internal/_randomFormatHostname.d.ts +8 -1
  152. package/lib/internal/_randomFormatHostname.js +45 -2
  153. package/lib/internal/_randomFormatHostname.js.map +1 -1
  154. package/lib/internal/_randomFormatHostname.mjs +38 -2
  155. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  156. package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
  157. package/lib/internal/_randomFormatIdnEmail.js +16 -2
  158. package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
  159. package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
  160. package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
  161. package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
  162. package/lib/internal/_randomFormatIdnHostname.js +26 -1
  163. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  164. package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
  165. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  166. package/lib/internal/_randomFormatIpv4.d.ts +2 -1
  167. package/lib/internal/_randomFormatIpv4.js +2 -1
  168. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  169. package/lib/internal/_randomFormatIpv4.mjs +2 -1
  170. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  171. package/lib/internal/_randomFormatIpv6.d.ts +2 -1
  172. package/lib/internal/_randomFormatIpv6.js +2 -1
  173. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  174. package/lib/internal/_randomFormatIpv6.mjs +2 -1
  175. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  176. package/lib/internal/_randomFormatIri.d.ts +2 -1
  177. package/lib/internal/_randomFormatIri.js +1 -1
  178. package/lib/internal/_randomFormatIri.js.map +1 -1
  179. package/lib/internal/_randomFormatIri.mjs +1 -1
  180. package/lib/internal/_randomFormatIri.mjs.map +1 -1
  181. package/lib/internal/_randomFormatIriReference.d.ts +2 -1
  182. package/lib/internal/_randomFormatIriReference.js +1 -1
  183. package/lib/internal/_randomFormatIriReference.js.map +1 -1
  184. package/lib/internal/_randomFormatIriReference.mjs +1 -1
  185. package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
  186. package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
  187. package/lib/internal/_randomFormatJsonPointer.js +8 -1
  188. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  189. package/lib/internal/_randomFormatJsonPointer.mjs +5 -1
  190. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  191. package/lib/internal/_randomFormatPassword.d.ts +2 -1
  192. package/lib/internal/_randomFormatPassword.js +7 -5
  193. package/lib/internal/_randomFormatPassword.js.map +1 -1
  194. package/lib/internal/_randomFormatPassword.mjs +5 -1
  195. package/lib/internal/_randomFormatPassword.mjs.map +1 -1
  196. package/lib/internal/_randomFormatRegex.d.ts +2 -1
  197. package/lib/internal/_randomFormatRegex.js +2 -1
  198. package/lib/internal/_randomFormatRegex.js.map +1 -1
  199. package/lib/internal/_randomFormatRegex.mjs +2 -1
  200. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  201. package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
  202. package/lib/internal/_randomFormatRelativeJsonPointer.js +3 -2
  203. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  204. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +3 -2
  205. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  206. package/lib/internal/_randomFormatTime.d.ts +2 -1
  207. package/lib/internal/_randomFormatTime.js +3 -2
  208. package/lib/internal/_randomFormatTime.js.map +1 -1
  209. package/lib/internal/_randomFormatTime.mjs +3 -2
  210. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  211. package/lib/internal/_randomFormatUri.d.ts +2 -1
  212. package/lib/internal/_randomFormatUri.js +1 -1
  213. package/lib/internal/_randomFormatUri.js.map +1 -1
  214. package/lib/internal/_randomFormatUri.mjs +1 -1
  215. package/lib/internal/_randomFormatUri.mjs.map +1 -1
  216. package/lib/internal/_randomFormatUriReference.d.ts +2 -1
  217. package/lib/internal/_randomFormatUriReference.js +1 -1
  218. package/lib/internal/_randomFormatUriReference.js.map +1 -1
  219. package/lib/internal/_randomFormatUriReference.mjs +1 -1
  220. package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
  221. package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
  222. package/lib/internal/_randomFormatUriTemplate.js +1 -1
  223. package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
  224. package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
  225. package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
  226. package/lib/internal/_randomFormatUrl.d.ts +2 -1
  227. package/lib/internal/_randomFormatUrl.js +21 -1
  228. package/lib/internal/_randomFormatUrl.js.map +1 -1
  229. package/lib/internal/_randomFormatUrl.mjs +18 -1
  230. package/lib/internal/_randomFormatUrl.mjs.map +1 -1
  231. package/lib/internal/_randomFormatUuid.d.ts +2 -1
  232. package/lib/internal/_randomFormatUuid.js +3 -2
  233. package/lib/internal/_randomFormatUuid.js.map +1 -1
  234. package/lib/internal/_randomFormatUuid.mjs +3 -2
  235. package/lib/internal/_randomFormatUuid.mjs.map +1 -1
  236. package/lib/internal/_randomInteger.js +59 -28
  237. package/lib/internal/_randomInteger.js.map +1 -1
  238. package/lib/internal/_randomInteger.mjs +56 -16
  239. package/lib/internal/_randomInteger.mjs.map +1 -1
  240. package/lib/internal/_randomMultiple.d.ts +8 -0
  241. package/lib/internal/_randomMultiple.js +168 -0
  242. package/lib/internal/_randomMultiple.js.map +1 -0
  243. package/lib/internal/_randomMultiple.mjs +158 -0
  244. package/lib/internal/_randomMultiple.mjs.map +1 -0
  245. package/lib/internal/_randomNumber.js +42 -42
  246. package/lib/internal/_randomNumber.js.map +1 -1
  247. package/lib/internal/_randomNumber.mjs +41 -27
  248. package/lib/internal/_randomNumber.mjs.map +1 -1
  249. package/lib/internal/_randomPattern.d.ts +2 -1
  250. package/lib/internal/_randomPattern.js +19 -4
  251. package/lib/internal/_randomPattern.js.map +1 -1
  252. package/lib/internal/_randomPattern.mjs +10 -4
  253. package/lib/internal/_randomPattern.mjs.map +1 -1
  254. package/lib/internal/_randomStringLength.d.ts +33 -0
  255. package/lib/internal/_randomStringLength.js +48 -0
  256. package/lib/internal/_randomStringLength.js.map +1 -0
  257. package/lib/internal/_randomStringLength.mjs +44 -0
  258. package/lib/internal/_randomStringLength.mjs.map +1 -0
  259. package/lib/internal/_stringLength.d.ts +1 -0
  260. package/lib/internal/_stringLength.js +11 -0
  261. package/lib/internal/_stringLength.js.map +1 -0
  262. package/lib/internal/_stringLength.mjs +10 -0
  263. package/lib/internal/_stringLength.mjs.map +1 -0
  264. package/lib/internal/_validateReport.js +4 -1
  265. package/lib/internal/_validateReport.js.map +1 -1
  266. package/lib/internal/_validateReport.mjs +2 -1
  267. package/lib/internal/_validateReport.mjs.map +1 -1
  268. package/lib/internal/private/__notationRename.d.ts +14 -0
  269. package/lib/internal/private/__notationRename.js +25 -0
  270. package/lib/internal/private/__notationRename.js.map +1 -0
  271. package/lib/internal/private/__notationRename.mjs +24 -0
  272. package/lib/internal/private/__notationRename.mjs.map +1 -0
  273. package/lib/json.d.ts +2 -2
  274. package/lib/json.mjs.map +1 -1
  275. package/lib/module.d.ts +2 -2
  276. package/lib/module.js.map +1 -1
  277. package/lib/module.mjs.map +1 -1
  278. package/lib/notations.d.ts +20 -4
  279. package/lib/notations.js.map +1 -1
  280. package/lib/notations.mjs.map +1 -1
  281. package/native/adapter/plugin_options.go +117 -0
  282. package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
  283. package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
  284. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
  285. package/native/cmd/ttsc-typia/build.go +81 -64
  286. package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
  287. package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
  288. package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
  289. package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
  290. package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
  291. package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
  292. package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
  293. package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
  294. package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
  295. package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
  296. package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
  297. package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
  298. package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
  299. package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
  300. package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
  301. package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
  302. package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
  303. package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
  304. package/native/cmd/ttsc-typia/main_wasm.go +21 -2
  305. package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
  306. package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
  307. package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
  308. package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
  309. package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
  310. package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
  311. package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
  312. package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
  313. package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
  314. package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
  315. package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
  316. package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
  317. package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
  318. package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
  319. package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
  320. package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
  321. package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
  322. package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
  323. package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
  324. package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
  325. package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
  326. package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
  327. package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
  328. package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
  329. package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
  330. package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
  331. package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
  332. package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
  333. package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
  334. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
  335. package/native/cmd/ttsc-typia/transform.go +228 -39
  336. package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
  337. package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
  338. package/native/cmd/ttsc-typia/transform_helpers_test.go +159 -1
  339. package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
  340. package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
  341. package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
  342. package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
  343. package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
  344. package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
  345. package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
  346. package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
  347. package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
  348. package/native/core/factories/FormatCheatSheet.go +40 -7
  349. package/native/core/factories/IdentifierFactory.go +131 -4
  350. package/native/core/factories/MetadataCommentTagFactory.go +83 -40
  351. package/native/core/factories/MetadataTypeTagFactory.go +13 -1
  352. package/native/core/factories/NumericRangeFactory.go +60 -17
  353. package/native/core/factories/ProtobufFactory.go +7 -4
  354. package/native/core/factories/factory_utility_coverage_test.go +8 -2
  355. package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
  356. package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
  357. package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
  358. package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
  359. package/native/core/factories/internal/metadata/MetadataHelper.go +60 -6
  360. package/native/core/factories/internal/metadata/emplace_metadata_object.go +116 -8
  361. package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
  362. package/native/core/factories/internal/metadata/iterate_metadata_function.go +4 -11
  363. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +8 -6
  364. package/native/core/factories/internal/metadata/iterate_metadata_map.go +9 -0
  365. package/native/core/factories/internal/metadata/iterate_metadata_native.go +27 -2
  366. package/native/core/factories/internal/metadata/iterate_metadata_set.go +9 -0
  367. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  368. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  369. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  370. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  371. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  372. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  373. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  374. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  375. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  376. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  377. package/native/core/programmers/IsProgrammer.go +15 -1
  378. package/native/core/programmers/RandomProgrammer.go +51 -14
  379. package/native/core/programmers/compare/CompareEqualProgrammer.go +393 -5
  380. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  381. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  382. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  383. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  384. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  385. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  386. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  387. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  388. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  389. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  390. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  391. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  392. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  393. package/native/core/programmers/helpers/StringifyJoinder.go +32 -1
  394. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  395. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +5 -3
  396. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  397. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  398. package/native/core/programmers/iterate/check_template.go +344 -32
  399. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  400. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  401. package/native/core/programmers/iterate/openapi_v3_downgrader.go +641 -0
  402. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  403. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  404. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  405. package/native/core/programmers/iterate/template_runtime_pattern.go +52 -7
  406. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  407. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  408. package/native/core/programmers/llm/LlmApplicationProgrammer.go +12 -10
  409. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  410. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  411. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  412. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  413. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  414. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  415. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  416. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  417. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  418. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  419. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  420. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +40 -21
  421. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  422. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  423. package/native/core/schemas/metadata/MetadataCollection.go +270 -20
  424. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  425. package/native/core/schemas/metadata/MetadataObjectType.go +17 -4
  426. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  427. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  428. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  429. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  430. package/native/core/utils/PatternUtil.go +13 -0
  431. package/native/core/utils/PromiseTypeFactory.go +59 -0
  432. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  433. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  434. package/native/go.mod +9 -1
  435. package/native/transform/CallExpressionTransformer.go +12 -0
  436. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  437. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  438. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  439. package/package.json +16 -4
  440. package/src/executable/FileSystemIdentity.ts +189 -0
  441. package/src/executable/TypiaGenerateWizard.ts +377 -110
  442. package/src/functional.ts +30 -60
  443. package/src/internal/_ProtobufReader.ts +129 -43
  444. package/src/internal/_createStandardSchema.ts +15 -1
  445. package/src/internal/_decimal.ts +69 -0
  446. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  447. package/src/internal/_isFormatByte.ts +2 -5
  448. package/src/internal/_isFormatDate.ts +15 -2
  449. package/src/internal/_isFormatDateTime.ts +28 -2
  450. package/src/internal/_isFormatIri.ts +5 -2
  451. package/src/internal/_isFormatIriReference.ts +11 -3
  452. package/src/internal/_isFormatUriReference.ts +1 -1
  453. package/src/internal/_isMultipleOf.ts +8 -0
  454. package/src/internal/_isTypeFloat.ts +1 -1
  455. package/src/internal/_isTypeInt64.ts +1 -0
  456. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  457. package/src/internal/_isTypeUint64.ts +1 -0
  458. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  459. package/src/internal/_isUniqueItems.ts +134 -132
  460. package/src/internal/_notationAny.ts +9 -4
  461. package/src/internal/_notationAssign.ts +20 -0
  462. package/src/internal/_notationCamel.ts +31 -10
  463. package/src/internal/_notationKebab.ts +11 -0
  464. package/src/internal/_notationKeyCollision.ts +9 -0
  465. package/src/internal/_notationPascal.ts +19 -6
  466. package/src/internal/_notationSnake.ts +24 -21
  467. package/src/internal/_plainCloneAny.ts +208 -33
  468. package/src/internal/_randomArray.ts +13 -4
  469. package/src/internal/_randomFormatByte.ts +4 -1
  470. package/src/internal/_randomFormatDate.ts +17 -12
  471. package/src/internal/_randomFormatDatetime.ts +15 -10
  472. package/src/internal/_randomFormatDuration.ts +16 -14
  473. package/src/internal/_randomFormatEmail.ts +8 -2
  474. package/src/internal/_randomFormatHostname.ts +48 -1
  475. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  476. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  477. package/src/internal/_randomFormatIpv4.ts +3 -2
  478. package/src/internal/_randomFormatIpv6.ts +3 -2
  479. package/src/internal/_randomFormatIri.ts +3 -1
  480. package/src/internal/_randomFormatIriReference.ts +3 -1
  481. package/src/internal/_randomFormatJsonPointer.ts +8 -2
  482. package/src/internal/_randomFormatPassword.ts +11 -6
  483. package/src/internal/_randomFormatRegex.ts +4 -1
  484. package/src/internal/_randomFormatRelativeJsonPointer.ts +13 -6
  485. package/src/internal/_randomFormatTime.ts +13 -10
  486. package/src/internal/_randomFormatUri.ts +3 -1
  487. package/src/internal/_randomFormatUriReference.ts +3 -1
  488. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  489. package/src/internal/_randomFormatUrl.ts +25 -2
  490. package/src/internal/_randomFormatUuid.ts +10 -6
  491. package/src/internal/_randomInteger.ts +87 -40
  492. package/src/internal/_randomMultiple.ts +245 -0
  493. package/src/internal/_randomNumber.ts +72 -55
  494. package/src/internal/_randomPattern.ts +26 -4
  495. package/src/internal/_randomStringLength.ts +72 -0
  496. package/src/internal/_stringLength.ts +5 -0
  497. package/src/internal/_validateReport.ts +5 -1
  498. package/src/internal/private/__notationRename.ts +24 -0
  499. package/src/json.ts +2 -2
  500. package/src/module.ts +4 -6
  501. package/src/notations.ts +20 -4
  502. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  503. package/lib/internal/private/__notationCapitalize.js +0 -6
  504. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  505. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  506. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  507. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  508. package/lib/internal/private/__notationUnsnake.js +0 -26
  509. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  510. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  511. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  512. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  513. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  514. package/src/internal/private/__notationCapitalize.ts +0 -2
  515. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -0,0 +1,112 @@
1
+ package main
2
+
3
+ import (
4
+ "encoding/json"
5
+ "os"
6
+ "path/filepath"
7
+ "testing"
8
+ )
9
+
10
+ // TestProjectDependenciesStarBarrelTransform verifies a barrel reached through
11
+ // `export *` registers, even though no local specifier names the type.
12
+ //
13
+ // A named re-export publishes an export specifier the alias walk can step
14
+ // through hop by hop; `export * from "./alpha"` publishes none, so that walk
15
+ // has nothing to follow and would stop before reporting the barrel — while
16
+ // re-pointing the star at another module still changes the generated validator
17
+ // (samchon/typia#2126). The walk therefore reports each module specifier's
18
+ // resolved file directly, which is what keeps this shape covered.
19
+ //
20
+ // 1. Build a project where `a.ts` validates `Alpha` imported from `barrel.ts`,
21
+ // which reaches it only through `export * from "./alpha"`.
22
+ // 2. Run project transform mode and decode the JSON envelope.
23
+ // 3. Assert `dependencies["src/a.ts"]` contains the star barrel `barrel.ts`
24
+ // and the concrete module `alpha.ts`.
25
+ // 4. Assert it does NOT contain `beta.ts`, a module the same barrel also stars
26
+ // in but no consulted type reaches.
27
+ func TestProjectDependenciesStarBarrelTransform(t *testing.T) {
28
+ project := projectDependenciesStarBarrelProject(t)
29
+ out, errText, code := ttscTypiaTestCapture(func() int {
30
+ return runTransform([]string{
31
+ "--cwd", project,
32
+ "--tsconfig", "tsconfig.json",
33
+ "--output", "ts",
34
+ })
35
+ })
36
+ if code != 0 {
37
+ t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
38
+ }
39
+ var envelope struct {
40
+ Dependencies map[string][]string `json:"dependencies"`
41
+ }
42
+ if err := json.Unmarshal([]byte(out), &envelope); err != nil {
43
+ t.Fatalf("decode envelope: %v\n%s", err, out)
44
+ }
45
+ entries := envelope.Dependencies["src/a.ts"]
46
+ found := map[string]bool{}
47
+ for _, entry := range entries {
48
+ found[entry] = true
49
+ }
50
+ if !found["src/barrel.ts"] {
51
+ t.Fatalf("dependencies of src/a.ts must contain the star barrel src/barrel.ts: %v", entries)
52
+ }
53
+ if !found["src/alpha.ts"] {
54
+ t.Fatalf("dependencies of src/a.ts must contain the concrete module src/alpha.ts: %v", entries)
55
+ }
56
+ if found["src/beta.ts"] {
57
+ t.Fatalf("dependencies of src/a.ts must not contain src/beta.ts, which the barrel stars in but no consulted type reaches: %v", entries)
58
+ }
59
+ }
60
+
61
+ func projectDependenciesStarBarrelProject(t *testing.T) string {
62
+ t.Helper()
63
+ root := ttscTypiaTestRepoRoot(t)
64
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
65
+ if err := os.MkdirAll(base, 0o755); err != nil {
66
+ t.Fatalf("mkdir temp base: %v", err)
67
+ }
68
+ dir, err := os.MkdirTemp(base, "project-dependencies-star-barrel-")
69
+ if err != nil {
70
+ t.Fatalf("create temp fixture: %v", err)
71
+ }
72
+ t.Cleanup(func() { _ = os.RemoveAll(dir) })
73
+ src := filepath.Join(dir, "src")
74
+ if err := os.MkdirAll(src, 0o755); err != nil {
75
+ t.Fatalf("mkdir fixture src: %v", err)
76
+ }
77
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(projectDependenciesEnvelopeTSConfig), 0o644); err != nil {
78
+ t.Fatalf("write tsconfig: %v", err)
79
+ }
80
+ for name, body := range map[string]string{
81
+ "a.ts": projectDependenciesStarBarrelSourceA,
82
+ "barrel.ts": projectDependenciesStarBarrelSourceBarrel,
83
+ "alpha.ts": projectDependenciesStarBarrelSourceAlpha,
84
+ "beta.ts": projectDependenciesStarBarrelSourceBeta,
85
+ } {
86
+ if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
87
+ t.Fatalf("write %s: %v", name, err)
88
+ }
89
+ }
90
+ return dir
91
+ }
92
+
93
+ const projectDependenciesStarBarrelSourceA = `import typia from "typia";
94
+
95
+ import { Alpha } from "./barrel";
96
+
97
+ export const validateAlpha = (input: unknown) => typia.validate<Alpha>(input);
98
+ `
99
+
100
+ const projectDependenciesStarBarrelSourceBarrel = `export * from "./alpha";
101
+ export * from "./beta";
102
+ `
103
+
104
+ const projectDependenciesStarBarrelSourceAlpha = `export interface Alpha {
105
+ id: string;
106
+ }
107
+ `
108
+
109
+ const projectDependenciesStarBarrelSourceBeta = `export interface Beta {
110
+ flag: boolean;
111
+ }
112
+ `
@@ -0,0 +1,190 @@
1
+ package main
2
+
3
+ import (
4
+ "encoding/json"
5
+ "os"
6
+ "path/filepath"
7
+ "testing"
8
+ )
9
+
10
+ // TestProjectReferenceGraphEnvelopeTransform verifies the project transform
11
+ // envelope carries the ttsc driver SDK's host-owned reference `graph` section
12
+ // alongside typia's precise `dependencies`.
13
+ //
14
+ // `graph` is the plugin-agnostic sound invalidation baseline: the ttsc consumer
15
+ // registers reach(edges, F) ∪ globals ∪ configs ∪ dependencies[F], so a
16
+ // consulted file the precise `dependencies` collection might not attribute is
17
+ // still guarded by the host baseline (samchon/typia#2107). This pins that
18
+ // typia's hand-rolled envelope now routes through driver.NewTransformGraph:
19
+ // direct reference edges (type-only included), ambient global-scope files, and
20
+ // the tsconfig `extends` chain, all keyed by the same driver.TransformOutputKey
21
+ // convention as the `typescript`/`dependencies` sections so a consumer joins
22
+ // them by key.
23
+ //
24
+ // 1. Build a project where `a.ts` imports `Bee` from `b.ts` (and calls
25
+ // `typia.validate<Bee>()`), `b.ts` imports type-only `Cee` from `c.ts`, an
26
+ // ambient `globals.d.ts` contributes a global augmentation, and
27
+ // `tsconfig.json` extends `tsconfig.base.json`.
28
+ // 2. Run project transform mode and decode the JSON envelope's `graph`.
29
+ // 3. Assert the `a.ts -> b.ts` and the type-only `b.ts -> c.ts` edges, the
30
+ // `globals.d.ts` global entry, and the `tsconfig.json` + `tsconfig.base.json`
31
+ // configs chain, all under keys that join with the `typescript` section.
32
+ // 4. Assert `dependencies` is still emitted next to `graph`, and that a
33
+ // non-global source is not misreported as a global.
34
+ func TestProjectReferenceGraphEnvelopeTransform(t *testing.T) {
35
+ project := projectReferenceGraphEnvelopeProject(t)
36
+ out, errText, code := ttscTypiaTestCapture(func() int {
37
+ return runTransform([]string{
38
+ "--cwd", project,
39
+ "--tsconfig", "tsconfig.json",
40
+ "--output", "ts",
41
+ })
42
+ })
43
+ if code != 0 {
44
+ t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
45
+ }
46
+ var envelope struct {
47
+ TypeScript map[string]string `json:"typescript"`
48
+ Graph *struct {
49
+ Edges map[string][]string `json:"edges"`
50
+ Globals []string `json:"globals"`
51
+ Configs []string `json:"configs"`
52
+ } `json:"graph"`
53
+ Dependencies map[string][]string `json:"dependencies"`
54
+ }
55
+ if err := json.Unmarshal([]byte(out), &envelope); err != nil {
56
+ t.Fatalf("decode envelope: %v\n%s", err, out)
57
+ }
58
+ if envelope.Graph == nil {
59
+ t.Fatalf("envelope must carry a graph section:\n%s", out)
60
+ }
61
+ if _, ok := envelope.TypeScript["src/a.ts"]; !ok {
62
+ t.Fatalf("typescript map must contain src/a.ts (graph keys join with it):\n%s", out)
63
+ }
64
+
65
+ contains := func(values []string, want string) bool {
66
+ for _, value := range values {
67
+ if value == want {
68
+ return true
69
+ }
70
+ }
71
+ return false
72
+ }
73
+
74
+ // Direct resolved edge from the transformed file to its import.
75
+ if !contains(envelope.Graph.Edges["src/a.ts"], "src/b.ts") {
76
+ t.Fatalf("graph edges of src/a.ts must contain src/b.ts: %v", envelope.Graph.Edges["src/a.ts"])
77
+ }
78
+ // Type-only edges must be included: b.ts imports Cee with `import type`.
79
+ if !contains(envelope.Graph.Edges["src/b.ts"], "src/c.ts") {
80
+ t.Fatalf("graph edges of src/b.ts must contain the type-only edge src/c.ts: %v", envelope.Graph.Edges["src/b.ts"])
81
+ }
82
+ // Ambient global-scope file appears in globals.
83
+ if !contains(envelope.Graph.Globals, "src/globals.d.ts") {
84
+ t.Fatalf("graph globals must contain src/globals.d.ts: %v", envelope.Graph.Globals)
85
+ }
86
+ // A plain module source is not a global-scope contributor.
87
+ if contains(envelope.Graph.Globals, "src/c.ts") {
88
+ t.Fatalf("graph globals must not contain the module source src/c.ts: %v", envelope.Graph.Globals)
89
+ }
90
+ // tsconfig extends chain: project config followed by its base.
91
+ if !contains(envelope.Graph.Configs, "tsconfig.json") {
92
+ t.Fatalf("graph configs must contain tsconfig.json: %v", envelope.Graph.Configs)
93
+ }
94
+ if !contains(envelope.Graph.Configs, "tsconfig.base.json") {
95
+ t.Fatalf("graph configs must contain the extended tsconfig.base.json: %v", envelope.Graph.Configs)
96
+ }
97
+
98
+ // The precise dependencies channel remains emitted alongside graph.
99
+ if !contains(envelope.Dependencies["src/a.ts"], "src/b.ts") {
100
+ t.Fatalf("dependencies of src/a.ts must still be emitted alongside graph: %v", envelope.Dependencies["src/a.ts"])
101
+ }
102
+ }
103
+
104
+ func projectReferenceGraphEnvelopeProject(t *testing.T) string {
105
+ t.Helper()
106
+ root := ttscTypiaTestRepoRoot(t)
107
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
108
+ if err := os.MkdirAll(base, 0o755); err != nil {
109
+ t.Fatalf("mkdir temp base: %v", err)
110
+ }
111
+ dir, err := os.MkdirTemp(base, "project-reference-graph-envelope-")
112
+ if err != nil {
113
+ t.Fatalf("create temp fixture: %v", err)
114
+ }
115
+ t.Cleanup(func() { _ = os.RemoveAll(dir) })
116
+ src := filepath.Join(dir, "src")
117
+ if err := os.MkdirAll(src, 0o755); err != nil {
118
+ t.Fatalf("mkdir fixture src: %v", err)
119
+ }
120
+ files := map[string]string{
121
+ "tsconfig.json": projectReferenceGraphEnvelopeTSConfig,
122
+ "tsconfig.base.json": projectReferenceGraphEnvelopeTSConfigBase,
123
+ }
124
+ for name, body := range files {
125
+ if err := os.WriteFile(filepath.Join(dir, name), []byte(body), 0o644); err != nil {
126
+ t.Fatalf("write %s: %v", name, err)
127
+ }
128
+ }
129
+ for name, body := range map[string]string{
130
+ "a.ts": projectReferenceGraphEnvelopeSourceA,
131
+ "b.ts": projectReferenceGraphEnvelopeSourceB,
132
+ "c.ts": projectReferenceGraphEnvelopeSourceC,
133
+ "globals.d.ts": projectReferenceGraphEnvelopeGlobals,
134
+ } {
135
+ if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
136
+ t.Fatalf("write %s: %v", name, err)
137
+ }
138
+ }
139
+ return dir
140
+ }
141
+
142
+ const projectReferenceGraphEnvelopeTSConfig = `{
143
+ "extends": "./tsconfig.base.json",
144
+ "compilerOptions": {
145
+ "rootDir": "src",
146
+ "outDir": "dist"
147
+ },
148
+ "include": ["src"]
149
+ }
150
+ `
151
+
152
+ const projectReferenceGraphEnvelopeTSConfigBase = `{
153
+ "compilerOptions": {
154
+ "target": "ES2022",
155
+ "module": "commonjs",
156
+ "moduleResolution": "bundler",
157
+ "ignoreDeprecations": "6.0",
158
+ "esModuleInterop": true,
159
+ "strict": true,
160
+ "skipLibCheck": true
161
+ }
162
+ }
163
+ `
164
+
165
+ const projectReferenceGraphEnvelopeSourceA = `import typia from "typia";
166
+
167
+ import { Bee } from "./b";
168
+
169
+ export const validateBee = (input: unknown) => typia.validate<Bee>(input);
170
+ `
171
+
172
+ const projectReferenceGraphEnvelopeSourceB = `import type { Cee } from "./c";
173
+
174
+ export interface Bee {
175
+ id: string;
176
+ nested: Cee;
177
+ }
178
+ `
179
+
180
+ const projectReferenceGraphEnvelopeSourceC = `export interface Cee {
181
+ value: number;
182
+ }
183
+ `
184
+
185
+ // A pure ambient declaration file (no import/export) is a script file, so it
186
+ // contributes to the global scope and must appear in graph.globals.
187
+ const projectReferenceGraphEnvelopeGlobals = `declare interface TypiaGraphGlobal {
188
+ tag: string;
189
+ }
190
+ `
@@ -0,0 +1,98 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "strings"
7
+ "testing"
8
+ )
9
+
10
+ // TestProtobufIsEncodeFiniteNumberTransform pins protobuf.isEncode against a bare
11
+ // number leaf so a non-finite value cannot be encoded into the message (#2196).
12
+ //
13
+ // protobuf.isEncode forces Options.Finite on its inner `__is` guard, then emits
14
+ // `__is(input) ? __encode(input) : null`. A protobuf double can hold NaN and
15
+ // Infinity, so the guard is the only thing keeping them out of the wire. While
16
+ // `is` dropped `finite`, that guard accepted NaN and the encoder wrote it; the
17
+ // guard must now carry Number.isFinite on the number leaf. Because isEncode has no
18
+ // separate error-path checker, the guard is the sole place the number leaf's
19
+ // finite check can appear, so its presence in the emit is an unambiguous oracle.
20
+ //
21
+ // 1. Transform a `protobuf.isEncode<{ value: number }>` fixture with default options.
22
+ // 2. Assert the emitted `__is` guards the number leaf with Number.isFinite.
23
+ func TestProtobufIsEncodeFiniteNumberTransform(t *testing.T) {
24
+ project := protobufIsEncodeFiniteNumberProject(t)
25
+ js := protobufIsEncodeFiniteNumberTransform(t, project)
26
+ needle := "Number.isFinite(input.value)"
27
+ if !strings.Contains(js, needle) {
28
+ t.Fatalf("protobuf.isEncode did not guard the number leaf with %q:\n%s", needle, js)
29
+ }
30
+ }
31
+
32
+ func protobufIsEncodeFiniteNumberProject(t *testing.T) string {
33
+ t.Helper()
34
+ root := ttscTypiaTestRepoRoot(t)
35
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
36
+ if err := os.MkdirAll(base, 0o755); err != nil {
37
+ t.Fatalf("mkdir temp base: %v", err)
38
+ }
39
+ dir, err := os.MkdirTemp(base, "protobuf-is-encode-finite-number-")
40
+ if err != nil {
41
+ t.Fatalf("create temp fixture: %v", err)
42
+ }
43
+ t.Cleanup(func() {
44
+ _ = os.RemoveAll(dir)
45
+ })
46
+ src := filepath.Join(dir, "src")
47
+ if err := os.MkdirAll(src, 0o755); err != nil {
48
+ t.Fatalf("mkdir fixture src: %v", err)
49
+ }
50
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(protobufIsEncodeFiniteNumberTSConfig), 0o644); err != nil {
51
+ t.Fatalf("write tsconfig: %v", err)
52
+ }
53
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(protobufIsEncodeFiniteNumberSource), 0o644); err != nil {
54
+ t.Fatalf("write source: %v", err)
55
+ }
56
+ return dir
57
+ }
58
+
59
+ func protobufIsEncodeFiniteNumberTransform(t *testing.T, project string) string {
60
+ t.Helper()
61
+ out, errText, code := ttscTypiaTestCapture(func() int {
62
+ return runTransform([]string{
63
+ "--cwd", project,
64
+ "--tsconfig", "tsconfig.json",
65
+ "--file", "src/main.ts",
66
+ "--output", "js",
67
+ })
68
+ })
69
+ if code != 0 {
70
+ t.Fatalf("protobuf isEncode finite transform failed: code=%d stderr=\n%s", code, errText)
71
+ }
72
+ return out
73
+ }
74
+
75
+ const protobufIsEncodeFiniteNumberTSConfig = `{
76
+ "compilerOptions": {
77
+ "target": "ES2022",
78
+ "module": "commonjs",
79
+ "moduleResolution": "bundler",
80
+ "ignoreDeprecations": "6.0",
81
+ "types": ["*"],
82
+ "esModuleInterop": true,
83
+ "strict": true,
84
+ "skipLibCheck": true
85
+ },
86
+ "include": ["src"]
87
+ }
88
+ `
89
+
90
+ const protobufIsEncodeFiniteNumberSource = `import typia from "typia";
91
+
92
+ interface Box {
93
+ value: number;
94
+ }
95
+
96
+ export const encode = (input: unknown): Uint8Array | null =>
97
+ typia.protobuf.isEncode<Box>(input);
98
+ `
@@ -14,47 +14,70 @@ import (
14
14
  // explicit protobuf field numbers were silently replaced by auto-numbering and
15
15
  // duplicate-sequence validation never fired.
16
16
  //
17
+ // The two messages live in separate fixtures because a duplicate-sequence
18
+ // diagnostic now withholds the whole file's artifact (samchon/typia#2117), so one
19
+ // combined source could no longer show the valid message's emitted numbers.
20
+ //
17
21
  // 1. Transform a message fixture carrying explicit `Sequence<5>` / `Sequence<7>`
18
22
  // field numbers plus an untagged property (auto-numbered after the highest
19
- // explicit number).
20
- // 2. Require the emitted proto message to carry the explicit numbers.
21
- // 3. Require a message whose two properties share `Sequence<1>` to fail the
22
- // transform, leaving the call untransformed.
23
+ // explicit number), and require the emitted proto message to carry them.
24
+ // 2. Require a message whose two properties share `Sequence<1>` to fail the
25
+ // transform with a diagnostic naming the duplicate.
26
+ // 3. Require that rejected transform to publish no artifact.
23
27
  func TestProtobufSequenceFieldNumbersTransform(t *testing.T) {
24
- project := protobufSequenceFieldNumbersProject(t)
25
- out, errText, code := ttscTypiaTestCapture(func() int {
26
- return runTransform([]string{
27
- "--cwd", project,
28
- "--tsconfig", "tsconfig.json",
29
- "--file", "src/main.ts",
30
- "--output", "js",
31
- })
32
- })
28
+ out, errText, code := protobufSequenceFieldNumbersTransform(t, "sequenced-", protobufSequenceFieldNumbersSource)
33
29
  if code != 0 {
34
30
  t.Fatalf("protobuf sequence transform failed: code=%d stderr=\n%s", code, errText)
35
31
  }
32
+ // The subject is the explicit `Sequence<5>` / `Sequence<7>` field numbers and
33
+ // the auto-numbered `8` after them; the presence label is `optional` because
34
+ // proto3 has no `required`, and emitting it would make the document reject
35
+ // under a Protobuf compiler (samchon/typia#2155). Compiler legality itself is
36
+ // pinned by TestProtobufMessageDocumentCompiles.
36
37
  for _, line := range []string{
37
- "required string id = 5;",
38
- "required double age = 7;",
39
- "required bool flag = 8;",
38
+ "optional string id = 5;",
39
+ "optional double age = 7;",
40
+ "optional bool flag = 8;",
40
41
  } {
41
42
  if !strings.Contains(out, line) {
42
43
  t.Fatalf("emitted proto message should contain %q:\n%s", line, out)
43
44
  }
44
45
  }
45
- if !strings.Contains(out, ".protobuf.message()") {
46
- t.Fatalf("duplicated sequence message should stay untransformed:\n%s", out)
46
+
47
+ dupOut, dupErr, dupCode := protobufSequenceFieldNumbersTransform(t, "duplicated-", protobufSequenceDuplicatedSource)
48
+ if dupCode != 3 {
49
+ t.Fatalf("duplicated sequence message should be rejected with code 3: code=%d stdout=\n%s\nstderr=\n%s", dupCode, dupOut, dupErr)
50
+ }
51
+ if !strings.Contains(dupErr, "error TS(typia.protobuf.message):") ||
52
+ !strings.Contains(dupErr, `The Sequence<1> tag is duplicated in two properties ("id" and "age")`) {
53
+ t.Fatalf("duplicated sequence diagnostic did not name the collision:\n%s", dupErr)
47
54
  }
55
+ if dupOut != "" {
56
+ t.Fatalf("duplicated sequence message published an artifact:\n%s", dupOut)
57
+ }
58
+ }
59
+
60
+ func protobufSequenceFieldNumbersTransform(t *testing.T, prefix string, source string) (string, string, int) {
61
+ t.Helper()
62
+ project := protobufSequenceFieldNumbersProject(t, prefix, source)
63
+ return ttscTypiaTestCapture(func() int {
64
+ return runTransform([]string{
65
+ "--cwd", project,
66
+ "--tsconfig", "tsconfig.json",
67
+ "--file", "src/main.ts",
68
+ "--output", "js",
69
+ })
70
+ })
48
71
  }
49
72
 
50
- func protobufSequenceFieldNumbersProject(t *testing.T) string {
73
+ func protobufSequenceFieldNumbersProject(t *testing.T, prefix string, source string) string {
51
74
  t.Helper()
52
75
  root := ttscTypiaTestRepoRoot(t)
53
76
  base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
54
77
  if err := os.MkdirAll(base, 0o755); err != nil {
55
78
  t.Fatalf("mkdir temp base: %v", err)
56
79
  }
57
- dir, err := os.MkdirTemp(base, "protobuf-sequence-")
80
+ dir, err := os.MkdirTemp(base, "protobuf-sequence-"+prefix)
58
81
  if err != nil {
59
82
  t.Fatalf("create temp fixture: %v", err)
60
83
  }
@@ -68,7 +91,7 @@ func protobufSequenceFieldNumbersProject(t *testing.T) string {
68
91
  if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(protobufSequenceFieldNumbersTSConfig), 0o644); err != nil {
69
92
  t.Fatalf("write tsconfig: %v", err)
70
93
  }
71
- if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(protobufSequenceFieldNumbersSource), 0o644); err != nil {
94
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(source), 0o644); err != nil {
72
95
  t.Fatalf("write source: %v", err)
73
96
  }
74
97
  return dir
@@ -97,11 +120,18 @@ interface Sequenced {
97
120
  flag: boolean;
98
121
  }
99
122
 
123
+ export const sequenced = typia.protobuf.message<Sequenced>();
124
+ `
125
+
126
+ // protobufSequenceDuplicatedSource is the negative twin: the same message shape
127
+ // whose two properties claim one `Sequence<1>` number, which typia must reject
128
+ // rather than auto-renumber.
129
+ const protobufSequenceDuplicatedSource = `import typia, { tags } from "typia";
130
+
100
131
  interface Duplicated {
101
132
  id: string & tags.Sequence<1>;
102
133
  age: number & tags.Sequence<1>;
103
134
  }
104
135
 
105
- export const sequenced = typia.protobuf.message<Sequenced>();
106
136
  export const duplicated = typia.protobuf.message<Duplicated>();
107
137
  `