typia 13.1.1 → 13.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. package/README.md +3 -0
  2. package/lib/_virtual/_rolldown/runtime.mjs +1 -5
  3. package/lib/executable/FileSystemIdentity.d.ts +21 -0
  4. package/lib/executable/FileSystemIdentity.js +183 -0
  5. package/lib/executable/FileSystemIdentity.js.map +1 -0
  6. package/lib/executable/FileSystemIdentity.mjs +129 -0
  7. package/lib/executable/FileSystemIdentity.mjs.map +1 -0
  8. package/lib/executable/TypiaGenerateWizard.js +264 -104
  9. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  10. package/lib/executable/TypiaGenerateWizard.mjs +233 -93
  11. package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
  12. package/lib/functional.d.ts +15 -12
  13. package/lib/functional.js.map +1 -1
  14. package/lib/functional.mjs.map +1 -1
  15. package/lib/internal/_ProtobufReader.d.ts +17 -0
  16. package/lib/internal/_ProtobufReader.js +117 -45
  17. package/lib/internal/_ProtobufReader.js.map +1 -1
  18. package/lib/internal/_ProtobufReader.mjs +108 -39
  19. package/lib/internal/_ProtobufReader.mjs.map +1 -1
  20. package/lib/internal/_createStandardSchema.js +18 -1
  21. package/lib/internal/_createStandardSchema.js.map +1 -1
  22. package/lib/internal/_createStandardSchema.mjs +12 -1
  23. package/lib/internal/_createStandardSchema.mjs.map +1 -1
  24. package/lib/internal/_decimal.d.ts +14 -0
  25. package/lib/internal/_decimal.js +61 -0
  26. package/lib/internal/_decimal.js.map +1 -0
  27. package/lib/internal/_decimal.mjs +49 -0
  28. package/lib/internal/_decimal.mjs.map +1 -0
  29. package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
  30. package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
  31. package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
  32. package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
  33. package/lib/internal/_isFormatByte.js +2 -5
  34. package/lib/internal/_isFormatByte.js.map +1 -1
  35. package/lib/internal/_isFormatByte.mjs +2 -5
  36. package/lib/internal/_isFormatByte.mjs.map +1 -1
  37. package/lib/internal/_isFormatDate.js +15 -2
  38. package/lib/internal/_isFormatDate.js.map +1 -1
  39. package/lib/internal/_isFormatDate.mjs +22 -2
  40. package/lib/internal/_isFormatDate.mjs.map +1 -1
  41. package/lib/internal/_isFormatDateTime.js +21 -2
  42. package/lib/internal/_isFormatDateTime.js.map +1 -1
  43. package/lib/internal/_isFormatDateTime.mjs +13 -2
  44. package/lib/internal/_isFormatDateTime.mjs.map +1 -1
  45. package/lib/internal/_isFormatIri.js +3 -2
  46. package/lib/internal/_isFormatIri.js.map +1 -1
  47. package/lib/internal/_isFormatIri.mjs +3 -2
  48. package/lib/internal/_isFormatIri.mjs.map +1 -1
  49. package/lib/internal/_isFormatIriReference.js +10 -2
  50. package/lib/internal/_isFormatIriReference.js.map +1 -1
  51. package/lib/internal/_isFormatIriReference.mjs +9 -2
  52. package/lib/internal/_isFormatIriReference.mjs.map +1 -1
  53. package/lib/internal/_isFormatUriReference.js +1 -1
  54. package/lib/internal/_isFormatUriReference.js.map +1 -1
  55. package/lib/internal/_isFormatUriReference.mjs +1 -1
  56. package/lib/internal/_isFormatUriReference.mjs.map +1 -1
  57. package/lib/internal/_isMultipleOf.d.ts +1 -0
  58. package/lib/internal/_isMultipleOf.js +13 -0
  59. package/lib/internal/_isMultipleOf.js.map +1 -0
  60. package/lib/internal/_isMultipleOf.mjs +12 -0
  61. package/lib/internal/_isMultipleOf.mjs.map +1 -0
  62. package/lib/internal/_isTypeFloat.js +1 -1
  63. package/lib/internal/_isTypeFloat.js.map +1 -1
  64. package/lib/internal/_isTypeFloat.mjs +1 -1
  65. package/lib/internal/_isTypeFloat.mjs.map +1 -1
  66. package/lib/internal/_isTypeInt64.js +1 -0
  67. package/lib/internal/_isTypeInt64.js.map +1 -1
  68. package/lib/internal/_isTypeInt64.mjs.map +1 -1
  69. package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
  70. package/lib/internal/_isTypeInt64Bigint.js +15 -0
  71. package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
  72. package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
  73. package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
  74. package/lib/internal/_isTypeUint64.js +1 -0
  75. package/lib/internal/_isTypeUint64.js.map +1 -1
  76. package/lib/internal/_isTypeUint64.mjs.map +1 -1
  77. package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
  78. package/lib/internal/_isTypeUint64Bigint.js +10 -0
  79. package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
  80. package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
  81. package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
  82. package/lib/internal/_isUniqueItems.js +96 -109
  83. package/lib/internal/_isUniqueItems.js.map +1 -1
  84. package/lib/internal/_isUniqueItems.mjs +62 -50
  85. package/lib/internal/_isUniqueItems.mjs.map +1 -1
  86. package/lib/internal/_notationAny.js +8 -1
  87. package/lib/internal/_notationAny.js.map +1 -1
  88. package/lib/internal/_notationAny.mjs +7 -1
  89. package/lib/internal/_notationAny.mjs.map +1 -1
  90. package/lib/internal/_notationAssign.d.ts +1 -0
  91. package/lib/internal/_notationAssign.js +18 -0
  92. package/lib/internal/_notationAssign.js.map +1 -0
  93. package/lib/internal/_notationAssign.mjs +17 -0
  94. package/lib/internal/_notationAssign.mjs.map +1 -0
  95. package/lib/internal/_notationCamel.js +30 -9
  96. package/lib/internal/_notationCamel.js.map +1 -1
  97. package/lib/internal/_notationCamel.mjs +13 -5
  98. package/lib/internal/_notationCamel.mjs.map +1 -1
  99. package/lib/internal/_notationKebab.d.ts +1 -0
  100. package/lib/internal/_notationKebab.js +15 -0
  101. package/lib/internal/_notationKebab.js.map +1 -0
  102. package/lib/internal/_notationKebab.mjs +15 -0
  103. package/lib/internal/_notationKebab.mjs.map +1 -0
  104. package/lib/internal/_notationKeyCollision.d.ts +1 -0
  105. package/lib/internal/_notationKeyCollision.js +8 -0
  106. package/lib/internal/_notationKeyCollision.js.map +1 -0
  107. package/lib/internal/_notationKeyCollision.mjs +8 -0
  108. package/lib/internal/_notationKeyCollision.mjs.map +1 -0
  109. package/lib/internal/_notationPascal.js +20 -5
  110. package/lib/internal/_notationPascal.js.map +1 -1
  111. package/lib/internal/_notationPascal.mjs +10 -5
  112. package/lib/internal/_notationPascal.mjs.map +1 -1
  113. package/lib/internal/_notationSnake.js +25 -22
  114. package/lib/internal/_notationSnake.js.map +1 -1
  115. package/lib/internal/_notationSnake.mjs +11 -11
  116. package/lib/internal/_notationSnake.mjs.map +1 -1
  117. package/lib/internal/_plainCloneAny.js +174 -38
  118. package/lib/internal/_plainCloneAny.js.map +1 -1
  119. package/lib/internal/_plainCloneAny.mjs +126 -22
  120. package/lib/internal/_plainCloneAny.mjs.map +1 -1
  121. package/lib/internal/_randomArray.d.ts +1 -1
  122. package/lib/internal/_randomArray.js +11 -4
  123. package/lib/internal/_randomArray.js.map +1 -1
  124. package/lib/internal/_randomArray.mjs +9 -3
  125. package/lib/internal/_randomArray.mjs.map +1 -1
  126. package/lib/internal/_randomFormatByte.d.ts +2 -1
  127. package/lib/internal/_randomFormatByte.js +2 -1
  128. package/lib/internal/_randomFormatByte.js.map +1 -1
  129. package/lib/internal/_randomFormatByte.mjs +2 -1
  130. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  131. package/lib/internal/_randomFormatDate.d.ts +2 -0
  132. package/lib/internal/_randomFormatDate.js +3 -2
  133. package/lib/internal/_randomFormatDate.js.map +1 -1
  134. package/lib/internal/_randomFormatDate.mjs +3 -2
  135. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  136. package/lib/internal/_randomFormatDatetime.d.ts +2 -0
  137. package/lib/internal/_randomFormatDatetime.js +3 -2
  138. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  139. package/lib/internal/_randomFormatDatetime.mjs +3 -2
  140. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  141. package/lib/internal/_randomFormatDuration.d.ts +2 -1
  142. package/lib/internal/_randomFormatDuration.js +3 -2
  143. package/lib/internal/_randomFormatDuration.js.map +1 -1
  144. package/lib/internal/_randomFormatDuration.mjs +3 -2
  145. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  146. package/lib/internal/_randomFormatEmail.d.ts +2 -1
  147. package/lib/internal/_randomFormatEmail.js +8 -1
  148. package/lib/internal/_randomFormatEmail.js.map +1 -1
  149. package/lib/internal/_randomFormatEmail.mjs +5 -1
  150. package/lib/internal/_randomFormatEmail.mjs.map +1 -1
  151. package/lib/internal/_randomFormatHostname.d.ts +8 -1
  152. package/lib/internal/_randomFormatHostname.js +45 -2
  153. package/lib/internal/_randomFormatHostname.js.map +1 -1
  154. package/lib/internal/_randomFormatHostname.mjs +38 -2
  155. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  156. package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
  157. package/lib/internal/_randomFormatIdnEmail.js +16 -2
  158. package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
  159. package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
  160. package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
  161. package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
  162. package/lib/internal/_randomFormatIdnHostname.js +26 -1
  163. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  164. package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
  165. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  166. package/lib/internal/_randomFormatIpv4.d.ts +2 -1
  167. package/lib/internal/_randomFormatIpv4.js +2 -1
  168. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  169. package/lib/internal/_randomFormatIpv4.mjs +2 -1
  170. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  171. package/lib/internal/_randomFormatIpv6.d.ts +2 -1
  172. package/lib/internal/_randomFormatIpv6.js +2 -1
  173. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  174. package/lib/internal/_randomFormatIpv6.mjs +2 -1
  175. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  176. package/lib/internal/_randomFormatIri.d.ts +2 -1
  177. package/lib/internal/_randomFormatIri.js +1 -1
  178. package/lib/internal/_randomFormatIri.js.map +1 -1
  179. package/lib/internal/_randomFormatIri.mjs +1 -1
  180. package/lib/internal/_randomFormatIri.mjs.map +1 -1
  181. package/lib/internal/_randomFormatIriReference.d.ts +2 -1
  182. package/lib/internal/_randomFormatIriReference.js +1 -1
  183. package/lib/internal/_randomFormatIriReference.js.map +1 -1
  184. package/lib/internal/_randomFormatIriReference.mjs +1 -1
  185. package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
  186. package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
  187. package/lib/internal/_randomFormatJsonPointer.js +8 -1
  188. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  189. package/lib/internal/_randomFormatJsonPointer.mjs +5 -1
  190. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  191. package/lib/internal/_randomFormatPassword.d.ts +2 -1
  192. package/lib/internal/_randomFormatPassword.js +7 -5
  193. package/lib/internal/_randomFormatPassword.js.map +1 -1
  194. package/lib/internal/_randomFormatPassword.mjs +5 -1
  195. package/lib/internal/_randomFormatPassword.mjs.map +1 -1
  196. package/lib/internal/_randomFormatRegex.d.ts +2 -1
  197. package/lib/internal/_randomFormatRegex.js +2 -1
  198. package/lib/internal/_randomFormatRegex.js.map +1 -1
  199. package/lib/internal/_randomFormatRegex.mjs +2 -1
  200. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  201. package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
  202. package/lib/internal/_randomFormatRelativeJsonPointer.js +3 -2
  203. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  204. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +3 -2
  205. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  206. package/lib/internal/_randomFormatTime.d.ts +2 -1
  207. package/lib/internal/_randomFormatTime.js +3 -2
  208. package/lib/internal/_randomFormatTime.js.map +1 -1
  209. package/lib/internal/_randomFormatTime.mjs +3 -2
  210. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  211. package/lib/internal/_randomFormatUri.d.ts +2 -1
  212. package/lib/internal/_randomFormatUri.js +1 -1
  213. package/lib/internal/_randomFormatUri.js.map +1 -1
  214. package/lib/internal/_randomFormatUri.mjs +1 -1
  215. package/lib/internal/_randomFormatUri.mjs.map +1 -1
  216. package/lib/internal/_randomFormatUriReference.d.ts +2 -1
  217. package/lib/internal/_randomFormatUriReference.js +1 -1
  218. package/lib/internal/_randomFormatUriReference.js.map +1 -1
  219. package/lib/internal/_randomFormatUriReference.mjs +1 -1
  220. package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
  221. package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
  222. package/lib/internal/_randomFormatUriTemplate.js +1 -1
  223. package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
  224. package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
  225. package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
  226. package/lib/internal/_randomFormatUrl.d.ts +2 -1
  227. package/lib/internal/_randomFormatUrl.js +21 -1
  228. package/lib/internal/_randomFormatUrl.js.map +1 -1
  229. package/lib/internal/_randomFormatUrl.mjs +18 -1
  230. package/lib/internal/_randomFormatUrl.mjs.map +1 -1
  231. package/lib/internal/_randomFormatUuid.d.ts +2 -1
  232. package/lib/internal/_randomFormatUuid.js +3 -2
  233. package/lib/internal/_randomFormatUuid.js.map +1 -1
  234. package/lib/internal/_randomFormatUuid.mjs +3 -2
  235. package/lib/internal/_randomFormatUuid.mjs.map +1 -1
  236. package/lib/internal/_randomInteger.js +59 -28
  237. package/lib/internal/_randomInteger.js.map +1 -1
  238. package/lib/internal/_randomInteger.mjs +56 -16
  239. package/lib/internal/_randomInteger.mjs.map +1 -1
  240. package/lib/internal/_randomMultiple.d.ts +8 -0
  241. package/lib/internal/_randomMultiple.js +168 -0
  242. package/lib/internal/_randomMultiple.js.map +1 -0
  243. package/lib/internal/_randomMultiple.mjs +158 -0
  244. package/lib/internal/_randomMultiple.mjs.map +1 -0
  245. package/lib/internal/_randomNumber.js +42 -42
  246. package/lib/internal/_randomNumber.js.map +1 -1
  247. package/lib/internal/_randomNumber.mjs +41 -27
  248. package/lib/internal/_randomNumber.mjs.map +1 -1
  249. package/lib/internal/_randomPattern.d.ts +2 -1
  250. package/lib/internal/_randomPattern.js +19 -4
  251. package/lib/internal/_randomPattern.js.map +1 -1
  252. package/lib/internal/_randomPattern.mjs +10 -4
  253. package/lib/internal/_randomPattern.mjs.map +1 -1
  254. package/lib/internal/_randomStringLength.d.ts +33 -0
  255. package/lib/internal/_randomStringLength.js +48 -0
  256. package/lib/internal/_randomStringLength.js.map +1 -0
  257. package/lib/internal/_randomStringLength.mjs +44 -0
  258. package/lib/internal/_randomStringLength.mjs.map +1 -0
  259. package/lib/internal/_stringLength.d.ts +1 -0
  260. package/lib/internal/_stringLength.js +11 -0
  261. package/lib/internal/_stringLength.js.map +1 -0
  262. package/lib/internal/_stringLength.mjs +10 -0
  263. package/lib/internal/_stringLength.mjs.map +1 -0
  264. package/lib/internal/_validateReport.js +4 -1
  265. package/lib/internal/_validateReport.js.map +1 -1
  266. package/lib/internal/_validateReport.mjs +2 -1
  267. package/lib/internal/_validateReport.mjs.map +1 -1
  268. package/lib/internal/private/__notationRename.d.ts +14 -0
  269. package/lib/internal/private/__notationRename.js +25 -0
  270. package/lib/internal/private/__notationRename.js.map +1 -0
  271. package/lib/internal/private/__notationRename.mjs +24 -0
  272. package/lib/internal/private/__notationRename.mjs.map +1 -0
  273. package/lib/json.d.ts +2 -2
  274. package/lib/json.mjs.map +1 -1
  275. package/lib/module.d.ts +2 -2
  276. package/lib/module.js.map +1 -1
  277. package/lib/module.mjs.map +1 -1
  278. package/lib/notations.d.ts +20 -4
  279. package/lib/notations.js.map +1 -1
  280. package/lib/notations.mjs.map +1 -1
  281. package/native/adapter/plugin_options.go +117 -0
  282. package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
  283. package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
  284. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
  285. package/native/cmd/ttsc-typia/build.go +81 -64
  286. package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
  287. package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
  288. package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
  289. package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
  290. package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
  291. package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
  292. package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
  293. package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
  294. package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
  295. package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
  296. package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
  297. package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
  298. package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
  299. package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
  300. package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
  301. package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
  302. package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
  303. package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
  304. package/native/cmd/ttsc-typia/main_wasm.go +21 -2
  305. package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
  306. package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
  307. package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
  308. package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
  309. package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
  310. package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
  311. package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
  312. package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
  313. package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
  314. package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
  315. package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
  316. package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
  317. package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
  318. package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
  319. package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
  320. package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
  321. package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
  322. package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
  323. package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
  324. package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
  325. package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
  326. package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
  327. package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
  328. package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
  329. package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
  330. package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
  331. package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
  332. package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
  333. package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
  334. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
  335. package/native/cmd/ttsc-typia/transform.go +228 -39
  336. package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
  337. package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
  338. package/native/cmd/ttsc-typia/transform_helpers_test.go +159 -1
  339. package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
  340. package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
  341. package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
  342. package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
  343. package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
  344. package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
  345. package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
  346. package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
  347. package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
  348. package/native/core/factories/FormatCheatSheet.go +40 -7
  349. package/native/core/factories/IdentifierFactory.go +131 -4
  350. package/native/core/factories/MetadataCommentTagFactory.go +83 -40
  351. package/native/core/factories/MetadataTypeTagFactory.go +13 -1
  352. package/native/core/factories/NumericRangeFactory.go +60 -17
  353. package/native/core/factories/ProtobufFactory.go +7 -4
  354. package/native/core/factories/factory_utility_coverage_test.go +8 -2
  355. package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
  356. package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
  357. package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
  358. package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
  359. package/native/core/factories/internal/metadata/MetadataHelper.go +60 -6
  360. package/native/core/factories/internal/metadata/emplace_metadata_object.go +116 -8
  361. package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
  362. package/native/core/factories/internal/metadata/iterate_metadata_function.go +4 -11
  363. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +8 -6
  364. package/native/core/factories/internal/metadata/iterate_metadata_map.go +9 -0
  365. package/native/core/factories/internal/metadata/iterate_metadata_native.go +27 -2
  366. package/native/core/factories/internal/metadata/iterate_metadata_set.go +9 -0
  367. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  368. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  369. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  370. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  371. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  372. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  373. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  374. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  375. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  376. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  377. package/native/core/programmers/IsProgrammer.go +15 -1
  378. package/native/core/programmers/RandomProgrammer.go +51 -14
  379. package/native/core/programmers/compare/CompareEqualProgrammer.go +393 -5
  380. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  381. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  382. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  383. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  384. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  385. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  386. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  387. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  388. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  389. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  390. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  391. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  392. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  393. package/native/core/programmers/helpers/StringifyJoinder.go +32 -1
  394. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  395. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +5 -3
  396. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  397. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  398. package/native/core/programmers/iterate/check_template.go +344 -32
  399. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  400. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  401. package/native/core/programmers/iterate/openapi_v3_downgrader.go +641 -0
  402. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  403. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  404. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  405. package/native/core/programmers/iterate/template_runtime_pattern.go +52 -7
  406. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  407. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  408. package/native/core/programmers/llm/LlmApplicationProgrammer.go +12 -10
  409. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  410. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  411. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  412. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  413. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  414. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  415. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  416. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  417. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  418. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  419. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  420. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +40 -21
  421. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  422. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  423. package/native/core/schemas/metadata/MetadataCollection.go +270 -20
  424. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  425. package/native/core/schemas/metadata/MetadataObjectType.go +17 -4
  426. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  427. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  428. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  429. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  430. package/native/core/utils/PatternUtil.go +13 -0
  431. package/native/core/utils/PromiseTypeFactory.go +59 -0
  432. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  433. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  434. package/native/go.mod +9 -1
  435. package/native/transform/CallExpressionTransformer.go +12 -0
  436. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  437. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  438. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  439. package/package.json +16 -4
  440. package/src/executable/FileSystemIdentity.ts +189 -0
  441. package/src/executable/TypiaGenerateWizard.ts +377 -110
  442. package/src/functional.ts +30 -60
  443. package/src/internal/_ProtobufReader.ts +129 -43
  444. package/src/internal/_createStandardSchema.ts +15 -1
  445. package/src/internal/_decimal.ts +69 -0
  446. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  447. package/src/internal/_isFormatByte.ts +2 -5
  448. package/src/internal/_isFormatDate.ts +15 -2
  449. package/src/internal/_isFormatDateTime.ts +28 -2
  450. package/src/internal/_isFormatIri.ts +5 -2
  451. package/src/internal/_isFormatIriReference.ts +11 -3
  452. package/src/internal/_isFormatUriReference.ts +1 -1
  453. package/src/internal/_isMultipleOf.ts +8 -0
  454. package/src/internal/_isTypeFloat.ts +1 -1
  455. package/src/internal/_isTypeInt64.ts +1 -0
  456. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  457. package/src/internal/_isTypeUint64.ts +1 -0
  458. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  459. package/src/internal/_isUniqueItems.ts +134 -132
  460. package/src/internal/_notationAny.ts +9 -4
  461. package/src/internal/_notationAssign.ts +20 -0
  462. package/src/internal/_notationCamel.ts +31 -10
  463. package/src/internal/_notationKebab.ts +11 -0
  464. package/src/internal/_notationKeyCollision.ts +9 -0
  465. package/src/internal/_notationPascal.ts +19 -6
  466. package/src/internal/_notationSnake.ts +24 -21
  467. package/src/internal/_plainCloneAny.ts +208 -33
  468. package/src/internal/_randomArray.ts +13 -4
  469. package/src/internal/_randomFormatByte.ts +4 -1
  470. package/src/internal/_randomFormatDate.ts +17 -12
  471. package/src/internal/_randomFormatDatetime.ts +15 -10
  472. package/src/internal/_randomFormatDuration.ts +16 -14
  473. package/src/internal/_randomFormatEmail.ts +8 -2
  474. package/src/internal/_randomFormatHostname.ts +48 -1
  475. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  476. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  477. package/src/internal/_randomFormatIpv4.ts +3 -2
  478. package/src/internal/_randomFormatIpv6.ts +3 -2
  479. package/src/internal/_randomFormatIri.ts +3 -1
  480. package/src/internal/_randomFormatIriReference.ts +3 -1
  481. package/src/internal/_randomFormatJsonPointer.ts +8 -2
  482. package/src/internal/_randomFormatPassword.ts +11 -6
  483. package/src/internal/_randomFormatRegex.ts +4 -1
  484. package/src/internal/_randomFormatRelativeJsonPointer.ts +13 -6
  485. package/src/internal/_randomFormatTime.ts +13 -10
  486. package/src/internal/_randomFormatUri.ts +3 -1
  487. package/src/internal/_randomFormatUriReference.ts +3 -1
  488. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  489. package/src/internal/_randomFormatUrl.ts +25 -2
  490. package/src/internal/_randomFormatUuid.ts +10 -6
  491. package/src/internal/_randomInteger.ts +87 -40
  492. package/src/internal/_randomMultiple.ts +245 -0
  493. package/src/internal/_randomNumber.ts +72 -55
  494. package/src/internal/_randomPattern.ts +26 -4
  495. package/src/internal/_randomStringLength.ts +72 -0
  496. package/src/internal/_stringLength.ts +5 -0
  497. package/src/internal/_validateReport.ts +5 -1
  498. package/src/internal/private/__notationRename.ts +24 -0
  499. package/src/json.ts +2 -2
  500. package/src/module.ts +4 -6
  501. package/src/notations.ts +20 -4
  502. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  503. package/lib/internal/private/__notationCapitalize.js +0 -6
  504. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  505. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  506. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  507. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  508. package/lib/internal/private/__notationUnsnake.js +0 -26
  509. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  510. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  511. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  512. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  513. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  514. package/src/internal/private/__notationCapitalize.ts +0 -2
  515. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -1,6 +1,7 @@
