typia 13.1.1 → 13.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/README.md +3 -0
  2. package/lib/_virtual/_rolldown/runtime.mjs +1 -5
  3. package/lib/executable/FileSystemIdentity.d.ts +44 -0
  4. package/lib/executable/FileSystemIdentity.js +213 -0
  5. package/lib/executable/FileSystemIdentity.js.map +1 -0
  6. package/lib/executable/FileSystemIdentity.mjs +133 -0
  7. package/lib/executable/FileSystemIdentity.mjs.map +1 -0
  8. package/lib/executable/TypiaGenerateWizard.js +272 -106
  9. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  10. package/lib/executable/TypiaGenerateWizard.mjs +239 -95
  11. package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
  12. package/lib/functional.d.ts +15 -12
  13. package/lib/functional.js.map +1 -1
  14. package/lib/functional.mjs.map +1 -1
  15. package/lib/internal/_ProtobufReader.d.ts +32 -0
  16. package/lib/internal/_ProtobufReader.js +148 -48
  17. package/lib/internal/_ProtobufReader.js.map +1 -1
  18. package/lib/internal/_ProtobufReader.mjs +137 -41
  19. package/lib/internal/_ProtobufReader.mjs.map +1 -1
  20. package/lib/internal/_createStandardSchema.js +18 -1
  21. package/lib/internal/_createStandardSchema.js.map +1 -1
  22. package/lib/internal/_createStandardSchema.mjs +12 -1
  23. package/lib/internal/_createStandardSchema.mjs.map +1 -1
  24. package/lib/internal/_decimal.d.ts +14 -0
  25. package/lib/internal/_decimal.js +61 -0
  26. package/lib/internal/_decimal.js.map +1 -0
  27. package/lib/internal/_decimal.mjs +49 -0
  28. package/lib/internal/_decimal.mjs.map +1 -0
  29. package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
  30. package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
  31. package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
  32. package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
  33. package/lib/internal/_isFormatByte.js +2 -5
  34. package/lib/internal/_isFormatByte.js.map +1 -1
  35. package/lib/internal/_isFormatByte.mjs +2 -5
  36. package/lib/internal/_isFormatByte.mjs.map +1 -1
  37. package/lib/internal/_isFormatDate.js +15 -2
  38. package/lib/internal/_isFormatDate.js.map +1 -1
  39. package/lib/internal/_isFormatDate.mjs +22 -2
  40. package/lib/internal/_isFormatDate.mjs.map +1 -1
  41. package/lib/internal/_isFormatDateTime.js +21 -2
  42. package/lib/internal/_isFormatDateTime.js.map +1 -1
  43. package/lib/internal/_isFormatDateTime.mjs +13 -2
  44. package/lib/internal/_isFormatDateTime.mjs.map +1 -1
  45. package/lib/internal/_isFormatIri.js +3 -2
  46. package/lib/internal/_isFormatIri.js.map +1 -1
  47. package/lib/internal/_isFormatIri.mjs +3 -2
  48. package/lib/internal/_isFormatIri.mjs.map +1 -1
  49. package/lib/internal/_isFormatIriReference.js +10 -2
  50. package/lib/internal/_isFormatIriReference.js.map +1 -1
  51. package/lib/internal/_isFormatIriReference.mjs +9 -2
  52. package/lib/internal/_isFormatIriReference.mjs.map +1 -1
  53. package/lib/internal/_isFormatUriReference.js +1 -1
  54. package/lib/internal/_isFormatUriReference.js.map +1 -1
  55. package/lib/internal/_isFormatUriReference.mjs +1 -1
  56. package/lib/internal/_isFormatUriReference.mjs.map +1 -1
  57. package/lib/internal/_isMultipleOf.d.ts +1 -0
  58. package/lib/internal/_isMultipleOf.js +13 -0
  59. package/lib/internal/_isMultipleOf.js.map +1 -0
  60. package/lib/internal/_isMultipleOf.mjs +12 -0
  61. package/lib/internal/_isMultipleOf.mjs.map +1 -0
  62. package/lib/internal/_isTypeFloat.js +1 -1
  63. package/lib/internal/_isTypeFloat.js.map +1 -1
  64. package/lib/internal/_isTypeFloat.mjs +1 -1
  65. package/lib/internal/_isTypeFloat.mjs.map +1 -1
  66. package/lib/internal/_isTypeInt64.js +1 -0
  67. package/lib/internal/_isTypeInt64.js.map +1 -1
  68. package/lib/internal/_isTypeInt64.mjs.map +1 -1
  69. package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
  70. package/lib/internal/_isTypeInt64Bigint.js +15 -0
  71. package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
  72. package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
  73. package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
  74. package/lib/internal/_isTypeUint64.js +1 -0
  75. package/lib/internal/_isTypeUint64.js.map +1 -1
  76. package/lib/internal/_isTypeUint64.mjs.map +1 -1
  77. package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
  78. package/lib/internal/_isTypeUint64Bigint.js +10 -0
  79. package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
  80. package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
  81. package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
  82. package/lib/internal/_isUniqueItems.js +96 -109
  83. package/lib/internal/_isUniqueItems.js.map +1 -1
  84. package/lib/internal/_isUniqueItems.mjs +62 -50
  85. package/lib/internal/_isUniqueItems.mjs.map +1 -1
  86. package/lib/internal/_jsonStringifyArray.d.ts +1 -0
  87. package/lib/internal/_jsonStringifyArray.js +48 -0
  88. package/lib/internal/_jsonStringifyArray.js.map +1 -0
  89. package/lib/internal/_jsonStringifyArray.mjs +40 -0
  90. package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
  91. package/lib/internal/_jsonStringifyElement.d.ts +1 -0
  92. package/lib/internal/_jsonStringifyElement.js +23 -0
  93. package/lib/internal/_jsonStringifyElement.js.map +1 -0
  94. package/lib/internal/_jsonStringifyElement.mjs +23 -0
  95. package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
  96. package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
  97. package/lib/internal/_jsonStringifyProperty.js +31 -0
  98. package/lib/internal/_jsonStringifyProperty.js.map +1 -0
  99. package/lib/internal/_jsonStringifyProperty.mjs +31 -0
  100. package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
  101. package/lib/internal/_llmApplicationFinalize.js +1 -1
  102. package/lib/internal/_llmApplicationFinalize.js.map +1 -1
  103. package/lib/internal/_llmApplicationFinalize.mjs +1 -1
  104. package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
  105. package/lib/internal/_notationAny.js +8 -1
  106. package/lib/internal/_notationAny.js.map +1 -1
  107. package/lib/internal/_notationAny.mjs +7 -1
  108. package/lib/internal/_notationAny.mjs.map +1 -1
  109. package/lib/internal/_notationAssign.d.ts +1 -0
  110. package/lib/internal/_notationAssign.js +18 -0
  111. package/lib/internal/_notationAssign.js.map +1 -0
  112. package/lib/internal/_notationAssign.mjs +17 -0
  113. package/lib/internal/_notationAssign.mjs.map +1 -0
  114. package/lib/internal/_notationCamel.js +30 -9
  115. package/lib/internal/_notationCamel.js.map +1 -1
  116. package/lib/internal/_notationCamel.mjs +13 -5
  117. package/lib/internal/_notationCamel.mjs.map +1 -1
  118. package/lib/internal/_notationKebab.d.ts +1 -0
  119. package/lib/internal/_notationKebab.js +15 -0
  120. package/lib/internal/_notationKebab.js.map +1 -0
  121. package/lib/internal/_notationKebab.mjs +15 -0
  122. package/lib/internal/_notationKebab.mjs.map +1 -0
  123. package/lib/internal/_notationKeyCollision.d.ts +1 -0
  124. package/lib/internal/_notationKeyCollision.js +8 -0
  125. package/lib/internal/_notationKeyCollision.js.map +1 -0
  126. package/lib/internal/_notationKeyCollision.mjs +8 -0
  127. package/lib/internal/_notationKeyCollision.mjs.map +1 -0
  128. package/lib/internal/_notationPascal.js +20 -5
  129. package/lib/internal/_notationPascal.js.map +1 -1
  130. package/lib/internal/_notationPascal.mjs +10 -5
  131. package/lib/internal/_notationPascal.mjs.map +1 -1
  132. package/lib/internal/_notationSnake.js +25 -22
  133. package/lib/internal/_notationSnake.js.map +1 -1
  134. package/lib/internal/_notationSnake.mjs +11 -11
  135. package/lib/internal/_notationSnake.mjs.map +1 -1
  136. package/lib/internal/_plainCloneAny.js +174 -38
  137. package/lib/internal/_plainCloneAny.js.map +1 -1
  138. package/lib/internal/_plainCloneAny.mjs +126 -22
  139. package/lib/internal/_plainCloneAny.mjs.map +1 -1
  140. package/lib/internal/_randomArray.d.ts +1 -1
  141. package/lib/internal/_randomArray.js +11 -4
  142. package/lib/internal/_randomArray.js.map +1 -1
  143. package/lib/internal/_randomArray.mjs +9 -3
  144. package/lib/internal/_randomArray.mjs.map +1 -1
  145. package/lib/internal/_randomFormatByte.d.ts +2 -1
  146. package/lib/internal/_randomFormatByte.js +25 -1
  147. package/lib/internal/_randomFormatByte.js.map +1 -1
  148. package/lib/internal/_randomFormatByte.mjs +20 -1
  149. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  150. package/lib/internal/_randomFormatDate.d.ts +3 -4
  151. package/lib/internal/_randomFormatDate.js +3 -10
  152. package/lib/internal/_randomFormatDate.js.map +1 -1
  153. package/lib/internal/_randomFormatDate.mjs +3 -6
  154. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  155. package/lib/internal/_randomFormatDatetime.d.ts +3 -4
  156. package/lib/internal/_randomFormatDatetime.js +26 -8
  157. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  158. package/lib/internal/_randomFormatDatetime.mjs +17 -6
  159. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  160. package/lib/internal/_randomFormatDuration.d.ts +2 -1
  161. package/lib/internal/_randomFormatDuration.js +23 -14
  162. package/lib/internal/_randomFormatDuration.js.map +1 -1
  163. package/lib/internal/_randomFormatDuration.mjs +22 -13
  164. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  165. package/lib/internal/_randomFormatEmail.d.ts +2 -1
  166. package/lib/internal/_randomFormatEmail.js +8 -1
  167. package/lib/internal/_randomFormatEmail.js.map +1 -1
  168. package/lib/internal/_randomFormatEmail.mjs +5 -1
  169. package/lib/internal/_randomFormatEmail.mjs.map +1 -1
  170. package/lib/internal/_randomFormatHostname.d.ts +8 -1
  171. package/lib/internal/_randomFormatHostname.js +45 -2
  172. package/lib/internal/_randomFormatHostname.js.map +1 -1
  173. package/lib/internal/_randomFormatHostname.mjs +38 -2
  174. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  175. package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
  176. package/lib/internal/_randomFormatIdnEmail.js +16 -2
  177. package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
  178. package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
  179. package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
  180. package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
  181. package/lib/internal/_randomFormatIdnHostname.js +26 -1
  182. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  183. package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
  184. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  185. package/lib/internal/_randomFormatIpv4.d.ts +2 -1
  186. package/lib/internal/_randomFormatIpv4.js +32 -1
  187. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  188. package/lib/internal/_randomFormatIpv4.mjs +23 -1
  189. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  190. package/lib/internal/_randomFormatIpv6.d.ts +2 -1
  191. package/lib/internal/_randomFormatIpv6.js +58 -1
  192. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  193. package/lib/internal/_randomFormatIpv6.mjs +45 -1
  194. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  195. package/lib/internal/_randomFormatIri.d.ts +2 -1
  196. package/lib/internal/_randomFormatIri.js +1 -1
  197. package/lib/internal/_randomFormatIri.js.map +1 -1
  198. package/lib/internal/_randomFormatIri.mjs +1 -1
  199. package/lib/internal/_randomFormatIri.mjs.map +1 -1
  200. package/lib/internal/_randomFormatIriReference.d.ts +2 -1
  201. package/lib/internal/_randomFormatIriReference.js +1 -1
  202. package/lib/internal/_randomFormatIriReference.js.map +1 -1
  203. package/lib/internal/_randomFormatIriReference.mjs +1 -1
  204. package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
  205. package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
  206. package/lib/internal/_randomFormatJsonPointer.js +20 -1
  207. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  208. package/lib/internal/_randomFormatJsonPointer.mjs +15 -1
  209. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  210. package/lib/internal/_randomFormatPassword.d.ts +2 -1
  211. package/lib/internal/_randomFormatPassword.js +7 -5
  212. package/lib/internal/_randomFormatPassword.js.map +1 -1
  213. package/lib/internal/_randomFormatPassword.mjs +5 -1
  214. package/lib/internal/_randomFormatPassword.mjs.map +1 -1
  215. package/lib/internal/_randomFormatRegex.d.ts +2 -1
  216. package/lib/internal/_randomFormatRegex.js +15 -1
  217. package/lib/internal/_randomFormatRegex.js.map +1 -1
  218. package/lib/internal/_randomFormatRegex.mjs +14 -1
  219. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  220. package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
  221. package/lib/internal/_randomFormatRelativeJsonPointer.js +20 -5
  222. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  223. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -5
  224. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  225. package/lib/internal/_randomFormatTime.d.ts +2 -1
  226. package/lib/internal/_randomFormatTime.js +34 -7
  227. package/lib/internal/_randomFormatTime.js.map +1 -1
  228. package/lib/internal/_randomFormatTime.mjs +37 -4
  229. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  230. package/lib/internal/_randomFormatUri.d.ts +2 -1
  231. package/lib/internal/_randomFormatUri.js +1 -1
  232. package/lib/internal/_randomFormatUri.js.map +1 -1
  233. package/lib/internal/_randomFormatUri.mjs +1 -1
  234. package/lib/internal/_randomFormatUri.mjs.map +1 -1
  235. package/lib/internal/_randomFormatUriReference.d.ts +2 -1
  236. package/lib/internal/_randomFormatUriReference.js +1 -1
  237. package/lib/internal/_randomFormatUriReference.js.map +1 -1
  238. package/lib/internal/_randomFormatUriReference.mjs +1 -1
  239. package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
  240. package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
  241. package/lib/internal/_randomFormatUriTemplate.js +1 -1
  242. package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
  243. package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
  244. package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
  245. package/lib/internal/_randomFormatUrl.d.ts +2 -1
  246. package/lib/internal/_randomFormatUrl.js +21 -1
  247. package/lib/internal/_randomFormatUrl.js.map +1 -1
  248. package/lib/internal/_randomFormatUrl.mjs +18 -1
  249. package/lib/internal/_randomFormatUrl.mjs.map +1 -1
  250. package/lib/internal/_randomFormatUuid.d.ts +2 -1
  251. package/lib/internal/_randomFormatUuid.js +3 -2
  252. package/lib/internal/_randomFormatUuid.js.map +1 -1
  253. package/lib/internal/_randomFormatUuid.mjs +3 -2
  254. package/lib/internal/_randomFormatUuid.mjs.map +1 -1
  255. package/lib/internal/_randomInteger.js +59 -28
  256. package/lib/internal/_randomInteger.js.map +1 -1
  257. package/lib/internal/_randomInteger.mjs +56 -16
  258. package/lib/internal/_randomInteger.mjs.map +1 -1
  259. package/lib/internal/_randomMultiple.d.ts +8 -0
  260. package/lib/internal/_randomMultiple.js +168 -0
  261. package/lib/internal/_randomMultiple.js.map +1 -0
  262. package/lib/internal/_randomMultiple.mjs +158 -0
  263. package/lib/internal/_randomMultiple.mjs.map +1 -0
  264. package/lib/internal/_randomNumber.js +42 -42
  265. package/lib/internal/_randomNumber.js.map +1 -1
  266. package/lib/internal/_randomNumber.mjs +41 -27
  267. package/lib/internal/_randomNumber.mjs.map +1 -1
  268. package/lib/internal/_randomPattern.d.ts +2 -1
  269. package/lib/internal/_randomPattern.js +19 -4
  270. package/lib/internal/_randomPattern.js.map +1 -1
  271. package/lib/internal/_randomPattern.mjs +10 -4
  272. package/lib/internal/_randomPattern.mjs.map +1 -1
  273. package/lib/internal/_randomStringLength.d.ts +64 -0
  274. package/lib/internal/_randomStringLength.js +84 -0
  275. package/lib/internal/_randomStringLength.js.map +1 -0
  276. package/lib/internal/_randomStringLength.mjs +79 -0
  277. package/lib/internal/_randomStringLength.mjs.map +1 -0
  278. package/lib/internal/_stringLength.d.ts +1 -0
  279. package/lib/internal/_stringLength.js +11 -0
  280. package/lib/internal/_stringLength.js.map +1 -0
  281. package/lib/internal/_stringLength.mjs +10 -0
  282. package/lib/internal/_stringLength.mjs.map +1 -0
  283. package/lib/internal/_validateReport.js +4 -1
  284. package/lib/internal/_validateReport.js.map +1 -1
  285. package/lib/internal/_validateReport.mjs +2 -1
  286. package/lib/internal/_validateReport.mjs.map +1 -1
  287. package/lib/internal/private/__notationRename.d.ts +14 -0
  288. package/lib/internal/private/__notationRename.js +25 -0
  289. package/lib/internal/private/__notationRename.js.map +1 -0
  290. package/lib/internal/private/__notationRename.mjs +24 -0
  291. package/lib/internal/private/__notationRename.mjs.map +1 -0
  292. package/lib/internal/private/__randomComposition.d.ts +23 -0
  293. package/lib/internal/private/__randomComposition.js +48 -0
  294. package/lib/internal/private/__randomComposition.js.map +1 -0
  295. package/lib/internal/private/__randomComposition.mjs +54 -0
  296. package/lib/internal/private/__randomComposition.mjs.map +1 -0
  297. package/lib/internal/private/__randomEpoch.d.ts +19 -0
  298. package/lib/internal/private/__randomEpoch.js +31 -0
  299. package/lib/internal/private/__randomEpoch.js.map +1 -0
  300. package/lib/internal/private/__randomEpoch.mjs +28 -0
  301. package/lib/internal/private/__randomEpoch.mjs.map +1 -0
  302. package/lib/json.d.ts +2 -2
  303. package/lib/json.mjs.map +1 -1
  304. package/lib/module.d.ts +2 -2
  305. package/lib/module.js.map +1 -1
  306. package/lib/module.mjs.map +1 -1
  307. package/lib/notations.d.ts +20 -4
  308. package/lib/notations.js.map +1 -1
  309. package/lib/notations.mjs.map +1 -1
  310. package/native/adapter/plugin_options.go +117 -0
  311. package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
  312. package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
  313. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
  314. package/native/cmd/ttsc-typia/build.go +84 -64
  315. package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
  316. package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
  317. package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
  318. package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
  319. package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
  320. package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
  321. package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
  322. package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
  323. package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
  324. package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
  325. package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
  326. package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
  327. package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
  328. package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
  329. package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
  330. package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
  331. package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
  332. package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
  333. package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
  334. package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
  335. package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
  336. package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
  337. package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
  338. package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
  339. package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
  340. package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
  341. package/native/cmd/ttsc-typia/main_wasm.go +21 -2
  342. package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
  343. package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
  344. package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
  345. package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
  346. package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
  347. package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
  348. package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
  349. package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
  350. package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
  351. package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
  352. package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
  353. package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
  354. package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
  355. package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
  356. package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
  357. package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
  358. package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
  359. package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
  360. package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
  361. package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
  362. package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
  363. package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
  364. package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
  365. package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
  366. package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
  367. package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
  368. package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
  369. package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
  370. package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
  371. package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
  372. package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
  373. package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
  374. package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
  375. package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
  376. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
  377. package/native/cmd/ttsc-typia/transform.go +251 -39
  378. package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
  379. package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
  380. package/native/cmd/ttsc-typia/transform_helpers_test.go +236 -3
  381. package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
  382. package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
  383. package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
  384. package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
  385. package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
  386. package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
  387. package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
  388. package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
  389. package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
  390. package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
  391. package/native/core/factories/FormatCheatSheet.go +40 -7
  392. package/native/core/factories/IdentifierFactory.go +131 -4
  393. package/native/core/factories/MetadataCommentTagFactory.go +83 -40
  394. package/native/core/factories/MetadataTypeTagFactory.go +13 -1
  395. package/native/core/factories/NumericRangeFactory.go +60 -17
  396. package/native/core/factories/ProtobufFactory.go +13 -5
  397. package/native/core/factories/factory_utility_coverage_test.go +8 -2
  398. package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
  399. package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
  400. package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
  401. package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
  402. package/native/core/factories/internal/metadata/MetadataHelper.go +226 -17
  403. package/native/core/factories/internal/metadata/emplace_metadata_object.go +141 -8
  404. package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
  405. package/native/core/factories/internal/metadata/iterate_metadata_function.go +5 -12
  406. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +111 -29
  407. package/native/core/factories/internal/metadata/iterate_metadata_map.go +5 -0
  408. package/native/core/factories/internal/metadata/iterate_metadata_native.go +45 -2
  409. package/native/core/factories/internal/metadata/iterate_metadata_set.go +5 -0
  410. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  411. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  412. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  413. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  414. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  415. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  416. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  417. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  418. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  419. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  420. package/native/core/programmers/IsProgrammer.go +15 -1
  421. package/native/core/programmers/RandomProgrammer.go +51 -14
  422. package/native/core/programmers/compare/CompareEqualProgrammer.go +410 -8
  423. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  424. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  425. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  426. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  427. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  428. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  429. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  430. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  431. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  432. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  433. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  434. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  435. package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
  436. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  437. package/native/core/programmers/helpers/StringifyJoinder.go +161 -51
  438. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  439. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -118
  440. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  441. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  442. package/native/core/programmers/iterate/check_template.go +344 -32
  443. package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
  444. package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
  445. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  446. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  447. package/native/core/programmers/iterate/json_schema_object.go +49 -7
  448. package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
  449. package/native/core/programmers/iterate/openapi_v3_downgrader.go +674 -0
  450. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  451. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  452. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  453. package/native/core/programmers/iterate/template_runtime_pattern.go +63 -7
  454. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  455. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  456. package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
  457. package/native/core/programmers/llm/LlmApplicationProgrammer.go +21 -11
  458. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  459. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  460. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  461. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  462. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  463. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  464. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  465. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  466. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  467. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  468. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  469. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +41 -22
  470. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  471. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  472. package/native/core/schemas/metadata/MetadataCollection.go +266 -25
  473. package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
  474. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  475. package/native/core/schemas/metadata/MetadataObjectType.go +24 -22
  476. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  477. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  478. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  479. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  480. package/native/core/utils/PatternUtil.go +13 -0
  481. package/native/core/utils/PromiseTypeFactory.go +59 -0
  482. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  483. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  484. package/native/go.mod +9 -1
  485. package/native/transform/CallExpressionTransformer.go +12 -0
  486. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  487. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  488. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  489. package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
  490. package/package.json +12 -4
  491. package/src/executable/FileSystemIdentity.ts +222 -0
  492. package/src/executable/TypiaGenerateWizard.ts +386 -113
  493. package/src/functional.ts +30 -60
  494. package/src/internal/_ProtobufReader.ts +161 -46
  495. package/src/internal/_createStandardSchema.ts +15 -1
  496. package/src/internal/_decimal.ts +69 -0
  497. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  498. package/src/internal/_isFormatByte.ts +2 -5
  499. package/src/internal/_isFormatDate.ts +15 -2
  500. package/src/internal/_isFormatDateTime.ts +28 -2
  501. package/src/internal/_isFormatIri.ts +5 -2
  502. package/src/internal/_isFormatIriReference.ts +11 -3
  503. package/src/internal/_isFormatUriReference.ts +1 -1
  504. package/src/internal/_isMultipleOf.ts +8 -0
  505. package/src/internal/_isTypeFloat.ts +1 -1
  506. package/src/internal/_isTypeInt64.ts +1 -0
  507. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  508. package/src/internal/_isTypeUint64.ts +1 -0
  509. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  510. package/src/internal/_isUniqueItems.ts +134 -132
  511. package/src/internal/_jsonStringifyArray.ts +50 -0
  512. package/src/internal/_jsonStringifyElement.ts +19 -0
  513. package/src/internal/_jsonStringifyProperty.ts +30 -0
  514. package/src/internal/_llmApplicationFinalize.ts +6 -1
  515. package/src/internal/_notationAny.ts +9 -4
  516. package/src/internal/_notationAssign.ts +20 -0
  517. package/src/internal/_notationCamel.ts +31 -10
  518. package/src/internal/_notationKebab.ts +11 -0
  519. package/src/internal/_notationKeyCollision.ts +9 -0
  520. package/src/internal/_notationPascal.ts +19 -6
  521. package/src/internal/_notationSnake.ts +24 -21
  522. package/src/internal/_plainCloneAny.ts +208 -33
  523. package/src/internal/_randomArray.ts +13 -4
  524. package/src/internal/_randomFormatByte.ts +31 -1
  525. package/src/internal/_randomFormatDate.ts +6 -17
  526. package/src/internal/_randomFormatDatetime.ts +34 -15
  527. package/src/internal/_randomFormatDuration.ts +30 -13
  528. package/src/internal/_randomFormatEmail.ts +8 -2
  529. package/src/internal/_randomFormatHostname.ts +48 -1
  530. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  531. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  532. package/src/internal/_randomFormatIpv4.ts +43 -2
  533. package/src/internal/_randomFormatIpv6.ts +67 -2
  534. package/src/internal/_randomFormatIri.ts +3 -1
  535. package/src/internal/_randomFormatIriReference.ts +3 -1
  536. package/src/internal/_randomFormatJsonPointer.ts +28 -2
  537. package/src/internal/_randomFormatPassword.ts +11 -6
  538. package/src/internal/_randomFormatRegex.ts +22 -1
  539. package/src/internal/_randomFormatRelativeJsonPointer.ts +26 -6
  540. package/src/internal/_randomFormatTime.ts +46 -10
  541. package/src/internal/_randomFormatUri.ts +3 -1
  542. package/src/internal/_randomFormatUriReference.ts +3 -1
  543. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  544. package/src/internal/_randomFormatUrl.ts +25 -2
  545. package/src/internal/_randomFormatUuid.ts +10 -6
  546. package/src/internal/_randomInteger.ts +87 -40
  547. package/src/internal/_randomMultiple.ts +245 -0
  548. package/src/internal/_randomNumber.ts +72 -55
  549. package/src/internal/_randomPattern.ts +29 -4
  550. package/src/internal/_randomStringLength.ts +116 -0
  551. package/src/internal/_stringLength.ts +5 -0
  552. package/src/internal/_validateReport.ts +5 -1
  553. package/src/internal/private/__notationRename.ts +21 -0
  554. package/src/internal/private/__randomComposition.ts +50 -0
  555. package/src/internal/private/__randomEpoch.ts +34 -0
  556. package/src/json.ts +2 -2
  557. package/src/module.ts +4 -6
  558. package/src/notations.ts +20 -4
  559. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  560. package/lib/internal/private/__notationCapitalize.js +0 -6
  561. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  562. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  563. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  564. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  565. package/lib/internal/private/__notationUnsnake.js +0 -26
  566. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  567. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  568. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  569. package/native/adapter/visit.go +0 -173
  570. package/native/adapter/visit_property_chain_edges_test.go +0 -129
  571. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  572. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  573. package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
  574. package/native/core/programmers/iterate/check_union_array_like.go +0 -422
  575. package/native/core/programmers/iterate/prune_object_properties.go +0 -105
  576. package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
  577. package/native/core/programmers/iterate/stringify_native.go +0 -14
  578. package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
  579. package/native/core/schemas/metadata/MetadataApplication.go +0 -41
  580. package/src/internal/private/__notationCapitalize.ts +0 -2
  581. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -0,0 +1,70 @@
