typia 13.1.0 → 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 (516) 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 +134 -7
  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/js_doc_link_text_test.go +69 -0
  368. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  369. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  370. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  371. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  372. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  373. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  374. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  375. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  376. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  377. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  378. package/native/core/programmers/IsProgrammer.go +15 -1
  379. package/native/core/programmers/RandomProgrammer.go +51 -14
  380. package/native/core/programmers/compare/CompareEqualProgrammer.go +393 -5
  381. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  382. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  383. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  384. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  385. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  386. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  387. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  388. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  389. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  390. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  391. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  392. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  393. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  394. package/native/core/programmers/helpers/StringifyJoinder.go +32 -1
  395. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  396. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +5 -3
  397. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  398. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  399. package/native/core/programmers/iterate/check_template.go +344 -32
  400. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  401. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  402. package/native/core/programmers/iterate/openapi_v3_downgrader.go +641 -0
  403. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  404. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  405. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  406. package/native/core/programmers/iterate/template_runtime_pattern.go +52 -7
  407. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  408. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  409. package/native/core/programmers/llm/LlmApplicationProgrammer.go +12 -10
  410. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  411. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  412. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  413. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  414. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  415. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  416. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  417. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  418. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  419. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  420. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  421. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +40 -21
  422. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  423. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  424. package/native/core/schemas/metadata/MetadataCollection.go +270 -20
  425. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  426. package/native/core/schemas/metadata/MetadataObjectType.go +17 -4
  427. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  428. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  429. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  430. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  431. package/native/core/utils/PatternUtil.go +13 -0
  432. package/native/core/utils/PromiseTypeFactory.go +59 -0
  433. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  434. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  435. package/native/go.mod +9 -1
  436. package/native/transform/CallExpressionTransformer.go +12 -0
  437. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  438. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  439. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  440. package/package.json +16 -4
  441. package/src/executable/FileSystemIdentity.ts +189 -0
  442. package/src/executable/TypiaGenerateWizard.ts +377 -110
  443. package/src/functional.ts +30 -60
  444. package/src/internal/_ProtobufReader.ts +129 -43
  445. package/src/internal/_createStandardSchema.ts +15 -1
  446. package/src/internal/_decimal.ts +69 -0
  447. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  448. package/src/internal/_isFormatByte.ts +2 -5
  449. package/src/internal/_isFormatDate.ts +15 -2
  450. package/src/internal/_isFormatDateTime.ts +28 -2
  451. package/src/internal/_isFormatIri.ts +5 -2
  452. package/src/internal/_isFormatIriReference.ts +11 -3
  453. package/src/internal/_isFormatUriReference.ts +1 -1
  454. package/src/internal/_isMultipleOf.ts +8 -0
  455. package/src/internal/_isTypeFloat.ts +1 -1
  456. package/src/internal/_isTypeInt64.ts +1 -0
  457. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  458. package/src/internal/_isTypeUint64.ts +1 -0
  459. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  460. package/src/internal/_isUniqueItems.ts +134 -132
  461. package/src/internal/_notationAny.ts +9 -4
  462. package/src/internal/_notationAssign.ts +20 -0
  463. package/src/internal/_notationCamel.ts +31 -10
  464. package/src/internal/_notationKebab.ts +11 -0
  465. package/src/internal/_notationKeyCollision.ts +9 -0
  466. package/src/internal/_notationPascal.ts +19 -6
  467. package/src/internal/_notationSnake.ts +24 -21
  468. package/src/internal/_plainCloneAny.ts +208 -33
  469. package/src/internal/_randomArray.ts +13 -4
  470. package/src/internal/_randomFormatByte.ts +4 -1
  471. package/src/internal/_randomFormatDate.ts +17 -12
  472. package/src/internal/_randomFormatDatetime.ts +15 -10
  473. package/src/internal/_randomFormatDuration.ts +16 -14
  474. package/src/internal/_randomFormatEmail.ts +8 -2
  475. package/src/internal/_randomFormatHostname.ts +48 -1
  476. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  477. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  478. package/src/internal/_randomFormatIpv4.ts +3 -2
  479. package/src/internal/_randomFormatIpv6.ts +3 -2
  480. package/src/internal/_randomFormatIri.ts +3 -1
  481. package/src/internal/_randomFormatIriReference.ts +3 -1
  482. package/src/internal/_randomFormatJsonPointer.ts +8 -2
  483. package/src/internal/_randomFormatPassword.ts +11 -6
  484. package/src/internal/_randomFormatRegex.ts +4 -1
  485. package/src/internal/_randomFormatRelativeJsonPointer.ts +13 -6
  486. package/src/internal/_randomFormatTime.ts +13 -10
  487. package/src/internal/_randomFormatUri.ts +3 -1
  488. package/src/internal/_randomFormatUriReference.ts +3 -1
  489. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  490. package/src/internal/_randomFormatUrl.ts +25 -2
  491. package/src/internal/_randomFormatUuid.ts +10 -6
  492. package/src/internal/_randomInteger.ts +87 -40
  493. package/src/internal/_randomMultiple.ts +245 -0
  494. package/src/internal/_randomNumber.ts +72 -55
  495. package/src/internal/_randomPattern.ts +26 -4
  496. package/src/internal/_randomStringLength.ts +72 -0
  497. package/src/internal/_stringLength.ts +5 -0
  498. package/src/internal/_validateReport.ts +5 -1
  499. package/src/internal/private/__notationRename.ts +24 -0
  500. package/src/json.ts +2 -2
  501. package/src/module.ts +4 -6
  502. package/src/notations.ts +20 -4
  503. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  504. package/lib/internal/private/__notationCapitalize.js +0 -6
  505. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  506. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  507. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  508. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  509. package/lib/internal/private/__notationUnsnake.js +0 -26
  510. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  511. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  512. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  513. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  514. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  515. package/src/internal/private/__notationCapitalize.ts +0 -2
  516. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -0,0 +1,147 @@
