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
@@ -1,8 +1,9 @@
1
1
  package factories
2
2
 
3
3
  import (
4
- "strconv"
4
+ "fmt"
5
5
  "strings"
6
+ "unicode/utf8"
6
7
 
7
8
  shimast "github.com/microsoft/typescript-go/shim/ast"
8
9
  shimprinter "github.com/microsoft/typescript-go/shim/printer"
@@ -71,12 +72,138 @@ func (identifierFactoryNamespace) GetName(input *shimast.Expression) string {
71
72
  return "unknown"
72
73
  }
73
74
 
75
+ // Postfix renders the accessor for `str` as JavaScript source for a string
76
+ // literal, because callers splice the result straight into emitted text (see
77
+ // AssertProgrammer and ValidateProgrammer building `_path + <postfix>`).
78
+ //
79
+ // The value of that literal must equal what the runtime helper
80
+ // `typia/lib/internal/_accessExpressionAsString` computes for the same key,
81
+ // since dynamic keys take that runtime path while sole-literal keys are folded
82
+ // here at compile time. Both must produce one path grammar, which
83
+ // `typia/lib/internal/_createStandardSchema` parses back with JSON.parse.
84
+ //
85
+ // So there are two nested levels, and they escape for different readers. The
86
+ // key becomes JSON text, which is part of the path a user sees and JSON.parse
87
+ // reads. That text is then embedded in JavaScript source. Escaping only one
88
+ // level emits a file that does not parse; escaping both for the same reader
89
+ // makes the reported path disagree with the runtime helper.
74
90
  func (identifierFactoryNamespace) Postfix(str string) string {
75
91
  if identifierFactory_variable(str) {
76
- return "\"." + str + "\""
92
+ return identifierFactory_source("." + str)
77
93
  }
78
- quoted := strings.ReplaceAll(strconv.Quote(str), "\"", "\\\"")
79
- return "\"[" + quoted + "]\""
94
+ return identifierFactory_source("[" + identifierFactory_json(str) + "]")
95
+ }
96
+
97
+ // identifierFactory_json renders `str` as JSON text, matching JSON.stringify so
98
+ // that the path this lands in is the one _accessExpressionAsString builds for
99
+ // the same key at runtime, and so JSON.parse in _createStandardSchema reads the
100
+ // key back out.
101
+ func identifierFactory_json(str string) string {
102
+ return identifierFactory_quote(str, false)
103
+ }
104
+
105
+ // identifierFactory_source renders `str` as JavaScript source for a string
106
+ // literal whose value is exactly `str`.
107
+ //
108
+ // This is JSON's escape set plus the line separators. JSON string syntax is
109
+ // otherwise a subset of JavaScript's: both forbid a raw `"` and `\`, and JSON
110
+ // already escapes every character below U+0020, which covers the CR and LF that
111
+ // JavaScript also forbids raw. U+2028 and U+2029 are the whole difference, being
112
+ // line terminators to JavaScript but ordinary characters to JSON.
113
+ func identifierFactory_source(str string) string {
114
+ return identifierFactory_quote(str, true)
115
+ }
116
+
117
+ // identifierFactory_quote writes a quoted literal, escaping the line separators
118
+ // only when the reader is a JavaScript parser.
119
+ //
120
+ // strconv.Quote cannot serve either role: it escapes for Go, and Go and
121
+ // JavaScript disagree. Quote renders U+0007 as `\a` and a non-printable astral
122
+ // rune as `\U0001d173`; JavaScript has neither escape and decodes them as the
123
+ // identity escapes `a` and `U`, silently corrupting the key, while JSON.parse
124
+ // rejects both outright.
125
+ func identifierFactory_quote(str string, source bool) string {
126
+ var builder strings.Builder
127
+ builder.Grow(len(str) + 2)
128
+ builder.WriteByte('"')
129
+ for i := 0; i < len(str); {
130
+ if char := str[i]; char < utf8.RuneSelf {
131
+ i++
132
+ switch char {
133
+ case '"':
134
+ builder.WriteString("\\\"")
135
+ case '\\':
136
+ builder.WriteString("\\\\")
137
+ case '\b':
138
+ builder.WriteString("\\b")
139
+ case '\f':
140
+ builder.WriteString("\\f")
141
+ case '\n':
142
+ builder.WriteString("\\n")
143
+ case '\r':
144
+ builder.WriteString("\\r")
145
+ case '\t':
146
+ builder.WriteString("\\t")
147
+ default:
148
+ // JSON forbids a raw control character in a string, and JSON.parse
149
+ // throws on one rather than reporting the validation issue that the
150
+ // path belongs to. Every other ASCII byte is safe verbatim.
151
+ if char < 0x20 {
152
+ builder.WriteString(identifierFactory_unicode_escape(rune(char)))
153
+ } else {
154
+ builder.WriteByte(char)
155
+ }
156
+ }
157
+ continue
158
+ }
159
+ if unit, size := identifierFactory_surrogate(str[i:]); size != 0 {
160
+ // A lone surrogate reaches here WTF-8 encoded and has no valid UTF-8
161
+ // form, so it survives only as an escape. JSON.stringify does the same.
162
+ builder.WriteString(identifierFactory_unicode_escape(unit))
163
+ i += size
164
+ continue
165
+ }
166
+ rune_, size := utf8.DecodeRuneInString(str[i:])
167
+ if rune_ == utf8.RuneError && size == 1 {
168
+ // Not UTF-8 at all. No escape can denote the byte, so spend the
169
+ // replacement character and keep the literal well-formed; the
170
+ // alternative is emitting a file that does not parse.
171
+ builder.WriteString(identifierFactory_unicode_escape(utf8.RuneError))
172
+ i++
173
+ continue
174
+ }
175
+ if source && (rune_ == '\u2028' || rune_ == '\u2029') {
176
+ // A line terminator to JavaScript, so a raw one would end the literal on
177
+ // a target below ES2019. Escaping it in the source is invisible to the
178
+ // reader of the path, because JavaScript decodes it straight back.
179
+ builder.WriteString(identifierFactory_unicode_escape(rune_))
180
+ i += size
181
+ continue
182
+ }
183
+ builder.WriteString(str[i : i+size])
184
+ i += size
185
+ }
186
+ builder.WriteByte('"')
187
+ return builder.String()
188
+ }
189
+
190
+ // identifierFactory_unicode_escape writes the `\uXXXX` form, which denotes one
191
+ // UTF-16 code unit and so only spans the Basic Multilingual Plane. Every caller
192
+ // passes a control character, a surrogate, or the replacement character; an
193
+ // astral rune needs no escape and must keep taking the verbatim path, because
194
+ // four hex digits cannot spell it.
195
+ func identifierFactory_unicode_escape(value rune) string {
196
+ return fmt.Sprintf("\\u%04x", value)
197
+ }
198
+
199
+ // identifierFactory_surrogate decodes a leading WTF-8 encoded surrogate code
200
+ // unit, which utf8.DecodeRuneInString reports as an error because no valid
201
+ // UTF-8 sequence denotes one.
202
+ func identifierFactory_surrogate(str string) (rune, int) {
203
+ if len(str) < 3 || str[0] != 0xed || str[1] < 0xa0 || str[1] > 0xbf || str[2] < 0x80 || str[2] > 0xbf {
204
+ return 0, 0
205
+ }
206
+ return rune(str[0]&0x0f)<<12 | rune(str[1]&0x3f)<<6 | rune(str[2]&0x3f), 3
80
207
  }
81
208
 
82
209
  func (identifierFactoryNamespace) Parameter(name any, typeNode *shimast.TypeNode, init *shimast.Node, emit ...*shimprinter.EmitContext) *shimast.Node {
@@ -207,8 +207,8 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
207
207
  Value string
208
208
  }{Report: props.Report, Value: props.Value, Unsigned: true})
