typia 13.1.1 → 13.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. package/README.md +3 -0
  2. package/lib/_virtual/_rolldown/runtime.mjs +1 -5
  3. package/lib/executable/FileSystemIdentity.d.ts +21 -0
  4. package/lib/executable/FileSystemIdentity.js +183 -0
  5. package/lib/executable/FileSystemIdentity.js.map +1 -0
  6. package/lib/executable/FileSystemIdentity.mjs +129 -0
  7. package/lib/executable/FileSystemIdentity.mjs.map +1 -0
  8. package/lib/executable/TypiaGenerateWizard.js +264 -104
  9. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  10. package/lib/executable/TypiaGenerateWizard.mjs +233 -93
  11. package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
  12. package/lib/functional.d.ts +15 -12
  13. package/lib/functional.js.map +1 -1
  14. package/lib/functional.mjs.map +1 -1
  15. package/lib/internal/_ProtobufReader.d.ts +17 -0
  16. package/lib/internal/_ProtobufReader.js +117 -45
  17. package/lib/internal/_ProtobufReader.js.map +1 -1
  18. package/lib/internal/_ProtobufReader.mjs +108 -39
  19. package/lib/internal/_ProtobufReader.mjs.map +1 -1
  20. package/lib/internal/_createStandardSchema.js +18 -1
  21. package/lib/internal/_createStandardSchema.js.map +1 -1
  22. package/lib/internal/_createStandardSchema.mjs +12 -1
  23. package/lib/internal/_createStandardSchema.mjs.map +1 -1
  24. package/lib/internal/_decimal.d.ts +14 -0
  25. package/lib/internal/_decimal.js +61 -0
  26. package/lib/internal/_decimal.js.map +1 -0
  27. package/lib/internal/_decimal.mjs +49 -0
  28. package/lib/internal/_decimal.mjs.map +1 -0
  29. package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
  30. package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
  31. package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
  32. package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
  33. package/lib/internal/_isFormatByte.js +2 -5
  34. package/lib/internal/_isFormatByte.js.map +1 -1
  35. package/lib/internal/_isFormatByte.mjs +2 -5
  36. package/lib/internal/_isFormatByte.mjs.map +1 -1
  37. package/lib/internal/_isFormatDate.js +15 -2
  38. package/lib/internal/_isFormatDate.js.map +1 -1
  39. package/lib/internal/_isFormatDate.mjs +22 -2
  40. package/lib/internal/_isFormatDate.mjs.map +1 -1
  41. package/lib/internal/_isFormatDateTime.js +21 -2
  42. package/lib/internal/_isFormatDateTime.js.map +1 -1
  43. package/lib/internal/_isFormatDateTime.mjs +13 -2
  44. package/lib/internal/_isFormatDateTime.mjs.map +1 -1
  45. package/lib/internal/_isFormatIri.js +3 -2
  46. package/lib/internal/_isFormatIri.js.map +1 -1
  47. package/lib/internal/_isFormatIri.mjs +3 -2
  48. package/lib/internal/_isFormatIri.mjs.map +1 -1
  49. package/lib/internal/_isFormatIriReference.js +10 -2
  50. package/lib/internal/_isFormatIriReference.js.map +1 -1
  51. package/lib/internal/_isFormatIriReference.mjs +9 -2
  52. package/lib/internal/_isFormatIriReference.mjs.map +1 -1
  53. package/lib/internal/_isFormatUriReference.js +1 -1
  54. package/lib/internal/_isFormatUriReference.js.map +1 -1
  55. package/lib/internal/_isFormatUriReference.mjs +1 -1
  56. package/lib/internal/_isFormatUriReference.mjs.map +1 -1
  57. package/lib/internal/_isMultipleOf.d.ts +1 -0
  58. package/lib/internal/_isMultipleOf.js +13 -0
  59. package/lib/internal/_isMultipleOf.js.map +1 -0
  60. package/lib/internal/_isMultipleOf.mjs +12 -0
  61. package/lib/internal/_isMultipleOf.mjs.map +1 -0
  62. package/lib/internal/_isTypeFloat.js +1 -1
  63. package/lib/internal/_isTypeFloat.js.map +1 -1
  64. package/lib/internal/_isTypeFloat.mjs +1 -1
  65. package/lib/internal/_isTypeFloat.mjs.map +1 -1
  66. package/lib/internal/_isTypeInt64.js +1 -0
  67. package/lib/internal/_isTypeInt64.js.map +1 -1
  68. package/lib/internal/_isTypeInt64.mjs.map +1 -1
  69. package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
  70. package/lib/internal/_isTypeInt64Bigint.js +15 -0
  71. package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
  72. package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
  73. package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
  74. package/lib/internal/_isTypeUint64.js +1 -0
  75. package/lib/internal/_isTypeUint64.js.map +1 -1
  76. package/lib/internal/_isTypeUint64.mjs.map +1 -1
  77. package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
  78. package/lib/internal/_isTypeUint64Bigint.js +10 -0
  79. package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
  80. package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
  81. package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
  82. package/lib/internal/_isUniqueItems.js +96 -109
  83. package/lib/internal/_isUniqueItems.js.map +1 -1
  84. package/lib/internal/_isUniqueItems.mjs +62 -50
  85. package/lib/internal/_isUniqueItems.mjs.map +1 -1
  86. package/lib/internal/_notationAny.js +8 -1
  87. package/lib/internal/_notationAny.js.map +1 -1
  88. package/lib/internal/_notationAny.mjs +7 -1
  89. package/lib/internal/_notationAny.mjs.map +1 -1
  90. package/lib/internal/_notationAssign.d.ts +1 -0
  91. package/lib/internal/_notationAssign.js +18 -0
  92. package/lib/internal/_notationAssign.js.map +1 -0
  93. package/lib/internal/_notationAssign.mjs +17 -0
  94. package/lib/internal/_notationAssign.mjs.map +1 -0
  95. package/lib/internal/_notationCamel.js +30 -9
  96. package/lib/internal/_notationCamel.js.map +1 -1
  97. package/lib/internal/_notationCamel.mjs +13 -5
  98. package/lib/internal/_notationCamel.mjs.map +1 -1
  99. package/lib/internal/_notationKebab.d.ts +1 -0
  100. package/lib/internal/_notationKebab.js +15 -0
  101. package/lib/internal/_notationKebab.js.map +1 -0
  102. package/lib/internal/_notationKebab.mjs +15 -0
  103. package/lib/internal/_notationKebab.mjs.map +1 -0
  104. package/lib/internal/_notationKeyCollision.d.ts +1 -0
  105. package/lib/internal/_notationKeyCollision.js +8 -0
  106. package/lib/internal/_notationKeyCollision.js.map +1 -0
  107. package/lib/internal/_notationKeyCollision.mjs +8 -0
  108. package/lib/internal/_notationKeyCollision.mjs.map +1 -0
  109. package/lib/internal/_notationPascal.js +20 -5
  110. package/lib/internal/_notationPascal.js.map +1 -1
  111. package/lib/internal/_notationPascal.mjs +10 -5
  112. package/lib/internal/_notationPascal.mjs.map +1 -1
  113. package/lib/internal/_notationSnake.js +25 -22
  114. package/lib/internal/_notationSnake.js.map +1 -1
  115. package/lib/internal/_notationSnake.mjs +11 -11
  116. package/lib/internal/_notationSnake.mjs.map +1 -1
  117. package/lib/internal/_plainCloneAny.js +174 -38
  118. package/lib/internal/_plainCloneAny.js.map +1 -1
  119. package/lib/internal/_plainCloneAny.mjs +126 -22
  120. package/lib/internal/_plainCloneAny.mjs.map +1 -1
  121. package/lib/internal/_randomArray.d.ts +1 -1
  122. package/lib/internal/_randomArray.js +11 -4
  123. package/lib/internal/_randomArray.js.map +1 -1
  124. package/lib/internal/_randomArray.mjs +9 -3
  125. package/lib/internal/_randomArray.mjs.map +1 -1
  126. package/lib/internal/_randomFormatByte.d.ts +2 -1
  127. package/lib/internal/_randomFormatByte.js +2 -1
  128. package/lib/internal/_randomFormatByte.js.map +1 -1
  129. package/lib/internal/_randomFormatByte.mjs +2 -1
  130. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  131. package/lib/internal/_randomFormatDate.d.ts +2 -0
  132. package/lib/internal/_randomFormatDate.js +3 -2
  133. package/lib/internal/_randomFormatDate.js.map +1 -1
  134. package/lib/internal/_randomFormatDate.mjs +3 -2
  135. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  136. package/lib/internal/_randomFormatDatetime.d.ts +2 -0
  137. package/lib/internal/_randomFormatDatetime.js +3 -2
  138. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  139. package/lib/internal/_randomFormatDatetime.mjs +3 -2
  140. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  141. package/lib/internal/_randomFormatDuration.d.ts +2 -1
  142. package/lib/internal/_randomFormatDuration.js +3 -2
  143. package/lib/internal/_randomFormatDuration.js.map +1 -1
  144. package/lib/internal/_randomFormatDuration.mjs +3 -2
  145. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  146. package/lib/internal/_randomFormatEmail.d.ts +2 -1
  147. package/lib/internal/_randomFormatEmail.js +8 -1
  148. package/lib/internal/_randomFormatEmail.js.map +1 -1
  149. package/lib/internal/_randomFormatEmail.mjs +5 -1
  150. package/lib/internal/_randomFormatEmail.mjs.map +1 -1
  151. package/lib/internal/_randomFormatHostname.d.ts +8 -1
  152. package/lib/internal/_randomFormatHostname.js +45 -2
  153. package/lib/internal/_randomFormatHostname.js.map +1 -1
  154. package/lib/internal/_randomFormatHostname.mjs +38 -2
  155. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  156. package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
  157. package/lib/internal/_randomFormatIdnEmail.js +16 -2
  158. package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
  159. package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
  160. package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
  161. package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
  162. package/lib/internal/_randomFormatIdnHostname.js +26 -1
  163. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  164. package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
  165. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  166. package/lib/internal/_randomFormatIpv4.d.ts +2 -1
  167. package/lib/internal/_randomFormatIpv4.js +2 -1
  168. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  169. package/lib/internal/_randomFormatIpv4.mjs +2 -1
  170. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  171. package/lib/internal/_randomFormatIpv6.d.ts +2 -1
  172. package/lib/internal/_randomFormatIpv6.js +2 -1
  173. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  174. package/lib/internal/_randomFormatIpv6.mjs +2 -1
  175. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  176. package/lib/internal/_randomFormatIri.d.ts +2 -1
  177. package/lib/internal/_randomFormatIri.js +1 -1
  178. package/lib/internal/_randomFormatIri.js.map +1 -1
  179. package/lib/internal/_randomFormatIri.mjs +1 -1
  180. package/lib/internal/_randomFormatIri.mjs.map +1 -1
  181. package/lib/internal/_randomFormatIriReference.d.ts +2 -1
  182. package/lib/internal/_randomFormatIriReference.js +1 -1
  183. package/lib/internal/_randomFormatIriReference.js.map +1 -1
  184. package/lib/internal/_randomFormatIriReference.mjs +1 -1
  185. package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
  186. package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
  187. package/lib/internal/_randomFormatJsonPointer.js +8 -1
  188. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  189. package/lib/internal/_randomFormatJsonPointer.mjs +5 -1
  190. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  191. package/lib/internal/_randomFormatPassword.d.ts +2 -1
  192. package/lib/internal/_randomFormatPassword.js +7 -5
  193. package/lib/internal/_randomFormatPassword.js.map +1 -1
  194. package/lib/internal/_randomFormatPassword.mjs +5 -1
  195. package/lib/internal/_randomFormatPassword.mjs.map +1 -1
  196. package/lib/internal/_randomFormatRegex.d.ts +2 -1
  197. package/lib/internal/_randomFormatRegex.js +2 -1
  198. package/lib/internal/_randomFormatRegex.js.map +1 -1
  199. package/lib/internal/_randomFormatRegex.mjs +2 -1
  200. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  201. package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
  202. package/lib/internal/_randomFormatRelativeJsonPointer.js +3 -2
  203. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  204. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +3 -2
  205. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  206. package/lib/internal/_randomFormatTime.d.ts +2 -1
  207. package/lib/internal/_randomFormatTime.js +3 -2
  208. package/lib/internal/_randomFormatTime.js.map +1 -1
  209. package/lib/internal/_randomFormatTime.mjs +3 -2
  210. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  211. package/lib/internal/_randomFormatUri.d.ts +2 -1
  212. package/lib/internal/_randomFormatUri.js +1 -1
  213. package/lib/internal/_randomFormatUri.js.map +1 -1
  214. package/lib/internal/_randomFormatUri.mjs +1 -1
  215. package/lib/internal/_randomFormatUri.mjs.map +1 -1
  216. package/lib/internal/_randomFormatUriReference.d.ts +2 -1
  217. package/lib/internal/_randomFormatUriReference.js +1 -1
  218. package/lib/internal/_randomFormatUriReference.js.map +1 -1
  219. package/lib/internal/_randomFormatUriReference.mjs +1 -1
  220. package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
  221. package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
  222. package/lib/internal/_randomFormatUriTemplate.js +1 -1
  223. package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
  224. package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
  225. package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
  226. package/lib/internal/_randomFormatUrl.d.ts +2 -1
  227. package/lib/internal/_randomFormatUrl.js +21 -1
  228. package/lib/internal/_randomFormatUrl.js.map +1 -1
  229. package/lib/internal/_randomFormatUrl.mjs +18 -1
  230. package/lib/internal/_randomFormatUrl.mjs.map +1 -1
  231. package/lib/internal/_randomFormatUuid.d.ts +2 -1
  232. package/lib/internal/_randomFormatUuid.js +3 -2
  233. package/lib/internal/_randomFormatUuid.js.map +1 -1
  234. package/lib/internal/_randomFormatUuid.mjs +3 -2
  235. package/lib/internal/_randomFormatUuid.mjs.map +1 -1
  236. package/lib/internal/_randomInteger.js +59 -28
  237. package/lib/internal/_randomInteger.js.map +1 -1
  238. package/lib/internal/_randomInteger.mjs +56 -16
  239. package/lib/internal/_randomInteger.mjs.map +1 -1
  240. package/lib/internal/_randomMultiple.d.ts +8 -0
  241. package/lib/internal/_randomMultiple.js +168 -0
  242. package/lib/internal/_randomMultiple.js.map +1 -0
  243. package/lib/internal/_randomMultiple.mjs +158 -0
  244. package/lib/internal/_randomMultiple.mjs.map +1 -0
  245. package/lib/internal/_randomNumber.js +42 -42
  246. package/lib/internal/_randomNumber.js.map +1 -1
  247. package/lib/internal/_randomNumber.mjs +41 -27
  248. package/lib/internal/_randomNumber.mjs.map +1 -1
  249. package/lib/internal/_randomPattern.d.ts +2 -1
  250. package/lib/internal/_randomPattern.js +19 -4
  251. package/lib/internal/_randomPattern.js.map +1 -1
  252. package/lib/internal/_randomPattern.mjs +10 -4
  253. package/lib/internal/_randomPattern.mjs.map +1 -1
  254. package/lib/internal/_randomStringLength.d.ts +33 -0
  255. package/lib/internal/_randomStringLength.js +48 -0
  256. package/lib/internal/_randomStringLength.js.map +1 -0
  257. package/lib/internal/_randomStringLength.mjs +44 -0
  258. package/lib/internal/_randomStringLength.mjs.map +1 -0
  259. package/lib/internal/_stringLength.d.ts +1 -0
  260. package/lib/internal/_stringLength.js +11 -0
  261. package/lib/internal/_stringLength.js.map +1 -0
  262. package/lib/internal/_stringLength.mjs +10 -0
  263. package/lib/internal/_stringLength.mjs.map +1 -0
  264. package/lib/internal/_validateReport.js +4 -1
  265. package/lib/internal/_validateReport.js.map +1 -1
  266. package/lib/internal/_validateReport.mjs +2 -1
  267. package/lib/internal/_validateReport.mjs.map +1 -1
  268. package/lib/internal/private/__notationRename.d.ts +14 -0
  269. package/lib/internal/private/__notationRename.js +25 -0
  270. package/lib/internal/private/__notationRename.js.map +1 -0
  271. package/lib/internal/private/__notationRename.mjs +24 -0
  272. package/lib/internal/private/__notationRename.mjs.map +1 -0
  273. package/lib/json.d.ts +2 -2
  274. package/lib/json.mjs.map +1 -1
  275. package/lib/module.d.ts +2 -2
  276. package/lib/module.js.map +1 -1
  277. package/lib/module.mjs.map +1 -1
  278. package/lib/notations.d.ts +20 -4
  279. package/lib/notations.js.map +1 -1
  280. package/lib/notations.mjs.map +1 -1
  281. package/native/adapter/plugin_options.go +117 -0
  282. package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
  283. package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
  284. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
  285. package/native/cmd/ttsc-typia/build.go +81 -64
  286. package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
  287. package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
  288. package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
  289. package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
  290. package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
  291. package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
  292. package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
  293. package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
  294. package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
  295. package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
  296. package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
  297. package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
  298. package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
  299. package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
  300. package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
  301. package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
  302. package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
  303. package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
  304. package/native/cmd/ttsc-typia/main_wasm.go +21 -2
  305. package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
  306. package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
  307. package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
  308. package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
  309. package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
  310. package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
  311. package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
  312. package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
  313. package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
  314. package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
  315. package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
  316. package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
  317. package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
  318. package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
  319. package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
  320. package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
  321. package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
  322. package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
  323. package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
  324. package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
  325. package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
  326. package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
  327. package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
  328. package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
  329. package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
  330. package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
  331. package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
  332. package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
  333. package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
  334. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
  335. package/native/cmd/ttsc-typia/transform.go +228 -39
  336. package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
  337. package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
  338. package/native/cmd/ttsc-typia/transform_helpers_test.go +159 -1
  339. package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
  340. package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
  341. package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
  342. package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
  343. package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
  344. package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
  345. package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
  346. package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
  347. package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
  348. package/native/core/factories/FormatCheatSheet.go +40 -7
  349. package/native/core/factories/IdentifierFactory.go +131 -4
  350. package/native/core/factories/MetadataCommentTagFactory.go +83 -40
  351. package/native/core/factories/MetadataTypeTagFactory.go +13 -1
  352. package/native/core/factories/NumericRangeFactory.go +60 -17
  353. package/native/core/factories/ProtobufFactory.go +7 -4
  354. package/native/core/factories/factory_utility_coverage_test.go +8 -2
  355. package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
  356. package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
  357. package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
  358. package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
  359. package/native/core/factories/internal/metadata/MetadataHelper.go +60 -6
  360. package/native/core/factories/internal/metadata/emplace_metadata_object.go +116 -8
  361. package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
  362. package/native/core/factories/internal/metadata/iterate_metadata_function.go +4 -11
  363. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +8 -6
  364. package/native/core/factories/internal/metadata/iterate_metadata_map.go +9 -0
  365. package/native/core/factories/internal/metadata/iterate_metadata_native.go +27 -2
  366. package/native/core/factories/internal/metadata/iterate_metadata_set.go +9 -0
  367. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  368. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  369. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  370. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  371. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  372. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  373. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  374. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  375. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  376. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  377. package/native/core/programmers/IsProgrammer.go +15 -1
  378. package/native/core/programmers/RandomProgrammer.go +51 -14
  379. package/native/core/programmers/compare/CompareEqualProgrammer.go +393 -5
  380. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  381. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  382. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  383. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  384. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  385. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  386. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  387. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  388. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  389. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  390. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  391. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  392. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  393. package/native/core/programmers/helpers/StringifyJoinder.go +32 -1
  394. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  395. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +5 -3
  396. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  397. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  398. package/native/core/programmers/iterate/check_template.go +344 -32
  399. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  400. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  401. package/native/core/programmers/iterate/openapi_v3_downgrader.go +641 -0
  402. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  403. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  404. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  405. package/native/core/programmers/iterate/template_runtime_pattern.go +52 -7
  406. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  407. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  408. package/native/core/programmers/llm/LlmApplicationProgrammer.go +12 -10
  409. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  410. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  411. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  412. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  413. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  414. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  415. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  416. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  417. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  418. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  419. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  420. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +40 -21
  421. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  422. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  423. package/native/core/schemas/metadata/MetadataCollection.go +270 -20
  424. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  425. package/native/core/schemas/metadata/MetadataObjectType.go +17 -4
  426. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  427. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  428. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  429. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  430. package/native/core/utils/PatternUtil.go +13 -0
  431. package/native/core/utils/PromiseTypeFactory.go +59 -0
  432. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  433. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  434. package/native/go.mod +9 -1
  435. package/native/transform/CallExpressionTransformer.go +12 -0
  436. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  437. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  438. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  439. package/package.json +16 -4
  440. package/src/executable/FileSystemIdentity.ts +189 -0
  441. package/src/executable/TypiaGenerateWizard.ts +377 -110
  442. package/src/functional.ts +30 -60
  443. package/src/internal/_ProtobufReader.ts +129 -43
  444. package/src/internal/_createStandardSchema.ts +15 -1
  445. package/src/internal/_decimal.ts +69 -0
  446. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  447. package/src/internal/_isFormatByte.ts +2 -5
  448. package/src/internal/_isFormatDate.ts +15 -2
  449. package/src/internal/_isFormatDateTime.ts +28 -2
  450. package/src/internal/_isFormatIri.ts +5 -2
  451. package/src/internal/_isFormatIriReference.ts +11 -3
  452. package/src/internal/_isFormatUriReference.ts +1 -1
  453. package/src/internal/_isMultipleOf.ts +8 -0
  454. package/src/internal/_isTypeFloat.ts +1 -1
  455. package/src/internal/_isTypeInt64.ts +1 -0
  456. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  457. package/src/internal/_isTypeUint64.ts +1 -0
  458. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  459. package/src/internal/_isUniqueItems.ts +134 -132
  460. package/src/internal/_notationAny.ts +9 -4
  461. package/src/internal/_notationAssign.ts +20 -0
  462. package/src/internal/_notationCamel.ts +31 -10
  463. package/src/internal/_notationKebab.ts +11 -0
  464. package/src/internal/_notationKeyCollision.ts +9 -0
  465. package/src/internal/_notationPascal.ts +19 -6
  466. package/src/internal/_notationSnake.ts +24 -21
  467. package/src/internal/_plainCloneAny.ts +208 -33
  468. package/src/internal/_randomArray.ts +13 -4
  469. package/src/internal/_randomFormatByte.ts +4 -1
  470. package/src/internal/_randomFormatDate.ts +17 -12
  471. package/src/internal/_randomFormatDatetime.ts +15 -10
  472. package/src/internal/_randomFormatDuration.ts +16 -14
  473. package/src/internal/_randomFormatEmail.ts +8 -2
  474. package/src/internal/_randomFormatHostname.ts +48 -1
  475. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  476. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  477. package/src/internal/_randomFormatIpv4.ts +3 -2
  478. package/src/internal/_randomFormatIpv6.ts +3 -2
  479. package/src/internal/_randomFormatIri.ts +3 -1
  480. package/src/internal/_randomFormatIriReference.ts +3 -1
  481. package/src/internal/_randomFormatJsonPointer.ts +8 -2
  482. package/src/internal/_randomFormatPassword.ts +11 -6
  483. package/src/internal/_randomFormatRegex.ts +4 -1
  484. package/src/internal/_randomFormatRelativeJsonPointer.ts +13 -6
  485. package/src/internal/_randomFormatTime.ts +13 -10
  486. package/src/internal/_randomFormatUri.ts +3 -1
  487. package/src/internal/_randomFormatUriReference.ts +3 -1
  488. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  489. package/src/internal/_randomFormatUrl.ts +25 -2
  490. package/src/internal/_randomFormatUuid.ts +10 -6
  491. package/src/internal/_randomInteger.ts +87 -40
  492. package/src/internal/_randomMultiple.ts +245 -0
  493. package/src/internal/_randomNumber.ts +72 -55
  494. package/src/internal/_randomPattern.ts +26 -4
  495. package/src/internal/_randomStringLength.ts +72 -0
  496. package/src/internal/_stringLength.ts +5 -0
  497. package/src/internal/_validateReport.ts +5 -1
  498. package/src/internal/private/__notationRename.ts +24 -0
  499. package/src/json.ts +2 -2
  500. package/src/module.ts +4 -6
  501. package/src/notations.ts +20 -4
  502. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  503. package/lib/internal/private/__notationCapitalize.js +0 -6
  504. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  505. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  506. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  507. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  508. package/lib/internal/private/__notationUnsnake.js +0 -26
  509. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  510. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  511. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  512. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  513. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  514. package/src/internal/private/__notationCapitalize.ts +0 -2
  515. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -0,0 +1,240 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "os"