1
+ package metadata
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
+ // TestMetadataTypeArgumentsPrecondition verifies reference-only extraction.
13
+ //
14
+ // The checker accepts GetTypeArguments only for object-reference types. The
15
+ // helper should identify that capability explicitly, return no arguments for a
16
+ // primitive, and preserve generic arguments for a real reference.
17
+ //
18
+ // 1. Load primitive and generic reference declarations through the checker.
19
+ // 2. Verify the primitive follows the unsupported-input fallback.
20
+ // 3. Verify the reference returns its sole string argument.
21
+ func TestMetadataTypeArgumentsPrecondition(t *testing.T) {
22
+ dir := t.TempDir()
23
+ if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(`{
24
+ "compilerOptions": {
25
+ "target": "ES2022",
26
+ "module": "commonjs",
27
+ "moduleResolution": "bundler",
28
+ "ignoreDeprecations": "6.0",
29
+ "strict": true,
30
+ "skipLibCheck": true
31
+ },
32
+ "include": ["src"]
33
+ }`), 0o644); err != nil {
34
+ t.Fatalf("write tsconfig: %v", err)
35
+ }
36
+ if err := os.MkdirAll(filepath.Join(dir, "src"), 0o755); err != nil {
37
+ t.Fatalf("mkdir src: %v", err)
38
+ }
39
+ if err := os.WriteFile(filepath.Join(dir, "src", "main.ts"), []byte(`
40
+ interface Box<T> { value: T; }
41
+ let primitive!: number;
42
+ let reference!: Box<string>;
43
+ `), 0o644); err != nil {
44
+ t.Fatalf("write source: %v", err)
45
+ }
46
+ program, diagnostics, err := driver.LoadProgram(dir, "tsconfig.json", driver.LoadProgramOptions{})
47
+ if err != nil {
48
+ t.Fatalf("load program: %v", err)
49
+ }
50
+ if len(diagnostics) != 0 {
51
+ t.Fatalf("fixture diagnostics: %+v", diagnostics)
52
+ }
53
+ defer program.Close()
54
+
55
+ source := program.SourceFile(filepath.Join(dir, "src", "main.ts"))
56
+ if source == nil || source.Statements == nil || len(source.Statements.Nodes) != 3 {
57
+ t.Fatal("fixture declarations were not loaded")
58
+ }
59
+ variableType := func(index int) *shimchecker.Type {
60
+ declaration := source.Statements.Nodes[index].AsVariableStatement().DeclarationList.AsVariableDeclarationList().Declarations.Nodes[0]
61
+ return program.Checker.GetTypeAtLocation(declaration)
62
+ }
63
+ if args := metadata_get_type_arguments(program.Checker, variableType(1)); len(args) != 0 {
64
+ t.Fatalf("primitive type returned %d type arguments", len(args))
65
+ }
66
+ args := metadata_get_type_arguments(program.Checker, variableType(2))
67
+ if len(args) != 1 || program.Checker.TypeToString(args[0]) != "string" {
68
+ t.Fatalf("generic reference arguments mismatch: %#v", args)
69
+ }
70
+ }
@@ -110,6 +110,23 @@ func TestMetadataCommentTagFactoryCoverage(t *testing.T) {
110
110
  Tag schemametadata.IJsDocTagInfo
111
111
  }{Report: report, Tag: tag})