209
209
  return metadataCommentTagFactory_TagRecord{"array": {
210
- {Name: "MinItems<" + props.Value + ">", Target: "array", Kind: "minItems", Value: value, Validate: props.Value + " <= $input.length", Exclusive: true, Schema: map[string]any{"minItems": value}},
211
- {Name: "MaxItems<" + props.Value + ">", Target: "array", Kind: "maxItems", Value: value, Validate: "$input.length <= " + props.Value, Exclusive: true, Schema: map[string]any{"maxItems": value}},
210
+ {Name: "MinItems<" + props.Value + ">", Target: "array", Kind: "minItems", Value: value, Validate: props.Value + " <= $input.length", Exclusive: metadataCommentTagFactory_exclusive("minItems"), Schema: map[string]any{"minItems": value}},
211
+ {Name: "MaxItems<" + props.Value + ">", Target: "array", Kind: "maxItems", Value: value, Validate: "$input.length <= " + props.Value, Exclusive: metadataCommentTagFactory_exclusive("maxItems"), Schema: map[string]any{"maxItems": value}},
212
212
  }}
213
213
  },
214
214
  "minItems": func(props struct {
@@ -220,7 +220,7 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
220
220
  Unsigned bool
221
221
  Value string
222
222
  }{Report: props.Report, Value: props.Value, Unsigned: true})
223
- return metadataCommentTagFactory_TagRecord{"array": {{Name: "MinItems<" + props.Value + ">", Target: "array", Kind: "minItems", Value: value, Validate: props.Value + " <= $input.length", Exclusive: true, Schema: map[string]any{"minItems": value}}}}
223
+ return metadataCommentTagFactory_TagRecord{"array": {{Name: "MinItems<" + props.Value + ">", Target: "array", Kind: "minItems", Value: value, Validate: props.Value + " <= $input.length", Exclusive: metadataCommentTagFactory_exclusive("minItems"), Schema: map[string]any{"minItems": value}}}}
224
224
  },
