typia 13.1.1 → 13.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/README.md +3 -0
  2. package/lib/_virtual/_rolldown/runtime.mjs +1 -5
  3. package/lib/executable/FileSystemIdentity.d.ts +44 -0
  4. package/lib/executable/FileSystemIdentity.js +213 -0
  5. package/lib/executable/FileSystemIdentity.js.map +1 -0
  6. package/lib/executable/FileSystemIdentity.mjs +133 -0
  7. package/lib/executable/FileSystemIdentity.mjs.map +1 -0
  8. package/lib/executable/TypiaGenerateWizard.js +272 -106
  9. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  10. package/lib/executable/TypiaGenerateWizard.mjs +239 -95
  11. package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
  12. package/lib/functional.d.ts +15 -12
  13. package/lib/functional.js.map +1 -1
  14. package/lib/functional.mjs.map +1 -1
  15. package/lib/internal/_ProtobufReader.d.ts +32 -0
  16. package/lib/internal/_ProtobufReader.js +148 -48
  17. package/lib/internal/_ProtobufReader.js.map +1 -1
  18. package/lib/internal/_ProtobufReader.mjs +137 -41
  19. package/lib/internal/_ProtobufReader.mjs.map +1 -1
  20. package/lib/internal/_createStandardSchema.js +18 -1
  21. package/lib/internal/_createStandardSchema.js.map +1 -1
  22. package/lib/internal/_createStandardSchema.mjs +12 -1
  23. package/lib/internal/_createStandardSchema.mjs.map +1 -1
  24. package/lib/internal/_decimal.d.ts +14 -0
  25. package/lib/internal/_decimal.js +61 -0
  26. package/lib/internal/_decimal.js.map +1 -0
  27. package/lib/internal/_decimal.mjs +49 -0
  28. package/lib/internal/_decimal.mjs.map +1 -0
  29. package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
  30. package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
  31. package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
  32. package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
  33. package/lib/internal/_isFormatByte.js +2 -5
  34. package/lib/internal/_isFormatByte.js.map +1 -1
  35. package/lib/internal/_isFormatByte.mjs +2 -5
  36. package/lib/internal/_isFormatByte.mjs.map +1 -1
  37. package/lib/internal/_isFormatDate.js +15 -2
  38. package/lib/internal/_isFormatDate.js.map +1 -1
  39. package/lib/internal/_isFormatDate.mjs +22 -2
  40. package/lib/internal/_isFormatDate.mjs.map +1 -1
  41. package/lib/internal/_isFormatDateTime.js +21 -2
  42. package/lib/internal/_isFormatDateTime.js.map +1 -1
  43. package/lib/internal/_isFormatDateTime.mjs +13 -2
  44. package/lib/internal/_isFormatDateTime.mjs.map +1 -1
  45. package/lib/internal/_isFormatIri.js +3 -2
  46. package/lib/internal/_isFormatIri.js.map +1 -1
  47. package/lib/internal/_isFormatIri.mjs +3 -2
  48. package/lib/internal/_isFormatIri.mjs.map +1 -1
  49. package/lib/internal/_isFormatIriReference.js +10 -2
  50. package/lib/internal/_isFormatIriReference.js.map +1 -1
  51. package/lib/internal/_isFormatIriReference.mjs +9 -2
  52. package/lib/internal/_isFormatIriReference.mjs.map +1 -1
  53. package/lib/internal/_isFormatUriReference.js +1 -1
  54. package/lib/internal/_isFormatUriReference.js.map +1 -1
  55. package/lib/internal/_isFormatUriReference.mjs +1 -1
  56. package/lib/internal/_isFormatUriReference.mjs.map +1 -1
  57. package/lib/internal/_isMultipleOf.d.ts +1 -0
  58. package/lib/internal/_isMultipleOf.js +13 -0
  59. package/lib/internal/_isMultipleOf.js.map +1 -0
  60. package/lib/internal/_isMultipleOf.mjs +12 -0
  61. package/lib/internal/_isMultipleOf.mjs.map +1 -0
  62. package/lib/internal/_isTypeFloat.js +1 -1
  63. package/lib/internal/_isTypeFloat.js.map +1 -1
  64. package/lib/internal/_isTypeFloat.mjs +1 -1
  65. package/lib/internal/_isTypeFloat.mjs.map +1 -1
  66. package/lib/internal/_isTypeInt64.js +1 -0
  67. package/lib/internal/_isTypeInt64.js.map +1 -1
  68. package/lib/internal/_isTypeInt64.mjs.map +1 -1
  69. package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
  70. package/lib/internal/_isTypeInt64Bigint.js +15 -0
  71. package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
  72. package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
  73. package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
  74. package/lib/internal/_isTypeUint64.js +1 -0
  75. package/lib/internal/_isTypeUint64.js.map +1 -1
  76. package/lib/internal/_isTypeUint64.mjs.map +1 -1
  77. package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
  78. package/lib/internal/_isTypeUint64Bigint.js +10 -0
  79. package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
  80. package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
  81. package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
  82. package/lib/internal/_isUniqueItems.js +96 -109
  83. package/lib/internal/_isUniqueItems.js.map +1 -1
  84. package/lib/internal/_isUniqueItems.mjs +62 -50
  85. package/lib/internal/_isUniqueItems.mjs.map +1 -1
  86. package/lib/internal/_jsonStringifyArray.d.ts +1 -0
  87. package/lib/internal/_jsonStringifyArray.js +48 -0
  88. package/lib/internal/_jsonStringifyArray.js.map +1 -0
  89. package/lib/internal/_jsonStringifyArray.mjs +40 -0
  90. package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
  91. package/lib/internal/_jsonStringifyElement.d.ts +1 -0
  92. package/lib/internal/_jsonStringifyElement.js +23 -0
  93. package/lib/internal/_jsonStringifyElement.js.map +1 -0
  94. package/lib/internal/_jsonStringifyElement.mjs +23 -0
  95. package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
  96. package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
  97. package/lib/internal/_jsonStringifyProperty.js +31 -0
  98. package/lib/internal/_jsonStringifyProperty.js.map +1 -0
  99. package/lib/internal/_jsonStringifyProperty.mjs +31 -0
  100. package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
  101. package/lib/internal/_llmApplicationFinalize.js +1 -1
  102. package/lib/internal/_llmApplicationFinalize.js.map +1 -1
  103. package/lib/internal/_llmApplicationFinalize.mjs +1 -1
  104. package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
  105. package/lib/internal/_notationAny.js +8 -1
  106. package/lib/internal/_notationAny.js.map +1 -1
  107. package/lib/internal/_notationAny.mjs +7 -1
  108. package/lib/internal/_notationAny.mjs.map +1 -1
  109. package/lib/internal/_notationAssign.d.ts +1 -0
  110. package/lib/internal/_notationAssign.js +18 -0
  111. package/lib/internal/_notationAssign.js.map +1 -0
  112. package/lib/internal/_notationAssign.mjs +17 -0
  113. package/lib/internal/_notationAssign.mjs.map +1 -0
  114. package/lib/internal/_notationCamel.js +30 -9
  115. package/lib/internal/_notationCamel.js.map +1 -1
  116. package/lib/internal/_notationCamel.mjs +13 -5
  117. package/lib/internal/_notationCamel.mjs.map +1 -1
  118. package/lib/internal/_notationKebab.d.ts +1 -0
  119. package/lib/internal/_notationKebab.js +15 -0
  120. package/lib/internal/_notationKebab.js.map +1 -0
  121. package/lib/internal/_notationKebab.mjs +15 -0
  122. package/lib/internal/_notationKebab.mjs.map +1 -0
  123. package/lib/internal/_notationKeyCollision.d.ts +1 -0
  124. package/lib/internal/_notationKeyCollision.js +8 -0
  125. package/lib/internal/_notationKeyCollision.js.map +1 -0
  126. package/lib/internal/_notationKeyCollision.mjs +8 -0
  127. package/lib/internal/_notationKeyCollision.mjs.map +1 -0
  128. package/lib/internal/_notationPascal.js +20 -5
  129. package/lib/internal/_notationPascal.js.map +1 -1
  130. package/lib/internal/_notationPascal.mjs +10 -5
  131. package/lib/internal/_notationPascal.mjs.map +1 -1
  132. package/lib/internal/_notationSnake.js +25 -22
  133. package/lib/internal/_notationSnake.js.map +1 -1
  134. package/lib/internal/_notationSnake.mjs +11 -11
  135. package/lib/internal/_notationSnake.mjs.map +1 -1
  136. package/lib/internal/_plainCloneAny.js +174 -38
  137. package/lib/internal/_plainCloneAny.js.map +1 -1
  138. package/lib/internal/_plainCloneAny.mjs +126 -22
  139. package/lib/internal/_plainCloneAny.mjs.map +1 -1
  140. package/lib/internal/_randomArray.d.ts +1 -1
  141. package/lib/internal/_randomArray.js +11 -4
  142. package/lib/internal/_randomArray.js.map +1 -1
  143. package/lib/internal/_randomArray.mjs +9 -3
  144. package/lib/internal/_randomArray.mjs.map +1 -1
  145. package/lib/internal/_randomFormatByte.d.ts +2 -1
  146. package/lib/internal/_randomFormatByte.js +25 -1
  147. package/lib/internal/_randomFormatByte.js.map +1 -1
  148. package/lib/internal/_randomFormatByte.mjs +20 -1
  149. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  150. package/lib/internal/_randomFormatDate.d.ts +3 -4
  151. package/lib/internal/_randomFormatDate.js +3 -10
  152. package/lib/internal/_randomFormatDate.js.map +1 -1
  153. package/lib/internal/_randomFormatDate.mjs +3 -6
  154. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  155. package/lib/internal/_randomFormatDatetime.d.ts +3 -4
  156. package/lib/internal/_randomFormatDatetime.js +26 -8
  157. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  158. package/lib/internal/_randomFormatDatetime.mjs +17 -6
  159. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  160. package/lib/internal/_randomFormatDuration.d.ts +2 -1
  161. package/lib/internal/_randomFormatDuration.js +23 -14
  162. package/lib/internal/_randomFormatDuration.js.map +1 -1
  163. package/lib/internal/_randomFormatDuration.mjs +22 -13
  164. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  165. package/lib/internal/_randomFormatEmail.d.ts +2 -1
  166. package/lib/internal/_randomFormatEmail.js +8 -1
  167. package/lib/internal/_randomFormatEmail.js.map +1 -1
  168. package/lib/internal/_randomFormatEmail.mjs +5 -1
  169. package/lib/internal/_randomFormatEmail.mjs.map +1 -1
  170. package/lib/internal/_randomFormatHostname.d.ts +8 -1
  171. package/lib/internal/_randomFormatHostname.js +45 -2
  172. package/lib/internal/_randomFormatHostname.js.map +1 -1
  173. package/lib/internal/_randomFormatHostname.mjs +38 -2
  174. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  175. package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
  176. package/lib/internal/_randomFormatIdnEmail.js +16 -2
  177. package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
  178. package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
  179. package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
  180. package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
  181. package/lib/internal/_randomFormatIdnHostname.js +26 -1
  182. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  183. package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
  184. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  185. package/lib/internal/_randomFormatIpv4.d.ts +2 -1
  186. package/lib/internal/_randomFormatIpv4.js +32 -1
  187. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  188. package/lib/internal/_randomFormatIpv4.mjs +23 -1
  189. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  190. package/lib/internal/_randomFormatIpv6.d.ts +2 -1
  191. package/lib/internal/_randomFormatIpv6.js +58 -1
  192. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  193. package/lib/internal/_randomFormatIpv6.mjs +45 -1
  194. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  195. package/lib/internal/_randomFormatIri.d.ts +2 -1
  196. package/lib/internal/_randomFormatIri.js +1 -1
  197. package/lib/internal/_randomFormatIri.js.map +1 -1
  198. package/lib/internal/_randomFormatIri.mjs +1 -1
  199. package/lib/internal/_randomFormatIri.mjs.map +1 -1
  200. package/lib/internal/_randomFormatIriReference.d.ts +2 -1
  201. package/lib/internal/_randomFormatIriReference.js +1 -1
  202. package/lib/internal/_randomFormatIriReference.js.map +1 -1
  203. package/lib/internal/_randomFormatIriReference.mjs +1 -1
  204. package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
  205. package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
  206. package/lib/internal/_randomFormatJsonPointer.js +20 -1
  207. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  208. package/lib/internal/_randomFormatJsonPointer.mjs +15 -1
  209. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  210. package/lib/internal/_randomFormatPassword.d.ts +2 -1
  211. package/lib/internal/_randomFormatPassword.js +7 -5
  212. package/lib/internal/_randomFormatPassword.js.map +1 -1
  213. package/lib/internal/_randomFormatPassword.mjs +5 -1
  214. package/lib/internal/_randomFormatPassword.mjs.map +1 -1
  215. package/lib/internal/_randomFormatRegex.d.ts +2 -1
  216. package/lib/internal/_randomFormatRegex.js +15 -1
  217. package/lib/internal/_randomFormatRegex.js.map +1 -1
  218. package/lib/internal/_randomFormatRegex.mjs +14 -1
  219. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  220. package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
  221. package/lib/internal/_randomFormatRelativeJsonPointer.js +20 -5
  222. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  223. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -5
  224. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  225. package/lib/internal/_randomFormatTime.d.ts +2 -1
  226. package/lib/internal/_randomFormatTime.js +34 -7
  227. package/lib/internal/_randomFormatTime.js.map +1 -1
  228. package/lib/internal/_randomFormatTime.mjs +37 -4
  229. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  230. package/lib/internal/_randomFormatUri.d.ts +2 -1
  231. package/lib/internal/_randomFormatUri.js +1 -1
  232. package/lib/internal/_randomFormatUri.js.map +1 -1
  233. package/lib/internal/_randomFormatUri.mjs +1 -1
  234. package/lib/internal/_randomFormatUri.mjs.map +1 -1
  235. package/lib/internal/_randomFormatUriReference.d.ts +2 -1
  236. package/lib/internal/_randomFormatUriReference.js +1 -1
  237. package/lib/internal/_randomFormatUriReference.js.map +1 -1
  238. package/lib/internal/_randomFormatUriReference.mjs +1 -1
  239. package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
  240. package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
  241. package/lib/internal/_randomFormatUriTemplate.js +1 -1
  242. package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
  243. package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
  244. package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
  245. package/lib/internal/_randomFormatUrl.d.ts +2 -1
  246. package/lib/internal/_randomFormatUrl.js +21 -1
  247. package/lib/internal/_randomFormatUrl.js.map +1 -1
  248. package/lib/internal/_randomFormatUrl.mjs +18 -1
  249. package/lib/internal/_randomFormatUrl.mjs.map +1 -1
  250. package/lib/internal/_randomFormatUuid.d.ts +2 -1
  251. package/lib/internal/_randomFormatUuid.js +3 -2
  252. package/lib/internal/_randomFormatUuid.js.map +1 -1
  253. package/lib/internal/_randomFormatUuid.mjs +3 -2
  254. package/lib/internal/_randomFormatUuid.mjs.map +1 -1
  255. package/lib/internal/_randomInteger.js +59 -28
  256. package/lib/internal/_randomInteger.js.map +1 -1
  257. package/lib/internal/_randomInteger.mjs +56 -16
  258. package/lib/internal/_randomInteger.mjs.map +1 -1
  259. package/lib/internal/_randomMultiple.d.ts +8 -0
  260. package/lib/internal/_randomMultiple.js +168 -0
  261. package/lib/internal/_randomMultiple.js.map +1 -0
  262. package/lib/internal/_randomMultiple.mjs +158 -0
  263. package/lib/internal/_randomMultiple.mjs.map +1 -0
  264. package/lib/internal/_randomNumber.js +42 -42
  265. package/lib/internal/_randomNumber.js.map +1 -1
  266. package/lib/internal/_randomNumber.mjs +41 -27
  267. package/lib/internal/_randomNumber.mjs.map +1 -1
  268. package/lib/internal/_randomPattern.d.ts +2 -1
  269. package/lib/internal/_randomPattern.js +19 -4
  270. package/lib/internal/_randomPattern.js.map +1 -1
  271. package/lib/internal/_randomPattern.mjs +10 -4
  272. package/lib/internal/_randomPattern.mjs.map +1 -1
  273. package/lib/internal/_randomStringLength.d.ts +64 -0
  274. package/lib/internal/_randomStringLength.js +84 -0
  275. package/lib/internal/_randomStringLength.js.map +1 -0
  276. package/lib/internal/_randomStringLength.mjs +79 -0
  277. package/lib/internal/_randomStringLength.mjs.map +1 -0
  278. package/lib/internal/_stringLength.d.ts +1 -0
  279. package/lib/internal/_stringLength.js +11 -0
  280. package/lib/internal/_stringLength.js.map +1 -0
  281. package/lib/internal/_stringLength.mjs +10 -0
  282. package/lib/internal/_stringLength.mjs.map +1 -0
  283. package/lib/internal/_validateReport.js +4 -1
  284. package/lib/internal/_validateReport.js.map +1 -1
  285. package/lib/internal/_validateReport.mjs +2 -1
  286. package/lib/internal/_validateReport.mjs.map +1 -1
  287. package/lib/internal/private/__notationRename.d.ts +14 -0
  288. package/lib/internal/private/__notationRename.js +25 -0
  289. package/lib/internal/private/__notationRename.js.map +1 -0
  290. package/lib/internal/private/__notationRename.mjs +24 -0
  291. package/lib/internal/private/__notationRename.mjs.map +1 -0
  292. package/lib/internal/private/__randomComposition.d.ts +23 -0
  293. package/lib/internal/private/__randomComposition.js +48 -0
  294. package/lib/internal/private/__randomComposition.js.map +1 -0
  295. package/lib/internal/private/__randomComposition.mjs +54 -0
  296. package/lib/internal/private/__randomComposition.mjs.map +1 -0
  297. package/lib/internal/private/__randomEpoch.d.ts +19 -0
  298. package/lib/internal/private/__randomEpoch.js +31 -0
  299. package/lib/internal/private/__randomEpoch.js.map +1 -0
  300. package/lib/internal/private/__randomEpoch.mjs +28 -0
  301. package/lib/internal/private/__randomEpoch.mjs.map +1 -0
  302. package/lib/json.d.ts +2 -2
  303. package/lib/json.mjs.map +1 -1
  304. package/lib/module.d.ts +2 -2
  305. package/lib/module.js.map +1 -1
  306. package/lib/module.mjs.map +1 -1
  307. package/lib/notations.d.ts +20 -4
  308. package/lib/notations.js.map +1 -1
  309. package/lib/notations.mjs.map +1 -1
  310. package/native/adapter/plugin_options.go +117 -0
  311. package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
  312. package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
  313. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
  314. package/native/cmd/ttsc-typia/build.go +84 -64
  315. package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
  316. package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
  317. package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
  318. package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
  319. package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
  320. package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
  321. package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
  322. package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
  323. package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
  324. package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
  325. package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
  326. package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
  327. package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
  328. package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
  329. package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
  330. package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
  331. package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
  332. package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
  333. package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
  334. package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
  335. package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
  336. package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
  337. package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
  338. package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
  339. package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
  340. package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
  341. package/native/cmd/ttsc-typia/main_wasm.go +21 -2
  342. package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
  343. package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
  344. package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
  345. package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
  346. package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
  347. package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
  348. package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
  349. package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
  350. package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
  351. package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
  352. package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
  353. package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
  354. package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
  355. package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
  356. package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
  357. package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
  358. package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
  359. package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
  360. package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
  361. package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
  362. package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
  363. package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
  364. package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
  365. package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
  366. package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
  367. package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
  368. package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
  369. package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
  370. package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
  371. package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
  372. package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
  373. package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
  374. package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
  375. package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
  376. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
  377. package/native/cmd/ttsc-typia/transform.go +251 -39
  378. package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
  379. package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
  380. package/native/cmd/ttsc-typia/transform_helpers_test.go +236 -3
  381. package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
  382. package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
  383. package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
  384. package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
  385. package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
  386. package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
  387. package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
  388. package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
  389. package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
  390. package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
  391. package/native/core/factories/FormatCheatSheet.go +40 -7
  392. package/native/core/factories/IdentifierFactory.go +131 -4
  393. package/native/core/factories/MetadataCommentTagFactory.go +83 -40
  394. package/native/core/factories/MetadataTypeTagFactory.go +13 -1
  395. package/native/core/factories/NumericRangeFactory.go +60 -17
  396. package/native/core/factories/ProtobufFactory.go +13 -5
  397. package/native/core/factories/factory_utility_coverage_test.go +8 -2
  398. package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
  399. package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
  400. package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
  401. package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
  402. package/native/core/factories/internal/metadata/MetadataHelper.go +226 -17
  403. package/native/core/factories/internal/metadata/emplace_metadata_object.go +141 -8
  404. package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
  405. package/native/core/factories/internal/metadata/iterate_metadata_function.go +5 -12
  406. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +111 -29
  407. package/native/core/factories/internal/metadata/iterate_metadata_map.go +5 -0
  408. package/native/core/factories/internal/metadata/iterate_metadata_native.go +45 -2
  409. package/native/core/factories/internal/metadata/iterate_metadata_set.go +5 -0
  410. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  411. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  412. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  413. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  414. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  415. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  416. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  417. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  418. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  419. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  420. package/native/core/programmers/IsProgrammer.go +15 -1
  421. package/native/core/programmers/RandomProgrammer.go +51 -14
  422. package/native/core/programmers/compare/CompareEqualProgrammer.go +410 -8
  423. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  424. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  425. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  426. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  427. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  428. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  429. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  430. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  431. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  432. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  433. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  434. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  435. package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
  436. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  437. package/native/core/programmers/helpers/StringifyJoinder.go +161 -51
  438. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  439. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -118
  440. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  441. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  442. package/native/core/programmers/iterate/check_template.go +344 -32
  443. package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
  444. package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
  445. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  446. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  447. package/native/core/programmers/iterate/json_schema_object.go +49 -7
  448. package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
  449. package/native/core/programmers/iterate/openapi_v3_downgrader.go +674 -0
  450. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  451. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  452. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  453. package/native/core/programmers/iterate/template_runtime_pattern.go +63 -7
  454. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  455. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  456. package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
  457. package/native/core/programmers/llm/LlmApplicationProgrammer.go +21 -11
  458. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  459. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  460. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  461. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  462. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  463. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  464. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  465. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  466. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  467. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  468. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  469. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +41 -22
  470. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  471. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  472. package/native/core/schemas/metadata/MetadataCollection.go +266 -25
  473. package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
  474. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  475. package/native/core/schemas/metadata/MetadataObjectType.go +24 -22
  476. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  477. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  478. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  479. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  480. package/native/core/utils/PatternUtil.go +13 -0
  481. package/native/core/utils/PromiseTypeFactory.go +59 -0
  482. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  483. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  484. package/native/go.mod +9 -1
  485. package/native/transform/CallExpressionTransformer.go +12 -0
  486. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  487. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  488. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  489. package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
  490. package/package.json +12 -4
  491. package/src/executable/FileSystemIdentity.ts +222 -0
  492. package/src/executable/TypiaGenerateWizard.ts +386 -113
  493. package/src/functional.ts +30 -60
  494. package/src/internal/_ProtobufReader.ts +161 -46
  495. package/src/internal/_createStandardSchema.ts +15 -1
  496. package/src/internal/_decimal.ts +69 -0
  497. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  498. package/src/internal/_isFormatByte.ts +2 -5
  499. package/src/internal/_isFormatDate.ts +15 -2
  500. package/src/internal/_isFormatDateTime.ts +28 -2
  501. package/src/internal/_isFormatIri.ts +5 -2
  502. package/src/internal/_isFormatIriReference.ts +11 -3
  503. package/src/internal/_isFormatUriReference.ts +1 -1
  504. package/src/internal/_isMultipleOf.ts +8 -0
  505. package/src/internal/_isTypeFloat.ts +1 -1
  506. package/src/internal/_isTypeInt64.ts +1 -0
  507. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  508. package/src/internal/_isTypeUint64.ts +1 -0
  509. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  510. package/src/internal/_isUniqueItems.ts +134 -132
  511. package/src/internal/_jsonStringifyArray.ts +50 -0
  512. package/src/internal/_jsonStringifyElement.ts +19 -0
  513. package/src/internal/_jsonStringifyProperty.ts +30 -0
  514. package/src/internal/_llmApplicationFinalize.ts +6 -1
  515. package/src/internal/_notationAny.ts +9 -4
  516. package/src/internal/_notationAssign.ts +20 -0
  517. package/src/internal/_notationCamel.ts +31 -10
  518. package/src/internal/_notationKebab.ts +11 -0
  519. package/src/internal/_notationKeyCollision.ts +9 -0
  520. package/src/internal/_notationPascal.ts +19 -6
  521. package/src/internal/_notationSnake.ts +24 -21
  522. package/src/internal/_plainCloneAny.ts +208 -33
  523. package/src/internal/_randomArray.ts +13 -4
  524. package/src/internal/_randomFormatByte.ts +31 -1
  525. package/src/internal/_randomFormatDate.ts +6 -17
  526. package/src/internal/_randomFormatDatetime.ts +34 -15
  527. package/src/internal/_randomFormatDuration.ts +30 -13
  528. package/src/internal/_randomFormatEmail.ts +8 -2
  529. package/src/internal/_randomFormatHostname.ts +48 -1
  530. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  531. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  532. package/src/internal/_randomFormatIpv4.ts +43 -2
  533. package/src/internal/_randomFormatIpv6.ts +67 -2
  534. package/src/internal/_randomFormatIri.ts +3 -1
  535. package/src/internal/_randomFormatIriReference.ts +3 -1
  536. package/src/internal/_randomFormatJsonPointer.ts +28 -2
  537. package/src/internal/_randomFormatPassword.ts +11 -6
  538. package/src/internal/_randomFormatRegex.ts +22 -1
  539. package/src/internal/_randomFormatRelativeJsonPointer.ts +26 -6
  540. package/src/internal/_randomFormatTime.ts +46 -10
  541. package/src/internal/_randomFormatUri.ts +3 -1
  542. package/src/internal/_randomFormatUriReference.ts +3 -1
  543. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  544. package/src/internal/_randomFormatUrl.ts +25 -2
  545. package/src/internal/_randomFormatUuid.ts +10 -6
  546. package/src/internal/_randomInteger.ts +87 -40
  547. package/src/internal/_randomMultiple.ts +245 -0
  548. package/src/internal/_randomNumber.ts +72 -55
  549. package/src/internal/_randomPattern.ts +29 -4
  550. package/src/internal/_randomStringLength.ts +116 -0
  551. package/src/internal/_stringLength.ts +5 -0
  552. package/src/internal/_validateReport.ts +5 -1
  553. package/src/internal/private/__notationRename.ts +21 -0
  554. package/src/internal/private/__randomComposition.ts +50 -0
  555. package/src/internal/private/__randomEpoch.ts +34 -0
  556. package/src/json.ts +2 -2
  557. package/src/module.ts +4 -6
  558. package/src/notations.ts +20 -4
  559. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  560. package/lib/internal/private/__notationCapitalize.js +0 -6
  561. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  562. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  563. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  564. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  565. package/lib/internal/private/__notationUnsnake.js +0 -26
  566. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  567. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  568. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  569. package/native/adapter/visit.go +0 -173
  570. package/native/adapter/visit_property_chain_edges_test.go +0 -129
  571. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  572. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  573. package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
  574. package/native/core/programmers/iterate/check_union_array_like.go +0 -422
  575. package/native/core/programmers/iterate/prune_object_properties.go +0 -105
  576. package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
  577. package/native/core/programmers/iterate/stringify_native.go +0 -14
  578. package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
  579. package/native/core/schemas/metadata/MetadataApplication.go +0 -41
  580. package/src/internal/private/__notationCapitalize.ts +0 -2
  581. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -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"