112
112
  }
113
+ decimalReportCount := len(reports)
114
+ decimal := metadataCommentTagFactory_parse(struct {
115
+ Report func(msg string) any
116
+ Tag schemametadata.IJsDocTagInfo
117
+ }{
118
+ Report: report,
119
+ Tag: schemametadata.IJsDocTagInfo{
120
+ Name: "multipleOf",
121
+ Text: []schemametadata.IJsDocTagInfo_IText{{Text: "0.01"}},
122
+ },
123
+ })
124
+ if len(reports) != decimalReportCount || len(decimal["number"]) != 1 || len(decimal["bigint"]) != 0 {
125
+ t.Fatalf("decimal multipleOf must remain a number-only JSDoc tag: %#v, reports=%#v", decimal, reports[decimalReportCount:])
126
+ }
127
+ if decimal["number"][0].Validate != "$importInternal(\"_isMultipleOf\")($input, 0.01)" {
128
+ t.Fatalf("decimal multipleOf must use the shared exact helper: %s", decimal["number"][0].Validate)
129
+ }
113
130
  invalidBefore := len(reports)
114
131
  _ = metadataCommentTagFactory_parse_number(struct {
115
132
  Report func(msg string) any
@@ -193,6 +210,28 @@ func TestMetadataCommentTagFactoryCoverage(t *testing.T) {
193
210
  if len(oppositeOnly.Atomics[0].Tags) == 0 {
194
211
  t.Fatal("numeric comment tag should apply when only one numeric side exists")
195
212
  }
213
+ decimalOnly := schemametadata.MetadataSchema_create(schemametadata.MetadataSchema{
214
+ Atomics: []*schemametadata.MetadataAtomic{
215
+ schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "number"}),
216
+ },
217
+ })
218
+ decimalErrors := []MetadataFactory_IError{}
219
+ MetadataCommentTagFactory.Analyze(struct {
220
+ Errors *[]MetadataFactory_IError
221
+ Metadata *schemametadata.MetadataSchema
222
+ Tags []schemametadata.IJsDocTagInfo
223
+ Explore MetadataFactory_IExplore
224
+ }{
225
+ Errors: &decimalErrors,
226
+ Metadata: decimalOnly,
227
+ Tags: []schemametadata.IJsDocTagInfo{{
228
+ Name: "multipleOf",
229
+ Text: []schemametadata.IJsDocTagInfo_IText{{Text: "0.01"}},
230
+ }},
231
+ })
232
+ if len(decimalErrors) != 0 || len(decimalOnly.Atomics[0].Tags) != 1 {
233
+ t.Fatalf("decimal number JSDoc must analyze without bigint diagnostics: errors=%#v tags=%#v", decimalErrors, decimalOnly.Atomics[0].Tags)
234
+ }
196
235
 
197
236
  empty := schemametadata.MetadataSchema_create(schemametadata.MetadataSchema{})
198
237
  unsupportedErrors := []MetadataFactory_IError{}
@@ -0,0 +1,84 @@
1
+ package factories
2
+
3
+ import (
4
+ "reflect"
5
+ "testing"
6
+
7
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
8
+ )
9
+
10
+ // TestMetadataCommentTagFactoryExclusivityMatchesInterface pins every JSDoc
11
+ // comment tag's `Exclusive` value to the @typia/interface declaration.
12
+ //
13
+ // The JSDoc path and the type-tag path both feed
14
+ // MetadataTypeTagFactory.Validate, which reads a tag's `Exclusive` list to
15
+ // reject forbidden combinations. The type-tag path takes that list straight
16
+ // from the interface declaration, but the comment factory used to hand-copy it
17
+ // per parser, and two copies drifted: `@format` published a bare `true` and
18
+ // `@pattern` published `["format"]` (missing its own kind), so `@pattern ^a`
19
+ // `@pattern ^b` compiled while `Pattern<...> & Pattern<...>` is a compile error.
20
+ // This test transcribes the authority once via
21
+ // metadataTypeTagFactoryTestDeclarations -- the same mirror the type-tag tests
22
+ // use -- and asserts the comment factory now produces the identical list.
23
+ //
24
+ // 1. Build the array-form authority (kind -> exclusive kinds) from the shared
25
+ // declaration mirror, and note the kinds that declare a bare `true`.
26
+ // 2. Parse one representative JSDoc comment per tag kind through the factory.
27
+ // 3. Assert the produced tag's kind and `Exclusive` match the authority exactly,
28
+ // so `@format`/`@pattern` carry `["format", "pattern"]` and no list drifts.
29
+ func TestMetadataCommentTagFactoryExclusivityMatchesInterface(t *testing.T) {
30
+ arrayForm := map[string][]string{}
31
+ for _, declaration := range metadataTypeTagFactoryTestDeclarations() {
32
+ arrayForm[declaration.kind] = declaration.exclusive
33
+ }
34
+
35
+ report := func(string) any { return nil }
36
+ cases := []struct {
37
+ tag string
38
+ text string
39
+ kind string
40
+ key string
41
+ }{
42
+ {tag: "minimum", text: "0", kind: "minimum", key: "number"},
43
+ {tag: "maximum", text: "10", kind: "maximum", key: "number"},
44
+ {tag: "exclusiveMinimum", text: "0", kind: "exclusiveMinimum", key: "number"},
45
+ {tag: "exclusiveMaximum", text: "10", kind: "exclusiveMaximum", key: "number"},
46
+ {tag: "format", text: "uuid", kind: "format", key: "string"},
47
+ {tag: "pattern", text: "^x$", kind: "pattern", key: "string"},
48
+ {tag: "multipleOf", text: "2", kind: "multipleOf", key: "number"},
49
+ {tag: "minItems", text: "1", kind: "minItems", key: "array"},
50
+ {tag: "maxItems", text: "2", kind: "maxItems", key: "array"},
51
+ {tag: "uniqueItems", text: "", kind: "uniqueItems", key: "array"},
52
+ {tag: "minLength", text: "1", kind: "minLength", key: "string"},
53
+ {tag: "maxLength", text: "2", kind: "maxLength", key: "string"},
54
+ {tag: "type", text: "int32", kind: "type", key: "number"},
55
+ }
56
+ for _, tuple := range cases {
57
+ info := schemametadata.IJsDocTagInfo{Name: tuple.tag}
58
+ if tuple.text != "" {
59
+ info.Text = []schemametadata.IJsDocTagInfo_IText{{Text: tuple.text}}
60
+ }
61
+ record := metadataCommentTagFactory_parse(struct {
62
+ Report func(msg string) any
63
+ Tag schemametadata.IJsDocTagInfo
64
+ }{Report: report, Tag: info})
65
+ tags := record[tuple.key]
66
+ if len(tags) == 0 {
67
+ t.Fatalf("@%s should produce a %q tag", tuple.tag, tuple.key)
68
+ }
69
+ produced := tags[0]
70
+ if produced.Kind != tuple.kind {
71
+ t.Fatalf("@%s should produce kind %q, got %q", tuple.tag, tuple.kind, produced.Kind)
72
+ }
73
+ var expected any = true
74
+ if list, ok := arrayForm[tuple.kind]; ok {
75
+ expected = list
76
+ }
77
+ if reflect.DeepEqual(produced.Exclusive, expected) == false {
78
+ t.Fatalf(
79
+ "@%s exclusive drifted from the interface authority: got %#v, want %#v",
80
+ tuple.tag, produced.Exclusive, expected,
81
+ )
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,60 @@
1
+ package factories
2
+
3
+ import (
4
+ "testing"
5
+
6
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
7
+ )
8
+
9
+ // TestMetadataTypeTagFactoryAcceptsLegalTagCombinations verifies enforcing exclusivity rejects nothing a declaration permits.
10
+ //
11
+ // This is the negative twin of the rejection tests. Making an inert check fire
12
+ // is only correct if it fires on exactly the declared `exclusive` pairs: a check
13
+ // that over-matches would reject `Minimum<0> & Maximum<10>`, which neither tag's
14
+ // `exclusive` list names and which every bounded-range type depends on.
15
+ //
16
+ // 1. Combine each array-form tag with a kind absent from its exclusive list.
17
+ // 2. Combine bool-form tags of differing kinds, which the untouched branch owns.
18
+ // 3. Require every combination, and each tag alone, to validate.
19
+ func TestMetadataTypeTagFactoryAcceptsLegalTagCombinations(t *testing.T) {
20
+ declarations := metadataTypeTagFactoryTestDeclarations()
21
+ byKind := map[string]metadataTypeTagFactoryTestDeclaration{}
22
+ for _, declaration := range declarations {
23
+ byKind[declaration.kind] = declaration
24
+ success, messages := metadataTypeTagFactoryTestValidate(
25
+ declaration.target,
26
+ []schemametadata.IMetadataTypeTag{declaration.tag("A")},
27
+ )
28
+ if success == false {
29
+ t.Fatalf("a lone %s tag must validate, reported %#v", declaration.kind, messages)
30
+ }
31
+ }
32
+
33
+ for _, pair := range [][2]string{
34
+ {"minimum", "maximum"},
35
+ {"minimum", "exclusiveMaximum"},
36
+ {"exclusiveMinimum", "maximum"},
37
+ {"exclusiveMinimum", "exclusiveMaximum"},
38
+ } {
39
+ left := byKind[pair[0]]
40
+ right := byKind[pair[1]]
41
+ success, messages := metadataTypeTagFactoryTestValidate(
42
+ left.target,
43
+ []schemametadata.IMetadataTypeTag{left.tag("0"), right.tag("10")},
44
+ )
45
+ if success == false {
46
+ t.Fatalf("%s and %s bound opposite ends and must combine, reported %#v", pair[0], pair[1], messages)
47
+ }
48
+ }
49
+
50
+ boolFormTarget := "string"
51
+ boolForm := []schemametadata.IMetadataTypeTag{
52
+ {Target: boolFormTarget, Name: "MinLength<3>", Kind: "minLength", Exclusive: true},
53
+ {Target: boolFormTarget, Name: "MaxLength<7>", Kind: "maxLength", Exclusive: true},
54
+ {Target: boolFormTarget, Name: "Format<\"uuid\">", Kind: "format", Exclusive: true},
55
+ }
56
+ success, messages := metadataTypeTagFactoryTestValidate(boolFormTarget, boolForm)
57
+ if success == false {
58
+ t.Fatalf("bool-form tags of differing kinds must combine, reported %#v", messages)
59
+ }
60
+ }
@@ -0,0 +1,86 @@
1
+ package factories
2
+
3
+ import (
4
+ "fmt"
5
+
6
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
7
+ )
8
+
9
+ // metadataTypeTagFactoryTestDeclaration mirrors one type tag declaration from
10
+ // `packages/interface/src/tags`, which is the specification the native check
11
+ // must enforce. `exclusive` names kinds, never tag names.
12
+ type metadataTypeTagFactoryTestDeclaration struct {
13
+ target string
14
+ kind string
15
+ exclusive []string
16
+ name string
17
+ }
18
+
19
+ // tag materializes the declaration as the metadata tag the factory receives.
20
+ func (d metadataTypeTagFactoryTestDeclaration) tag(value string) schemametadata.IMetadataTypeTag {
21
+ return schemametadata.IMetadataTypeTag{
22
+ Target: d.target,
23
+ Name: fmt.Sprintf(d.name, value),
24
+ Kind: d.kind,
25
+ Exclusive: d.exclusive,
26
+ Value: value,
27
+ }
28
+ }
29
+
30
+ // metadataTypeTagFactoryTestDeclarations transcribes every array-form tag
31
+ // declaration, in the exact `kind` and `exclusive` shape each publishes:
32
+ //
33
+ // - Minimum kind "minimum" exclusive ["minimum", "exclusiveMinimum"]
34
+ // - Maximum kind "maximum" exclusive ["maximum", "exclusiveMaximum"]
35
+ // - ExclusiveMinimum kind "exclusiveMinimum" exclusive ["exclusiveMinimum", "minimum"]
36
+ // - ExclusiveMaximum kind "exclusiveMaximum" exclusive ["exclusiveMaximum", "maximum"]
37
+ // - Format kind "format" exclusive ["format", "pattern"]
38
+ // - Pattern kind "pattern" exclusive ["format", "pattern"]
39
+ //
40
+ // Each list names its own kind, so no tag may be duplicated, plus exactly one
41
+ // cross-kind partner.
42
+ func metadataTypeTagFactoryTestDeclarations() []metadataTypeTagFactoryTestDeclaration {
43
+ return []metadataTypeTagFactoryTestDeclaration{
44
+ {target: "number", kind: "minimum", exclusive: []string{"minimum", "exclusiveMinimum"}, name: "Minimum<%s>"},
45
+ {target: "number", kind: "maximum", exclusive: []string{"maximum", "exclusiveMaximum"}, name: "Maximum<%s>"},
46
+ {target: "number", kind: "exclusiveMinimum", exclusive: []string{"exclusiveMinimum", "minimum"}, name: "ExclusiveMinimum<%s>"},
47
+ {target: "number", kind: "exclusiveMaximum", exclusive: []string{"exclusiveMaximum", "maximum"}, name: "ExclusiveMaximum<%s>"},
48
+ {target: "string", kind: "format", exclusive: []string{"format", "pattern"}, name: "Format<%s>"},
49
+ {target: "string", kind: "pattern", exclusive: []string{"format", "pattern"}, name: "Pattern<%s>"},
50
+ }
51
+ }
52
+
53
+ // metadataTypeTagFactoryTestReport collects the factory's validation messages.
54
+ func metadataTypeTagFactoryTestReport(messages *[]string) func(struct {
55
+ Property *string
56
+ Message string
57
+ }) bool {
58
+ return func(next struct {
59
+ Property *string
60
+ Message string
61
+ }) bool {
62
+ *messages = append(*messages, next.Message)
63
+ return false
64
+ }
65
+ }
66
+
67
+ // metadataTypeTagFactoryTestValidate runs the factory check over one tag list.
68
+ func metadataTypeTagFactoryTestValidate(
69
+ target string,
70
+ tags []schemametadata.IMetadataTypeTag,
71
+ ) (bool, []string) {
72
+ messages := []string{}
73
+ success := MetadataTypeTagFactory.Validate(struct {
74
+ Report func(struct {
75
+ Property *string
76
+ Message string
77
+ }) bool
78
+ Type string
79
+ Tags []schemametadata.IMetadataTypeTag
80
+ }{
81
+ Report: metadataTypeTagFactoryTestReport(&messages),
82
+ Type: target,
83
+ Tags: tags,
84
+ })
85
+ return success, messages
86
+ }
@@ -0,0 +1,38 @@
1
+ package factories
2
+
3
+ import (
4
+ "strings"
5
+ "testing"
6
+
7
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
8
+ )
9
+
10
+ // TestMetadataTypeTagFactoryKeepsBoolFormExclusivity verifies the bool-form exclusivity branch still rejects a duplicated kind.
11
+ //
12
+ // The bool branch was never broken; it is the working neighbor of the inert
13
+ // array-form branch and shares the same loop and reporting path. Repairing the
14
+ // array-form branch must not disturb it, so this pins its behavior in both
15
+ // directions independently of the array-form tests.
16
+ //
17
+ // 1. Duplicate a bool-form kind and require rejection naming the kind.
18
+ // 2. Require an opted-out `exclusive: false` tag to permit its own duplicate.
19
+ func TestMetadataTypeTagFactoryKeepsBoolFormExclusivity(t *testing.T) {
20
+ success, messages := metadataTypeTagFactoryTestValidate("string", []schemametadata.IMetadataTypeTag{
21
+ {Target: "string", Name: "Format<\"uuid\">", Kind: "format", Exclusive: true},
22
+ {Target: "string", Name: "Format<\"email\">", Kind: "format", Exclusive: true},
23
+ })
24
+ if success {
25
+ t.Fatal("a duplicated bool-form kind must be rejected")
26
+ }
27
+ if len(messages) != 1 || strings.Contains(messages[0], "format") == false {
28
+ t.Fatalf("the bool-form duplication report must name the kind, reported %#v", messages)
29
+ }
30
+
31
+ success, messages = metadataTypeTagFactoryTestValidate("string", []schemametadata.IMetadataTypeTag{
32
+ {Target: "string", Name: "Example<\"first\">", Kind: "example", Exclusive: false},
33
+ {Target: "string", Name: "Example<\"second\">", Kind: "example", Exclusive: false},
34
+ })
35
+ if success == false {
36
+ t.Fatalf("a tag opting out of exclusivity must permit its own duplicate, reported %#v", messages)
37
+ }
38
+ }
@@ -0,0 +1,65 @@
1
+ package factories
2
+
3
+ import (
4
+ "strings"
5
+ "testing"
6
+
7
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
8
+ )
9
+
10
+ // TestMetadataTypeTagFactoryRejectsCrossKindExclusiveTags verifies each array-form tag rejects the cross-kind partner it declares.
11
+ //
12
+ // The cross-kind partner is the whole reason an `exclusive` list holds more
13
+ // than the tag's own kind: `Minimum` lists `exclusiveMinimum`, `Format` lists
14
+ // `pattern`. The declaration is the spec and it forbids the coexistence, so
15
+ // `number & Minimum<0> & ExclusiveMinimum<5>` and
16
+ // `string & Format<"uuid"> & Pattern<...>` must not compile. The original check
17
+ // scanned only same-kind tags, so the two never met; dropping that same-kind
18
+ // guard is what lets this fire, so restoring the guard turns this red while
19
+ // leaving the same-kind duplication test green.
20
+ //
21
+ // 1. Derive every declared cross-kind pair from the declarations themselves.
22
+ // 2. Validate each pair, both orders, and require rejection naming the conflict.
23
+ // 3. Require all six declarations to contribute exactly one cross-kind partner.
24
+ func TestMetadataTypeTagFactoryRejectsCrossKindExclusiveTags(t *testing.T) {
25
+ declarations := metadataTypeTagFactoryTestDeclarations()
26
+ byKind := map[string]metadataTypeTagFactoryTestDeclaration{}
27
+ for _, declaration := range declarations {
28
+ byKind[declaration.kind] = declaration
29
+ }
30
+
31
+ covered := 0
32
+ for _, declaration := range declarations {
33
+ for _, kind := range declaration.exclusive {
34
+ if kind == declaration.kind {
35
+ continue
36
+ }
37
+ opposite, ok := byKind[kind]
38
+ if ok == false {
39
+ t.Fatalf("%s declares the unknown partner kind %s", declaration.kind, kind)
40
+ }
41
+ if opposite.target != declaration.target {
42
+ t.Fatalf("%s and %s must share a target to ever conflict", declaration.kind, kind)
43
+ }
44
+ covered++
45
+
46
+ subject := declaration.tag("A")
47
+ partner := opposite.tag("B")
48
+ success, messages := metadataTypeTagFactoryTestValidate(
49
+ declaration.target,
50
+ []schemametadata.IMetadataTypeTag{subject, partner},
51
+ )
52
+ if success {
53
+ t.Fatalf("kind %s must not be used with kind %s", declaration.kind, kind)
54
+ }
55
+ if len(messages) != 1 ||
56
+ strings.Contains(messages[0], declaration.kind) == false ||
57
+ strings.Contains(messages[0], partner.Name) == false {
58
+ t.Fatalf("the %s and %s conflict report must name the conflict, reported %#v", declaration.kind, kind, messages)
59
+ }
60
+ }
61
+ }
62
+ if covered != len(declarations) {
63
+ t.Fatalf("every array-form declaration should name exactly one cross-kind partner, covered %d of %d", covered, len(declarations))
64
+ }
65
+ }
@@ -0,0 +1,41 @@
1
+ package factories
2
+
3
+ import (
4
+ "strings"
5
+ "testing"
6
+
7
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
8
+ )
9
+
10
+ // TestMetadataTypeTagFactoryRejectsDuplicatedArrayFormTags verifies an array-form tag rejects a second tag of its own kind.
11
+ //
12
+ // Every array-form `exclusive` list names its own kind, so the tag can never be
13
+ // duplicated. The check compared that list of kinds against the opposite tag's
14
+ // `Name` — `"minimum"` against `"Minimum<0>"` — which never matches, so
15
+ // `number & Minimum<5> & Minimum<0>` compiled and emitted `{"minimum": 0}`
16
+ // while its validator required 5. This is one half of the mutation proof:
17
+ // reverting the kind comparison back to `Name` turns this red. Restoring the
18
+ // same-kind guard leaves this green, because a duplicate is same-kind; it reds
19
+ // only the cross-kind rejection test instead.
20
+ //
21
+ // 1. Build two tags of one kind from each array-form declaration.
22
+ // 2. Validate the pair and require rejection.
23
+ // 3. Require the report to name the kind and the conflicting tag.
24
+ func TestMetadataTypeTagFactoryRejectsDuplicatedArrayFormTags(t *testing.T) {
25
+ for _, declaration := range metadataTypeTagFactoryTestDeclarations() {
26
+ first := declaration.tag("A")
27
+ second := declaration.tag("B")
28
+ success, messages := metadataTypeTagFactoryTestValidate(
29
+ declaration.target,
30
+ []schemametadata.IMetadataTypeTag{first, second},
31
+ )
32
+ if success {
33
+ t.Fatalf("kind %s must not be duplicated on one property", declaration.kind)
34
+ }
35
+ if len(messages) != 1 ||
36
+ strings.Contains(messages[0], declaration.kind) == false ||
37
+ strings.Contains(messages[0], second.Name) == false {
38
+ t.Fatalf("the %s duplication report must name the conflict, reported %#v", declaration.kind, messages)
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,69 @@
1
+ package factories
2
+
3
+ import (
4
+ "testing"
5
+
6
+ shimast "github.com/microsoft/typescript-go/shim/ast"
7
+ )
8
+
9
+ // TestNumericRangeFactoryEnforces64BitBounds verifies 64-bit range predicates check something.
10
+ //
11
+ // ProtobufFactory routes only "int64" and "uint64" into the bigint path, so its
12
+ // fall-through was the int64 case and returned a bare `true` keyword: a union
13
+ // candidate typed `bigint & Type<"int64">` matched every magnitude. The bigint
14
+ // path must therefore emit a real comparison, while every number predicate
15
+ // bounds inclusively at its maximum (`2 ** 63 - 1`, `2 ** 64 - 1`, and the
16
+ // exactly-representable 32-bit bounds).
17
+ //
18
+ // 1. Require neither bigint type to emit a bare `true` keyword.
19
+ // 2. Require every number predicate to use an inclusive upper bound.
20
+ func TestNumericRangeFactoryEnforces64BitBounds(t *testing.T) {
21
+ input := numericRangeFactory_factory.NewIdentifier("input")
22
+
23
+ for _, name := range []string{"int64", "uint64"} {
24
+ node := NumericRangeFactory.Bigint(name, input)
25
+ if node == nil {
26
+ t.Fatalf("bigint range %s returned nil", name)
27
+ }
28
+ if node.Kind == shimast.KindTrueKeyword {
29
+ t.Fatalf("bigint range %s emits a bare true keyword, so it checks nothing", name)
30
+ }
31
+ }
32
+
33
+ for _, name := range []string{"int32", "uint32", "int64", "uint64"} {
34
+ if numericRangeFactoryCountTokens(NumericRangeFactory.Number(name, input), shimast.KindLessThanToken) != 0 {
35
+ t.Fatalf("number range %s must bound its maximum inclusively", name)
36
+ }
37
+ if numericRangeFactoryCountTokens(NumericRangeFactory.Number(name, input), shimast.KindLessThanEqualsToken) != 2 {
38
+ t.Fatalf("number range %s must compare both bounds inclusively", name)
39
+ }
40
+ }
41
+ }
42
+
43
+ // numericRangeFactoryCountTokens counts binary operators of one kind in a predicate tree.
44
+ func numericRangeFactoryCountTokens(node *shimast.Node, kind shimast.Kind) int {
45
+ if node == nil {
46
+ return 0
47
+ }
48
+ count := 0
49
+ var walk func(*shimast.Node)
50
+ walk = func(current *shimast.Node) {
51
+ if current == nil {
52
+ return
53
+ }
54
+ if current.Kind != shimast.KindBinaryExpression {
55
+ return
56
+ }
57
+ binary := current.AsBinaryExpression()
58
+ if binary == nil {
59
+ return
60
+ }
61
+ if binary.OperatorToken != nil && binary.OperatorToken.Kind == kind {
62
+ count++
63
+ }
64
+ walk(binary.Left)
65
+ walk(binary.Right)
66
+ }
67
+ walk(node)
68
+ return count
69
+ }
@@ -0,0 +1,64 @@
1
+ package factories
2
+
3
+ import (
4
+ "slices"
5
+ "testing"
6
+
7
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
8
+ )
9
+
10
+ // TestProtobufEmplacerRecoveryOwnership verifies unexpected panics stay visible.
11
+ //
12
+ // Unsupported metadata is diagnosed before emission, but an invariant failure
13
+ // inside the Protobuf emplacer must not be converted into a successful semantic
14
+ // result by a blanket recover.
15
+ //
16
+ // 1. Verify unsupported metadata remains an ordinary diagnostic.
17
+ // 2. Build a static object with an impossible empty semantic schema.
18
+ // 3. Require the panic to escape the post-validation emplacement pass.
19
+ func TestProtobufEmplacerRecoveryOwnership(t *testing.T) {
20
+ unsupported := schemametadata.MetadataSchema_initialize()
21
+ unsupported.Any = true
22
+ errors := protobufFactory_validate()(struct {
23
+ Metadata *schemametadata.MetadataSchema
24
+ Explore MetadataFactory_IExplore
25
+ Top *schemametadata.MetadataSchema
26
+ }{
27
+ Metadata: unsupported,
28
+ Explore: MetadataFactory_IExplore{Top: true},
29
+ Top: unsupported,
30
+ })
31
+ if !slices.Contains(errors, "does not support any type") {
32
+ t.Fatalf("unsupported any fallback mismatch: %v", errors)
33
+ }
34
+
35
+ key := MetadataFactory.SoleLiteral("value")
36
+ dynamicKey := schemametadata.MetadataSchema_initialize()
37
+ dynamicKey.Atomics = append(dynamicKey.Atomics, schemametadata.MetadataAtomic_create(schemametadata.MetadataAtomic{Type: "string"}))
38
+ dynamic := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
39
+ Name: "BrokenMap",
40
+ Properties: []*schemametadata.MetadataProperty{
41
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
42
+ Key: dynamicKey,
43
+ Value: schemametadata.MetadataSchema_initialize(),
44
+ }),
45
+ },
46
+ })
47
+ value := schemametadata.MetadataSchema_initialize()
48
+ value.Objects = append(value.Objects, schemametadata.MetadataObject_create(schemametadata.MetadataObject{Type: dynamic}))
49
+ object := schemametadata.MetadataObjectType_create(schemametadata.MetadataObjectType{
50
+ Name: "Broken",
51
+ Properties: []*schemametadata.MetadataProperty{
52
+ schemametadata.MetadataProperty_create(schemametadata.MetadataProperty{
53
+ Key: key,
54
+ Value: value,
55
+ }),
56
+ },
57
+ })
58
+ defer func() {
59
+ if recover() == nil {
60
+ t.Fatal("unexpected Protobuf emplacer panic was swallowed")
61
+ }
62
+ }()
63
+ protobufFactory_emplaceObjects([]*schemametadata.MetadataObjectType{object})
64
+ }
@@ -18,6 +18,7 @@ var IsProgrammer = isProgrammerNamespace{}
18
18
 
19
19
  type IsProgrammer_CONFIG_IOptions struct {
20
20
  Numeric *bool
21
+ Finite *bool
21
22
  Undefined *bool
22
23
  Object func(props IsProgrammer_CONFIG_IOptions_ObjectProps) *shimast.Node
23
24
  }
@@ -182,6 +183,7 @@ func (isProgrammerNamespace) Decompose(props IsProgrammer_DecomposeProps) native
182
183
  f := nativecontext.EmitFactoryOf(isProgrammer_factory, props.Context.Emit)
183
184
  options := &IsProgrammer_CONFIG_IOptions{
184
185
  Numeric: props.Context.Options.Numeric,
186
+ Finite: props.Context.Options.Finite,
185
187
  Object: func(v IsProgrammer_CONFIG_IOptions_ObjectProps) *shimast.Node {
186
188
  return nativeiterate.Check_object(nativeiterate.Check_objectProps{
187
189
  Config: nativeiterate.Check_object_IConfig{
@@ -397,8 +399,20 @@ func isProgrammer_binary(left *shimast.Expression, operator shimast.Kind, right
397
399
  )
398
400
  }
399
401
 
402
+ // isProgrammer_option_numeric reports whether the number leaf gate must be
403
+ // emitted at all. It opens on `finite` as well as `numeric` so that `finite:true`
404
+ // alone rejects NaN and Infinity, matching how assert/validate open the same gate
405
+ // via OptionPredicator.Numeric (which is likewise finite || numeric) and the
406
+ // documented independence of the two flags (samchon/typia#2196). The gate only
407
+ // decides whether check_number emits a guard; check_number's own inner selection
408
+ // then picks Number.isFinite for `finite` or !Number.isNaN for `numeric`.
400
409
  func isProgrammer_option_numeric(options *IsProgrammer_CONFIG_IOptions) bool {
401
- return options != nil && options.Numeric != nil && *options.Numeric
410
+ if options == nil {
411
+ return false
412
+ }
413
+ finite := options.Finite != nil && *options.Finite
414
+ numeric := options.Numeric != nil && *options.Numeric
415
+ return finite || numeric
402
416
  }
403
417
 
404
418
  func isProgrammer_option_undefined(options *IsProgrammer_CONFIG_IOptions) bool {