225
225
  "maxItems": func(props struct {
226
226
  Report func(msg string) any
@@ -231,60 +231,60 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
231
231
  Unsigned bool
232
232
  Value string
233
233
  }{Report: props.Report, Value: props.Value, Unsigned: true})
234
- return metadataCommentTagFactory_TagRecord{"array": {{Name: "MaxItems<" + props.Value + ">", Target: "array", Kind: "maxItems", Value: value, Validate: "$input.length <= " + props.Value, Exclusive: true, Schema: map[string]any{"maxItems": value}}}}
234
+ return metadataCommentTagFactory_TagRecord{"array": {{Name: "MaxItems<" + props.Value + ">", Target: "array", Kind: "maxItems", Value: value, Validate: "$input.length <= " + props.Value, Exclusive: metadataCommentTagFactory_exclusive("maxItems"), Schema: map[string]any{"maxItems": value}}}}
235
235
  },
236
236
  "uniqueItems": func(props struct {
237
237
  Report func(msg string) any
238
238
  Value string
239
239
  }) metadataCommentTagFactory_TagRecord {
240
- return metadataCommentTagFactory_TagRecord{"array": {{Name: "UniqueItems", Target: "array", Kind: "uniqueItems", Value: true, Validate: "$input.length <= 1 || (new Set($input).size === $input.length)", Exclusive: true, Schema: map[string]any{"uniqueItems": true}}}}
240
+ return metadataCommentTagFactory_TagRecord{"array": {{Name: "UniqueItems", Target: "array", Kind: "uniqueItems", Value: true, Validate: "$importInternal(\"isUniqueItems\")($input)", Exclusive: metadataCommentTagFactory_exclusive("uniqueItems"), Schema: map[string]any{"uniqueItems": true}}}}
241
241
  },
242
242
  "type": metadataCommentTagFactory_parse_type,
243
243
  "minimum": func(props struct {
244
244
  Report func(msg string) any
245
245
  Value string
246
246
  }) metadataCommentTagFactory_TagRecord {
247
- return metadataCommentTagFactory_numeric(props, "Minimum", "minimum", props.Value+" <= $input", props.Value+" <= $input", []string{"minimum", "exclusiveMinimum"})
247
+ return metadataCommentTagFactory_numeric(props, "Minimum", "minimum", props.Value+" <= $input", props.Value+" <= $input")
248
248
  },
249
249
  "maximum": func(props struct {
250
250
  Report func(msg string) any
251
251
  Value string
252
252
  }) metadataCommentTagFactory_TagRecord {
253
- return metadataCommentTagFactory_numeric(props, "Maximum", "maximum", "$input <= "+props.Value, "$input <= "+props.Value, []string{"maximum", "exclusiveMaximum"})
253
+ return metadataCommentTagFactory_numeric(props, "Maximum", "maximum", "$input <= "+props.Value, "$input <= "+props.Value)
254
254
  },
255
255
  "exclusiveMinimum": func(props struct {
256
256
  Report func(msg string) any
257
257
  Value string
258
258
  }) metadataCommentTagFactory_TagRecord {
259
- return metadataCommentTagFactory_numeric(props, "ExclusiveMinimum", "exclusiveMinimum", props.Value+" < $input", props.Value+" < $input", []string{"minimum", "exclusiveMinimum"})
259
+ return metadataCommentTagFactory_numeric(props, "ExclusiveMinimum", "exclusiveMinimum", props.Value+" < $input", props.Value+" < $input")
260
260
  },
261
261
  "exclusiveMaximum": func(props struct {
262
262
  Report func(msg string) any
263
263
  Value string
264
264
  }) metadataCommentTagFactory_TagRecord {
265
- return metadataCommentTagFactory_numeric(props, "ExclusiveMaximum", "exclusiveMaximum", "$input < "+props.Value, "$input < "+props.Value, []string{"maximum", "exclusiveMaximum"})
265
+ return metadataCommentTagFactory_numeric(props, "ExclusiveMaximum", "exclusiveMaximum", "$input < "+props.Value, "$input < "+props.Value)
266
266
  },
267
267
  "multipleOf": func(props struct {
268
268
  Report func(msg string) any
269
269
  Value string
270
270
  }) metadataCommentTagFactory_TagRecord {
271
- return metadataCommentTagFactory_numeric(props, "MultipleOf", "multipleOf", "$input % "+props.Value+" === 0", "$input % "+props.Value+"n === 0n", true)
271
+ return metadataCommentTagFactory_numeric(props, "MultipleOf", "multipleOf", "$importInternal(\"_isMultipleOf\")($input, "+props.Value+")", "$input % "+props.Value+"n === 0n")
272
272
  },