1
1
  package iterate
2
2
 
3
3
  import (
4
+ "fmt"
4
5
  "strings"
5
6
 
6
7
  shimast "github.com/microsoft/typescript-go/shim/ast"
@@ -32,8 +33,10 @@ func Check_template(props Check_templateProps) nativehelpers.ICheckEntry {
32
33
  internal := make([]*shimast.Node, 0, len(props.Templates))
33
34
  var solePattern string
34
35
  var soleCaptures []templateCapture
36
+ var soleBacktracking *nativehelpers.ICheckEntry_ICondition
35
37
  for _, tpl := range props.Templates {
36
38
  pattern, captures := template_runtime_pattern(tpl.Row)
39
+ backtracking := template_requires_backtracking(tpl.Row)
37
40
  expression := f.NewCallExpression(
38
41
  f.NewIdentifier("RegExp(/"+pattern+"/).test"),
39
42
  nil,
@@ -46,6 +49,16 @@ func Check_template(props Check_templateProps) nativehelpers.ICheckEntry {
46
49
  // them — both the whole-string matrix and the per-placeholder
47
50
  // interpolation matrix — into the member expression instead.
48
51
  if len(props.Templates) > 1 {
52
+ if backtracking {
53
+ expression = f.NewBinaryExpression(
54
+ nil,
55
+ expression,
56
+ nil,
57
+ f.NewToken(shimast.KindAmpersandAmpersandToken),
58
+ check_template_backtracking(props, tpl),
59
+ )
60
+ captures = nil
61
+ }
49
62
  if tags := check_template_inline_all_tags(props, tpl, pattern, captures); tags != nil {
50
63
  expression = f.NewBinaryExpression(
51
64
  nil,
@@ -57,7 +70,15 @@ func Check_template(props Check_templateProps) nativehelpers.ICheckEntry {
57
70
  }
58
71
  } else {
59
72
  solePattern = pattern
60
- soleCaptures = captures
73
+ if backtracking {
74
+ soleCaptures = nil
75
+ soleBacktracking = &nativehelpers.ICheckEntry_ICondition{
76
+ Expected: check_template_backtracking_expected(tpl),
77
+ Expression: check_template_backtracking(props, tpl),
78
+ }
79
+ } else {
80
+ soleCaptures = captures
81
+ }
61
82
  }
62
83
  internal = append(internal, expression)
63
84
  }
@@ -74,7 +95,7 @@ func Check_template(props Check_templateProps) nativehelpers.ICheckEntry {
74
95
  Expected: strings.Join(names, " | "),
75
96
  }
76
97
  if len(props.Templates) == 1 {
77
- entry.Conditions = check_template_all_conditions(props, props.Templates[0], solePattern, soleCaptures)
98
+ entry.Conditions = check_template_all_conditions(props, props.Templates[0], solePattern, soleCaptures, soleBacktracking)
78
99
  }
79
100
  return entry
80
101
  }
@@ -114,10 +135,10 @@ func check_template_type_tags(props Check_templateProps, tpl *nativemetadata.Met
114
135
  // must hold simultaneously, so all matrices collapse into a single AND row:
115
136
  // single-row matrices keep one ICondition per tag (so validate still names the
116
137
  // exact tag), while a multi-row (union) matrix collapses to one OR'd ICondition.
117
- func check_template_all_conditions(props Check_templateProps, tpl *nativemetadata.MetadataTemplate, pattern string, captures []templateCapture) [][]nativehelpers.ICheckEntry_ICondition {
138
+ func check_template_all_conditions(props Check_templateProps, tpl *nativemetadata.MetadataTemplate, pattern string, captures []templateCapture, backtracking *nativehelpers.ICheckEntry_ICondition) [][]nativehelpers.ICheckEntry_ICondition {
118
139
  wholeString := check_template_type_tags(props, tpl)
119
140
  groups := check_template_placeholder_groups(props, tpl, pattern, captures)
120
- if len(groups) == 0 {
141
+ if len(groups) == 0 && backtracking == nil {
121
142
  return wholeString
122
143
  }
123
144
  // groups is non-empty here, and every group contributes at least one
@@ -127,6 +148,9 @@ func check_template_all_conditions(props Check_templateProps, tpl *nativemetadat
127
148
  for _, group := range groups {
128
149
  check_template_append_matrix(&row, group, props.Emit)
129
150
  }
151
+ if backtracking != nil {
152
+ row = append(row, *backtracking)
153
+ }
130
154
  return [][]nativehelpers.ICheckEntry_ICondition{row}
131
155
  }
132
156
 
@@ -182,22 +206,31 @@ func check_template_placeholder_groups(props Check_templateProps, tpl *nativemet
182
206
  // this placeholder only because template_fully_constrained holds, i.e. each row
183
207
  // carries a validate-able tag, so no produced row is empty.
184
208
  func check_template_capture_conditions(props Check_templateProps, base string, pattern string, capture templateCapture) [][]nativehelpers.ICheckEntry_ICondition {
209
+ return check_template_value_conditions(
210
+ props,
211
+ base,
212
+ capture.Atomic,
213
+ capture.Kind,
214
+ check_template_capture_input(pattern, capture, props.Input, props.Emit),
215
+ )
216
+ }
217
+
218
+ func check_template_value_conditions(props Check_templateProps, base string, atomic *nativemetadata.MetadataAtomic, kind string, input *shimast.Expression) [][]nativehelpers.ICheckEntry_ICondition {
185
219
  output := [][]nativehelpers.ICheckEntry_ICondition{}
186
- for _, row := range capture.Atomic.Tags {
220
+ for _, row := range atomic.Tags {
187
221
  conditions := []nativehelpers.ICheckEntry_ICondition{}
188
- if capture.Kind != "string" {
189
- // number and bigint share the numeric transpiler; the bigint validate
190
- // scripts already compare via `BigInt(...)`, and check_template_capture_input
191
- // hands them a `BigInt(...)`-parsed value. The exclude literals use
192
- // capture.Kind so a bigint placeholder emits bigint literals.
222
+ if kind != "string" {
223
+ // Number and bigint share the numeric transpiler. Coercion stays here so
224
+ // both direct RegExp captures and backtracking slices use the same tag
225
+ // predicates, while bigint exclude checks still emit bigint literals.
193
226
  for _, tag := range check_number_filter_validate(row) {
194
227
  conditions = append(conditions, nativehelpers.ICheckEntry_ICondition{
195
228
  Expected: base + " & " + tag.Name,
196
- Expression: check_number_transpile(props.Context, tag.Validate)(check_template_capture_input(pattern, capture, props.Input, props.Emit)),
229
+ Expression: check_number_transpile(props.Context, tag.Validate)(check_template_coerce_input(kind, input, props.Emit)),
197
230
  })
198
231
  }
199
232
  for _, tag := range row {
200
- if condition := check_exclude_condition(capture.Kind, tag, check_template_capture_input(pattern, capture, props.Input, props.Emit), props.Emit); condition != nil {
233
+ if condition := check_exclude_condition(kind, tag, check_template_coerce_input(kind, input, props.Emit), props.Emit); condition != nil {
201
234
  conditions = append(conditions, *condition)
202
235
  }
203
236
  }
@@ -205,11 +238,11 @@ func check_template_capture_conditions(props Check_templateProps, base string, p
205
238
  for _, tag := range check_string_filter_validate(row) {
206
239
  conditions = append(conditions, nativehelpers.ICheckEntry_ICondition{
207
240
  Expected: base + " & " + tag.Name,
208
- Expression: check_string_transpile(props.Context, tag.Validate)(check_template_capture_input(pattern, capture, props.Input, props.Emit)),
241
+ Expression: check_string_transpile(props.Context, tag.Validate)(input),
209
242
  })
210
243
  }
211
244
  for _, tag := range row {
212
- if condition := check_exclude_condition("string", tag, check_template_capture_input(pattern, capture, props.Input, props.Emit), props.Emit); condition != nil {
245
+ if condition := check_exclude_condition("string", tag, input, props.Emit); condition != nil {
213
246
  conditions = append(conditions, *condition)
214
247
  }
215
248
  }
@@ -219,13 +252,33 @@ func check_template_capture_conditions(props Check_templateProps, base string, p
219
252
  return output
220
253
  }
221
254
 
222
- // check_template_capture_input builds the expression that re-extracts a
223
- // placeholder's captured substring: `RegExp(/pattern/).exec(input)[index]`,
224
- // coerced through `Number(...)` for a numeric placeholder or `BigInt(...)` for a
225
- // bigint one (a string placeholder uses the raw substring). The surrounding
226
- // `.test()` (entry expression for a sole template, member expression for a
227
- // union) guarantees the match is non-null, and the bigint capture pattern admits
228
- // only integers, so the conversion never throws.
255
+ func check_template_coerce_input(kind string, input *shimast.Expression, emit *shimprinter.EmitContext) *shimast.Expression {
256
+ f := nativecontext.EmitFactoryOf(check_template_factory, emit)
257
+ coerce := ""
258
+ switch kind {
259
+ case "number":
260
+ coerce = "Number"
261
+ case "bigint":
262
+ coerce = "BigInt"
263
+ }
264
+ if coerce == "" {
265
+ return input
266
+ }
267
+ return f.NewCallExpression(
268
+ f.NewIdentifier(coerce),
269
+ nil,
270
+ nil,
271
+ f.NewNodeList([]*shimast.Node{input}),
272
+ shimast.NodeFlagsNone,
273
+ )
274
+ }
275
+
276
+ // check_template_capture_input re-extracts a placeholder's raw captured
277
+ // substring: `RegExp(/pattern/).exec(input)[index]`. The surrounding `.test()`
278
+ // (entry expression for a sole template, member expression for a union)
279
+ // guarantees the match is non-null. Numeric coercion belongs to
280
+ // check_template_value_conditions so direct captures and backtracking slices
281
+ // share the same path.
229
282
  func check_template_capture_input(pattern string, capture templateCapture, input *shimast.Expression, emit *shimprinter.EmitContext) *shimast.Expression {
230
283
  f := nativecontext.EmitFactoryOf(check_template_factory, emit)
231
284
  element := f.NewElementAccessExpression(
@@ -240,23 +293,282 @@ func check_template_capture_input(pattern string, capture templateCapture, input
240
293
  nativefactories.ExpressionFactory.Number(capture.Index, emit),
241
294
  shimast.NodeFlagsNone,
242
295
  )
243
- coerce := ""
244
- switch capture.Kind {
245
- case "number":
246
- coerce = "Number"
247
- case "bigint":
248
- coerce = "BigInt"
296
+ return element
297
+ }
298
+
299
+ // check_template_backtracking accepts a template when at least one complete
300
+ // assignment of substrings to placeholders satisfies both their structural
301
+ // patterns and every runtime-checkable tag. One memoized visitor per template
302
+ // row enumerates UTF-16 offsets, matching JavaScript string slicing and RegExp
303
+ // semantics without repeating the same suffix search or committing to
304
+ // RegExp.exec's single greedy capture.
305
+ func check_template_backtracking(props Check_templateProps, tpl *nativemetadata.MetadataTemplate) *shimast.Node {
306
+ f := nativecontext.EmitFactoryOf(check_template_factory, props.Emit)
307
+ statements := make([]*shimast.Node, 0, (len(tpl.Row)+1)*2+1)
308
+ for index := 0; index <= len(tpl.Row); index++ {
309
+ memoName := fmt.Sprintf("_templateMemo%d", index)
310
+ visitName := fmt.Sprintf("_templateVisit%d", index)
311
+ offsetName := fmt.Sprintf("_templateStart%d", index)
312
+ cachedName := fmt.Sprintf("_templateCached%d", index)
313
+ resultName := fmt.Sprintf("_templateResult%d", index)
314
+ offset := f.NewIdentifier(offsetName)
315
+ memo := f.NewIdentifier(memoName)
316
+
317
+ statements = append(statements,
318
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
319
+ Name: memoName,
320
+ Value: f.NewNewExpression(f.NewIdentifier("Map"), nil, f.NewNodeList(nil)),
321
+ }, props.Emit),
322
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
323
+ Name: visitName,
324
+ Value: f.NewArrowFunction(
325
+ nil,
326
+ nil,
327
+ f.NewNodeList([]*shimast.Node{
328
+ nativefactories.IdentifierFactory.Parameter(offsetName, nativefactories.TypeFactory.Keyword("number", props.Emit), nil, props.Emit),
329
+ }),
330
+ nativefactories.TypeFactory.Keyword("boolean", props.Emit),
331
+ nil,
332
+ f.NewToken(shimast.KindEqualsGreaterThanToken),
333
+ f.NewBlock(f.NewNodeList([]*shimast.Node{
334
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
335
+ Name: cachedName,
336
+ Value: f.NewCallExpression(
337
+ nativefactories.IdentifierFactory.Access(props.Emit, memo, "get"),
338
+ nil,
339
+ nil,
340
+ f.NewNodeList([]*shimast.Node{offset}),
341
+ shimast.NodeFlagsNone,
342
+ ),
343
+ }, props.Emit),
344
+ f.NewIfStatement(
345
+ f.NewBinaryExpression(
346
+ nil,
347
+ f.NewIdentifier(cachedName),
348
+ nil,
349
+ f.NewToken(shimast.KindExclamationEqualsEqualsToken),
350
+ f.NewIdentifier("undefined"),
351
+ ),
352
+ f.NewReturnStatement(f.NewIdentifier(cachedName)),
353
+ nil,
354
+ ),
355
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
356
+ Name: resultName,
357
+ Type: nativefactories.TypeFactory.Keyword("boolean", props.Emit),
358
+ Value: check_template_backtracking_step(props, tpl, index, offset),
359
+ }, props.Emit),
360
+ f.NewExpressionStatement(f.NewCallExpression(
361
+ nativefactories.IdentifierFactory.Access(props.Emit, memo, "set"),
362
+ nil,
363
+ nil,
364
+ f.NewNodeList([]*shimast.Node{offset, f.NewIdentifier(resultName)}),
365
+ shimast.NodeFlagsNone,
366
+ )),
367
+ f.NewReturnStatement(f.NewIdentifier(resultName)),
368
+ }), true),
369
+ ),
370
+ }, props.Emit),
371
+ )
372
+ }
373
+ statements = append(statements, f.NewReturnStatement(check_template_backtracking_call(
374
+ 0,
375
+ nativefactories.ExpressionFactory.Number(0, props.Emit),
376
+ props.Emit,
377
+ )))
378
+ return f.NewCallExpression(
379
+ f.NewParenthesizedExpression(f.NewArrowFunction(
380
+ nil,
381
+ nil,
382
+ f.NewNodeList(nil),
383
+ nativefactories.TypeFactory.Keyword("boolean", props.Emit),
384
+ nil,
385
+ f.NewToken(shimast.KindEqualsGreaterThanToken),
386
+ f.NewBlock(f.NewNodeList(statements), true),
387
+ )),
388
+ nil,
389
+ nil,
390
+ nil,
391
+ shimast.NodeFlagsNone,
392
+ )
393
+ }
394
+
395
+ func check_template_backtracking_step(props Check_templateProps, tpl *nativemetadata.MetadataTemplate, index int, offset *shimast.Expression) *shimast.Node {
396
+ f := nativecontext.EmitFactoryOf(check_template_factory, props.Emit)
397
+ if index == len(tpl.Row) {
398
+ return f.NewBinaryExpression(
399
+ nil,
400
+ offset,
401
+ nil,
402
+ f.NewToken(shimast.KindEqualsEqualsEqualsToken),
403
+ nativefactories.IdentifierFactory.Access(props.Emit, props.Input, "length"),
404
+ )
249
405
  }
250
- if coerce != "" {
251
- return f.NewCallExpression(
252
- f.NewIdentifier(coerce),
406
+ meta := tpl.Row[index]
407
+ if literal, ok := template_literal_value(meta); ok {
408
+ value := f.NewStringLiteral(literal, shimast.TokenFlagsNone)
409
+ starts := f.NewCallExpression(
410
+ nativefactories.IdentifierFactory.Access(props.Emit, props.Input, "startsWith"),
253
411
  nil,
254
412
  nil,
255
- f.NewNodeList([]*shimast.Node{element}),
413
+ f.NewNodeList([]*shimast.Node{value, offset}),
256
414
  shimast.NodeFlagsNone,
257
415
  )
416
+ nextOffset := f.NewBinaryExpression(
417
+ nil,
418
+ offset,
419
+ nil,
420
+ f.NewToken(shimast.KindPlusToken),
421
+ nativefactories.IdentifierFactory.Access(props.Emit, value, "length"),
422
+ )
423
+ return f.NewBinaryExpression(
424
+ nil,
425
+ starts,
426
+ nil,
427
+ f.NewToken(shimast.KindAmpersandAmpersandToken),
428
+ check_template_backtracking_call(index+1, nextOffset, props.Emit),
429
+ )
258
430
  }
259
- return element
431
+
432
+ endName := fmt.Sprintf("_templateEnd%d", index)
433
+ end := f.NewIdentifier(endName)
434
+ slice := f.NewCallExpression(
435
+ nativefactories.IdentifierFactory.Access(props.Emit, props.Input, "slice"),
436
+ nil,
437
+ nil,
438
+ f.NewNodeList([]*shimast.Node{offset, end}),
439
+ shimast.NodeFlagsNone,
440
+ )
441
+ conditions := []*shimast.Node{
442
+ f.NewCallExpression(
443
+ f.NewIdentifier("RegExp(/"+template_backtracking_pattern(meta)+"/).test"),
444
+ nil,
445
+ nil,
446
+ f.NewNodeList([]*shimast.Node{slice}),
447
+ shimast.NodeFlagsNone,
448
+ ),
449
+ }
450
+ if atomic, kind, ok := template_constrained_capture(meta); ok {
451
+ conditions = append(conditions, check_template_condition_matrix(check_template_value_conditions(
452
+ props,
453
+ tpl.GetBaseName(),
454
+ atomic,
455
+ kind,
456
+ slice,
457
+ ), props.Emit))
458
+ }
459
+ conditions = append(conditions, check_template_backtracking_call(index+1, end, props.Emit))
460
+
461
+ length := f.NewBinaryExpression(
462
+ nil,
463
+ f.NewBinaryExpression(
464
+ nil,
465
+ nativefactories.IdentifierFactory.Access(props.Emit, props.Input, "length"),
466
+ nil,
467
+ f.NewToken(shimast.KindMinusToken),
468
+ offset,
469
+ ),
470
+ nil,
471
+ f.NewToken(shimast.KindPlusToken),
472
+ nativefactories.ExpressionFactory.Number(1, props.Emit),
473
+ )
474
+ positionName := fmt.Sprintf("_templateOffset%d", index)
475
+ candidates := f.NewCallExpression(
476
+ f.NewIdentifier("Array.from"),
477
+ nil,
478
+ nil,
479
+ f.NewNodeList([]*shimast.Node{
480
+ f.NewObjectLiteralExpression(f.NewNodeList([]*shimast.Node{
481
+ f.NewPropertyAssignment(nil, f.NewIdentifier("length"), nil, nil, length),
482
+ }), false),
483
+ f.NewArrowFunction(
484
+ nil,
485
+ nil,
486
+ f.NewNodeList([]*shimast.Node{
487
+ nativefactories.IdentifierFactory.Parameter(fmt.Sprintf("_templateUnused%d", index), nil, nil, props.Emit),
488
+ nativefactories.IdentifierFactory.Parameter(positionName, nativefactories.TypeFactory.Keyword("number", props.Emit), nil, props.Emit),
489
+ }),
490
+ nil,
491
+ nil,
492
+ f.NewToken(shimast.KindEqualsGreaterThanToken),
493
+ f.NewBinaryExpression(
494
+ nil,
495
+ offset,
496
+ nil,
497
+ f.NewToken(shimast.KindPlusToken),
498
+ f.NewIdentifier(positionName),
499
+ ),
500
+ ),
501
+ }),
502
+ shimast.NodeFlagsNone,
503
+ )
504
+ return f.NewCallExpression(
505
+ nativefactories.IdentifierFactory.Access(props.Emit, candidates, "some"),
506
+ nil,
507
+ nil,
508
+ f.NewNodeList([]*shimast.Node{
509
+ f.NewArrowFunction(
510
+ nil,
511
+ nil,
512
+ f.NewNodeList([]*shimast.Node{
513
+ nativefactories.IdentifierFactory.Parameter(endName, nativefactories.TypeFactory.Keyword("number", props.Emit), nil, props.Emit),
514
+ }),
515
+ nil,
516
+ nil,
517
+ f.NewToken(shimast.KindEqualsGreaterThanToken),
518
+ check_template_reduce(conditions, shimast.KindAmpersandAmpersandToken, props.Emit),
519
+ ),
520
+ }),
521
+ shimast.NodeFlagsNone,
522
+ )
523
+ }
524
+
525
+ func check_template_backtracking_call(index int, offset *shimast.Expression, emit *shimprinter.EmitContext) *shimast.Node {
526
+ f := nativecontext.EmitFactoryOf(check_template_factory, emit)
527
+ return f.NewCallExpression(
528
+ f.NewIdentifier(fmt.Sprintf("_templateVisit%d", index)),
529
+ nil,
530
+ nil,
531
+ f.NewNodeList([]*shimast.Node{offset}),
532
+ shimast.NodeFlagsNone,
533
+ )
534
+ }
535
+
536
+ func check_template_condition_matrix(matrix [][]nativehelpers.ICheckEntry_ICondition, emit *shimprinter.EmitContext) *shimast.Node {
537
+ rows := make([]*shimast.Node, 0, len(matrix))
538
+ for _, row := range matrix {
539
+ columns := make([]*shimast.Node, 0, len(row))
540
+ for _, condition := range row {
541
+ columns = append(columns, condition.Expression)
542
+ }
543
+ rows = append(rows, check_template_reduce(columns, shimast.KindAmpersandAmpersandToken, emit))
544
+ }
545
+ return check_template_reduce(rows, shimast.KindBarBarToken, emit)
546
+ }
547
+
548
+ func check_template_backtracking_expected(tpl *nativemetadata.MetadataTemplate) string {
549
+ names := []string{}
550
+ seen := map[string]bool{}
551
+ for _, meta := range tpl.Row {
552
+ atomic, _, ok := template_constrained_capture(meta)
553
+ if ok == false {
554
+ continue
555
+ }
556
+ for _, row := range atomic.Tags {
557
+ for _, tag := range row {
558
+ if tag.Validate == "" && (tag.Kind != "exclude" || len(check_exclude_values(tag)) == 0) {
559
+ continue
560
+ }
561
+ if seen[tag.Name] == false {
562
+ seen[tag.Name] = true
563
+ names = append(names, tag.Name)
564
+ }
565
+ }
566
+ }
567
+ }
568
+ if len(names) == 0 {
569
+ return tpl.GetBaseName()
570
+ }
571
+ return tpl.GetBaseName() + " & (" + strings.Join(names, " & ") + ")"
260
572
  }
261
573
 
262
574
  // check_template_inline_all_tags folds a union member template's whole-string
@@ -6,17 +6,12 @@ import (
6
6
  )
7
7
 
8
8
  func json_schema_discriminator(metadata *nativemetadata.MetadataSchema) JsonSchema {
9
- if metadata.Size() == 0 ||
10
- metadata.Size() != len(metadata.Objects) ||
11
- json_schema_discriminator_hasLiteral(metadata) {
9
+ objects := json_schema_discriminator_objects(metadata)
10
+ if len(objects) == 0 || json_schema_discriminator_hasLiteral(objects) {
12
11
  return nil
13
12
  }
14
- objects := make([]*nativemetadata.MetadataObjectType, 0, len(metadata.Objects))
15
- for _, object := range metadata.Objects {
16
- objects = append(objects, object.Type)
17
- }
18
13
  specialized := nativehelpers.UnionPredicator.Object(objects)
19
- meet := len(specialized) == len(metadata.Objects)
14
+ meet := len(specialized) == len(objects)
20
15
  if meet {
21
16
  keys := map[string]struct{}{}
22
17
  for _, item := range specialized {
@@ -47,9 +42,40 @@ func json_schema_discriminator(metadata *nativemetadata.MetadataSchema) JsonSche
47
42
  }
48
43
  }
49
44
 
50
- func json_schema_discriminator_hasLiteral(metadata *nativemetadata.MetadataSchema) bool {
45
+ // json_schema_discriminator_objects resolves every union member to the object
46
+ // type whose `$ref` that member exports, and returns nil unless all of them do.
47
+ //
48
+ // Declaration syntax decides only which bucket a member lands in: an `interface`
49
+ // member arrives in `Objects`, while a `type` alias of an object literal arrives
50
+ // in `Aliases`. Both export the same `$ref`, so both are eligible to carry a
51
+ // discriminator and eligibility must not depend on the bucket.
52
+ //
53
+ // The alias branch mirrors json_schema_alias's delegation condition exactly, so
54
+ // the resolved object's name stays equal to the `$ref` the member exports, which
55
+ // is what the mapping has to target. An alias naming anything else -- an atomic,
56
+ // a union, or another alias -- exports a `$ref` to the alias itself rather than
57
+ // to an object, so it is not resolvable here.
58
+ func json_schema_discriminator_objects(metadata *nativemetadata.MetadataSchema) []*nativemetadata.MetadataObjectType {
59
+ if metadata.Size() != len(metadata.Objects)+len(metadata.Aliases) {
60
+ return nil
61
+ }
62
+ objects := make([]*nativemetadata.MetadataObjectType, 0, metadata.Size())
51
63
  for _, object := range metadata.Objects {
52
- if object.Type.IsLiteral() {
64
+ objects = append(objects, object.Type)
65
+ }
66
+ for _, alias := range metadata.Aliases {
67
+ value := alias.Type.Value
68
+ if value == nil || value.Size() != 1 || len(value.Objects) != 1 {
69
+ return nil
70
+ }
71
+ objects = append(objects, value.Objects[0].Type)
72
+ }
73
+ return objects
74
+ }
75
+
76
+ func json_schema_discriminator_hasLiteral(objects []*nativemetadata.MetadataObjectType) bool {
77
+ for _, object := range objects {
78
+ if object.IsLiteral() {
53
79
  return true
54
80
  }
55
81
  }