6
+ "os/exec"
7
+ "path/filepath"
8
+ "strings"
9
+ "testing"
10
+ )
11
+
12
+ // TestFiniteOptionNumberLeafTransform pins the finite/numeric option matrix for a
13
+ // bare `number` leaf across typia.is, typia.assert, and typia.validate (#2196).
14
+ //
15
+ // The `finite` option is documented as an independent flag that rejects both NaN
16
+ // and Infinity, yet it was inert unless `numeric` was also set: typia.is dropped
17
+ // `finite` when it built its number gate, and assert/validate gate their verdict
18
+ // on that same is-checker, so all three accepted NaN and Infinity under
19
+ // `finite:true` alone. The other three rows are regression guards that must not
20
+ // move:
21
+ //
22
+ // - finite alone -> reject NaN, Infinity, -Infinity (the #2196 red case)
23
+ // - numeric alone -> reject NaN, ACCEPT Infinity/-Infinity (numeric != finite)
24
+ // - finite+numeric -> reject NaN, Infinity, -Infinity (already worked)
25
+ // - neither option -> ACCEPT everything (the documented default)
26
+ //
27
+ // 1. Transform the same `number`-leaf fixture once per option row, injecting the
28
+ // row's options through the resolved --plugins-json payload (the only option
29
+ // source runTransform reads).
30
+ // 2. Execute the emitted validators in Node against a finite value plus NaN,
31
+ // Infinity, and -Infinity, requiring is/assert/validate to agree with the row.
32
+ // 3. Require the runner to report the exact executed case count so a runner that
33
+ // silently exercised nothing cannot pass as green.
34
+ func TestFiniteOptionNumberLeafTransform(t *testing.T) {
35
+ for _, tc := range finiteOptionNumberLeafCases() {
36
+ t.Run(tc.name, func(t *testing.T) {
37
+ project := finiteOptionNumberLeafProject(t)
38
+ js := finiteOptionNumberLeafTransform(t, project, tc.payload())
39
+ finiteOptionNumberLeafRunRuntimeCases(t, project, js, tc)
40
+ })
41
+ }
42
+ }
43
+
44
+ type finiteOptionNumberLeafCase struct {
45
+ name string
46
+ // config is the JSON fragment appended to typia's resolved plugin entry, e.g.
47
+ // `,"finite":true`. Empty means typia's documented defaults.
48
+ config string
49
+ // acceptNaN and acceptInfinity are the expected verdicts for the non-finite
50
+ // inputs; a finite value is always accepted.
51
+ acceptNaN bool
52
+ acceptInfinity bool
53
+ }
54
+
55
+ func (tc finiteOptionNumberLeafCase) payload() string {
56
+ return `[{"config":{"transform":"typia/lib/transform"` + tc.config + `},"name":"typia","stage":"transform"}]`
57
+ }
58
+
59
+ func finiteOptionNumberLeafCases() []finiteOptionNumberLeafCase {
60
+ return []finiteOptionNumberLeafCase{
61
+ {
62
+ name: "finite alone rejects NaN and Infinity",
63
+ config: `,"finite":true`,
64
+ acceptNaN: false,
65
+ acceptInfinity: false,
66
+ },
67
+ {
68
+ name: "numeric alone rejects NaN but accepts Infinity",
69
+ config: `,"numeric":true`,
70
+ acceptNaN: false,
71
+ acceptInfinity: true,
72
+ },
73
+ {
74
+ name: "finite and numeric together reject NaN and Infinity",
75
+ config: `,"finite":true,"numeric":true`,
76
+ acceptNaN: false,
77
+ acceptInfinity: false,
78
+ },
79
+ {
80
+ name: "neither option accepts NaN and Infinity",
81
+ config: ``,
82
+ acceptNaN: true,
83
+ acceptInfinity: true,
84
+ },
85
+ }
86
+ }
87
+
88
+ func finiteOptionNumberLeafProject(t *testing.T) string {
89
+ t.Helper()
90
+ root := ttscTypiaTestRepoRoot(t)
91
+ base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
92
+ if err := os.MkdirAll(base, 0o755); err != nil {
93
+ t.Fatalf("mkdir temp base: %v", err)
94
+ }
95
+ dir, err := os.MkdirTemp(base, "finite-option-number-leaf-")
96
+ if err != nil {
97
+ t.Fatalf("create temp fixture: %v", err)
98
+ }
99
+ t.Cleanup(func() {
100
+ _ = os.RemoveAll(dir)
101
+ })
102
+ src := filepath.Join(dir, "src")
103
+ if err := os.MkdirAll(src, 0o755); err != nil {
104
+ t.Fatalf("mkdir fixture src: %v", err)
105
+ }
106
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(finiteOptionNumberLeafTSConfig), 0o644); err != nil {
107
+ t.Fatalf("write tsconfig: %v", err)
108
+ }
109
+ if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(finiteOptionNumberLeafSource), 0o644); err != nil {
110
+ t.Fatalf("write source: %v", err)
111
+ }
112
+ return dir
113
+ }
114
+
115
+ func finiteOptionNumberLeafTransform(t *testing.T, project string, payload string) string {
116
+ t.Helper()
117
+ out, errText, code := ttscTypiaTestCapture(func() int {
118
+ return runTransform([]string{
119
+ "--cwd", project,
120
+ "--tsconfig", "tsconfig.json",
121
+ "--file", "src/main.ts",
122
+ "--output", "js",
123
+ "--plugins-json", payload,
124
+ })
125
+ })
126
+ if code != 0 {
127
+ t.Fatalf("finite option transform failed: code=%d stderr=\n%s", code, errText)
128
+ }
129
+ return out
130
+ }
131
+
132
+ func finiteOptionNumberLeafRunRuntimeCases(t *testing.T, project string, js string, tc finiteOptionNumberLeafCase) {
133
+ t.Helper()
134
+ node, err := exec.LookPath("node")
135
+ if err != nil {
136
+ t.Skip("node executable not found")
137
+ }
138
+ runtimeDir := filepath.Join(project, "runtime")
139
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
140
+ t.Fatalf("mkdir runtime dir: %v", err)
141
+ }
142
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
143
+ runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
144
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
145
+ t.Fatalf("write runtime module: %v", err)
146
+ }
147
+ runner := filepath.Join(runtimeDir, "run.cjs")
148
+ if err := os.WriteFile(runner, []byte(finiteOptionNumberLeafRuntimeRunner(tc)), 0o644); err != nil {
149
+ t.Fatalf("write runtime runner: %v", err)
150
+ }
151
+ cmd := exec.Command(node, runner)
152
+ cmd.Dir = project
153
+ output, err := cmd.CombinedOutput()
154
+ if err != nil {
155
+ t.Fatalf("finite option runtime cases failed: %v\n%s", err, output)
156
+ }
157
+ // Every input drives is, validate, and assert, so the runner must report one
158
+ // executed assertion per (input, function) pair. Pinning the count keeps a
159
+ // runner that short-circuited or skipped cases from passing as a false green.
160
+ const expected = "RAN 12 CASES"
161
+ if !strings.Contains(string(output), expected) {
162
+ t.Fatalf("finite option runner did not report %q; got:\n%s", expected, output)
163
+ }
164
+ }
165
+
166
+ func finiteOptionNumberLeafRuntimeRunner(tc finiteOptionNumberLeafCase) string {
167
+ return fmt.Sprintf(`const mod = require("./main.cjs");
168
+
169
+ const cases = [
170
+ { name: "finite 1", value: 1, accept: true },
171
+ { name: "NaN", value: Number.NaN, accept: %[1]t },
172
+ { name: "Infinity", value: Number.POSITIVE_INFINITY, accept: %[2]t },
173
+ { name: "-Infinity", value: Number.NEGATIVE_INFINITY, accept: %[2]t },
174
+ ];
175
+
176
+ let ran = 0;
177
+ for (const c of cases) {
178
+ const result = mod.run(c.value);
179
+
180
+ ran += 1;
181
+ if (result.is !== c.accept) {
182
+ throw new Error(c.name + ": typia.is expected " + c.accept + " but got " + result.is);
183
+ }
184
+
185
+ ran += 1;
186
+ if (result.validate !== c.accept) {
187
+ throw new Error(c.name + ": typia.validate.success expected " + c.accept + " but got " + result.validate);
188
+ }
189
+
190
+ ran += 1;
191
+ const assertAccepted = result.assertThrew === false;
192
+ if (assertAccepted !== c.accept) {
193
+ throw new Error(c.name + ": typia.assert accepted=" + assertAccepted + " but expected " + c.accept);
194
+ }
195
+ }
196
+
197
+ console.log("RAN " + ran + " CASES");
198
+ `, tc.acceptNaN, tc.acceptInfinity)
199
+ }
200
+
201
+ const finiteOptionNumberLeafTSConfig = `{
202
+ "compilerOptions": {
203
+ "target": "ES2022",
204
+ "module": "commonjs",
205
+ "moduleResolution": "bundler",
206
+ "ignoreDeprecations": "6.0",
207
+ "types": ["*"],
208
+ "esModuleInterop": true,
209
+ "strict": true,
210
+ "skipLibCheck": true
211
+ },
212
+ "include": ["src"]
213
+ }
214
+ `
215
+
216
+ const finiteOptionNumberLeafSource = `import typia from "typia";
217
+
218
+ interface FiniteBox {
219
+ value: number;
220
+ }
221
+
222
+ const check = typia.createIs<FiniteBox>();
223
+ const validate = typia.createValidate<FiniteBox>();
224
+ const assert = typia.createAssert<FiniteBox>();
225
+
226
+ const captureThrow = (task: () => void): boolean => {
227
+ try {
228
+ task();
229
+ return false;
230
+ } catch {
231
+ return true;
232
+ }
233
+ };
234
+
235
+ export const run = (value: number) => ({
236
+ is: check({ value }),
237
+ validate: validate({ value }).success,
238
+ assertThrew: captureThrow(() => assert({ value })),
239
+ });
240
+ `
@@ -0,0 +1,220 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestFunctionalPromisedTypeTransform verifies semantic async wrappers.
12
+ //
13
+ // Every functional family shares the return-type classifier. A derived Promise
14
+ // must produce an async wrapper that validates the fulfilled value, while a
15
+ // non-thenable class merely named Promise must remain synchronous.
16
+ //
17
+ // 1. Transform all assert, is/equals, and validate function variants.
18
+ // 2. Exercise derived class/interface and branded Promise results.
19
+ // 3. Pin invalid parameters, invalid fulfilled values, rejection, and the
20
+ // shadowed-name negative control without regressing receiver forwarding.
21
+ func TestFunctionalPromisedTypeTransform(t *testing.T) {
22
+ project := compareEqualCoverProject(t, "functional-promised-type-", functionalPromisedTypeSource)
23
+ ttscTypiaTestTypecheck(t, project)
24
+ js := compareEqualCoverTransform(t, project)
25
+ if !strings.Contains(js, "async function") || !strings.Contains(js, "await Reflect.apply") {
26
+ t.Fatalf("promised wrappers do not emit async/await:\n%s", js)
27
+ }
28
+ if !strings.Contains(js, "Reflect.apply") {
29
+ t.Fatalf("promised wrappers do not preserve receiver forwarding:\n%s", js)
30
+ }
31
+
32
+ node, err := exec.LookPath("node")
33
+ if err != nil {
34
+ t.Skip("node executable not found")
35
+ }
36
+ runtimeDir := filepath.Join(project, "runtime")
37
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
38
+ t.Fatalf("mkdir runtime dir: %v", err)
39
+ }
40
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
41
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(ttscTypiaTestRewriteCommonJS(t, js)), 0o644); err != nil {
42
+ t.Fatalf("write runtime module: %v", err)
43
+ }
44
+ runner := filepath.Join(runtimeDir, "run.cjs")
45
+ if err := os.WriteFile(runner, []byte(functionalPromisedTypeRuntime), 0o644); err != nil {
46
+ t.Fatalf("write runtime runner: %v", err)
47
+ }
48
+ cmd := exec.Command(node, runner)
49
+ cmd.Dir = runtimeDir
50
+ if output, err := cmd.CombinedOutput(); err != nil {
51
+ t.Fatalf("functional promised-type runtime cases failed: %v\n%s", err, output)
52
+ }
53
+ }
54
+
55
+ const functionalPromisedTypeSource = `import typia from "typia";
56
+
57
+ export interface Receiver { base: number; }
58
+ export interface Input { value: number; }
59
+ export interface Output { total: number; }
60
+
61
+ export class DerivedPromise<T> extends Promise<T> {}
62
+ export interface InterfacePromise<T> extends Promise<T> {}
63
+ export type BrandedPromise<T> = Promise<T> & { readonly __brand: unique symbol };
64
+ export namespace Shadow {
65
+ export class Promise<T> {
66
+ public constructor(public value: T) {}
67
+ }
68
+ }
69
+
70
+ export function promisedTarget(this: Receiver, input: Input): DerivedPromise<Output> {
71
+ return new DerivedPromise((resolve) => resolve({ total: this.base + input.value }));
72
+ }
73
+ export function interfaceTarget(input: Input): InterfacePromise<Output> {
74
+ return Promise.resolve({ total: input.value }) as InterfacePromise<Output>;
75
+ }
76
+ export function brandedTarget(input: Input): BrandedPromise<Output> {
77
+ return Promise.resolve({ total: input.value }) as BrandedPromise<Output>;
78
+ }
79
+ export function shadowedTarget(input: Input): Shadow.Promise<Output> {
80
+ return new Shadow.Promise({ total: input.value });
81
+ }
82
+ export function rejectingTarget(): DerivedPromise<Output> {
83
+ return new DerivedPromise((_resolve, reject) => reject(new Error("promised rejection")));
84
+ }
85
+
86
+ export const promised = {
87
+ assertFunction: typia.functional.assertFunction(promisedTarget),
88
+ assertParameters: typia.functional.assertParameters(promisedTarget),
89
+ assertReturn: typia.functional.assertReturn(promisedTarget),
90
+ assertEqualsFunction: typia.functional.assertEqualsFunction(promisedTarget),
91
+ assertEqualsParameters: typia.functional.assertEqualsParameters(promisedTarget),
92
+ assertEqualsReturn: typia.functional.assertEqualsReturn(promisedTarget),
93
+ isFunction: typia.functional.isFunction(promisedTarget),
94
+ isParameters: typia.functional.isParameters(promisedTarget),
95
+ isReturn: typia.functional.isReturn(promisedTarget),
96
+ equalsFunction: typia.functional.equalsFunction(promisedTarget),
97
+ equalsParameters: typia.functional.equalsParameters(promisedTarget),
98
+ equalsReturn: typia.functional.equalsReturn(promisedTarget),
99
+ validateFunction: typia.functional.validateFunction(promisedTarget),
100
+ validateParameters: typia.functional.validateParameters(promisedTarget),
101
+ validateReturn: typia.functional.validateReturn(promisedTarget),
102
+ validateEqualsFunction: typia.functional.validateEqualsFunction(promisedTarget),
103
+ validateEqualsParameters: typia.functional.validateEqualsParameters(promisedTarget),
104
+ validateEqualsReturn: typia.functional.validateEqualsReturn(promisedTarget),
105
+ };
106
+
107
+ export const shadowed = {
108
+ assertFunction: typia.functional.assertFunction(shadowedTarget),
109
+ assertParameters: typia.functional.assertParameters(shadowedTarget),
110
+ assertReturn: typia.functional.assertReturn(shadowedTarget),
111
+ assertEqualsFunction: typia.functional.assertEqualsFunction(shadowedTarget),
112
+ assertEqualsParameters: typia.functional.assertEqualsParameters(shadowedTarget),
113
+ assertEqualsReturn: typia.functional.assertEqualsReturn(shadowedTarget),
114
+ isFunction: typia.functional.isFunction(shadowedTarget),
115
+ isParameters: typia.functional.isParameters(shadowedTarget),
116
+ isReturn: typia.functional.isReturn(shadowedTarget),
117
+ equalsFunction: typia.functional.equalsFunction(shadowedTarget),
118
+ equalsParameters: typia.functional.equalsParameters(shadowedTarget),
119
+ equalsReturn: typia.functional.equalsReturn(shadowedTarget),
120
+ validateFunction: typia.functional.validateFunction(shadowedTarget),
121
+ validateParameters: typia.functional.validateParameters(shadowedTarget),
122
+ validateReturn: typia.functional.validateReturn(shadowedTarget),
123
+ validateEqualsFunction: typia.functional.validateEqualsFunction(shadowedTarget),
124
+ validateEqualsParameters: typia.functional.validateEqualsParameters(shadowedTarget),
125
+ validateEqualsReturn: typia.functional.validateEqualsReturn(shadowedTarget),
126
+ };
127
+
128
+ export const semanticShapes = {
129
+ interfaceAssert: typia.functional.assertReturn<(input: Input) => InterfacePromise<Output>>(interfaceTarget),
130
+ interfaceIs: typia.functional.isReturn(interfaceTarget),
131
+ interfaceValidate: typia.functional.validateReturn(interfaceTarget),
132
+ brandedAssert: typia.functional.assertReturn(brandedTarget),
133
+ brandedIs: typia.functional.isReturn<(input: Input) => BrandedPromise<Output>>(brandedTarget),
134
+ brandedValidate: typia.functional.validateReturn(brandedTarget),
135
+ };
136
+ export const rejecting = typia.functional.assertReturn(rejectingTarget);
137
+
138
+ type Equal<X, Y> =
139
+ (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2
140
+ ? true
141
+ : false;
142
+ type Assert<T extends true> = T;
143
+ export type PromisedWrapperCases = [
144
+ Assert<Equal<ReturnType<typeof promised.isFunction>, Promise<Output | null>>>,
145
+ Assert<Equal<ReturnType<typeof promised.validateReturn>, Promise<typia.IValidation<Output>>>>,
146
+ Assert<Equal<ReturnType<typeof shadowed.isFunction>, Shadow.Promise<Output> | null>>,
147
+ Assert<Equal<ReturnType<typeof shadowed.validateReturn>, typia.IValidation<Shadow.Promise<Output>>>>,
148
+ ];
149
+ `
150
+
151
+ const functionalPromisedTypeRuntime = `const mod = require("./main.cjs");
152
+
153
+ const expect = (label, actual, expected) => {
154
+ if (actual !== expected) throw new Error(label + ": expected " + expected + ", got " + actual);
155
+ };
156
+ const assertNames = new Set([
157
+ "assertFunction", "assertParameters", "assertReturn",
158
+ "assertEqualsFunction", "assertEqualsParameters", "assertEqualsReturn",
159
+ ]);
160
+ const validateNames = new Set([
161
+ "validateFunction", "validateParameters", "validateReturn",
162
+ "validateEqualsFunction", "validateEqualsParameters", "validateEqualsReturn",
163
+ ]);
164
+
165
+ (async () => {
166
+ for (const [name, wrapped] of Object.entries(mod.promised)) {
167
+ const pending = wrapped.call({ base: 40 }, { value: 2 });
168
+ expect("promised " + name + " returns Promise", pending instanceof Promise, true);
169
+ const result = await pending;
170
+ if (validateNames.has(name)) {
171
+ expect("promised " + name + " succeeds", result.success, true);
172
+ expect("promised " + name + " fulfilled total", result.data.total, 42);
173
+ } else {
174
+ expect("promised " + name + " is non-null", result === null, false);
175
+ expect("promised " + name + " fulfilled total", result.total, 42);
176
+ }
177
+
178
+ const invalid = wrapped.call({ base: 40 }, { value: "bad" });
179
+ expect("invalid " + name + " keeps Promise shape", invalid instanceof Promise, true);
180
+ if (assertNames.has(name)) {
181
+ let error;
182
+ try { await invalid; } catch (exp) { error = exp; }
183
+ expect("invalid " + name + " rejects", Boolean(error), true);
184
+ } else {
185
+ const failure = await invalid;
186
+ if (validateNames.has(name)) expect("invalid " + name + " validation fails", failure.success, false);
187
+ else expect("invalid " + name + " returns null", failure, null);
188
+ }
189
+ }
190
+
191
+ for (const [name, wrapped] of Object.entries(mod.semanticShapes)) {
192
+ const pending = wrapped({ value: 7 });
193
+ expect(name + " returns Promise", pending instanceof Promise, true);
194
+ const result = await pending;
195
+ if (name.endsWith("Validate")) {
196
+ expect(name + " succeeds", result.success, true);
197
+ expect(name + " total", result.data.total, 7);
198
+ } else expect(name + " total", result.total, 7);
199
+ }
200
+
201
+ for (const [name, wrapped] of Object.entries(mod.shadowed)) {
202
+ const result = wrapped({ value: 9 });
203
+ expect("shadowed " + name + " stays synchronous", result instanceof Promise, false);
204
+ if (validateNames.has(name)) {
205
+ expect("shadowed " + name + " succeeds", result.success, true);
206
+ expect("shadowed " + name + " value", result.data.value.total, 9);
207
+ } else {
208
+ expect("shadowed " + name + " is non-null", result === null, false);
209
+ expect("shadowed " + name + " value", result.value.total, 9);
210
+ }
211
+ }
212
+
213
+ let rejection;
214
+ try { await mod.rejecting(); } catch (error) { rejection = error; }
215
+ expect("rejection propagates", rejection && rejection.message, "promised rejection");
216
+ })().catch((error) => {
217
+ console.error(error);
218
+ process.exitCode = 1;
219
+ });
220
+ `
@@ -0,0 +1,232 @@
1
+ package main
2
+
3
+ import (
4
+ "os"
5
+ "os/exec"
6
+ "path/filepath"
7
+ "strings"
8
+ "testing"
9
+ )
10
+
11
+ // TestFunctionalReceiverTransform verifies dynamic receiver preservation.
12
+ //
13
+ // Functional wrappers advertise the target function's receiver contract, so
14
+ // the emitted wrapper must be an ordinary function and must invoke the captured
15
+ // target with the wrapper's call-site `this`. Arrow wrappers and bare calls
16
+ // silently discard that contract.
17
+ //
18
+ // 1. Transform all assert, is/equals, and validate parameter/return variants.
19
+ // 2. Exercise sync, async, bound, and receiver-free targets.
20
+ // 3. Preserve validation failures, thrown errors, and receiver-dependent data.
21
+ func TestFunctionalReceiverTransform(t *testing.T) {
22
+ project := compareEqualCoverProject(t, "functional-receiver-", functionalReceiverSource)
23
+ ttscTypiaTestTypecheck(t, project)
24
+ js := compareEqualCoverTransform(t, project)
25
+ if !strings.Contains(js, "Reflect.apply") {
26
+ t.Fatalf("functional output does not forward the dynamic receiver:\n%s", js)
27
+ }
28
+
29
+ node, err := exec.LookPath("node")
30
+ if err != nil {
31
+ t.Skip("node executable not found")
32
+ }
33
+ runtimeDir := filepath.Join(project, "runtime")
34
+ if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
35
+ t.Fatalf("mkdir runtime dir: %v", err)
36
+ }
37
+ ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
38
+ if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(ttscTypiaTestRewriteCommonJS(t, js)), 0o644); err != nil {
39
+ t.Fatalf("write runtime module: %v", err)
40
+ }
41
+ runner := filepath.Join(runtimeDir, "run.cjs")
42
+ if err := os.WriteFile(runner, []byte(functionalReceiverRuntime), 0o644); err != nil {
43
+ t.Fatalf("write runtime runner: %v", err)
44
+ }
45
+ cmd := exec.Command(node, runner)
46
+ cmd.Dir = runtimeDir
47
+ if output, err := cmd.CombinedOutput(); err != nil {
48
+ t.Fatalf("functional receiver runtime cases failed: %v\n%s", err, output)
49
+ }
50
+ }
51
+
52
+ const functionalReceiverSource = `import typia from "typia";
53
+
54
+ export interface Receiver {
55
+ base: number;
56
+ calls: number;
57
+ }
58
+ export interface Input {
59
+ value: number;
60
+ }
61
+ export interface Output {
62
+ total: number;
63
+ }
64
+
65
+ export function syncTarget(this: Receiver, input: Input): Output {
66
+ this.calls += 1;
67
+ return { total: this.base + input.value };
68
+ }
69
+ export async function asyncTarget(this: Receiver, input: Input): Promise<Output> {
70
+ this.calls += 1;
71
+ return { total: this.base + input.value };
72
+ }
73
+
74
+ export const sync = {
75
+ assertFunction: typia.functional.assertFunction(syncTarget),
76
+ assertParameters: typia.functional.assertParameters(syncTarget),
77
+ assertReturn: typia.functional.assertReturn(syncTarget),
78
+ assertEqualsFunction: typia.functional.assertEqualsFunction(syncTarget),
79
+ assertEqualsParameters: typia.functional.assertEqualsParameters(syncTarget),
80
+ assertEqualsReturn: typia.functional.assertEqualsReturn(syncTarget),
81
+ isFunction: typia.functional.isFunction(syncTarget),
82
+ isParameters: typia.functional.isParameters(syncTarget),
83
+ isReturn: typia.functional.isReturn(syncTarget),
84
+ equalsFunction: typia.functional.equalsFunction(syncTarget),
85
+ equalsParameters: typia.functional.equalsParameters(syncTarget),
86
+ equalsReturn: typia.functional.equalsReturn(syncTarget),
87
+ validateFunction: typia.functional.validateFunction(syncTarget),
88
+ validateParameters: typia.functional.validateParameters(syncTarget),
89
+ validateReturn: typia.functional.validateReturn(syncTarget),
90
+ validateEqualsFunction: typia.functional.validateEqualsFunction(syncTarget),
91
+ validateEqualsParameters: typia.functional.validateEqualsParameters(syncTarget),
92
+ validateEqualsReturn: typia.functional.validateEqualsReturn(syncTarget),
93
+ };
94
+
95
+ export const asynchronous = {
96
+ assertFunction: typia.functional.assertFunction(asyncTarget),
97
+ assertParameters: typia.functional.assertParameters(asyncTarget),
98
+ assertReturn: typia.functional.assertReturn(asyncTarget),
99
+ assertEqualsFunction: typia.functional.assertEqualsFunction(asyncTarget),
100
+ assertEqualsParameters: typia.functional.assertEqualsParameters(asyncTarget),
101
+ assertEqualsReturn: typia.functional.assertEqualsReturn(asyncTarget),
102
+ isFunction: typia.functional.isFunction(asyncTarget),
103
+ isParameters: typia.functional.isParameters(asyncTarget),
104
+ isReturn: typia.functional.isReturn(asyncTarget),
105
+ equalsFunction: typia.functional.equalsFunction(asyncTarget),
106
+ equalsParameters: typia.functional.equalsParameters(asyncTarget),
107
+ equalsReturn: typia.functional.equalsReturn(asyncTarget),
108
+ validateFunction: typia.functional.validateFunction(asyncTarget),
109
+ validateParameters: typia.functional.validateParameters(asyncTarget),
110
+ validateReturn: typia.functional.validateReturn(asyncTarget),
111
+ validateEqualsFunction: typia.functional.validateEqualsFunction(asyncTarget),
112
+ validateEqualsParameters: typia.functional.validateEqualsParameters(asyncTarget),
113
+ validateEqualsReturn: typia.functional.validateEqualsReturn(asyncTarget),
114
+ };
115
+
116
+ const boundReceiver: Receiver = { base: 20, calls: 0 };
117
+ export const boundAssert = typia.functional.assertFunction(syncTarget).bind(boundReceiver);
118
+ export const customAssert = typia.functional.assertParameters(
119
+ syncTarget,
120
+ (props) => Object.assign(new Error("custom receiver"), props),
121
+ );
122
+ export const receiverFree = typia.functional.isFunction((input: Input): Output => ({ total: input.value }));
123
+ export const receiverFreeResult = receiverFree({ value: 2 });
124
+ export const throwing = typia.functional.assertParameters(function (this: Receiver, input: Input): Output {
125
+ throw new Error(String(this.base + input.value));
126
+ });
127
+
128
+ type Equal<X, Y> =
129
+ (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2
130
+ ? true
131
+ : false;
132
+ type Assert<T extends true> = T;
133
+ export type ReceiverCases = [
134
+ Assert<Equal<ThisParameterType<typeof sync.assertFunction>, Receiver>>,
135
+ Assert<Equal<ThisParameterType<typeof sync.isFunction>, Receiver>>,
136
+ Assert<Equal<ThisParameterType<typeof sync.equalsParameters>, Receiver>>,
137
+ Assert<Equal<ThisParameterType<typeof sync.validateReturn>, Receiver>>,
138
+ Assert<Equal<ThisParameterType<typeof sync.validateEqualsFunction>, Receiver>>,
139
+ Assert<Equal<ThisParameterType<typeof asynchronous.assertReturn>, Receiver>>,
140
+ Assert<Equal<ThisParameterType<typeof asynchronous.isParameters>, Receiver>>,
141
+ Assert<Equal<ThisParameterType<typeof asynchronous.validateFunction>, Receiver>>,
142
+ ];
143
+ `
144
+
145
+ const functionalReceiverRuntime = `const mod = require("./main.cjs");
146
+
147
+ const expect = (label, actual, expected) => {
148
+ if (actual !== expected) throw new Error(label + ": expected " + expected + ", got " + actual);
149
+ };
150
+ const assertNames = new Set([
151
+ "assertFunction", "assertParameters", "assertReturn",
152
+ "assertEqualsFunction", "assertEqualsParameters", "assertEqualsReturn",
153
+ ]);
154
+ const validateNames = new Set([
155
+ "validateFunction", "validateParameters", "validateReturn",
156
+ "validateEqualsFunction", "validateEqualsParameters", "validateEqualsReturn",
157
+ ]);
158
+ const checkResult = (label, name, result) => {
159
+ if (validateNames.has(name)) {
160
+ expect(label + " success", result.success, true);
161
+ expect(label + " total", result.data.total, 42);
162
+ } else {
163
+ expect(label + " non-null", result === null, false);
164
+ expect(label + " total", result.total, 42);
165
+ }
166
+ };
167
+
168
+ (async () => {
169
+ for (const [name, wrapped] of Object.entries(mod.sync)) {
170
+ const receiver = { base: 40, calls: 0 };
171
+ const result = wrapped.call(receiver, { value: 2 });
172
+ checkResult("sync " + name, name, result);
173
+ expect("sync " + name + " receiver calls", receiver.calls, 1);
174
+ }
175
+ for (const [name, wrapped] of Object.entries(mod.asynchronous)) {
176
+ const receiver = { base: 40, calls: 0 };
177
+ const result = await wrapped.call(receiver, { value: 2 });
178
+ checkResult("async " + name, name, result);
179
+ expect("async " + name + " receiver calls", receiver.calls, 1);
180
+ }
181
+
182
+ const ignored = { base: 100, calls: 0 };
183
+ const bound = mod.boundAssert.call(ignored, { value: 2 });
184
+ expect("bound wrapper keeps bound receiver", bound.total, 22);
185
+ expect("bound wrapper ignores call receiver", ignored.calls, 0);
186
+ expect("receiver-free arrow remains directly callable", mod.receiverFreeResult.total, 2);
187
+
188
+ const receiver = { base: 40, calls: 0 };
189
+ let thrown;
190
+ try {
191
+ mod.throwing.call(receiver, { value: 2 });
192
+ } catch (error) {
193
+ thrown = error;
194
+ }
195
+ expect("thrown target error", thrown && thrown.message, "42");
196
+
197
+ for (const name of ["assertFunction", "isFunction", "validateFunction"]) {
198
+ const receiver = { base: 40, calls: 0 };
199
+ let result;
200
+ let error;
201
+ try {
202
+ result = mod.sync[name].call(receiver, { value: "bad" });
203
+ } catch (exp) {
204
+ error = exp;
205
+ }
206
+ if (assertNames.has(name)) {
207
+ expect("assert invalid throws", Boolean(error), true);
208
+ expect("assert invalid path", error.path, "$input.parameters[0].value");
209
+ } else if (validateNames.has(name)) {
210
+ expect("validate invalid fails", result.success, false);
211
+ expect("validate invalid path", result.errors[0].path, "$input.parameters[0].value");
212
+ } else {
213
+ expect("is invalid returns null", result, null);
214
+ }
215
+ expect(name + " invalid does not invoke target", receiver.calls, 0);
216
+ }
217
+
218
+ const customReceiver = { base: 40, calls: 0 };
219
+ let customError;
220
+ try {
221
+ mod.customAssert.call(customReceiver, { value: "bad" });
222
+ } catch (error) {
223
+ customError = error;
224
+ }
225
+ expect("custom error factory message", customError && customError.message, "custom receiver");
226
+ expect("custom error factory path", customError && customError.path, "$input.parameters[0].value");
227
+ expect("custom error does not invoke target", customReceiver.calls, 0);
228
+ })().catch((error) => {
229
+ console.error(error);
230
+ process.exitCode = 1;
231
+ });
232
+ `