273
273
  "format": func(props struct {
274
274
  Report func(msg string) any
275
275
  Value string
276
276
  }) metadataCommentTagFactory_TagRecord {
277
- matched, ok := metadataCommentTagFactory_FORMATS[props.Value]
277
+ name, validate, ok := formatCheatSheet_resolve(props.Value)
278
278
  if ok == false {
279
279
  return metadataCommentTagFactory_TagRecord{}
280
280
  }
281
- return metadataCommentTagFactory_TagRecord{"string": {{Name: "Format<" + strconv.Quote(matched[0]) + ">", Target: "string", Kind: "format", Value: matched[0], Validate: matched[1], Exclusive: true, Schema: map[string]any{"format": matched[0]}}}}
281
+ return metadataCommentTagFactory_TagRecord{"string": {{Name: "Format<" + strconv.Quote(name) + ">", Target: "string", Kind: "format", Value: name, Validate: validate, Exclusive: metadataCommentTagFactory_exclusive("format"), Schema: map[string]any{"format": name}}}}
282
282
  },
283
283
  "pattern": func(props struct {
284
284
  Report func(msg string) any
285
285
  Value string
286
286
  }) metadataCommentTagFactory_TagRecord {
287
- return metadataCommentTagFactory_TagRecord{"string": {{Name: "Pattern<" + strconv.Quote(props.Value) + ">", Target: "string", Kind: "pattern", Value: props.Value, Validate: "RegExp(" + strconv.Quote(props.Value) + ").test($input)", Exclusive: []string{"format"}, Schema: map[string]any{"pattern": props.Value}}}}
287
+ return metadataCommentTagFactory_TagRecord{"string": {{Name: "Pattern<" + strconv.Quote(props.Value) + ">", Target: "string", Kind: "pattern", Value: props.Value, Validate: "RegExp(" + strconv.Quote(props.Value) + ").test($input)", Exclusive: metadataCommentTagFactory_exclusive("pattern"), Schema: map[string]any{"pattern": props.Value}}}}
288
288
  },
289
289
  "length": func(props struct {
290
290
  Report func(msg string) any
@@ -292,8 +292,8 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
292
292
  }) metadataCommentTagFactory_TagRecord {
293
293
  value := metadataCommentTagFactory_parse_number(props)
294
294
  return metadataCommentTagFactory_TagRecord{"string": {
295
- {Name: "MinLength<" + props.Value + ">", Target: "string", Kind: "minLength", Value: value, Validate: props.Value + " <= $input.length", Exclusive: true, Schema: map[string]any{"minLength": value}},
296
- {Name: "MaxLength<" + props.Value + ">", Target: "string", Kind: "maxLength", Value: value, Validate: "$input.length <= " + props.Value, Exclusive: true, Schema: map[string]any{"maxLength": value}},
295
+ {Name: "MinLength<" + props.Value + ">", Target: "string", Kind: "minLength", Value: value, Validate: props.Value + " <= $importInternal(\"_stringLength\")($input)", Exclusive: metadataCommentTagFactory_exclusive("minLength"), Schema: map[string]any{"minLength": value}},
296
+ {Name: "MaxLength<" + props.Value + ">", Target: "string", Kind: "maxLength", Value: value, Validate: "$importInternal(\"_stringLength\")($input) <= " + props.Value, Exclusive: metadataCommentTagFactory_exclusive("maxLength"), Schema: map[string]any{"maxLength": value}},
297
297
  }}
298
298
  },
299
299
  "minLength": func(props struct {
@@ -301,17 +301,58 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
301
301
  Value string
302
302
  }) metadataCommentTagFactory_TagRecord {
303
303
  value := metadataCommentTagFactory_parse_number(props)
304
- return metadataCommentTagFactory_TagRecord{"string": {{Name: "MinLength<" + props.Value + ">", Target: "string", Kind: "minLength", Value: value, Validate: props.Value + " <= $input.length", Exclusive: true, Schema: map[string]any{"minLength": value}}}}
304
+ return metadataCommentTagFactory_TagRecord{"string": {{Name: "MinLength<" + props.Value + ">", Target: "string", Kind: "minLength", Value: value, Validate: props.Value + " <= $importInternal(\"_stringLength\")($input)", Exclusive: metadataCommentTagFactory_exclusive("minLength"), Schema: map[string]any{"minLength": value}}}}
305
305
  },
306
306
  "maxLength": func(props struct {
307
307
  Report func(msg string) any
308
308
  Value string
309
309
  }) metadataCommentTagFactory_TagRecord {
310
310
  value := metadataCommentTagFactory_parse_number(props)
311
- return metadataCommentTagFactory_TagRecord{"string": {{Name: "MaxLength<" + props.Value + ">", Target: "string", Kind: "maxLength", Value: value, Validate: "$input.length <= " + props.Value, Exclusive: true, Schema: map[string]any{"maxLength": value}}}}
311
+ return metadataCommentTagFactory_TagRecord{"string": {{Name: "MaxLength<" + props.Value + ">", Target: "string", Kind: "maxLength", Value: value, Validate: "$importInternal(\"_stringLength\")($input) <= " + props.Value, Exclusive: metadataCommentTagFactory_exclusive("maxLength"), Schema: map[string]any{"maxLength": value}}}}
312
312
  },