@@ -15,6 +14,7 @@ import (
15
14
  "github.com/samchon/ttsc/packages/ttsc/driver"
16
15
  typiaadapter "github.com/samchon/typia/packages/typia/native/adapter"
17
16
  nativecontext "github.com/samchon/typia/packages/typia/native/core/context"
17
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
18
18
  nativetransform "github.com/samchon/typia/packages/typia/native/transform"
19
19
  )
20
20
 
@@ -30,7 +30,7 @@ func runBuild(args []string) int {
30
30
  outDir := fs.String("outDir", "", "override compilerOptions.outDir")
31
31
  manifestPath := fs.String("manifest", "", "write emitted file list as JSON")
32
32
  rewriteMode := fs.String("rewrite-mode", "typia", "native rewrite backend id")
33
- _ = fs.String("plugins-json", "", "ordered ttsc plugin payload")
33
+ pluginsJSON := fs.String("plugins-json", "", "ordered ttsc plugin payload")
34
34
  if err := fs.Parse(args); err != nil {
35
35
  return 2
36
36
  }
@@ -45,38 +45,73 @@ func runBuild(args []string) int {
45
45
  fmt.Fprintf(stderr, "ttsc-typia build: unknown --rewrite-mode value %q\n", *rewriteMode)
46
46
  return 2
47
47
  }
48
+ // Resolve the options before loading the program: they come from the payload
49
+ // alone, so an unreadable manifest is a usage error to report now rather than
50
+ // after a full compile has already run under the wrong configuration.
51
+ pluginOptions, err := typiaadapter.ReadPluginOptions(*pluginsJSON)
52
+ if err != nil {
53
+ fmt.Fprintf(stderr, "ttsc-typia build: %v\n", err)
54
+ return 2
55
+ }
48
56
 
49
57
  cwd := *cwdOverride
50
58
  if cwd == "" {
51
- var err error
52
- cwd, err = os.Getwd()
53
- if err != nil {
59
+ if cwd, err = os.Getwd(); err != nil {
54
60
  fmt.Fprintf(stderr, "ttsc-typia build: cwd: %v\n", err)
55
61
  return 2
56
62
  }
57
63
  }
58
- prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, driver.LoadProgramOptions{
64
+ loadProgram := func(options driver.LoadProgramOptions, diagnose bool) (*driver.Program, int) {
65
+ prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, options)
66
+ if err != nil {
67
+ fmt.Fprintf(stderr, "ttsc-typia build: %v\n", err)
68
+ return nil, 2
69
+ }
70
+ if len(diags) > 0 {
71
+ if prog != nil {
72
+ prog.Close()
73
+ }
74
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
75
+ return nil, 2
76
+ }
77
+ if diagnose {
78
+ if diags := prog.Diagnostics(); len(diags) > 0 {
79
+ prog.Close()
80
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
81
+ return nil, 2
82
+ }
83
+ }
84
+ return prog, 0
85
+ }
86
+ prog, code := loadProgram(driver.LoadProgramOptions{
59
87
  ForceEmit: *emit,
60
88
  ForceNoEmit: *noEmit,
61
89
  OutDir: *outDir,
62
- })
63
- if err != nil {
64
- fmt.Fprintf(stderr, "ttsc-typia build: %v\n", err)
65
- return 2
90
+ }, true)
91
+ if code != 0 {
92
+ return code
66
93
  }
67
- if len(diags) > 0 {
68
- driver.WritePrettyDiagnostics(stderr, diags, cwd)
69
- return 2
94
+ shouldEmit := !prog.ParsedConfig.ParsedConfig.CompilerOptions.NoEmit.IsTrue()
95
+ if !shouldEmit {
96
+ // The plugin transformer is part of tsgo's emit pipeline. Reload with emit
97
+ // enabled so check/noEmit traverses the exact same source set, then discard
98
+ // every generated output below. The original program already proved the
99
+ // project's diagnostics; diagnosing the private reload would reject valid
100
+ // analysis-only options such as allowImportingTsExtensions.
101
+ prog.Close()
102
+ prog, code = loadProgram(driver.LoadProgramOptions{
103
+ ForceEmit: true,
104
+ OutDir: *outDir,
105
+ }, false)
106
+ if code != 0 {
107
+ return code
108
+ }
70
109
  }
71
110
  defer prog.Close()
72
- if diags := prog.Diagnostics(); len(diags) > 0 {
73
- driver.WritePrettyDiagnostics(stderr, diags, cwd)
74
- return 2
75
- }
111
+ registerTypiaDefaultLibraryClassifier(prog)
112
+ defer schemametadata.MetadataDefaultLibrary_release(prog.Checker)
76
113
 
77
- shouldEmit := !prog.ParsedConfig.ParsedConfig.CompilerOptions.NoEmit.IsTrue()
78
114
  transformDiags := []typiaTransformDiagnostic{}
79
- pluginOptions := readTypiaPluginOptions(cwd, *tsconfigPath)
80
115
  transformOptions := pluginOptions.TransformOptions()
81
116
  extras := nativecontext.ITypiaContext_Extras{
82
117
  AddDiagnostic: func(diag *nativecontext.ITypiaDiagnostic) int {
@@ -96,19 +131,33 @@ func runBuild(args []string) int {
96
131
  if !*quiet {
97
132
  fmt.Fprintf(stdout, "// ttsc-typia build: tsconfig=%s cwd=%s emit=%v rewrite=%s\n", *tsconfigPath, cwd, shouldEmit, *rewriteMode)
98
133
  }
99
- if shouldEmit {
100
- emitted := []string{}
101
- writeFile := shimcompiler.WriteFile(func(fileName, text string, data *shimcompiler.WriteFileData) error {
134
+ emitted := []string{}
135
+ pending := []buildPendingOutput{}
136
+ writeFile := shimcompiler.WriteFile(func(fileName, text string, data *shimcompiler.WriteFileData) error {
137
+ if shouldEmit {
102
138
  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
139
+ pending = append(pending, buildPendingOutput{FileName: fileName, Text: text})
109
140
  }
110
- for _, d := range eDiags {
111
- fmt.Fprintln(stderr, " -", d.String())
141
+ return nil
142
+ })
143
+ eDiags, err := prog.EmitWithPluginTransformers([]driver.PluginTransform{typiaTransform}, writeFile)
144
+ if err != nil {
145
+ fmt.Fprintf(stderr, "ttsc-typia build: emit failed: %v\n", err)
146
+ return 3
147
+ }
148
+ for _, d := range eDiags {
149
+ fmt.Fprintln(stderr, " -", d.String())
150
+ }
151
+ if len(transformDiags) > 0 {
152
+ writeTypiaTransformDiagnostics(stderr, transformDiags, cwd)
153
+ return 3
154
+ }
155
+ if shouldEmit {
156
+ for _, output := range pending {
157
+ if err := driver.DefaultWriteFile(output.FileName, output.Text); err != nil {
158
+ fmt.Fprintf(stderr, "ttsc-typia build: emit write failed: %v\n", err)
159
+ return 3
160
+ }
112
161
  }
113
162
  if !*quiet {
114
163
  fmt.Fprintf(stdout, "// ttsc-typia build: emitted=%d files\n", len(emitted))
@@ -136,13 +185,14 @@ func runBuild(args []string) int {
136
185
  }
137
186
  }
138
187
  }
139
- if len(transformDiags) > 0 {
140
- writeTypiaTransformDiagnostics(stderr, transformDiags, cwd)
141
- return 3
142
- }
143
188
  return 0
144
189
  }
145
190
 
191
+ type buildPendingOutput struct {
192
+ FileName string
193
+ Text string
194
+ }
195
+
146
196
  type typiaTransformDiagnostic struct {
147
197
  File string
148
198
  Line int
@@ -156,33 +206,3 @@ func writeTypiaTransformDiagnostics(out io.Writer, diagnostics []typiaTransformD
156
206
  fmt.Fprintln(out, diag.String(cwd))
157
207
  }
158
208
  }
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
+ }