1
+ package metadata
2
+
3
+ import (
4
+ "regexp"
5
+ "testing"
6
+ )
7
+
8
+ // TestMetadataCollectionNameAllocation verifies every minted component id is
9
+ // unique across the whole collection rather than within its base-name bucket.
10
+ //
11
+ // The allocator used to key its bookkeeping on the base name and mint
12
+ // `<Base>.o<N>` without ever comparing that id against the ids already handed
13
+ // out. A type whose real full name was exactly `Foo.o1` therefore collided with
14
+ // the id minted for a second `Foo`, one of the two schemas was dropped from the
15
+ // document outright, and the surviving `$ref` documented the wrong type.
16
+ //
17
+ // The per-base counter that survives is an optimization only. Uniqueness must
18
+ // rest on the taken set, so a stale or wrong counter has to cost a scan rather
19
+ // than a collision.
20
+ //
21
+ // 1. Allocate a free base name, then its duplicates in order.
22
+ // 2. Allocate against a taken set that already owns every id a base name would
23
+ // mint, including the ids its minted ids would mint.
24
+ // 3. Prove a real type's name is never overwritten by an invented one, in
25
+ // either discovery order.
26
+ // 4. Prove a cross-base-name collision, which no counter can see, is still
27
+ // kept apart by the set.
28
+ // 5. Prove the counter is honored when it is right and overridden when it is
29
+ // wrong.
30
+ func TestMetadataCollectionNameAllocation(t *testing.T) {
31
+ grammar := regexp.MustCompile(`^[a-zA-Z0-9.\-_]+$`)
32
+ allocate := func(taken map[string]bool, name string, from int) string {
33
+ allocated, index := metadataCollection_allocateName(taken, name, from)
34
+ if index < from {
35
+ t.Fatalf("allocator moved the counter backwards: name=%q from=%d index=%d", name, from, index)
36
+ }
37
+ taken[allocated] = true
38
+ return allocated
39
+ }
40
+
41
+ // 1. A FREE NAME KEEPS ITSELF; DUPLICATES COUNT UP
42
+ taken := map[string]bool{}
43
+ ordered := []string{}
44
+ for i := 0; i != 3; i++ {
45
+ ordered = append(ordered, allocate(taken, "Foo", i))
46
+ }
47
+ if ordered[0] != "Foo" {
48
+ t.Fatalf("a free base name lost its own name: actual=%q", ordered[0])
49
+ }
50
+ for i, allocated := range ordered {
51
+ for j, other := range ordered {
52
+ if i != j && allocated == other {
53
+ t.Fatalf("duplicate allocation collided: index=%d other=%d id=%q", i, j, allocated)
54
+ }
55
+ }
56
+ if grammar.MatchString(allocated) == false {
57
+ t.Fatalf("illegal allocated component key: id=%q", allocated)
58
+ }
59
+ }
60
+
61
+ // 2. A MINTED ID NEVER SQUATS A NAME ANOTHER TYPE ALREADY OWNS
62
+ //
63
+ // Every id these base names can mint is pre-taken by the loop itself, so the
64
+ // allocator can only pass by consulting the whole taken set.
65
+ for _, name := range []string{"Foo", "Qualified.Member", "Escaped-x0", "_"} {
66
+ reserved := map[string]bool{}
67
+ for i := 0; i != 8; i++ {
68
+ allocated, _ := metadataCollection_allocateName(reserved, name, 0)
69
+ if reserved[allocated] {
70
+ t.Fatalf("allocator handed out a taken id: name=%q id=%q", name, allocated)
71
+ }
72
+ if grammar.MatchString(allocated) == false {
73
+ t.Fatalf("illegal allocated component key: name=%q id=%q", name, allocated)
74
+ }
75
+ reserved[allocated] = true
76
+ }
77
+ }
78
+
79
+ // 3. A REAL TYPE'S NAME IS NEVER OVERWRITTEN BY AN INVENTED ONE
80
+ //
81
+ // The real `namespace Foo { interface o1 }` member owns `Foo.o1`. Whichever
82
+ // order the two arrive in, both must survive with distinct ids.
83
+ for _, order := range [][]string{
84
+ {"Foo", "Foo", "Foo.o1"},
85
+ {"Foo.o1", "Foo", "Foo"},
86
+ } {
87
+ reserved := map[string]bool{}
88
+ counters := map[string]int{}
89
+ allocations := []string{}
90
+ for _, name := range order {
91
+ allocated, index := metadataCollection_allocateName(reserved, name, counters[name])
92
+ reserved[allocated] = true
93
+ counters[name] = index + 1
94
+ allocations = append(allocations, allocated)
95
+ }
96
+ if len(reserved) != len(order) {
97
+ t.Fatalf("distinct types collapsed onto one id: order=%v allocations=%v", order, allocations)
98
+ }
99
+ }
100
+
101
+ // 4. A COUNTER CANNOT SEE ACROSS BASE NAMES; THE TAKEN SET CAN
102
+ //
103
+ // This is the class the set exists for, and nothing else covers it. A second
104
+ // `GenNs` mints `GenNs-o1` from its own counter, while `Gen<Ns.o1>` normalizes
105
+ // to the base name `GenNs-o1` and mints that from a different counter. Neither
106
+ // counter can see the other. Both orders must keep three types apart.
107
+ for _, order := range [][]string{
108
+ {"GenNs", "GenNs", "Gen<Ns.o1>"},
109
+ {"Gen<Ns.o1>", "GenNs", "GenNs"},
110
+ } {
111
+ reserved := map[string]bool{}
112
+ counters := map[string]int{}
113
+ allocations := []string{}
114
+ for _, declared := range order {
115
+ name := MetadataCollection_replaceOpenApi(declared)
116
+ allocated, index := metadataCollection_allocateName(reserved, name, counters[name])
117
+ reserved[allocated] = true
118
+ counters[name] = index + 1
119
+ allocations = append(allocations, allocated)
120
+ }
121
+ if len(reserved) != len(order) {
122
+ t.Fatalf("a cross-base-name collision dropped a type: order=%v allocations=%v", order, allocations)
123
+ }
124
+ }
125
+
126
+ // 5. THE COUNTER IS AN OPTIMIZATION, NOT THE UNIQUENESS ARGUMENT
127
+ //
128
+ // A right counter settles where it starts, and that returned index is the
129
+ // whole point: every anonymous type shares the name `__type`, so an allocator
130
+ // that rescanned the run from zero each time would be quadratic in a
131
+ // program's anonymous type count.
132
+ run := map[string]bool{}
133
+ for i := 0; i != 64; i++ {
134
+ run[metadataCollection_composeName("__type", i)] = true
135
+ }
136
+ if _, index := metadataCollection_allocateName(run, "__type", 64); index != 64 {
137
+ t.Fatalf("a correct counter was not honored: index=%d expected=64", index)
138
+ }
139
+ // A wrong counter costs a scan, never a collision.
140
+ allocated, index := metadataCollection_allocateName(run, "__type", 0)
141
+ if run[allocated] {
142
+ t.Fatalf("a stale counter handed out a taken id: id=%q", allocated)
143
+ }
144
+ if index != 64 {
145
+ t.Fatalf("a stale counter did not scan to the first free id: index=%d expected=64", index)
146
+ }
147
+ }
@@ -0,0 +1,55 @@
1
+ package metadata
2
+
3
+ import (
4
+ "strings"
5
+ "testing"
6
+ )
7
+
8
+ // TestMetadataCollectionOpenApiNameCascade verifies the allocator never invents
9
+ // a namespace parent for an escaped component name.
10
+ //
11
+ // JsonDescriptor.cascade reads every dotted prefix of a component key as a
12
+ // parent namespace and inherits that parent's description. A disambiguating
13
+ // suffix joined with "." would therefore present an escaped name's own base as
14
+ // a fake parent, and an unrelated component owning that base would leak its
15
+ // description into the escaped type's schema.
16
+ //
17
+ // 1. Allocate a legal name and the escaped name that shares its base.
18
+ // 2. Collect every dotted prefix each allocation exposes.
19
+ // 3. Require no allocation to expose another allocation as its parent.
20
+ func TestMetadataCollectionOpenApiNameCascade(t *testing.T) {
21
+ inputs := []string{
22
+ "A_x2F_B",
23
+ "A/B",
24
+ "Recursive",
25
+ `Recursive<"">`,
26
+ `Recursive<"A/B">`,
27
+ "Qualified.Member",
28
+ "Café",
29
+ "$Plain",
30
+ "",
31
+ }
32
+ allocated := map[string]string{}
33
+ for _, input := range inputs {
34
+ output := MetadataCollection_replaceOpenApi(input)
35
+ if previous, ok := allocated[output]; ok {
36
+ t.Fatalf("allocation collided: %q and %q both produced %q", previous, input, output)
37
+ }
38
+ allocated[output] = input
39
+ }
40
+ for output, input := range allocated {
41
+ segments := strings.Split(output, ".")
42
+ for i := 1; i < len(segments); i++ {
43
+ parent := strings.Join(segments[:i], ".")
44
+ if owner, ok := allocated[parent]; ok {
45
+ t.Fatalf(
46
+ "allocation %q (from %q) claims unrelated allocation %q (from %q) as a namespace parent",
47
+ output,
48
+ input,
49
+ parent,
50
+ owner,
51
+ )
52
+ }
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,68 @@
1
+ package metadata
2
+
3
+ import (
4
+ "regexp"
5
+ "testing"
6
+ )
7
+
8
+ // TestMetadataCollectionOpenApiName verifies the OpenAPI-specific metadata
9
+ // name allocator preserves legal controls while encoding every other rune.
10
+ //
11
+ // The schema generators use the allocated name as both a Components Object
12
+ // key and a local-reference token. Deleting punctuation is insufficient:
13
+ // distinct names can collapse, and the surviving key can still violate OAS.
14
+ //
15
+ // 1. Preserve ordinary, dotted, hyphenated, and underscored legal controls.
16
+ // 2. Encode empty, punctuation, percent, fragment, and Unicode boundaries.
17
+ // 3. Prove formerly colliding inputs remain legal, distinct, and repeatable.
18
+ func TestMetadataCollectionOpenApiName(t *testing.T) {
19
+ legal := map[string]string{
20
+ "Plain": "Plain",
21
+ "Qualified.Member": "Qualified.Member",
22
+ "A-B": "A-B",
23
+ "A_B": "A_B",
24
+ "A_x2F_B": "A_x2F_B",
25
+ "_": "_",
26
+ "Recursive": "Recursive",
27
+ }
28
+ outputs := map[string]string{}
29
+ for input, expected := range legal {
30
+ actual := MetadataCollection_replaceOpenApi(input)
31
+ if actual != expected {
32
+ t.Fatalf("legal OpenAPI component name changed: input=%q actual=%q expected=%q", input, actual, expected)
33
+ }
34
+ outputs[actual] = input
35
+ }
36
+
37
+ inputs := []string{
38
+ "",
39
+ "$Plain",
40
+ "A/B",
41
+ `Recursive<"">`,
42
+ `Recursive<"A/B">`,
43
+ `Recursive<"T~N">`,
44
+ `Recursive<"C%D">`,
45
+ `Recursive<"A#B">`,
46
+ `Recursive<"A B">`,
47
+ `Recursive<"A:B">`,
48
+ `Recursive<"AB">`,
49
+ `Recursive<"///">`,
50
+ "Café",
51
+ "한글",
52
+ }
53
+ grammar := regexp.MustCompile(`^[a-zA-Z0-9.\-_]+$`)
54
+ for _, input := range inputs {
55
+ first := MetadataCollection_replaceOpenApi(input)
56
+ second := MetadataCollection_replaceOpenApi(input)
57
+ if first != second {
58
+ t.Fatalf("OpenAPI component allocation is not repeatable: input=%q first=%q second=%q", input, first, second)
59
+ }
60
+ if grammar.MatchString(first) == false {
61
+ t.Fatalf("illegal OpenAPI component name: input=%q output=%q", input, first)
62
+ }
63
+ if previous, ok := outputs[first]; ok && previous != input {
64
+ t.Fatalf("OpenAPI component allocation collided: first=%q second=%q output=%q", previous, input, first)
65
+ }
66
+ outputs[first] = input
67
+ }
68
+ }
@@ -38,6 +38,19 @@ func (patternUtilNamespace) Escape(str string) string {
38
38
  builder.WriteRune(ch)
39
39
  case '-':
40
40
  builder.WriteString("\\x2d")
41
+ // The four ECMAScript LineTerminators cannot appear raw inside a regex
42
+ // literal (`RegExp(/.../)`) -- the sink every structural pattern feeds -- so a
43
+ // raw one turns the emitted module into a SyntaxError. Emit the regex escape
44
+ // instead; it stays valid in the literal and keeps matching the terminator
45
+ // (#2211).
46
+ case '\n':
47
+ builder.WriteString("\\n")
48
+ case '\r':
49
+ builder.WriteString("\\r")
50
+ case '\u2028':
51
+ builder.WriteString("\\u2028")
52
+ case '\u2029':
53
+ builder.WriteString("\\u2029")
41
54
  default:
42
55
  builder.WriteRune(ch)
43
56
  }
@@ -0,0 +1,59 @@
1
+ package utils
2
+
3
+ import (
4
+ shimast "github.com/microsoft/typescript-go/shim/ast"
5
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
6
+ )
7
+
8
+ type promiseTypeFactoryNamespace struct{}
9
+
10
+ var PromiseTypeFactory = promiseTypeFactoryNamespace{}
11
+
12
+ type PromiseTypeFactory_IOutput struct {
13
+ Type *shimchecker.Type
14
+ Async bool
15
+ }
16
+
17
+ func (promiseTypeFactoryNamespace) Resolve(checker *shimchecker.Checker, t *shimchecker.Type) PromiseTypeFactory_IOutput {
18
+ if checker != nil && t != nil {
19
+ promised := checker.GetPromisedTypeOfPromise(t)
20
+ if promised != nil && PromiseTypeFactory.satisfiesGlobalContract(checker, t) {
21
+ return PromiseTypeFactory_IOutput{
22
+ Type: promised,
23
+ Async: true,
24
+ }
25
+ }
26
+ }
27
+ return PromiseTypeFactory_IOutput{
28
+ Type: t,
29
+ Async: false,
30
+ }
31
+ }
32
+
33
+ func (promiseTypeFactoryNamespace) satisfiesGlobalContract(checker *shimchecker.Checker, t *shimchecker.Type) bool {
34
+ symbol := checker.GetGlobalSymbol("Promise", shimast.SymbolFlagsValue, nil)
35
+ if symbol == nil {
36
+ return false
37
+ }
38
+ constructor := checker.GetTypeOfSymbol(symbol)
39
+ if constructor == nil {
40
+ return false
41
+ }
42
+ contract := checker.GetTypeOfPropertyOfType(constructor, "prototype")
43
+ if contract == nil {
44
+ return false
45
+ }
46
+ for _, property := range checker.GetPropertiesOfType(contract) {
47
+ if property.Name == "then" || (len(property.Name) != 0 && property.Name[0] == 0xfe) {
48
+ // GetPromisedTypeOfPromise verifies the thenable shape. Conditional
49
+ // Promise inference ignores well-known-symbol augmentations.
50
+ continue
51
+ }
52
+ required := checker.GetTypeOfPropertyOfType(contract, property.Name)
53
+ candidate := checker.GetTypeOfPropertyOfType(t, property.Name)
54
+ if required == nil || candidate == nil || !checker.IsTypeAssignableTo(candidate, required) {
55
+ return false
56
+ }
57
+ }
58
+ return true
59
+ }
@@ -44,4 +44,12 @@ var protobufNameEncoder_replacers = []protobufNameEncoder_replacer{
44
44
  {Before: "'", After: "_singlequote_"},
45
45
  {Before: "\"", After: "_doublequote_"},
46
46
  {Before: " ", After: "_space_"},
47
+ // A Protocol Buffers message name is an identifier, so a hyphen has to be
48
+ // encoded like any other rune the grammar rejects. It is not exotic: the
49
+ // metadata collection joins a duplicated name's counter with one, and a
50
+ // quoted type argument can carry one of its own, as `Gen<"a-b">` does. The
51
+ // dot is deliberately absent from this table — `protobufMessageProgrammer_emplace`
52
+ // splits a name on it to nest a namespace member in its parent's message, and
53
+ // a qualified reference is legal in the grammar.
54
+ {Before: "-", After: "_hyphen_"},
47
55
  }
@@ -0,0 +1,118 @@
1
+ package utils
2
+
3
+ import (
4
+ "os"
5
+ "path/filepath"
6
+ "testing"
7
+
8
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
9
+ "github.com/samchon/ttsc/packages/ttsc/driver"
10
+ )
11
+
12
+ // TestPromiseTypeFactorySemantics verifies semantic promised-type resolution.
13
+ //
14
+ // Promise identity is structural in the checker rather than a symbol spelling.
15
+ // Derived classes, interfaces, and branded intersections must unwrap while an
16
+ // unrelated class named Promise and weaker PromiseLike contracts must remain
17
+ // synchronous, even when a thenable adds only part of the Promise surface.
18
+ //
19
+ // 1. Load ten return-shape declarations through the real checker.
20
+ // 2. Resolve the fulfilled type for every genuine Promise shape.
21
+ // 3. Reject plain, partial, and malformed PromiseLike controls without replacing their types.
22
+ func TestPromiseTypeFactorySemantics(t *testing.T) {
23
+ dir := t.TempDir()
24
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(`{
25
+ "compilerOptions": {
26
+ "target": "ES2022",
27
+ "module": "commonjs",
28
+ "moduleResolution": "bundler",
29
+ "ignoreDeprecations": "6.0",
30
+ "strict": true,
31
+ "skipLibCheck": true
32
+ },
33
+ "include": ["src"]
34
+ }`), 0o644); err != nil {
35
+ t.Fatalf("write tsconfig: %v", err)
36
+ }
37
+ if err := os.MkdirAll(filepath.Join(dir, "src"), 0o755); err != nil {
38
+ t.Fatalf("mkdir src: %v", err)
39
+ }
40
+ if err := os.WriteFile(filepath.Join(dir, "src", "main.ts"), []byte(`
41
+ class DerivedPromise<T> extends Promise<T> {}
42
+ interface InterfacePromise<T> extends Promise<T> {}
43
+ type BrandedPromise<T> = Promise<T> & { readonly __brand: unique symbol };
44
+ type CatchablePromiseLike<T> = PromiseLike<T> & {
45
+ catch(onrejected?: (reason: any) => any): CatchablePromiseLike<T>;
46
+ };
47
+ type MalformedPromiseLike<T> = PromiseLike<T> & {
48
+ catch(): number;
49
+ finally(): number;
50
+ };
51
+ namespace Shadow { export class Promise<T> { public constructor(public value: T) {} } }
52
+ let builtin!: Promise<string>;
53
+ let derivedClass!: DerivedPromise<number>;
54
+ let derivedInterface!: InterfacePromise<boolean>;
55
+ let branded!: BrandedPromise<bigint>;
56
+ let shadowed!: Shadow.Promise<Date>;
57
+ let synchronous!: { value: RegExp };
58
+ let promiseLike!: PromiseLike<string>;
59
+ let structural!: Pick<Promise<URL>, "then" | "catch" | "finally">;
60
+ let catchablePromiseLike!: CatchablePromiseLike<string>;
61
+ let malformedPromiseLike!: MalformedPromiseLike<string>;
62
+ const structuralBoundary: Pick<Promise<URL>, "then" | "catch" | "finally"> extends Promise<infer _> ? true : false = true;
63
+ const catchableBoundary: CatchablePromiseLike<string> extends Promise<infer _> ? true : false = false;
64
+ const malformedBoundary: MalformedPromiseLike<string> extends Promise<infer _> ? true : false = false;
65
+ `), 0o644); err != nil {
66
+ t.Fatalf("write source: %v", err)
67
+ }
68
+ program, diagnostics, err := driver.LoadProgram(dir, "tsconfig.json", driver.LoadProgramOptions{})
69
+ if err != nil {
70
+ t.Fatalf("load program: %v", err)
71
+ }
72
+ if len(diagnostics) != 0 {
73
+ t.Fatalf("fixture diagnostics: %+v", diagnostics)
74
+ }
75
+ defer program.Close()
76
+
77
+ source := program.SourceFile(filepath.Join(dir, "src", "main.ts"))
78
+ if source == nil || source.Statements == nil || len(source.Statements.Nodes) != 19 {
79
+ t.Fatal("fixture declarations were not loaded")
80
+ }
81
+ variableType := func(index int) *shimchecker.Type {
82
+ declaration := source.Statements.Nodes[index].AsVariableStatement().DeclarationList.AsVariableDeclarationList().Declarations.Nodes[0]
83
+ return program.Checker.GetTypeAtLocation(declaration)
84
+ }
85
+ tests := []struct {
86
+ name string
87
+ index int
88
+ async bool
89
+ fulfilled string
90
+ }{
91
+ {"builtin", 6, true, "string"},
92
+ {"derived-class", 7, true, "number"},
93
+ {"derived-interface", 8, true, "boolean"},
94
+ {"branded-intersection", 9, true, "bigint"},
95
+ {"shadowed-name", 10, false, ""},
96
+ {"synchronous", 11, false, ""},
97
+ {"promise-like", 12, false, ""},
98
+ {"structural", 13, true, "URL"},
99
+ {"catchable-promise-like", 14, false, ""},
100
+ {"malformed-promise-like", 15, false, ""},
101
+ }
102
+ for _, tc := range tests {
103
+ t.Run(tc.name, func(t *testing.T) {
104
+ input := variableType(tc.index)
105
+ output := PromiseTypeFactory.Resolve(program.Checker, input)
106
+ if output.Async != tc.async {
107
+ t.Fatalf("async mismatch: got %v, want %v", output.Async, tc.async)
108
+ }
109
+ if tc.async {
110
+ if got := program.Checker.TypeToString(output.Type); got != tc.fulfilled {
111
+ t.Fatalf("fulfilled type mismatch: got %q, want %q", got, tc.fulfilled)
112
+ }
113
+ } else if output.Type != input {
114
+ t.Fatal("non-Promise type was replaced")
115
+ }
116
+ })
117
+ }
118
+ }
package/native/go.mod CHANGED
@@ -2,6 +2,14 @@ module github.com/samchon/typia/packages/typia/native
2
2
 
3
3
  go 1.26
4
4
 
5
+ // Build-time floor: the driver reference-graph SDK
6
+ // (driver.NewTransformGraph / driver.TransformGraph / driver.TransformOutputKey)
7
+ // this plugin consumes exists only in ttsc >= 0.19.2. That floor is enforced
8
+ // through typia's package.json peerDependencies (ttsc / @ttsc/unplugin), not
9
+ // here: ttsc builds this plugin from source on the user's machine and its
10
+ // buildSourcePlugin generates `replace github.com/samchon/ttsc/packages/ttsc
11
+ // v0.0.0 => <installed ttsc root>`, so the require below must stay v0.0.0 or the
12
+ // generated replace no longer matches and the plugin build fails to resolve.
5
13
  require (
6
14
  github.com/microsoft/typescript-go/shim/ast v0.0.0
7
15
  github.com/microsoft/typescript-go/shim/checker v0.0.0
@@ -11,6 +19,7 @@ require (
11
19
  github.com/microsoft/typescript-go/shim/printer v0.0.0
12
20
  github.com/microsoft/typescript-go/shim/scanner v0.0.0
13
21
  github.com/samchon/ttsc/packages/ttsc v0.0.0
22
+ golang.org/x/text v0.36.0
14
23
  )
15
24
 
16
25
  require (
@@ -27,5 +36,4 @@ require (
27
36
  github.com/zeebo/xxh3 v1.1.0 // indirect
28
37
  golang.org/x/sync v0.20.0 // indirect
29
38
  golang.org/x/sys v0.43.0 // indirect
30
- golang.org/x/text v0.36.0 // indirect
31
39
  )
@@ -9,6 +9,7 @@ import (
9
9
  nativeprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers"
10
10
  nativefunctionalprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers/functional"
11
11
  nativenotationprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers/notations"
12
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
12
13
  nativefeatures "github.com/samchon/typia/packages/typia/native/transform/features"
13
14
  nativecomparetransformers "github.com/samchon/typia/packages/typia/native/transform/features/compare"
14
15
  nativefunctionaltransformers "github.com/samchon/typia/packages/typia/native/transform/features/functional"
@@ -86,6 +87,17 @@ func (callExpressionTransformerNamespace) TransformKnown(props CallExpressionTra
86
87
  if ok == false {
87
88
  return props.Expression.AsNode()
88
89
  }
90
+ // Report the WRITTEN type arguments of the typia call to the dependency
91
+ // listener (project transform mode only; a no-op otherwise). The metadata
92
+ // analysis touches every checker type it reads, but a top-level alias of an
93
+ // intrinsic (`typia.validate<Id>()` with `type Id = string` elsewhere) leaves
94
+ // no symbol on the resolved type, so the call site's own syntax is the only
95
+ // anchor that registers such an alias' declaring file.
96
+ if props.Expression.TypeArguments != nil {
97
+ for _, argument := range props.Expression.TypeArguments.Nodes {
98
+ schemametadata.MetadataDependency_touchTypeNode(props.Context.Checker, argument)
99
+ }
100
+ }
89
101
  // Keep the full callee expression (e.g. `typia.assertEquals`) as the modulo,
90
102
  // mirroring the TypeScript transformer. Programmers render it into the
91
103
  // TypeGuardError method label via nativehelpers.ModuloMethodText, which reads
@@ -43,7 +43,7 @@ func (jsonApplicationTransformerNamespace) Transform(props nativetransform.ITran
43
43
 
44
44
  typ := props.Context.Checker.GetTypeFromTypeNode(top)
45
45
  collection := schemametadata.NewMetadataCollection(&schemametadata.MetadataCollection_IOptions{
46
- Replace: schemametadata.MetadataCollection_replace,
46
+ Replace: schemametadata.MetadataCollection_replaceOpenApi,
47
47
  })
48
48
  result := nativefactories.MetadataFactory.Analyze(nativefactories.MetadataFactory_IProps{
49
49
  Checker: props.Context.Checker,
@@ -66,7 +66,7 @@ func (jsonSchemaTransformerNamespace) Transform(props nativetransform.ITransform
66
66
  Validate: validator,
67
67
  },
68
68
  Components: schemametadata.NewMetadataCollection(&schemametadata.MetadataCollection_IOptions{
69
- Replace: schemametadata.MetadataCollection_replace,
69
+ Replace: schemametadata.MetadataCollection_replaceOpenApi,
70
70
  }),
71
71
  Type: typ,
72
72
  })
@@ -64,6 +64,9 @@ func (jsonSchemasTransformerNamespace) Transform(props nativetransform.ITransfor
64
64
  analyze := func(validate bool) []*schemametadata.MetadataSchema {
65
65
  metadatas := []*schemametadata.MetadataSchema{}
66
66
  errors := []nativefactories.MetadataFactory_IError{}
67
+ collection := schemametadata.NewMetadataCollection(&schemametadata.MetadataCollection_IOptions{
68
+ Replace: schemametadata.MetadataCollection_replaceOpenApi,
69
+ })
67
70
  var validator nativefactories.MetadataFactory_Validator
68
71
  if validate {
69
72
  validator = jsonTransformer_schemasValidator
@@ -77,10 +80,8 @@ func (jsonSchemasTransformerNamespace) Transform(props nativetransform.ITransfor
77
80
  Escape: true,
78
81
  Validate: validator,
79
82
  },
80
- Components: schemametadata.NewMetadataCollection(&schemametadata.MetadataCollection_IOptions{
81
- Replace: schemametadata.MetadataCollection_replace,
82
- }),
83
- Type: typ,
83
+ Components: collection,
84
+ Type: typ,
84
85
  })
85
86
  if result.Success == false {
86
87
  errors = append(errors, result.Errors...)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typia",
3
- "version": "13.1.0",
3
+ "version": "13.1.19",
4
4
  "description": "Superfast runtime validators with only one line",
5
5
  "main": "lib/index.js",
6
6
  "exports": {
@@ -50,8 +50,20 @@
50
50
  "inquirer": "^8.2.5",
51
51
  "randexp": "^0.5.3",
52
52
  "tinyglobby": "^0.2.12",
53
- "@typia/interface": "^13.1.0",
54
- "@typia/utils": "^13.1.0"
53
+ "@typia/interface": "^13.1.19",
54
+ "@typia/utils": "^13.1.19"
55
+ },
56
+ "peerDependencies": {
57
+ "@ttsc/unplugin": ">=0.19.2",
58
+ "ttsc": ">=0.19.2"
59
+ },
60
+ "peerDependenciesMeta": {
61
+ "@ttsc/unplugin": {
62
+ "optional": true
63
+ },
64
+ "ttsc": {
65
+ "optional": true
66
+ }
55
67
  },
56
68
  "devDependencies": {
57
69
  "@types/inquirer": "^8.2.5",
@@ -60,7 +72,7 @@
60
72
  "rimraf": "^6.1.2",
61
73
  "rolldown": "^1.1.5",
62
74
  "suppress-warnings": "^1.0.2",
63
- "ttsc": "^0.18.4",
75
+ "ttsc": "^0.19.2",
64
76
  "typescript": "^7.0.2"
65
77
  },
66
78
  "sideEffects": false,