313
313
  }
314
314
 
315
+ // metadataCommentTagFactory_EXCLUSIVE is the single authority for every JSDoc
316
+ // comment tag's mutual-exclusivity rule, keyed by tag kind and transcribing the
317
+ // `exclusive` field the matching @typia/interface tag declares
318
+ // (packages/interface/src/tags/*.ts). The JSDoc path and the type-tag path must
319
+ // enforce the same exclusivity, because MetadataTypeTagFactory.Validate reads
320
+ // this list for both; the type-tag path takes it straight from the declaration,
321
+ // so the comment path must publish the identical value. Hand-copying a separate
322
+ // list per parser is exactly what let `@format` (a bare `true`) and `@pattern`
323
+ // (`["format"]`, missing its own kind) drift from the declared
324
+ // `["format", "pattern"]`. Every parser now reads its list from here, so no one
325
+ // list can diverge on its own again. Each `[]string` names its own kind plus
326
+ // every cross-kind partner it may not share a property with, in the declaration
327
+ // order; `true` forbids only same-kind duplication.
328
+ var metadataCommentTagFactory_EXCLUSIVE = map[string]any{
329
+ "minItems": true,
330
+ "maxItems": true,
331
+ "uniqueItems": true,
332
+ "type": true,
333
+ "minimum": []string{"minimum", "exclusiveMinimum"},
334
+ "maximum": []string{"maximum", "exclusiveMaximum"},
335
+ "exclusiveMinimum": []string{"exclusiveMinimum", "minimum"},
336
+ "exclusiveMaximum": []string{"exclusiveMaximum", "maximum"},
337
+ "multipleOf": true,
338
+ "format": []string{"format", "pattern"},
339
+ "pattern": []string{"format", "pattern"},
340
+ "minLength": true,
341
+ "maxLength": true,
342
+ }
343
+
344
+ // metadataCommentTagFactory_exclusive returns the declared exclusivity rule for
345
+ // a tag kind. It panics on an unknown kind so a newly added comment tag that
346
+ // forgets its rule fails loudly here rather than silently emitting a tag with a
347
+ // nil `Exclusive` that the validator would never check.
348
+ func metadataCommentTagFactory_exclusive(kind string) any {
349
+ value, ok := metadataCommentTagFactory_EXCLUSIVE[kind]
350
+ if ok == false {
351
+ panic("no exclusive rule for comment tag kind: " + kind)
352
+ }
353
+ return value
354
+ }
355
+
315
356
  func metadataCommentTagFactory_parse_type(props struct {
316
357
  Report func(msg string) any
317
358
  Value string
@@ -342,11 +383,15 @@ func metadataCommentTagFactory_parse_type(props struct {
342
383
  } else if value == "uint32" {
343
384
  validate = "Math.floor($input) === $input && 0 <= $input && $input <= 4294967295"
344
385
  } else if value == "int64" {
345
- validate = "Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807"
386
+ // Delegate to the runtime helper instead of restating the bound. The 64-bit
387
+ // maxima are not representable as JavaScript numbers, so an inline literal
388
+ // here silently rounds up and admits an out-of-range value; the helper owns
389
+ // the one correct spelling and documents why it is exclusive.
390
+ validate = "$importInternal(\"isTypeInt64\")($input)"
346
391
  } else if value == "uint64" {
347
- validate = "Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615"
392
+ validate = "$importInternal(\"isTypeUint64\")($input)"
348
393
  } else if value == "float" {
349
- validate = "-1.175494351e38 <= $input && $input <= 3.4028235e38"
394
+ validate = "-3.4028235e38 <= $input && $input <= 3.4028235e38"
350
395
  }
351
396
  var numberSchema any
352
397
  if value == "int8" || value == "int16" || value == "int32" || value == "int64" {
@@ -359,11 +404,19 @@ func metadataCommentTagFactory_parse_type(props struct {
359
404
  bigintSchema = map[string]any{"minimum": 0}
360
405
  }
361
406
  record := metadataCommentTagFactory_TagRecord{
362
- "number": {{Name: "Type<" + strconv.Quote(value) + ">", Target: "number", Kind: "type", Value: value, Validate: validate, Exclusive: true, Schema: numberSchema}},
407
+ "number": {{Name: "Type<" + strconv.Quote(value) + ">", Target: "number", Kind: "type", Value: value, Validate: validate, Exclusive: metadataCommentTagFactory_exclusive("type"), Schema: numberSchema}},
363
408
  }
364
409
  if value == "int64" || value == "uint64" {
410
+ // The bigint form used to emit `true` for int64 and a lower bound only for
411
+ // uint64, so `bigint & Type<"int64">` -- the spelling the documentation
412
+ // recommends -- certified any magnitude at all. Both now delegate to the
413
+ // helper that holds the exact inclusive bound a bigint can represent.
414
+ bigintValidate := "$importInternal(\"isTypeUint64Bigint\")($input)"
415
+ if value == "int64" {
416
+ bigintValidate = "$importInternal(\"isTypeInt64Bigint\")($input)"
417
+ }
365
418
  record["bigint"] = []schemametadata.IMetadataTypeTag{
366
- {Name: "Type<" + strconv.Quote(value) + ">", Target: "bigint", Kind: "type", Value: value, Validate: map[bool]string{true: "true", false: "BigInt(0) <= $input"}[value == "int64"], Exclusive: true, Schema: bigintSchema},
419
+ {Name: "Type<" + strconv.Quote(value) + ">", Target: "bigint", Kind: "type", Value: value, Validate: bigintValidate, Exclusive: metadataCommentTagFactory_exclusive("type"), Schema: bigintSchema},
367
420
  }
368
421
  }
369
422
  return record
@@ -372,21 +425,21 @@ func metadataCommentTagFactory_parse_type(props struct {
372
425
  func metadataCommentTagFactory_numeric(props struct {
373
426
  Report func(msg string) any
374
427
  Value string
375
- }, name string, kind string, numberValidate string, bigintValidate string, exclusive any) metadataCommentTagFactory_TagRecord {
428
+ }, name string, kind string, numberValidate string, bigintValidate string) metadataCommentTagFactory_TagRecord {
376
429
  number := metadataCommentTagFactory_parse_number(props)
377
430
  integer := metadataCommentTagFactory_parse_integer(struct {
378
431
  Report func(msg string) any
379
432
  Unsigned bool
380
433
  Value string
381
- }{Report: props.Report, Value: props.Value, Unsigned: false})
382
- var bigint any
383
- if integer != nil {
384
- bigint = int64(*integer)
385
- }
386
- return metadataCommentTagFactory_TagRecord{
434
+ }{Report: func(string) any { return nil }, Value: props.Value, Unsigned: false})
435
+ exclusive := metadataCommentTagFactory_exclusive(kind)
436
+ record := metadataCommentTagFactory_TagRecord{
387
437
  "number": {{Name: name + "<" + props.Value + ">", Target: "number", Kind: kind, Value: number, Validate: numberValidate, Exclusive: exclusive, Schema: map[string]any{kind: number}}},
388
- "bigint": {{Name: name + "<" + props.Value + "n>", Target: "bigint", Kind: kind, Value: bigint, Validate: bigintValidate, Exclusive: exclusive, Schema: map[string]any{kind: number}}},
389
438
  }
439
+ if integer != nil {
440
+ record["bigint"] = []schemametadata.IMetadataTypeTag{{Name: name + "<" + props.Value + "n>", Target: "bigint", Kind: kind, Value: int64(*integer), Validate: bigintValidate, Exclusive: exclusive, Schema: map[string]any{kind: number}}}
441
+ }
442
+ return record
390
443
  }
391
444
 
392
445
  func metadataCommentTagFactory_parse_number(props struct {
@@ -426,16 +479,6 @@ func metadataCommentTagFactory_parse_integer(props struct {
426
479
  return &value
427
480
  }
428
481
 
429
- var metadataCommentTagFactory_FORMATS = func() map[string][2]string {
430
- output := map[string][2]string{}
431
- for key, value := range FormatCheatSheet {
432
- output[key] = [2]string{key, value}
433
- }
434
- output["datetime"] = [2]string{"date-time", "!isNaN(new Date($input).getTime())"}
435
- output["dateTime"] = [2]string{"date-time", "!isNaN(new Date($input).getTime())"}
436
- return output
437
- }()
438
-
439
482
  func metadataCommentTagFactory_includes(values []string, target string) bool {
440
483
  for _, value := range values {
441
484
  if value == target {
@@ -246,9 +246,21 @@ func (metadataTypeTagFactoryNamespace) Validate(props struct {
246
246
  }{Property: nil, Message: "kind '" + tag.Kind + "' can't be duplicated"})
247
247
  }
248
248
  case []string:
249
+ // The `exclusive` list names every kind this tag may not share a property
250
+ // with, itself included, and it is the authoritative spec. Reject when any
251
+ // other tag's kind appears in the list, matching kinds against kinds.
252
+ //
253
+ // Two bugs made this inert: it compared the list of kinds against
254
+ // `opposite.Name` ("minimum" against "Minimum<0>"), which never matched,
255
+ // and it also required `opposite.Kind == tag.Kind`, which excluded the
256
+ // cross-kind partners the list exists to catch. Both must go, or a
257
+ // forbidden combination keeps compiling: `Minimum<5> & Minimum<0>` emits
258
+ // `{"minimum":0}` yet its validator requires 5, and `Minimum<0> &
259
+ // ExclusiveMinimum<5>` or `Format<"uuid"> & Pattern<...>` coexist though
260
+ // the declarations forbid it.
249
261
  var some *schemametadata.IMetadataTypeTag
250
262
  for j, opposite := range props.Tags {
251
- if i != j && opposite.Kind == tag.Kind && metadataTypeTagFactory_includes(exclusive, opposite.Name) {
263
+ if i != j && metadataTypeTagFactory_includes(exclusive, opposite.Kind) {
252
264
  copied := opposite
253
265
  some = &copied
254
266
  break
@@ -23,30 +23,27 @@ func (numericRangeFactoryNamespace) Number(t string, input *shimast.Expression,
23
23
  case "uint64":
24
24
  return numericRangeFactory_number_uint64(input, emit...)
25
25
  case "float":
26
- return numericRangeFactory_between("-1.175494351e38", "3.4028235e38", emit...)(input)
26
+ return numericRangeFactory_between("-3.4028235e38", "3.4028235e38", emit...)(input)
27
27
  default:
28
28
  return nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...).NewKeywordExpression(shimast.KindTrueKeyword)
29
29
  }
30
30
  }
31
31
 
32
+ // Bigint narrows a protobuf union candidate whose atomic type is `bigint`.
33
+ //
34
+ // ProtobufFactory only ever routes "int64" and "uint64" here, so the fall-through
35
+ // used to be the int64 case: it returned a bare `true`, and a `bigint &
36
+ // Type<"int64">` candidate matched any magnitude at all. Both types are now
37
+ // explicit, and the default is reached only by an unknown type.
32
38
  func (numericRangeFactoryNamespace) Bigint(t string, input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
33
- f := nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...)
34
- if t == "uint64" {
35
- return f.NewBinaryExpression(
36
- nil,
37
- f.NewCallExpression(
38
- f.NewIdentifier("BigInt"),
39
- nil,
40
- nil,
41
- f.NewNodeList([]*shimast.Node{ExpressionFactory.Number(0, emit...)}),
42
- shimast.NodeFlagsNone,
43
- ),
44
- nil,
45
- f.NewToken(shimast.KindLessThanEqualsToken),
46
- input,
47
- )
39
+ switch t {
40
+ case "int64":
41
+ return numericRangeFactory_bigint_between("-9223372036854775808", "9223372036854775807", input, emit...)
42
+ case "uint64":
43
+ return numericRangeFactory_bigint_between("0", "18446744073709551615", input, emit...)
44
+ default:
45
+ return nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...).NewKeywordExpression(shimast.KindTrueKeyword)
48
46
  }
49
- return f.NewKeywordExpression(shimast.KindTrueKeyword)
50
47
  }
51
48
 
52
49
  func numericRangeFactory_number_int32(input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
@@ -65,6 +62,8 @@ func numericRangeFactory_number_uint32(input *shimast.Expression, emit ...*shimp
65
62
  )
66
63
  }
67
64
 
65
+ // numericRangeFactory_number_int64 bounds a `number` candidate to the int64 range.
66
+ // The maximum is 2**63 - 1, the int64 upper bound.
68
67
  func numericRangeFactory_number_int64(input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
69
68
  return numericRangeFactory_logical_and(
70
69
  numericRangeFactory_integer(input, emit...),
@@ -73,6 +72,8 @@ func numericRangeFactory_number_int64(input *shimast.Expression, emit ...*shimpr
73
72
  )
74
73
  }
75
74
 
75
+ // numericRangeFactory_number_uint64 bounds a `number` candidate to the uint64 range.
76
+ // The maximum is 2**64 - 1, the uint64 upper bound.
76
77
  func numericRangeFactory_number_uint64(input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
77
78
  return numericRangeFactory_logical_and(
78
79
  numericRangeFactory_integer(input, emit...),
@@ -121,6 +122,48 @@ func numericRangeFactory_between(x string, y string, emit ...*shimprinter.EmitCo
121
122
  }
122
123
  }
123
124
 
125
+ // numericRangeFactory_bigint_literal emits `BigInt("<value>")`.
126
+ //
127
+ // The argument has to stay a string literal. `BigInt(9223372036854775807)` would
128
+ // round its number literal to 2**63 before BigInt ever parsed it -- the same
129
+ // rounding that broke the number path -- while the string form parses the digits
130
+ // exactly.
131
+ func numericRangeFactory_bigint_literal(value string, emit ...*shimprinter.EmitContext) *shimast.Node {
132
+ f := nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...)
133
+ return f.NewCallExpression(
134
+ f.NewIdentifier("BigInt"),
135
+ nil,
136
+ nil,
137
+ f.NewNodeList([]*shimast.Node{f.NewStringLiteral(value, shimast.TokenFlagsNone)}),
138
+ shimast.NodeFlagsNone,
139
+ )
140
+ }
141
+
142
+ // numericRangeFactory_bigint_between emits `BigInt(x) <= input && input <= BigInt(y)`.
143
+ //
144
+ // Both comparisons are inclusive because a bigint represents the true 64-bit
145
+ // bounds exactly, unlike the number path's exclusive approximation.
146
+ func numericRangeFactory_bigint_between(x string, y string, input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
147
+ f := nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...)
148
+ return numericRangeFactory_logical_and(
149
+ f.NewBinaryExpression(
150
+ nil,
151
+ numericRangeFactory_bigint_literal(x, emit...),
152
+ nil,
153
+ f.NewToken(shimast.KindLessThanEqualsToken),
154
+ input,
155
+ ),
156
+ f.NewBinaryExpression(
157
+ nil,
158
+ input,
159
+ nil,
160
+ f.NewToken(shimast.KindLessThanEqualsToken),
161
+ numericRangeFactory_bigint_literal(y, emit...),
162
+ ),
163
+ emit...,
164
+ )
165
+ }
166
+
124
167
  func numericRangeFactory_logical_and(x *shimast.Expression, y *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
125
168
  return nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...).NewBinaryExpression(
126
169
  nil,
@@ -17,6 +17,11 @@ type protobufFactoryNamespace struct{}
17
17
  var ProtobufFactory = protobufFactoryNamespace{}
18
18
 
19
19
  type ProtobufFactory_IProps struct {
20
+ // Method is the fully qualified typia API the call site invoked, exactly as
21
+ // it must appear in the diagnostic code (`typia.protobuf.encode`). It is the
22
+ // sole source of that code: composing the code here from a shorter spelling
23
+ // let the encode and decode programmers, which already pass the whole call
24
+ // accessor, report `typia.protobuf.typia.protobuf.encode`.
20
25
  Method string
21
26
  Checker *shimchecker.Checker
22
27
  Components *schemametadata.MetadataCollection
@@ -40,13 +45,20 @@ func (protobufFactoryNamespace) Metadata(props ProtobufFactory_IProps) *schemame
40
45
  Code string
41
46
  Errors []nativecontext.TransformerError_MetadataFactory_IError
42
47
  }{
43
- Code: "typia.protobuf." + props.Method,
48
+ Code: props.Method,
44
49
  Errors: protobufFactory_errors(result.Errors),
45
50
  }))
46
51
  }
52
+ protobufFactory_emplaceObjects(props.Components.Objects())
47
53
  return result.Data
48
54
  }
49
55
 
56
+ func protobufFactory_emplaceObjects(objects []*schemametadata.MetadataObjectType) {
57
+ for _, object := range objects {
58
+ ProtobufFactory.EmplaceObject(object)
59
+ }
60
+ }
61
+
50
62
  func (protobufFactoryNamespace) EmplaceObject(object *schemametadata.MetadataObjectType) {
51
63
  for _, property := range object.Properties {
52
64
  protobufFactory_emplaceProperty(property)
@@ -335,10 +347,6 @@ func protobufFactory_validate() MetadataFactory_Validator {
335
347
  }
336
348
  visited[obj.Type] = true
337
349
  protobufFactory_validateObject(obj.Type, &errors)
338
- func() {
339
- defer func() { _ = recover() }()
340
- ProtobufFactory.EmplaceObject(obj.Type)
341
- }()
342
350
  }
343
351
  noSupport := func(msg string) { insert("does not support " + msg) }
344
352
  if props.Metadata.Any {
@@ -499,8 +499,14 @@ export let inner!: Outer.Inner;
499
499
  Report: typeTagReport,
500
500
  Type: "string",
501
501
  Tags: []schemametadata.IMetadataTypeTag{
502
- {Target: "string", Kind: "range", Name: "minimum", Exclusive: []string{"maximum"}},
503
- {Target: "string", Kind: "range", Name: "maximum", Exclusive: []string{"minimum"}},
502
+ // Format and Pattern as they are actually declared: both list the
503
+ // kinds `["format", "pattern"]`, so intersecting them on one property
504
+ // is forbidden. The cross-kind conflict fires on the opposite's kind,
505
+ // not its name, and without a same-kind guard. The previous fixture
506
+ // named the opposite in `exclusive` by tag name, the only shape the
507
+ // doubly-broken check could fire on and no real declaration produces.
508
+ {Target: "string", Kind: "format", Name: "Format<\"uuid\">", Exclusive: []string{"format", "pattern"}},
509
+ {Target: "string", Kind: "pattern", Name: "Pattern<\"^x$\">", Exclusive: []string{"format", "pattern"}},
504
510
  },
505
511
  })
506
512
  invalidExclusiveReports := []string{}