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
@@ -7,7 +7,6 @@ import (
7
7
  "io"
8
8
  "os"
9
9
  "path/filepath"
10
- "regexp"
11
10
 
12
11
  shimast "github.com/microsoft/typescript-go/shim/ast"
13
12
  shimcompiler "github.com/microsoft/typescript-go/shim/compiler"
@@ -30,7 +29,7 @@ func runBuild(args []string) int {
30
29
  outDir := fs.String("outDir", "", "override compilerOptions.outDir")
31
30
  manifestPath := fs.String("manifest", "", "write emitted file list as JSON")
32
31
  rewriteMode := fs.String("rewrite-mode", "typia", "native rewrite backend id")
33
- _ = fs.String("plugins-json", "", "ordered ttsc plugin payload")
32
+ pluginsJSON := fs.String("plugins-json", "", "ordered ttsc plugin payload")
34
33
  if err := fs.Parse(args); err != nil {
35
34
  return 2
36
35
  }
@@ -45,38 +44,71 @@ func runBuild(args []string) int {
45
44
  fmt.Fprintf(stderr, "ttsc-typia build: unknown --rewrite-mode value %q\n", *rewriteMode)
46
45
  return 2
47
46
  }
47
+ // Resolve the options before loading the program: they come from the payload
48
+ // alone, so an unreadable manifest is a usage error to report now rather than
49
+ // after a full compile has already run under the wrong configuration.
50
+ pluginOptions, err := typiaadapter.ReadPluginOptions(*pluginsJSON)
51
+ if err != nil {
52
+ fmt.Fprintf(stderr, "ttsc-typia build: %v\n", err)
53
+ return 2
54
+ }
48
55
 
49
56
  cwd := *cwdOverride
50
57
  if cwd == "" {
51
- var err error
52
- cwd, err = os.Getwd()
53
- if err != nil {
58
+ if cwd, err = os.Getwd(); err != nil {
54
59
  fmt.Fprintf(stderr, "ttsc-typia build: cwd: %v\n", err)
55
60
  return 2
56
61
  }
57
62
  }
58
- prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, driver.LoadProgramOptions{
63
+ loadProgram := func(options driver.LoadProgramOptions, diagnose bool) (*driver.Program, int) {
64
+ prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, options)
65
+ if err != nil {
66
+ fmt.Fprintf(stderr, "ttsc-typia build: %v\n", err)
67
+ return nil, 2
68
+ }
69
+ if len(diags) > 0 {
70
+ if prog != nil {
71
+ prog.Close()
72
+ }
73
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
74
+ return nil, 2
75
+ }
76
+ if diagnose {
77
+ if diags := prog.Diagnostics(); len(diags) > 0 {
78
+ prog.Close()
79
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
80
+ return nil, 2
81
+ }
82
+ }
83
+ return prog, 0
84
+ }
85
+ prog, code := loadProgram(driver.LoadProgramOptions{
59
86
  ForceEmit: *emit,
60
87
  ForceNoEmit: *noEmit,
61
88
  OutDir: *outDir,
62
- })
63
- if err != nil {
64
- fmt.Fprintf(stderr, "ttsc-typia build: %v\n", err)
65
- return 2
89
+ }, true)
90
+ if code != 0 {
91
+ return code
66
92
  }
67
- if len(diags) > 0 {
68
- driver.WritePrettyDiagnostics(stderr, diags, cwd)
69
- return 2
93
+ shouldEmit := !prog.ParsedConfig.ParsedConfig.CompilerOptions.NoEmit.IsTrue()
94
+ if !shouldEmit {
95
+ // The plugin transformer is part of tsgo's emit pipeline. Reload with emit
96
+ // enabled so check/noEmit traverses the exact same source set, then discard
97
+ // every generated output below. The original program already proved the
98
+ // project's diagnostics; diagnosing the private reload would reject valid
99
+ // analysis-only options such as allowImportingTsExtensions.
100
+ prog.Close()
101
+ prog, code = loadProgram(driver.LoadProgramOptions{
102
+ ForceEmit: true,
103
+ OutDir: *outDir,
104
+ }, false)
105
+ if code != 0 {
106
+ return code
107
+ }
70
108
  }
71
109
  defer prog.Close()
72
- if diags := prog.Diagnostics(); len(diags) > 0 {
73
- driver.WritePrettyDiagnostics(stderr, diags, cwd)
74
- return 2
75
- }
76
110
 
77
- shouldEmit := !prog.ParsedConfig.ParsedConfig.CompilerOptions.NoEmit.IsTrue()
78
111
  transformDiags := []typiaTransformDiagnostic{}
79
- pluginOptions := readTypiaPluginOptions(cwd, *tsconfigPath)
80
112
  transformOptions := pluginOptions.TransformOptions()
81
113
  extras := nativecontext.ITypiaContext_Extras{
82
114
  AddDiagnostic: func(diag *nativecontext.ITypiaDiagnostic) int {
@@ -96,19 +128,33 @@ func runBuild(args []string) int {
96
128
  if !*quiet {
97
129
  fmt.Fprintf(stdout, "// ttsc-typia build: tsconfig=%s cwd=%s emit=%v rewrite=%s\n", *tsconfigPath, cwd, shouldEmit, *rewriteMode)
98
130
  }
99
- if shouldEmit {
100
- emitted := []string{}
101
- writeFile := shimcompiler.WriteFile(func(fileName, text string, data *shimcompiler.WriteFileData) error {
131
+ emitted := []string{}
132
+ pending := []buildPendingOutput{}
133
+ writeFile := shimcompiler.WriteFile(func(fileName, text string, data *shimcompiler.WriteFileData) error {
134
+ if shouldEmit {
102
135
  emitted = append(emitted, fileName)
103
- return driver.DefaultWriteFile(fileName, text)
104
- })
105
- eDiags, err := prog.EmitWithPluginTransformers([]driver.PluginTransform{typiaTransform}, writeFile)
106
- if err != nil {
107
- fmt.Fprintf(stderr, "ttsc-typia build: emit failed: %v\n", err)
108
- return 3
136
+ pending = append(pending, buildPendingOutput{FileName: fileName, Text: text})
109
137
  }
110
- for _, d := range eDiags {
111
- fmt.Fprintln(stderr, " -", d.String())
138
+ return nil
139
+ })
140
+ eDiags, err := prog.EmitWithPluginTransformers([]driver.PluginTransform{typiaTransform}, writeFile)
141
+ if err != nil {
142
+ fmt.Fprintf(stderr, "ttsc-typia build: emit failed: %v\n", err)
143
+ return 3
144
+ }
145
+ for _, d := range eDiags {
146
+ fmt.Fprintln(stderr, " -", d.String())
147
+ }
148
+ if len(transformDiags) > 0 {
149
+ writeTypiaTransformDiagnostics(stderr, transformDiags, cwd)
150
+ return 3
151
+ }
152
+ if shouldEmit {
153
+ for _, output := range pending {
154
+ if err := driver.DefaultWriteFile(output.FileName, output.Text); err != nil {
155
+ fmt.Fprintf(stderr, "ttsc-typia build: emit write failed: %v\n", err)
156
+ return 3
157
+ }
112
158
  }
113
159
  if !*quiet {
114
160
  fmt.Fprintf(stdout, "// ttsc-typia build: emitted=%d files\n", len(emitted))
@@ -136,13 +182,14 @@ func runBuild(args []string) int {
136
182
  }
137
183
  }
138
184
  }
139
- if len(transformDiags) > 0 {
140
- writeTypiaTransformDiagnostics(stderr, transformDiags, cwd)
141
- return 3
142
- }
143
185
  return 0
144
186
  }
145
187
 
188
+ type buildPendingOutput struct {
189
+ FileName string
190
+ Text string
191
+ }
192
+
146
193
  type typiaTransformDiagnostic struct {
147
194
  File string
148
195
  Line int
@@ -156,33 +203,3 @@ func writeTypiaTransformDiagnostics(out io.Writer, diagnostics []typiaTransformD
156
203
  fmt.Fprintln(out, diag.String(cwd))
157
204
  }
158
205
  }
159
-
160
- func readTypiaPluginOptions(cwd, tsconfigPath string) typiaadapter.PluginOptions {
161
- path := tsconfigPath
162
- if !filepath.IsAbs(path) {
163
- path = filepath.Join(cwd, path)
164
- }
165
- data, err := os.ReadFile(path)
166
- if err != nil {
167
- return typiaadapter.PluginOptions{}
168
- }
169
- text := string(data)
170
- if !regexp.MustCompile(`(?s)"transform"\s*:\s*"typia/lib/transform"`).MatchString(text) {
171
- return typiaadapter.PluginOptions{}
172
- }
173
- return typiaadapter.PluginOptions{
174
- Functional: regexp.MustCompile(`(?s)"functional"\s*:\s*true`).MatchString(text),
175
- Numeric: regexp.MustCompile(`(?s)"numeric"\s*:\s*true`).MatchString(text),
176
- Finite: regexp.MustCompile(`(?s)"finite"\s*:\s*true`).MatchString(text),
177
- Undefined: readBooleanPluginOption(text, "undefined"),
178
- }
179
- }
180
-
181
- func readBooleanPluginOption(text string, name string) *bool {
182
- matched := regexp.MustCompile(`(?s)"` + regexp.QuoteMeta(name) + `"\s*:\s*(true|false)`).FindStringSubmatch(text)
183
- if matched == nil {
184
- return nil
185
- }
186
- value := matched[1] == "true"
187
- return &value
188
- }
@@ -0,0 +1,67 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "strings"
7
+ "testing"
8
+ )
9
+
10
+ // TestBuildNoEmitPreservesAnalysisOnlyOptions verifies forced traversal does
11
+ // not invalidate options that are legal precisely because the project emits
12
+ // nothing.
13
+ //
14
+ // `allowImportingTsExtensions` is valid with `noEmit`, but invalid in an
15
+ // emitting program. The private emit-enabled traversal must therefore reuse
16
+ // the already-proven TypeScript analysis instead of reporting diagnostics
17
+ // introduced only by its internal override.
18
+ //
19
+ // 1. Create a valid no-emit typia project with allowImportingTsExtensions.
20
+ // 2. Run the native build command through its configured no-emit path.
21
+ // 3. Require success and prove the private traversal publishes no output.
22
+ func TestBuildNoEmitPreservesAnalysisOnlyOptions(t *testing.T) {
23
+ project := buildNoEmitDiagnosticProject(t, true)
24
+ configPath := filepath.Join(project, "tsconfig.json")
25
+ config, err := os.ReadFile(configPath)
26
+ if err != nil {
27
+ t.Fatalf("read tsconfig: %v", err)
28
+ }
29
+ configured := strings.Replace(
30
+ string(config),
31
+ `"noEmit": true`,
32
+ `"noEmit": true,
33
+ "allowImportingTsExtensions": true`,
34
+ 1,
35
+ )
36
+ if err := os.WriteFile(configPath, []byte(configured), 0o644); err != nil {
37
+ t.Fatalf("write tsconfig: %v", err)
38
+ }
39
+ source := `import typia from "typia";
40
+ export const isValue = (input: unknown): input is { value: number } =>
41
+ typia.is<{ value: number }>(input);
42
+ `
43
+ if err := os.WriteFile(filepath.Join(project, "src", "main.ts"), []byte(source), 0o644); err != nil {
44
+ t.Fatalf("write source: %v", err)
45
+ }
46
+
47
+ out, errText, code := ttscTypiaTestCapture(func() int {
48
+ return runBuild([]string{
49
+ "--cwd", project,
50
+ "--tsconfig", "tsconfig.json",
51
+ })
52
+ })
53
+ if code != 0 {
54
+ t.Fatalf("valid analysis-only project failed with code %d\nstdout=%s\nstderr=%s", code, out, errText)
55
+ }
56
+ if strings.TrimSpace(errText) != "" {
57
+ t.Fatalf("valid analysis-only project reported private emit diagnostics:\n%s", errText)
58
+ }
59
+ for _, path := range []string{
60
+ filepath.Join(project, "dist"),
61
+ filepath.Join(project, "cache.tsbuildinfo"),
62
+ } {
63
+ if _, err := os.Stat(path); !os.IsNotExist(err) {
64
+ t.Fatalf("analysis-only traversal published %s: %v", path, err)
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,138 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "strings"
7
+ "testing"
8
+ )
9
+
10
+ // TestBuildNoEmitReportsTransformDiagnostics verifies analysis-only transforms.
11
+ //
12
+ // TypeScript-clean source can still be invalid for typia. Check mode, an
13
+ // explicit --noEmit flag, and tsconfig-owned noEmit must all run the same typia
14
+ // analysis as emit mode without publishing any compiler artifact.
15
+ //
16
+ // 1. Create equivalent invalid projects for all three no-emit entry paths.
17
+ // 2. Require the preserved typia source location, code, and message.
18
+ // 3. Prove quiet/verbose reporting while every output path stays absent.
19
+ func TestBuildNoEmitReportsTransformDiagnostics(t *testing.T) {
20
+ cases := []struct {
21
+ name string
22
+ configured bool
23
+ verbose bool
24
+ run func(project, manifest string) int
25
+ }{
26
+ {
27
+ name: "check-command",
28
+ run: func(project, manifest string) int {
29
+ return run([]string{
30
+ "check",
31
+ "--cwd", project,
32
+ "--tsconfig", "tsconfig.json",
33
+ "--manifest", manifest,
34
+ })
35
+ },
36
+ },
37
+ {
38
+ name: "explicit-no-emit",
39
+ verbose: true,
40
+ run: func(project, manifest string) int {
41
+ return runBuild([]string{
42
+ "--cwd", project,
43
+ "--tsconfig", "tsconfig.json",
44
+ "--noEmit",
45
+ "--manifest", manifest,
46
+ "--verbose",
47
+ })
48
+ },
49
+ },
50
+ {
51
+ name: "configured-no-emit",
52
+ configured: true,
53
+ run: func(project, manifest string) int {
54
+ return runBuild([]string{
55
+ "--cwd", project,
56
+ "--tsconfig", "tsconfig.json",
57
+ "--manifest", manifest,
58
+ })
59
+ },
60
+ },
61
+ }
62
+ for _, tc := range cases {
63
+ t.Run(tc.name, func(t *testing.T) {
64
+ project := buildNoEmitDiagnosticProject(t, tc.configured)
65
+ manifest := filepath.Join(project, "artifacts", "manifest.json")
66
+ out, errText, code := ttscTypiaTestCapture(func() int {
67
+ return tc.run(project, manifest)
68
+ })
69
+ if code != 3 {
70
+ t.Fatalf("analysis-only transform should fail with code 3, got %d\nstdout=%s\nstderr=%s", code, out, errText)
71
+ }
72
+ normalized := filepath.ToSlash(errText)
73
+ if !strings.Contains(normalized, "src/main.ts:3:9 - error TS(typia.is):") ||
74
+ !strings.Contains(normalized, "non-specified generic argument") {
75
+ t.Fatalf("analysis-only diagnostic lost detail:\n%s", errText)
76
+ }
77
+ if tc.verbose {
78
+ if !strings.Contains(out, "emit=false") {
79
+ t.Fatalf("verbose no-emit summary missing:\n%s", out)
80
+ }
81
+ } else if strings.TrimSpace(out) != "" {
82
+ t.Fatalf("quiet no-emit run wrote stdout:\n%s", out)
83
+ }
84
+ for _, path := range []string{
85
+ filepath.Join(project, "dist"),
86
+ filepath.Join(project, "cache.tsbuildinfo"),
87
+ manifest,
88
+ } {
89
+ if _, err := os.Stat(path); !os.IsNotExist(err) {
90
+ t.Fatalf("analysis-only run published %s: %v", path, err)
91
+ }
92
+ }
93
+ })
94
+ }
95
+ }
96
+
97
+ func buildNoEmitDiagnosticProject(t *testing.T, noEmit bool) string {
98
+ t.Helper()
99
+ project := t.TempDir()
100
+ src := filepath.Join(project, "src")
101
+ if err := os.MkdirAll(src, 0o755); err != nil {
102
+ t.Fatalf("mkdir fixture src: %v", err)
103
+ }
104
+ configuredNoEmit := ""
105
+ if noEmit {
106
+ configuredNoEmit = `,
107
+ "noEmit": true`
108
+ }
109
+ config := `{
110
+ "compilerOptions": {
111
+ "target": "ES2022",
112
+ "module": "commonjs",
113
+ "moduleResolution": "bundler",
114
+ "ignoreDeprecations": "6.0",
115
+ "types": ["*"],
116
+ "esModuleInterop": true,
117
+ "strict": true,
118
+ "skipLibCheck": true,
119
+ "rootDir": "src",
120
+ "outDir": "dist",
121
+ "declaration": true,
122
+ "declarationMap": true,
123
+ "sourceMap": true,
124
+ "incremental": true,
125
+ "tsBuildInfoFile": "cache.tsbuildinfo"` + configuredNoEmit + `
126
+ },
127
+ "include": ["src"]
128
+ }
129
+ `
130
+ if err := os.WriteFile(filepath.Join(project, "tsconfig.json"), []byte(config), 0o644); err != nil {
131
+ t.Fatalf("write tsconfig: %v", err)
132
+ }
133
+ transformDiagnosticWriteTypiaStub(t, project)
134
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(transformDiagnosticSource), 0o644); err != nil {
135
+ t.Fatalf("write source: %v", err)
136
+ }
137
+ return project
138
+ }
@@ -0,0 +1,48 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "testing"
7
+ )
8
+
9
+ // TestBuildPluginOptionsComeFromPayload verifies the build host takes typia's
10
+ // options from ttsc's resolved plugin entry, not from tsconfig text.
11
+ //
12
+ // The build host declares its own `--plugins-json` flag and performs its own
13
+ // option read, so the transform host's coverage does not speak for it: reverting
14
+ // this host alone would leave the transform tests green. The rows write a
15
+ // tsconfig whose raw text disagrees with the resolved entry -- the distinction
16
+ // samchon/typia#1887's regex scrape could not make -- and the assertion reads
17
+ // the JavaScript this host actually wrote to disk.
18
+ //
19
+ // 1. Materialize each matrix row as a project plus the payload ttsc resolves it into.
20
+ // 2. Run the build host with emit forced into the project's outDir.
21
+ // 3. Assert the emitted validator honors the entry, not the file text.
22
+ func TestBuildPluginOptionsComeFromPayload(t *testing.T) {
23
+ for _, tc := range pluginOptionsPayloadCases() {
24
+ t.Run(tc.name, func(t *testing.T) {
25
+ project := pluginOptionsPayloadProject(t, tc)
26
+ dist := filepath.Join(project, "dist")
27
+ out, errText, code := ttscTypiaTestCapture(func() int {
28
+ return runBuild([]string{
29
+ "--cwd", project,
30
+ "--tsconfig", "tsconfig.json",
31
+ "--emit",
32
+ "--outDir", dist,
33
+ // `=`-joined, the exact shape ttsc's createNativeBuildArgs and the
34
+ // wasm hosts put on the wire.
35
+ "--plugins-json=" + tc.payload,
36
+ })
37
+ })
38
+ if code != 0 {
39
+ t.Fatalf("build failed with code %d\nstdout=%s\nstderr=%s", code, out, errText)
40
+ }
41
+ emitted, err := os.ReadFile(filepath.Join(dist, "main.js"))
42
+ if err != nil {
43
+ t.Fatalf("read emitted javascript: %v", err)
44
+ }
45
+ pluginOptionsPayloadAssert(t, tc, string(emitted))
46
+ })
47
+ }
48
+ }
@@ -0,0 +1,81 @@
1
+ package main
2
+
3
+ import (
4
+ "encoding/json"
5
+ "os"
6
+ "path/filepath"
7
+ "reflect"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ // TestBuildTransactionalEmitPublishesCleanProject verifies the commit path.
13
+ //
14
+ // Buffering failed transforms must not suppress or alter successful JavaScript,
15
+ // declarations, maps, or manifest entries. A clean multi-file build publishes
16
+ // every compiler output only after the shared transform phase succeeds.
17
+ //
18
+ // 1. Build two valid typia sources with declarations and source maps enabled.
19
+ // 2. Read the emitted manifest and require every recorded file to exist.
20
+ // 3. Check each output family and prove JavaScript no longer calls typia.is.
21
+ func TestBuildTransactionalEmitPublishesCleanProject(t *testing.T) {
22
+ project := buildAtomicityProject(t, false)
23
+ manifest := filepath.Join(project, "artifacts", "manifest.json")
24
+ out, errText, code := ttscTypiaTestCapture(func() int {
25
+ return runBuild([]string{
26
+ "--cwd", project,
27
+ "--tsconfig", "tsconfig.json",
28
+ "--emit",
29
+ "--manifest", manifest,
30
+ "--verbose",
31
+ })
32
+ })
33
+ if code != 0 {
34
+ t.Fatalf("clean transactional build failed with code %d\nstdout=%s\nstderr=%s", code, out, errText)
35
+ }
36
+ data, err := os.ReadFile(manifest)
37
+ if err != nil {
38
+ t.Fatalf("read manifest: %v", err)
39
+ }
40
+ var emitted []string
41
+ if err := json.Unmarshal(data, &emitted); err != nil {
42
+ t.Fatalf("decode manifest: %v\n%s", err, data)
43
+ }
44
+ if len(emitted) == 0 || !strings.Contains(out, "emitted=") {
45
+ t.Fatalf("successful build did not report emitted outputs: %v\n%s", emitted, out)
46
+ }
47
+ expected := map[string]bool{
48
+ "dist/invalid.d.ts": true,
49
+ "dist/invalid.d.ts.map": true,
50
+ "dist/invalid.js": true,
51
+ "dist/invalid.js.map": true,
52
+ "dist/valid.d.ts": true,
53
+ "dist/valid.d.ts.map": true,
54
+ "dist/valid.js": true,
55
+ "dist/valid.js.map": true,
56
+ }
57
+ actual := map[string]bool{}
58
+ for _, path := range emitted {
59
+ if _, err := os.Stat(path); err != nil {
60
+ t.Fatalf("manifest advertised missing output %s: %v", path, err)
61
+ }
62
+ relative, err := filepath.Rel(project, path)
63
+ if err != nil {
64
+ t.Fatalf("relativize emitted output %s: %v", path, err)
65
+ }
66
+ slash := filepath.ToSlash(relative)
67
+ actual[slash] = true
68
+ if strings.HasSuffix(slash, ".js") {
69
+ js, err := os.ReadFile(path)
70
+ if err != nil {
71
+ t.Fatalf("read emitted JavaScript: %v", err)
72
+ }
73
+ if strings.Contains(string(js), "typia.is(") {
74
+ t.Fatalf("emitted JavaScript retained typia runtime stub:\n%s", js)
75
+ }
76
+ }
77
+ }
78
+ if !reflect.DeepEqual(actual, expected) {
79
+ t.Fatalf("manifest output set changed:\nexpected=%v\nactual=%v", expected, actual)
80
+ }
81
+ }
@@ -0,0 +1,138 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "reflect"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestBuildTransformFailurePreservesArtifacts verifies failed-build atomicity.
12
+ //
13
+ // A transform failure can arrive after valid siblings have already produced
14
+ // JavaScript, declarations, maps, and a manifest candidate. None of those
15
+ // buffered results may replace prior artifacts or escape as new files.
16
+ //
17
+ // 1. Seed output and manifest trees with byte-sensitive prior artifacts.
18
+ // 2. Build one valid source beside one typia-invalid generic source.
19
+ // 3. Require the diagnostic and compare both trees byte-for-byte.
20
+ func TestBuildTransformFailurePreservesArtifacts(t *testing.T) {
21
+ project := buildAtomicityProject(t, true)
22
+ dist := filepath.Join(project, "dist")
23
+ manifest := filepath.Join(project, "artifacts", "manifest.json")
24
+ seeds := map[string]string{
25
+ filepath.Join(dist, "valid.js"): "previous javascript\n",
26
+ filepath.Join(dist, "existing.d.ts"): "previous declaration\n",
27
+ filepath.Join(dist, "keep.txt"): "unrelated output\n",
28
+ manifest: `["previous.js"]`,
29
+ }
30
+ for path, body := range seeds {
31
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
32
+ t.Fatalf("mkdir seed parent: %v", err)
33
+ }
34
+ if err := os.WriteFile(path, []byte(body), 0o644); err != nil {
35
+ t.Fatalf("write seed %s: %v", path, err)
36
+ }
37
+ }
38
+ beforeDist := buildReadTree(t, dist)
39
+ beforeArtifacts := buildReadTree(t, filepath.Dir(manifest))
40
+
41
+ _, errText, code := ttscTypiaTestCapture(func() int {
42
+ return runBuild([]string{
43
+ "--cwd", project,
44
+ "--tsconfig", "tsconfig.json",
45
+ "--emit",
46
+ "--manifest", manifest,
47
+ })
48
+ })
49
+ if code != 3 {
50
+ t.Fatalf("invalid multi-file transform should fail with code 3, got %d\nstderr=%s", code, errText)
51
+ }
52
+ normalized := filepath.ToSlash(errText)
53
+ if !strings.Contains(normalized, "src/invalid.ts:3:9 - error TS(typia.is):") {
54
+ t.Fatalf("transform diagnostic missing invalid source location:\n%s", errText)
55
+ }
56
+ if after := buildReadTree(t, dist); !reflect.DeepEqual(after, beforeDist) {
57
+ t.Fatalf("failed transform mutated output tree:\nbefore=%q\nafter=%q", beforeDist, after)
58
+ }
59
+ if after := buildReadTree(t, filepath.Dir(manifest)); !reflect.DeepEqual(after, beforeArtifacts) {
60
+ t.Fatalf("failed transform mutated manifest tree:\nbefore=%q\nafter=%q", beforeArtifacts, after)
61
+ }
62
+ }
63
+
64
+ func buildReadTree(t *testing.T, root string) map[string]string {
65
+ t.Helper()
66
+ files := map[string]string{}
67
+ if err := filepath.WalkDir(root, func(path string, entry os.DirEntry, err error) error {
68
+ if err != nil {
69
+ return err
70
+ }
71
+ if entry.IsDir() {
72
+ return nil
73
+ }
74
+ data, err := os.ReadFile(path)
75
+ if err != nil {
76
+ return err
77
+ }
78
+ rel, err := filepath.Rel(root, path)
79
+ if err != nil {
80
+ return err
81
+ }
82
+ files[filepath.ToSlash(rel)] = string(data)
83
+ return nil
84
+ }); err != nil {
85
+ t.Fatalf("read tree %s: %v", root, err)
86
+ }
87
+ return files
88
+ }
89
+
90
+ func buildAtomicityProject(t *testing.T, invalid bool) string {
91
+ t.Helper()
92
+ project := t.TempDir()
93
+ src := filepath.Join(project, "src")
94
+ if err := os.MkdirAll(src, 0o755); err != nil {
95
+ t.Fatalf("mkdir fixture src: %v", err)
96
+ }
97
+ config := `{
98
+ "compilerOptions": {
99
+ "target": "ES2022",
100
+ "module": "commonjs",
101
+ "moduleResolution": "bundler",
102
+ "ignoreDeprecations": "6.0",
103
+ "types": ["*"],
104
+ "esModuleInterop": true,
105
+ "strict": true,
106
+ "skipLibCheck": true,
107
+ "rootDir": "src",
108
+ "outDir": "dist",
109
+ "declaration": true,
110
+ "declarationMap": true,
111
+ "sourceMap": true
112
+ },
113
+ "include": ["src"]
114
+ }
115
+ `
116
+ if err := os.WriteFile(filepath.Join(project, "tsconfig.json"), []byte(config), 0o644); err != nil {
117
+ t.Fatalf("write tsconfig: %v", err)
118
+ }
119
+ transformDiagnosticWriteTypiaStub(t, project)
120
+ validSource := `import typia from "typia";
121
+ export const valid = (input: unknown): input is { value: number } =>
122
+ typia.is<{ value: number }>(input);
123
+ `
124
+ if err := os.WriteFile(filepath.Join(src, "valid.ts"), []byte(validSource), 0o644); err != nil {
125
+ t.Fatalf("write valid source: %v", err)
126
+ }
127
+ secondSource := `import typia from "typia";
128
+ export const second = (input: unknown): input is { name: string } =>
129
+ typia.is<{ name: string }>(input);
130
+ `
131
+ if invalid {
132
+ secondSource = transformDiagnosticSource
133
+ }
134
+ if err := os.WriteFile(filepath.Join(src, "invalid.ts"), []byte(secondSource), 0o644); err != nil {
135
+ t.Fatalf("write second source: %v", err)
136
+ }
137
+ return project
138
+ }
@@ -175,6 +175,8 @@ func TestCommandRoutesAndDiagnosticsCoverage(t *testing.T) {
175
175
  "--rewrite-mode", "none",
176
176
  })
177
177
  }, 0},
178
+ // Publishes, rather than the 3 this expected while samchon/typia#2134
179
+ // made `--output js` miss its own artifact under the fixture's `outDir`.
178
180
  {"transform_js_out", func(t *testing.T) int {
179
181
  return runTransform([]string{
180
182
  "--cwd", primitives,
@@ -184,7 +186,7 @@ func TestCommandRoutesAndDiagnosticsCoverage(t *testing.T) {
184
186
  "--out", filepath.Join(t.TempDir(), "main.js"),
185
187
  "--rewrite-mode", "none",
186
188
  })
187
- }, 3},
189
+ }, 0},
188
190
  {"transform_ts_stdout_write_error", func(t *testing.T) int {
189
191
  return commandRoutesWithFailingStdout(func() int {
190
192
  return runTransform([]string{