@lokascript/semantic 1.2.1 → 2.0.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 (964) hide show
  1. package/dist/__test-utils__/index.d.ts +6 -0
  2. package/dist/__test-utils__/index.d.ts.map +1 -0
  3. package/dist/__test-utils__/test-helpers.d.ts +7 -0
  4. package/dist/__test-utils__/test-helpers.d.ts.map +1 -0
  5. package/dist/__types__/test-helpers.d.ts +67 -0
  6. package/dist/__types__/test-helpers.d.ts.map +1 -0
  7. package/dist/analysis/index.d.ts +106 -0
  8. package/dist/analysis/index.d.ts.map +1 -0
  9. package/dist/ast-builder/command-mappers.d.ts +50 -0
  10. package/dist/ast-builder/command-mappers.d.ts.map +1 -0
  11. package/dist/ast-builder/expression-parser/index.d.ts +14 -0
  12. package/dist/ast-builder/expression-parser/index.d.ts.map +1 -0
  13. package/dist/ast-builder/expression-parser/parser.d.ts +50 -0
  14. package/dist/ast-builder/expression-parser/parser.d.ts.map +1 -0
  15. package/dist/ast-builder/expression-parser/tokenizer.d.ts +44 -0
  16. package/dist/ast-builder/expression-parser/tokenizer.d.ts.map +1 -0
  17. package/dist/ast-builder/expression-parser/types.d.ts +111 -0
  18. package/dist/ast-builder/expression-parser/types.d.ts.map +1 -0
  19. package/dist/ast-builder/index.d.ts +183 -0
  20. package/dist/ast-builder/index.d.ts.map +1 -0
  21. package/dist/ast-builder/value-converters.d.ts +51 -0
  22. package/dist/ast-builder/value-converters.d.ts.map +1 -0
  23. package/dist/browser-ar.ar.global.js +2 -2
  24. package/dist/browser-ar.d.ts +47 -0
  25. package/dist/browser-ar.d.ts.map +1 -0
  26. package/dist/browser-bn.bn.global.js +2 -0
  27. package/dist/browser-bn.d.ts +47 -0
  28. package/dist/browser-bn.d.ts.map +1 -0
  29. package/dist/browser-core.core.global.js +2 -2
  30. package/dist/browser-core.d.ts +83 -0
  31. package/dist/browser-core.d.ts.map +1 -0
  32. package/dist/browser-de.d.ts +47 -0
  33. package/dist/browser-de.d.ts.map +1 -0
  34. package/dist/browser-de.de.global.js +2 -2
  35. package/dist/browser-east-asian.d.ts +59 -0
  36. package/dist/browser-east-asian.d.ts.map +1 -0
  37. package/dist/browser-east-asian.east-asian.global.js +2 -2
  38. package/dist/browser-en-tr.d.ts +50 -0
  39. package/dist/browser-en-tr.d.ts.map +1 -0
  40. package/dist/browser-en-tr.en-tr.global.js +2 -2
  41. package/dist/browser-en.d.ts +48 -0
  42. package/dist/browser-en.d.ts.map +1 -0
  43. package/dist/browser-en.en.global.js +2 -2
  44. package/dist/browser-es-en.d.ts +62 -0
  45. package/dist/browser-es-en.d.ts.map +1 -0
  46. package/dist/browser-es-en.es-en.global.js +2 -2
  47. package/dist/browser-es.d.ts +51 -0
  48. package/dist/browser-es.d.ts.map +1 -0
  49. package/dist/browser-es.es.global.js +2 -2
  50. package/dist/browser-fr.d.ts +47 -0
  51. package/dist/browser-fr.d.ts.map +1 -0
  52. package/dist/browser-fr.fr.global.js +2 -2
  53. package/dist/browser-hi.d.ts +47 -0
  54. package/dist/browser-hi.d.ts.map +1 -0
  55. package/dist/browser-hi.hi.global.js +2 -0
  56. package/dist/browser-id.d.ts +47 -0
  57. package/dist/browser-id.d.ts.map +1 -0
  58. package/dist/browser-id.id.global.js +2 -2
  59. package/dist/browser-it.d.ts +47 -0
  60. package/dist/browser-it.d.ts.map +1 -0
  61. package/dist/browser-it.it.global.js +2 -0
  62. package/dist/browser-ja.d.ts +47 -0
  63. package/dist/browser-ja.d.ts.map +1 -0
  64. package/dist/browser-ja.ja.global.js +2 -2
  65. package/dist/browser-ko.d.ts +47 -0
  66. package/dist/browser-ko.d.ts.map +1 -0
  67. package/dist/browser-ko.ko.global.js +2 -2
  68. package/dist/browser-lazy.d.ts +52 -0
  69. package/dist/browser-lazy.d.ts.map +1 -0
  70. package/dist/browser-lazy.lazy.global.js +2 -2
  71. package/dist/browser-ms.d.ts +47 -0
  72. package/dist/browser-ms.d.ts.map +1 -0
  73. package/dist/browser-ms.ms.global.js +2 -0
  74. package/dist/browser-pl.d.ts +47 -0
  75. package/dist/browser-pl.d.ts.map +1 -0
  76. package/dist/browser-pl.pl.global.js +2 -0
  77. package/dist/browser-priority.d.ts +83 -0
  78. package/dist/browser-priority.d.ts.map +1 -0
  79. package/dist/browser-priority.priority.global.js +2 -2
  80. package/dist/browser-pt.d.ts +47 -0
  81. package/dist/browser-pt.d.ts.map +1 -0
  82. package/dist/browser-pt.pt.global.js +2 -2
  83. package/dist/browser-qu.d.ts +47 -0
  84. package/dist/browser-qu.d.ts.map +1 -0
  85. package/dist/browser-qu.qu.global.js +2 -2
  86. package/dist/browser-ru.d.ts +47 -0
  87. package/dist/browser-ru.d.ts.map +1 -0
  88. package/dist/browser-ru.ru.global.js +2 -0
  89. package/dist/browser-sw.d.ts +47 -0
  90. package/dist/browser-sw.d.ts.map +1 -0
  91. package/dist/browser-sw.sw.global.js +2 -2
  92. package/dist/browser-th.d.ts +47 -0
  93. package/dist/browser-th.d.ts.map +1 -0
  94. package/dist/browser-th.th.global.js +2 -0
  95. package/dist/browser-tl.d.ts +47 -0
  96. package/dist/browser-tl.d.ts.map +1 -0
  97. package/dist/browser-tl.tl.global.js +2 -0
  98. package/dist/browser-tr.d.ts +47 -0
  99. package/dist/browser-tr.d.ts.map +1 -0
  100. package/dist/browser-tr.tr.global.js +2 -2
  101. package/dist/browser-uk.d.ts +47 -0
  102. package/dist/browser-uk.d.ts.map +1 -0
  103. package/dist/browser-uk.uk.global.js +2 -0
  104. package/dist/browser-vi.d.ts +47 -0
  105. package/dist/browser-vi.d.ts.map +1 -0
  106. package/dist/browser-vi.vi.global.js +2 -0
  107. package/dist/browser-western.d.ts +67 -0
  108. package/dist/browser-western.d.ts.map +1 -0
  109. package/dist/browser-western.western.global.js +2 -2
  110. package/dist/browser-zh.d.ts +47 -0
  111. package/dist/browser-zh.d.ts.map +1 -0
  112. package/dist/browser-zh.zh.global.js +2 -2
  113. package/dist/browser.d.ts +69 -0
  114. package/dist/browser.d.ts.map +1 -0
  115. package/dist/browser.global.js +2 -2
  116. package/dist/browser.global.js.map +1 -1
  117. package/dist/cache/index.d.ts +7 -0
  118. package/dist/cache/index.d.ts.map +1 -0
  119. package/dist/cache/semantic-cache.d.ts +138 -0
  120. package/dist/cache/semantic-cache.d.ts.map +1 -0
  121. package/dist/core-bridge.d.ts +154 -0
  122. package/dist/core-bridge.d.ts.map +1 -0
  123. package/dist/core.d.ts +24 -1235
  124. package/dist/core.d.ts.map +1 -0
  125. package/dist/core.js +6433 -1731
  126. package/dist/core.js.map +1 -1
  127. package/dist/explicit/converter.d.ts +98 -0
  128. package/dist/explicit/converter.d.ts.map +1 -0
  129. package/dist/explicit/index.d.ts +10 -0
  130. package/dist/explicit/index.d.ts.map +1 -0
  131. package/dist/explicit/parser.d.ts +25 -0
  132. package/dist/explicit/parser.d.ts.map +1 -0
  133. package/dist/explicit/renderer.d.ts +82 -0
  134. package/dist/explicit/renderer.d.ts.map +1 -0
  135. package/dist/generators/command-schemas.d.ts +358 -0
  136. package/dist/generators/command-schemas.d.ts.map +1 -0
  137. package/dist/generators/event-handlers-sov.d.ts +91 -0
  138. package/dist/generators/event-handlers-sov.d.ts.map +1 -0
  139. package/dist/generators/event-handlers-vso.d.ts +69 -0
  140. package/dist/generators/event-handlers-vso.d.ts.map +1 -0
  141. package/dist/generators/index.d.ts +12 -0
  142. package/dist/generators/index.d.ts.map +1 -0
  143. package/dist/generators/language-profiles.d.ts +65 -0
  144. package/dist/generators/language-profiles.d.ts.map +1 -0
  145. package/dist/generators/pattern-generator.d.ts +81 -0
  146. package/dist/generators/pattern-generator.d.ts.map +1 -0
  147. package/dist/generators/profiles/arabic.d.ts +9 -0
  148. package/dist/generators/profiles/arabic.d.ts.map +1 -0
  149. package/dist/generators/profiles/bengali.d.ts +9 -0
  150. package/dist/generators/profiles/bengali.d.ts.map +1 -0
  151. package/dist/generators/profiles/chinese.d.ts +9 -0
  152. package/dist/generators/profiles/chinese.d.ts.map +1 -0
  153. package/dist/generators/profiles/english.d.ts +8 -0
  154. package/dist/generators/profiles/english.d.ts.map +1 -0
  155. package/dist/generators/profiles/french.d.ts +9 -0
  156. package/dist/generators/profiles/french.d.ts.map +1 -0
  157. package/dist/generators/profiles/german.d.ts +9 -0
  158. package/dist/generators/profiles/german.d.ts.map +1 -0
  159. package/dist/generators/profiles/hebrew.d.ts +10 -0
  160. package/dist/generators/profiles/hebrew.d.ts.map +1 -0
  161. package/dist/generators/profiles/hindi.d.ts +9 -0
  162. package/dist/generators/profiles/hindi.d.ts.map +1 -0
  163. package/dist/generators/profiles/index.d.ts +36 -0
  164. package/dist/generators/profiles/index.d.ts.map +1 -0
  165. package/dist/generators/profiles/indonesian.d.ts +9 -0
  166. package/dist/generators/profiles/indonesian.d.ts.map +1 -0
  167. package/dist/generators/profiles/italian.d.ts +10 -0
  168. package/dist/generators/profiles/italian.d.ts.map +1 -0
  169. package/dist/generators/profiles/japanese.d.ts +9 -0
  170. package/dist/generators/profiles/japanese.d.ts.map +1 -0
  171. package/dist/generators/profiles/korean.d.ts +9 -0
  172. package/dist/generators/profiles/korean.d.ts.map +1 -0
  173. package/dist/generators/profiles/marker-templates.d.ts +119 -0
  174. package/dist/generators/profiles/marker-templates.d.ts.map +1 -0
  175. package/dist/generators/profiles/ms.d.ts +8 -0
  176. package/dist/generators/profiles/ms.d.ts.map +1 -0
  177. package/dist/generators/profiles/polish.d.ts +10 -0
  178. package/dist/generators/profiles/polish.d.ts.map +1 -0
  179. package/dist/generators/profiles/portuguese.d.ts +9 -0
  180. package/dist/generators/profiles/portuguese.d.ts.map +1 -0
  181. package/dist/generators/profiles/quechua.d.ts +9 -0
  182. package/dist/generators/profiles/quechua.d.ts.map +1 -0
  183. package/dist/generators/profiles/russian.d.ts +10 -0
  184. package/dist/generators/profiles/russian.d.ts.map +1 -0
  185. package/dist/generators/profiles/spanish.d.ts +9 -0
  186. package/dist/generators/profiles/spanish.d.ts.map +1 -0
  187. package/dist/generators/profiles/spanishMexico.d.ts +19 -0
  188. package/dist/generators/profiles/spanishMexico.d.ts.map +1 -0
  189. package/dist/generators/profiles/swahili.d.ts +9 -0
  190. package/dist/generators/profiles/swahili.d.ts.map +1 -0
  191. package/dist/generators/profiles/thai.d.ts +9 -0
  192. package/dist/generators/profiles/thai.d.ts.map +1 -0
  193. package/dist/generators/profiles/tl.d.ts +8 -0
  194. package/dist/generators/profiles/tl.d.ts.map +1 -0
  195. package/dist/generators/profiles/turkish.d.ts +9 -0
  196. package/dist/generators/profiles/turkish.d.ts.map +1 -0
  197. package/dist/generators/profiles/types.d.ts +170 -0
  198. package/dist/generators/profiles/types.d.ts.map +1 -0
  199. package/dist/generators/profiles/ukrainian.d.ts +10 -0
  200. package/dist/generators/profiles/ukrainian.d.ts.map +1 -0
  201. package/dist/generators/profiles/vietnamese.d.ts +10 -0
  202. package/dist/generators/profiles/vietnamese.d.ts.map +1 -0
  203. package/dist/generators/schema-error-codes.d.ts +60 -0
  204. package/dist/generators/schema-error-codes.d.ts.map +1 -0
  205. package/dist/generators/schema-validator.d.ts +77 -0
  206. package/dist/generators/schema-validator.d.ts.map +1 -0
  207. package/dist/index.cjs +5451 -2522
  208. package/dist/index.cjs.map +1 -1
  209. package/dist/index.d.ts +50 -3436
  210. package/dist/index.d.ts.map +1 -0
  211. package/dist/index.js +5448 -2526
  212. package/dist/index.js.map +1 -1
  213. package/dist/interchange/from-semantic.d.ts +23 -0
  214. package/dist/interchange/from-semantic.d.ts.map +1 -0
  215. package/dist/interchange/index.d.ts +7 -0
  216. package/dist/interchange/index.d.ts.map +1 -0
  217. package/dist/interchange/types.d.ts +132 -0
  218. package/dist/interchange/types.d.ts.map +1 -0
  219. package/dist/language-building-schema.d.ts +163 -0
  220. package/dist/language-building-schema.d.ts.map +1 -0
  221. package/dist/language-loader.d.ts +126 -0
  222. package/dist/language-loader.d.ts.map +1 -0
  223. package/dist/languages/_all.d.ts +66 -0
  224. package/dist/languages/_all.d.ts.map +1 -0
  225. package/dist/languages/ar.d.ts +6 -75
  226. package/dist/languages/ar.d.ts.map +1 -0
  227. package/dist/languages/ar.js +65 -14
  228. package/dist/languages/ar.js.map +1 -1
  229. package/dist/languages/bn.d.ts +10 -0
  230. package/dist/languages/bn.d.ts.map +1 -0
  231. package/dist/languages/bn.js +1163 -0
  232. package/dist/languages/bn.js.map +1 -0
  233. package/dist/languages/de.d.ts +6 -35
  234. package/dist/languages/de.d.ts.map +1 -0
  235. package/dist/languages/de.js +260 -22
  236. package/dist/languages/de.js.map +1 -1
  237. package/dist/languages/en.d.ts +13 -40
  238. package/dist/languages/en.d.ts.map +1 -0
  239. package/dist/languages/en.js +788 -241
  240. package/dist/languages/en.js.map +1 -1
  241. package/dist/languages/es-MX.d.ts +24 -0
  242. package/dist/languages/es-MX.d.ts.map +1 -0
  243. package/dist/languages/es-MX.js +1729 -0
  244. package/dist/languages/es-MX.js.map +1 -0
  245. package/dist/languages/es.d.ts +6 -49
  246. package/dist/languages/es.d.ts.map +1 -0
  247. package/dist/languages/es.js +60 -13
  248. package/dist/languages/es.js.map +1 -1
  249. package/dist/languages/fr.d.ts +6 -34
  250. package/dist/languages/fr.d.ts.map +1 -0
  251. package/dist/languages/fr.js +309 -22
  252. package/dist/languages/fr.js.map +1 -1
  253. package/dist/languages/he.d.ts +9 -0
  254. package/dist/languages/he.d.ts.map +1 -0
  255. package/dist/languages/he.js +1378 -0
  256. package/dist/languages/he.js.map +1 -0
  257. package/dist/languages/hi.d.ts +18 -0
  258. package/dist/languages/hi.d.ts.map +1 -0
  259. package/dist/languages/hi.js +1209 -0
  260. package/dist/languages/hi.js.map +1 -0
  261. package/dist/languages/id.d.ts +6 -32
  262. package/dist/languages/id.d.ts.map +1 -0
  263. package/dist/languages/id.js +60 -13
  264. package/dist/languages/id.js.map +1 -1
  265. package/dist/languages/index.d.ts +18 -0
  266. package/dist/languages/index.d.ts.map +1 -0
  267. package/dist/languages/it.d.ts +9 -0
  268. package/dist/languages/it.d.ts.map +1 -0
  269. package/dist/languages/it.js +1647 -0
  270. package/dist/languages/it.js.map +1 -0
  271. package/dist/languages/ja.d.ts +6 -50
  272. package/dist/languages/ja.d.ts.map +1 -0
  273. package/dist/languages/ja.js +60 -13
  274. package/dist/languages/ja.js.map +1 -1
  275. package/dist/languages/ko.d.ts +6 -55
  276. package/dist/languages/ko.d.ts.map +1 -0
  277. package/dist/languages/ko.js +64 -13
  278. package/dist/languages/ko.js.map +1 -1
  279. package/dist/languages/ms.d.ts +10 -0
  280. package/dist/languages/ms.d.ts.map +1 -0
  281. package/dist/languages/ms.js +1088 -0
  282. package/dist/languages/ms.js.map +1 -0
  283. package/dist/languages/pl.d.ts +12 -0
  284. package/dist/languages/pl.d.ts.map +1 -0
  285. package/dist/languages/pl.js +1586 -0
  286. package/dist/languages/pl.js.map +1 -0
  287. package/dist/languages/pt.d.ts +6 -34
  288. package/dist/languages/pt.d.ts.map +1 -0
  289. package/dist/languages/pt.js +344 -22
  290. package/dist/languages/pt.js.map +1 -1
  291. package/dist/languages/qu.d.ts +6 -44
  292. package/dist/languages/qu.d.ts.map +1 -0
  293. package/dist/languages/qu.js +105 -28
  294. package/dist/languages/qu.js.map +1 -1
  295. package/dist/languages/ru.d.ts +18 -0
  296. package/dist/languages/ru.d.ts.map +1 -0
  297. package/dist/languages/ru.js +1705 -0
  298. package/dist/languages/ru.js.map +1 -0
  299. package/dist/languages/sw.d.ts +6 -32
  300. package/dist/languages/sw.d.ts.map +1 -0
  301. package/dist/languages/sw.js +69 -17
  302. package/dist/languages/sw.js.map +1 -1
  303. package/dist/languages/th.d.ts +10 -0
  304. package/dist/languages/th.d.ts.map +1 -0
  305. package/dist/languages/th.js +1123 -0
  306. package/dist/languages/th.js.map +1 -0
  307. package/dist/languages/tl.d.ts +10 -0
  308. package/dist/languages/tl.d.ts.map +1 -0
  309. package/dist/languages/tl.js +1086 -0
  310. package/dist/languages/tl.js.map +1 -0
  311. package/dist/languages/tr.d.ts +6 -50
  312. package/dist/languages/tr.d.ts.map +1 -0
  313. package/dist/languages/tr.js +67 -16
  314. package/dist/languages/tr.js.map +1 -1
  315. package/dist/languages/uk.d.ts +18 -0
  316. package/dist/languages/uk.d.ts.map +1 -0
  317. package/dist/languages/uk.js +1691 -0
  318. package/dist/languages/uk.js.map +1 -0
  319. package/dist/languages/vi.d.ts +10 -0
  320. package/dist/languages/vi.d.ts.map +1 -0
  321. package/dist/languages/vi.js +1266 -0
  322. package/dist/languages/vi.js.map +1 -0
  323. package/dist/languages/zh.d.ts +6 -55
  324. package/dist/languages/zh.d.ts.map +1 -0
  325. package/dist/languages/zh.js +59 -13
  326. package/dist/languages/zh.js.map +1 -1
  327. package/dist/parser/index.d.ts +8 -0
  328. package/dist/parser/index.d.ts.map +1 -0
  329. package/dist/parser/pattern-matcher.d.ts +188 -0
  330. package/dist/parser/pattern-matcher.d.ts.map +1 -0
  331. package/dist/parser/semantic-parser.d.ts +238 -0
  332. package/dist/parser/semantic-parser.d.ts.map +1 -0
  333. package/dist/parser/utils/index.d.ts +9 -0
  334. package/dist/parser/utils/index.d.ts.map +1 -0
  335. package/dist/parser/utils/marker-resolution.d.ts +57 -0
  336. package/dist/parser/utils/marker-resolution.d.ts.map +1 -0
  337. package/dist/parser/utils/possessive-keywords.d.ts +31 -0
  338. package/dist/parser/utils/possessive-keywords.d.ts.map +1 -0
  339. package/dist/parser/utils/role-positioning.d.ts +42 -0
  340. package/dist/parser/utils/role-positioning.d.ts.map +1 -0
  341. package/dist/parser/utils/type-validation.d.ts +63 -0
  342. package/dist/parser/utils/type-validation.d.ts.map +1 -0
  343. package/dist/patterns/add/ar.d.ts +12 -0
  344. package/dist/patterns/add/ar.d.ts.map +1 -0
  345. package/dist/patterns/add/bn.d.ts +8 -0
  346. package/dist/patterns/add/bn.d.ts.map +1 -0
  347. package/dist/patterns/add/hi.d.ts +8 -0
  348. package/dist/patterns/add/hi.d.ts.map +1 -0
  349. package/dist/patterns/add/index.d.ts +31 -0
  350. package/dist/patterns/add/index.d.ts.map +1 -0
  351. package/dist/patterns/add/it.d.ts +11 -0
  352. package/dist/patterns/add/it.d.ts.map +1 -0
  353. package/dist/patterns/add/ja.d.ts +12 -0
  354. package/dist/patterns/add/ja.d.ts.map +1 -0
  355. package/dist/patterns/add/ko.d.ts +12 -0
  356. package/dist/patterns/add/ko.d.ts.map +1 -0
  357. package/dist/patterns/add/pl.d.ts +12 -0
  358. package/dist/patterns/add/pl.d.ts.map +1 -0
  359. package/dist/patterns/add/qu.d.ts +9 -0
  360. package/dist/patterns/add/qu.d.ts.map +1 -0
  361. package/dist/patterns/add/ru.d.ts +12 -0
  362. package/dist/patterns/add/ru.d.ts.map +1 -0
  363. package/dist/patterns/add/th.d.ts +8 -0
  364. package/dist/patterns/add/th.d.ts.map +1 -0
  365. package/dist/patterns/add/tr.d.ts +12 -0
  366. package/dist/patterns/add/tr.d.ts.map +1 -0
  367. package/dist/patterns/add/uk.d.ts +12 -0
  368. package/dist/patterns/add/uk.d.ts.map +1 -0
  369. package/dist/patterns/add/vi.d.ts +11 -0
  370. package/dist/patterns/add/vi.d.ts.map +1 -0
  371. package/dist/patterns/add/zh.d.ts +12 -0
  372. package/dist/patterns/add/zh.d.ts.map +1 -0
  373. package/dist/patterns/builders.d.ts +52 -0
  374. package/dist/patterns/builders.d.ts.map +1 -0
  375. package/dist/patterns/decrement/bn.d.ts +8 -0
  376. package/dist/patterns/decrement/bn.d.ts.map +1 -0
  377. package/dist/patterns/decrement/de.d.ts +12 -0
  378. package/dist/patterns/decrement/de.d.ts.map +1 -0
  379. package/dist/patterns/decrement/hi.d.ts +8 -0
  380. package/dist/patterns/decrement/hi.d.ts.map +1 -0
  381. package/dist/patterns/decrement/index.d.ts +28 -0
  382. package/dist/patterns/decrement/index.d.ts.map +1 -0
  383. package/dist/patterns/decrement/it.d.ts +11 -0
  384. package/dist/patterns/decrement/it.d.ts.map +1 -0
  385. package/dist/patterns/decrement/pl.d.ts +12 -0
  386. package/dist/patterns/decrement/pl.d.ts.map +1 -0
  387. package/dist/patterns/decrement/ru.d.ts +12 -0
  388. package/dist/patterns/decrement/ru.d.ts.map +1 -0
  389. package/dist/patterns/decrement/th.d.ts +8 -0
  390. package/dist/patterns/decrement/th.d.ts.map +1 -0
  391. package/dist/patterns/decrement/tr.d.ts +12 -0
  392. package/dist/patterns/decrement/tr.d.ts.map +1 -0
  393. package/dist/patterns/decrement/uk.d.ts +12 -0
  394. package/dist/patterns/decrement/uk.d.ts.map +1 -0
  395. package/dist/patterns/decrement/vi.d.ts +11 -0
  396. package/dist/patterns/decrement/vi.d.ts.map +1 -0
  397. package/dist/patterns/decrement/zh.d.ts +12 -0
  398. package/dist/patterns/decrement/zh.d.ts.map +1 -0
  399. package/dist/patterns/en.d.ts +13 -0
  400. package/dist/patterns/en.d.ts.map +1 -0
  401. package/dist/patterns/event-handler/ar.d.ts +12 -0
  402. package/dist/patterns/event-handler/ar.d.ts.map +1 -0
  403. package/dist/patterns/event-handler/bn.d.ts +8 -0
  404. package/dist/patterns/event-handler/bn.d.ts.map +1 -0
  405. package/dist/patterns/event-handler/de.d.ts +11 -0
  406. package/dist/patterns/event-handler/de.d.ts.map +1 -0
  407. package/dist/patterns/event-handler/en.d.ts +11 -0
  408. package/dist/patterns/event-handler/en.d.ts.map +1 -0
  409. package/dist/patterns/event-handler/es.d.ts +11 -0
  410. package/dist/patterns/event-handler/es.d.ts.map +1 -0
  411. package/dist/patterns/event-handler/fr.d.ts +11 -0
  412. package/dist/patterns/event-handler/fr.d.ts.map +1 -0
  413. package/dist/patterns/event-handler/he.d.ts +12 -0
  414. package/dist/patterns/event-handler/he.d.ts.map +1 -0
  415. package/dist/patterns/event-handler/hi.d.ts +9 -0
  416. package/dist/patterns/event-handler/hi.d.ts.map +1 -0
  417. package/dist/patterns/event-handler/id.d.ts +11 -0
  418. package/dist/patterns/event-handler/id.d.ts.map +1 -0
  419. package/dist/patterns/event-handler/index.d.ts +41 -0
  420. package/dist/patterns/event-handler/index.d.ts.map +1 -0
  421. package/dist/patterns/event-handler/it.d.ts +11 -0
  422. package/dist/patterns/event-handler/it.d.ts.map +1 -0
  423. package/dist/patterns/event-handler/ja.d.ts +12 -0
  424. package/dist/patterns/event-handler/ja.d.ts.map +1 -0
  425. package/dist/patterns/event-handler/ko.d.ts +12 -0
  426. package/dist/patterns/event-handler/ko.d.ts.map +1 -0
  427. package/dist/patterns/event-handler/ms.d.ts +14 -0
  428. package/dist/patterns/event-handler/ms.d.ts.map +1 -0
  429. package/dist/patterns/event-handler/pl.d.ts +12 -0
  430. package/dist/patterns/event-handler/pl.d.ts.map +1 -0
  431. package/dist/patterns/event-handler/pt.d.ts +11 -0
  432. package/dist/patterns/event-handler/pt.d.ts.map +1 -0
  433. package/dist/patterns/event-handler/qu.d.ts +11 -0
  434. package/dist/patterns/event-handler/qu.d.ts.map +1 -0
  435. package/dist/patterns/event-handler/ru.d.ts +12 -0
  436. package/dist/patterns/event-handler/ru.d.ts.map +1 -0
  437. package/dist/patterns/event-handler/shared.d.ts +15 -0
  438. package/dist/patterns/event-handler/shared.d.ts.map +1 -0
  439. package/dist/patterns/event-handler/sw.d.ts +11 -0
  440. package/dist/patterns/event-handler/sw.d.ts.map +1 -0
  441. package/dist/patterns/event-handler/th.d.ts +8 -0
  442. package/dist/patterns/event-handler/th.d.ts.map +1 -0
  443. package/dist/patterns/event-handler/tl.d.ts +9 -0
  444. package/dist/patterns/event-handler/tl.d.ts.map +1 -0
  445. package/dist/patterns/event-handler/tr.d.ts +12 -0
  446. package/dist/patterns/event-handler/tr.d.ts.map +1 -0
  447. package/dist/patterns/event-handler/uk.d.ts +12 -0
  448. package/dist/patterns/event-handler/uk.d.ts.map +1 -0
  449. package/dist/patterns/event-handler/vi.d.ts +11 -0
  450. package/dist/patterns/event-handler/vi.d.ts.map +1 -0
  451. package/dist/patterns/event-handler/zh.d.ts +11 -0
  452. package/dist/patterns/event-handler/zh.d.ts.map +1 -0
  453. package/dist/patterns/get/ar.d.ts +12 -0
  454. package/dist/patterns/get/ar.d.ts.map +1 -0
  455. package/dist/patterns/get/bn.d.ts +8 -0
  456. package/dist/patterns/get/bn.d.ts.map +1 -0
  457. package/dist/patterns/get/de.d.ts +12 -0
  458. package/dist/patterns/get/de.d.ts.map +1 -0
  459. package/dist/patterns/get/hi.d.ts +8 -0
  460. package/dist/patterns/get/hi.d.ts.map +1 -0
  461. package/dist/patterns/get/index.d.ts +29 -0
  462. package/dist/patterns/get/index.d.ts.map +1 -0
  463. package/dist/patterns/get/it.d.ts +11 -0
  464. package/dist/patterns/get/it.d.ts.map +1 -0
  465. package/dist/patterns/get/ja.d.ts +12 -0
  466. package/dist/patterns/get/ja.d.ts.map +1 -0
  467. package/dist/patterns/get/ko.d.ts +12 -0
  468. package/dist/patterns/get/ko.d.ts.map +1 -0
  469. package/dist/patterns/get/pl.d.ts +12 -0
  470. package/dist/patterns/get/pl.d.ts.map +1 -0
  471. package/dist/patterns/get/ru.d.ts +12 -0
  472. package/dist/patterns/get/ru.d.ts.map +1 -0
  473. package/dist/patterns/get/th.d.ts +8 -0
  474. package/dist/patterns/get/th.d.ts.map +1 -0
  475. package/dist/patterns/get/uk.d.ts +12 -0
  476. package/dist/patterns/get/uk.d.ts.map +1 -0
  477. package/dist/patterns/get/vi.d.ts +11 -0
  478. package/dist/patterns/get/vi.d.ts.map +1 -0
  479. package/dist/patterns/grammar-transformed/index.d.ts +20 -0
  480. package/dist/patterns/grammar-transformed/index.d.ts.map +1 -0
  481. package/dist/patterns/grammar-transformed/ja.d.ts +12 -0
  482. package/dist/patterns/grammar-transformed/ja.d.ts.map +1 -0
  483. package/dist/patterns/grammar-transformed/ko.d.ts +12 -0
  484. package/dist/patterns/grammar-transformed/ko.d.ts.map +1 -0
  485. package/dist/patterns/grammar-transformed/tr.d.ts +12 -0
  486. package/dist/patterns/grammar-transformed/tr.d.ts.map +1 -0
  487. package/dist/patterns/hide/ar.d.ts +12 -0
  488. package/dist/patterns/hide/ar.d.ts.map +1 -0
  489. package/dist/patterns/hide/bn.d.ts +8 -0
  490. package/dist/patterns/hide/bn.d.ts.map +1 -0
  491. package/dist/patterns/hide/de.d.ts +12 -0
  492. package/dist/patterns/hide/de.d.ts.map +1 -0
  493. package/dist/patterns/hide/hi.d.ts +8 -0
  494. package/dist/patterns/hide/hi.d.ts.map +1 -0
  495. package/dist/patterns/hide/index.d.ts +31 -0
  496. package/dist/patterns/hide/index.d.ts.map +1 -0
  497. package/dist/patterns/hide/it.d.ts +11 -0
  498. package/dist/patterns/hide/it.d.ts.map +1 -0
  499. package/dist/patterns/hide/ja.d.ts +12 -0
  500. package/dist/patterns/hide/ja.d.ts.map +1 -0
  501. package/dist/patterns/hide/ko.d.ts +12 -0
  502. package/dist/patterns/hide/ko.d.ts.map +1 -0
  503. package/dist/patterns/hide/pl.d.ts +12 -0
  504. package/dist/patterns/hide/pl.d.ts.map +1 -0
  505. package/dist/patterns/hide/ru.d.ts +12 -0
  506. package/dist/patterns/hide/ru.d.ts.map +1 -0
  507. package/dist/patterns/hide/th.d.ts +8 -0
  508. package/dist/patterns/hide/th.d.ts.map +1 -0
  509. package/dist/patterns/hide/tr.d.ts +12 -0
  510. package/dist/patterns/hide/tr.d.ts.map +1 -0
  511. package/dist/patterns/hide/uk.d.ts +12 -0
  512. package/dist/patterns/hide/uk.d.ts.map +1 -0
  513. package/dist/patterns/hide/vi.d.ts +11 -0
  514. package/dist/patterns/hide/vi.d.ts.map +1 -0
  515. package/dist/patterns/hide/zh.d.ts +12 -0
  516. package/dist/patterns/hide/zh.d.ts.map +1 -0
  517. package/dist/patterns/increment/bn.d.ts +8 -0
  518. package/dist/patterns/increment/bn.d.ts.map +1 -0
  519. package/dist/patterns/increment/de.d.ts +12 -0
  520. package/dist/patterns/increment/de.d.ts.map +1 -0
  521. package/dist/patterns/increment/hi.d.ts +8 -0
  522. package/dist/patterns/increment/hi.d.ts.map +1 -0
  523. package/dist/patterns/increment/index.d.ts +28 -0
  524. package/dist/patterns/increment/index.d.ts.map +1 -0
  525. package/dist/patterns/increment/it.d.ts +11 -0
  526. package/dist/patterns/increment/it.d.ts.map +1 -0
  527. package/dist/patterns/increment/pl.d.ts +12 -0
  528. package/dist/patterns/increment/pl.d.ts.map +1 -0
  529. package/dist/patterns/increment/ru.d.ts +12 -0
  530. package/dist/patterns/increment/ru.d.ts.map +1 -0
  531. package/dist/patterns/increment/th.d.ts +8 -0
  532. package/dist/patterns/increment/th.d.ts.map +1 -0
  533. package/dist/patterns/increment/tr.d.ts +12 -0
  534. package/dist/patterns/increment/tr.d.ts.map +1 -0
  535. package/dist/patterns/increment/uk.d.ts +12 -0
  536. package/dist/patterns/increment/uk.d.ts.map +1 -0
  537. package/dist/patterns/increment/vi.d.ts +11 -0
  538. package/dist/patterns/increment/vi.d.ts.map +1 -0
  539. package/dist/patterns/increment/zh.d.ts +12 -0
  540. package/dist/patterns/increment/zh.d.ts.map +1 -0
  541. package/dist/patterns/index.d.ts +21 -0
  542. package/dist/patterns/index.d.ts.map +1 -0
  543. package/dist/patterns/languages/en/control-flow.d.ts +40 -0
  544. package/dist/patterns/languages/en/control-flow.d.ts.map +1 -0
  545. package/dist/patterns/languages/en/fetch.d.ts +22 -0
  546. package/dist/patterns/languages/en/fetch.d.ts.map +1 -0
  547. package/dist/patterns/languages/en/index.d.ts +22 -0
  548. package/dist/patterns/languages/en/index.d.ts.map +1 -0
  549. package/dist/patterns/languages/en/repeat.d.ts +22 -0
  550. package/dist/patterns/languages/en/repeat.d.ts.map +1 -0
  551. package/dist/patterns/languages/en/set.d.ts +23 -0
  552. package/dist/patterns/languages/en/set.d.ts.map +1 -0
  553. package/dist/patterns/languages/en/swap.d.ts +19 -0
  554. package/dist/patterns/languages/en/swap.d.ts.map +1 -0
  555. package/dist/patterns/languages/en/temporal.d.ts +24 -0
  556. package/dist/patterns/languages/en/temporal.d.ts.map +1 -0
  557. package/dist/patterns/put/ar.d.ts +12 -0
  558. package/dist/patterns/put/ar.d.ts.map +1 -0
  559. package/dist/patterns/put/bn.d.ts +8 -0
  560. package/dist/patterns/put/bn.d.ts.map +1 -0
  561. package/dist/patterns/put/en.d.ts +11 -0
  562. package/dist/patterns/put/en.d.ts.map +1 -0
  563. package/dist/patterns/put/es.d.ts +11 -0
  564. package/dist/patterns/put/es.d.ts.map +1 -0
  565. package/dist/patterns/put/hi.d.ts +8 -0
  566. package/dist/patterns/put/hi.d.ts.map +1 -0
  567. package/dist/patterns/put/id.d.ts +15 -0
  568. package/dist/patterns/put/id.d.ts.map +1 -0
  569. package/dist/patterns/put/index.d.ts +33 -0
  570. package/dist/patterns/put/index.d.ts.map +1 -0
  571. package/dist/patterns/put/it.d.ts +11 -0
  572. package/dist/patterns/put/it.d.ts.map +1 -0
  573. package/dist/patterns/put/ja.d.ts +12 -0
  574. package/dist/patterns/put/ja.d.ts.map +1 -0
  575. package/dist/patterns/put/ko.d.ts +12 -0
  576. package/dist/patterns/put/ko.d.ts.map +1 -0
  577. package/dist/patterns/put/pl.d.ts +12 -0
  578. package/dist/patterns/put/pl.d.ts.map +1 -0
  579. package/dist/patterns/put/ru.d.ts +12 -0
  580. package/dist/patterns/put/ru.d.ts.map +1 -0
  581. package/dist/patterns/put/th.d.ts +8 -0
  582. package/dist/patterns/put/th.d.ts.map +1 -0
  583. package/dist/patterns/put/tr.d.ts +12 -0
  584. package/dist/patterns/put/tr.d.ts.map +1 -0
  585. package/dist/patterns/put/uk.d.ts +12 -0
  586. package/dist/patterns/put/uk.d.ts.map +1 -0
  587. package/dist/patterns/put/vi.d.ts +11 -0
  588. package/dist/patterns/put/vi.d.ts.map +1 -0
  589. package/dist/patterns/put/zh.d.ts +12 -0
  590. package/dist/patterns/put/zh.d.ts.map +1 -0
  591. package/dist/patterns/registry.d.ts +53 -0
  592. package/dist/patterns/registry.d.ts.map +1 -0
  593. package/dist/patterns/remove/ar.d.ts +12 -0
  594. package/dist/patterns/remove/ar.d.ts.map +1 -0
  595. package/dist/patterns/remove/bn.d.ts +8 -0
  596. package/dist/patterns/remove/bn.d.ts.map +1 -0
  597. package/dist/patterns/remove/hi.d.ts +8 -0
  598. package/dist/patterns/remove/hi.d.ts.map +1 -0
  599. package/dist/patterns/remove/index.d.ts +31 -0
  600. package/dist/patterns/remove/index.d.ts.map +1 -0
  601. package/dist/patterns/remove/it.d.ts +11 -0
  602. package/dist/patterns/remove/it.d.ts.map +1 -0
  603. package/dist/patterns/remove/ja.d.ts +12 -0
  604. package/dist/patterns/remove/ja.d.ts.map +1 -0
  605. package/dist/patterns/remove/ko.d.ts +12 -0
  606. package/dist/patterns/remove/ko.d.ts.map +1 -0
  607. package/dist/patterns/remove/pl.d.ts +12 -0
  608. package/dist/patterns/remove/pl.d.ts.map +1 -0
  609. package/dist/patterns/remove/qu.d.ts +9 -0
  610. package/dist/patterns/remove/qu.d.ts.map +1 -0
  611. package/dist/patterns/remove/ru.d.ts +12 -0
  612. package/dist/patterns/remove/ru.d.ts.map +1 -0
  613. package/dist/patterns/remove/th.d.ts +8 -0
  614. package/dist/patterns/remove/th.d.ts.map +1 -0
  615. package/dist/patterns/remove/tr.d.ts +12 -0
  616. package/dist/patterns/remove/tr.d.ts.map +1 -0
  617. package/dist/patterns/remove/uk.d.ts +12 -0
  618. package/dist/patterns/remove/uk.d.ts.map +1 -0
  619. package/dist/patterns/remove/vi.d.ts +11 -0
  620. package/dist/patterns/remove/vi.d.ts.map +1 -0
  621. package/dist/patterns/remove/zh.d.ts +12 -0
  622. package/dist/patterns/remove/zh.d.ts.map +1 -0
  623. package/dist/patterns/set/ar.d.ts +12 -0
  624. package/dist/patterns/set/ar.d.ts.map +1 -0
  625. package/dist/patterns/set/bn.d.ts +8 -0
  626. package/dist/patterns/set/bn.d.ts.map +1 -0
  627. package/dist/patterns/set/de.d.ts +12 -0
  628. package/dist/patterns/set/de.d.ts.map +1 -0
  629. package/dist/patterns/set/es.d.ts +12 -0
  630. package/dist/patterns/set/es.d.ts.map +1 -0
  631. package/dist/patterns/set/fr.d.ts +12 -0
  632. package/dist/patterns/set/fr.d.ts.map +1 -0
  633. package/dist/patterns/set/hi.d.ts +8 -0
  634. package/dist/patterns/set/hi.d.ts.map +1 -0
  635. package/dist/patterns/set/id.d.ts +12 -0
  636. package/dist/patterns/set/id.d.ts.map +1 -0
  637. package/dist/patterns/set/index.d.ts +35 -0
  638. package/dist/patterns/set/index.d.ts.map +1 -0
  639. package/dist/patterns/set/it.d.ts +11 -0
  640. package/dist/patterns/set/it.d.ts.map +1 -0
  641. package/dist/patterns/set/ja.d.ts +12 -0
  642. package/dist/patterns/set/ja.d.ts.map +1 -0
  643. package/dist/patterns/set/ko.d.ts +12 -0
  644. package/dist/patterns/set/ko.d.ts.map +1 -0
  645. package/dist/patterns/set/pl.d.ts +12 -0
  646. package/dist/patterns/set/pl.d.ts.map +1 -0
  647. package/dist/patterns/set/pt.d.ts +12 -0
  648. package/dist/patterns/set/pt.d.ts.map +1 -0
  649. package/dist/patterns/set/ru.d.ts +12 -0
  650. package/dist/patterns/set/ru.d.ts.map +1 -0
  651. package/dist/patterns/set/th.d.ts +8 -0
  652. package/dist/patterns/set/th.d.ts.map +1 -0
  653. package/dist/patterns/set/tr.d.ts +12 -0
  654. package/dist/patterns/set/tr.d.ts.map +1 -0
  655. package/dist/patterns/set/uk.d.ts +12 -0
  656. package/dist/patterns/set/uk.d.ts.map +1 -0
  657. package/dist/patterns/set/vi.d.ts +11 -0
  658. package/dist/patterns/set/vi.d.ts.map +1 -0
  659. package/dist/patterns/set/zh.d.ts +12 -0
  660. package/dist/patterns/set/zh.d.ts.map +1 -0
  661. package/dist/patterns/show/ar.d.ts +12 -0
  662. package/dist/patterns/show/ar.d.ts.map +1 -0
  663. package/dist/patterns/show/bn.d.ts +8 -0
  664. package/dist/patterns/show/bn.d.ts.map +1 -0
  665. package/dist/patterns/show/de.d.ts +12 -0
  666. package/dist/patterns/show/de.d.ts.map +1 -0
  667. package/dist/patterns/show/fr.d.ts +12 -0
  668. package/dist/patterns/show/fr.d.ts.map +1 -0
  669. package/dist/patterns/show/hi.d.ts +8 -0
  670. package/dist/patterns/show/hi.d.ts.map +1 -0
  671. package/dist/patterns/show/index.d.ts +32 -0
  672. package/dist/patterns/show/index.d.ts.map +1 -0
  673. package/dist/patterns/show/it.d.ts +11 -0
  674. package/dist/patterns/show/it.d.ts.map +1 -0
  675. package/dist/patterns/show/ja.d.ts +12 -0
  676. package/dist/patterns/show/ja.d.ts.map +1 -0
  677. package/dist/patterns/show/ko.d.ts +12 -0
  678. package/dist/patterns/show/ko.d.ts.map +1 -0
  679. package/dist/patterns/show/pl.d.ts +12 -0
  680. package/dist/patterns/show/pl.d.ts.map +1 -0
  681. package/dist/patterns/show/ru.d.ts +12 -0
  682. package/dist/patterns/show/ru.d.ts.map +1 -0
  683. package/dist/patterns/show/th.d.ts +8 -0
  684. package/dist/patterns/show/th.d.ts.map +1 -0
  685. package/dist/patterns/show/tr.d.ts +12 -0
  686. package/dist/patterns/show/tr.d.ts.map +1 -0
  687. package/dist/patterns/show/uk.d.ts +12 -0
  688. package/dist/patterns/show/uk.d.ts.map +1 -0
  689. package/dist/patterns/show/vi.d.ts +11 -0
  690. package/dist/patterns/show/vi.d.ts.map +1 -0
  691. package/dist/patterns/show/zh.d.ts +12 -0
  692. package/dist/patterns/show/zh.d.ts.map +1 -0
  693. package/dist/patterns/take/ar.d.ts +12 -0
  694. package/dist/patterns/take/ar.d.ts.map +1 -0
  695. package/dist/patterns/take/index.d.ts +18 -0
  696. package/dist/patterns/take/index.d.ts.map +1 -0
  697. package/dist/patterns/toggle/ar.d.ts +12 -0
  698. package/dist/patterns/toggle/ar.d.ts.map +1 -0
  699. package/dist/patterns/toggle/bn.d.ts +8 -0
  700. package/dist/patterns/toggle/bn.d.ts.map +1 -0
  701. package/dist/patterns/toggle/en.d.ts +11 -0
  702. package/dist/patterns/toggle/en.d.ts.map +1 -0
  703. package/dist/patterns/toggle/es.d.ts +11 -0
  704. package/dist/patterns/toggle/es.d.ts.map +1 -0
  705. package/dist/patterns/toggle/hi.d.ts +9 -0
  706. package/dist/patterns/toggle/hi.d.ts.map +1 -0
  707. package/dist/patterns/toggle/index.d.ts +33 -0
  708. package/dist/patterns/toggle/index.d.ts.map +1 -0
  709. package/dist/patterns/toggle/it.d.ts +11 -0
  710. package/dist/patterns/toggle/it.d.ts.map +1 -0
  711. package/dist/patterns/toggle/ja.d.ts +12 -0
  712. package/dist/patterns/toggle/ja.d.ts.map +1 -0
  713. package/dist/patterns/toggle/ko.d.ts +12 -0
  714. package/dist/patterns/toggle/ko.d.ts.map +1 -0
  715. package/dist/patterns/toggle/pl.d.ts +12 -0
  716. package/dist/patterns/toggle/pl.d.ts.map +1 -0
  717. package/dist/patterns/toggle/qu.d.ts +9 -0
  718. package/dist/patterns/toggle/qu.d.ts.map +1 -0
  719. package/dist/patterns/toggle/ru.d.ts +12 -0
  720. package/dist/patterns/toggle/ru.d.ts.map +1 -0
  721. package/dist/patterns/toggle/th.d.ts +9 -0
  722. package/dist/patterns/toggle/th.d.ts.map +1 -0
  723. package/dist/patterns/toggle/tr.d.ts +12 -0
  724. package/dist/patterns/toggle/tr.d.ts.map +1 -0
  725. package/dist/patterns/toggle/uk.d.ts +12 -0
  726. package/dist/patterns/toggle/uk.d.ts.map +1 -0
  727. package/dist/patterns/toggle/vi.d.ts +11 -0
  728. package/dist/patterns/toggle/vi.d.ts.map +1 -0
  729. package/dist/patterns/toggle/zh.d.ts +11 -0
  730. package/dist/patterns/toggle/zh.d.ts.map +1 -0
  731. package/dist/public-api.d.ts +190 -0
  732. package/dist/public-api.d.ts.map +1 -0
  733. package/dist/registry.d.ts +225 -0
  734. package/dist/registry.d.ts.map +1 -0
  735. package/dist/tokenizers/arabic.d.ts +67 -0
  736. package/dist/tokenizers/arabic.d.ts.map +1 -0
  737. package/dist/tokenizers/base-tokenizer.d.ts +240 -0
  738. package/dist/tokenizers/base-tokenizer.d.ts.map +1 -0
  739. package/dist/tokenizers/base.d.ts +14 -0
  740. package/dist/tokenizers/base.d.ts.map +1 -0
  741. package/dist/tokenizers/bengali.d.ts +22 -0
  742. package/dist/tokenizers/bengali.d.ts.map +1 -0
  743. package/dist/tokenizers/char-classifiers.d.ts +56 -0
  744. package/dist/tokenizers/char-classifiers.d.ts.map +1 -0
  745. package/dist/tokenizers/chinese.d.ts +47 -0
  746. package/dist/tokenizers/chinese.d.ts.map +1 -0
  747. package/dist/tokenizers/english.d.ts +34 -0
  748. package/dist/tokenizers/english.d.ts.map +1 -0
  749. package/dist/tokenizers/extractors.d.ts +61 -0
  750. package/dist/tokenizers/extractors.d.ts.map +1 -0
  751. package/dist/tokenizers/french.d.ts +26 -0
  752. package/dist/tokenizers/french.d.ts.map +1 -0
  753. package/dist/tokenizers/german.d.ts +27 -0
  754. package/dist/tokenizers/german.d.ts.map +1 -0
  755. package/dist/tokenizers/he.d.ts +58 -0
  756. package/dist/tokenizers/he.d.ts.map +1 -0
  757. package/dist/tokenizers/hindi.d.ts +25 -0
  758. package/dist/tokenizers/hindi.d.ts.map +1 -0
  759. package/dist/tokenizers/index.d.ts +64 -0
  760. package/dist/tokenizers/index.d.ts.map +1 -0
  761. package/dist/tokenizers/indonesian.d.ts +24 -0
  762. package/dist/tokenizers/indonesian.d.ts.map +1 -0
  763. package/dist/tokenizers/italian.d.ts +41 -0
  764. package/dist/tokenizers/italian.d.ts.map +1 -0
  765. package/dist/tokenizers/japanese.d.ts +42 -0
  766. package/dist/tokenizers/japanese.d.ts.map +1 -0
  767. package/dist/tokenizers/korean.d.ts +47 -0
  768. package/dist/tokenizers/korean.d.ts.map +1 -0
  769. package/dist/tokenizers/morphology/arabic-normalizer.d.ts +37 -0
  770. package/dist/tokenizers/morphology/arabic-normalizer.d.ts.map +1 -0
  771. package/dist/tokenizers/morphology/french-normalizer.d.ts +46 -0
  772. package/dist/tokenizers/morphology/french-normalizer.d.ts.map +1 -0
  773. package/dist/tokenizers/morphology/german-normalizer.d.ts +55 -0
  774. package/dist/tokenizers/morphology/german-normalizer.d.ts.map +1 -0
  775. package/dist/tokenizers/morphology/index.d.ts +20 -0
  776. package/dist/tokenizers/morphology/index.d.ts.map +1 -0
  777. package/dist/tokenizers/morphology/italian-normalizer.d.ts +52 -0
  778. package/dist/tokenizers/morphology/italian-normalizer.d.ts.map +1 -0
  779. package/dist/tokenizers/morphology/japanese-normalizer.d.ts +43 -0
  780. package/dist/tokenizers/morphology/japanese-normalizer.d.ts.map +1 -0
  781. package/dist/tokenizers/morphology/korean-normalizer.d.ts +45 -0
  782. package/dist/tokenizers/morphology/korean-normalizer.d.ts.map +1 -0
  783. package/dist/tokenizers/morphology/polish-normalizer.d.ts +61 -0
  784. package/dist/tokenizers/morphology/polish-normalizer.d.ts.map +1 -0
  785. package/dist/tokenizers/morphology/portuguese-normalizer.d.ts +51 -0
  786. package/dist/tokenizers/morphology/portuguese-normalizer.d.ts.map +1 -0
  787. package/dist/tokenizers/morphology/russian-normalizer.d.ts +72 -0
  788. package/dist/tokenizers/morphology/russian-normalizer.d.ts.map +1 -0
  789. package/dist/tokenizers/morphology/spanish-normalizer.d.ts +49 -0
  790. package/dist/tokenizers/morphology/spanish-normalizer.d.ts.map +1 -0
  791. package/dist/tokenizers/morphology/turkish-normalizer.d.ts +52 -0
  792. package/dist/tokenizers/morphology/turkish-normalizer.d.ts.map +1 -0
  793. package/dist/tokenizers/morphology/types.d.ts +110 -0
  794. package/dist/tokenizers/morphology/types.d.ts.map +1 -0
  795. package/dist/tokenizers/morphology/ukrainian-normalizer.d.ts +76 -0
  796. package/dist/tokenizers/morphology/ukrainian-normalizer.d.ts.map +1 -0
  797. package/dist/tokenizers/ms.d.ts +22 -0
  798. package/dist/tokenizers/ms.d.ts.map +1 -0
  799. package/dist/tokenizers/polish.d.ts +25 -0
  800. package/dist/tokenizers/polish.d.ts.map +1 -0
  801. package/dist/tokenizers/portuguese.d.ts +26 -0
  802. package/dist/tokenizers/portuguese.d.ts.map +1 -0
  803. package/dist/tokenizers/quechua.d.ts +36 -0
  804. package/dist/tokenizers/quechua.d.ts.map +1 -0
  805. package/dist/tokenizers/russian.d.ts +25 -0
  806. package/dist/tokenizers/russian.d.ts.map +1 -0
  807. package/dist/tokenizers/spanish.d.ts +41 -0
  808. package/dist/tokenizers/spanish.d.ts.map +1 -0
  809. package/dist/tokenizers/swahili.d.ts +24 -0
  810. package/dist/tokenizers/swahili.d.ts.map +1 -0
  811. package/dist/tokenizers/thai.d.ts +24 -0
  812. package/dist/tokenizers/thai.d.ts.map +1 -0
  813. package/dist/tokenizers/tl.d.ts +22 -0
  814. package/dist/tokenizers/tl.d.ts.map +1 -0
  815. package/dist/tokenizers/token-utils.d.ts +97 -0
  816. package/dist/tokenizers/token-utils.d.ts.map +1 -0
  817. package/dist/tokenizers/turkish.d.ts +42 -0
  818. package/dist/tokenizers/turkish.d.ts.map +1 -0
  819. package/dist/tokenizers/ukrainian.d.ts +25 -0
  820. package/dist/tokenizers/ukrainian.d.ts.map +1 -0
  821. package/dist/tokenizers/vietnamese.d.ts +47 -0
  822. package/dist/tokenizers/vietnamese.d.ts.map +1 -0
  823. package/dist/types/grammar-types.d.ts +224 -0
  824. package/dist/types/grammar-types.d.ts.map +1 -0
  825. package/dist/types/unified-profile.d.ts +167 -0
  826. package/dist/types/unified-profile.d.ts.map +1 -0
  827. package/dist/types.d.ts +401 -0
  828. package/dist/types.d.ts.map +1 -0
  829. package/dist/utils/confidence-calculator.d.ts +43 -0
  830. package/dist/utils/confidence-calculator.d.ts.map +1 -0
  831. package/dist/validators/command-validator.d.ts +83 -0
  832. package/dist/validators/command-validator.d.ts.map +1 -0
  833. package/dist/validators/index.d.ts +7 -0
  834. package/dist/validators/index.d.ts.map +1 -0
  835. package/package.json +86 -6
  836. package/src/ast-builder/command-mappers.ts +9 -1
  837. package/src/ast-builder/expression-parser/parser.ts +13 -2
  838. package/src/ast-builder/index.ts +20 -6
  839. package/src/browser-bn.ts +162 -0
  840. package/src/browser-east-asian.ts +1 -1
  841. package/src/browser-hi.ts +162 -0
  842. package/src/browser-it.ts +162 -0
  843. package/src/browser-ms.ts +162 -0
  844. package/src/browser-pl.ts +162 -0
  845. package/src/browser-priority.ts +1 -1
  846. package/src/browser-ru.ts +162 -0
  847. package/src/browser-th.ts +162 -0
  848. package/src/browser-tl.ts +162 -0
  849. package/src/browser-uk.ts +162 -0
  850. package/src/browser-vi.ts +162 -0
  851. package/src/browser-western.ts +1 -1
  852. package/src/core-bridge.ts +43 -16
  853. package/src/core.ts +13 -0
  854. package/src/explicit/parser.ts +4 -2
  855. package/src/explicit/renderer.ts +1 -1
  856. package/src/generators/command-schemas.ts +214 -2
  857. package/src/generators/event-handlers-sov.ts +686 -0
  858. package/src/generators/event-handlers-vso.ts +489 -0
  859. package/src/generators/pattern-generator.ts +93 -736
  860. package/src/generators/profiles/arabic.ts +11 -1
  861. package/src/generators/profiles/bengali.ts +6 -0
  862. package/src/generators/profiles/chinese.ts +6 -0
  863. package/src/generators/profiles/english.ts +6 -0
  864. package/src/generators/profiles/french.ts +6 -0
  865. package/src/generators/profiles/german.ts +6 -0
  866. package/src/generators/profiles/hebrew.ts +6 -0
  867. package/src/generators/profiles/hindi.ts +6 -0
  868. package/src/generators/profiles/indonesian.ts +6 -0
  869. package/src/generators/profiles/italian.ts +6 -0
  870. package/src/generators/profiles/japanese.ts +6 -0
  871. package/src/generators/profiles/korean.ts +6 -0
  872. package/src/generators/profiles/ms.ts +6 -0
  873. package/src/generators/profiles/polish.ts +6 -0
  874. package/src/generators/profiles/portuguese.ts +6 -0
  875. package/src/generators/profiles/quechua.ts +35 -13
  876. package/src/generators/profiles/russian.ts +6 -0
  877. package/src/generators/profiles/spanish.ts +6 -0
  878. package/src/generators/profiles/spanishMexico.ts +6 -0
  879. package/src/generators/profiles/swahili.ts +14 -3
  880. package/src/generators/profiles/thai.ts +6 -0
  881. package/src/generators/profiles/tl.ts +22 -9
  882. package/src/generators/profiles/turkish.ts +7 -1
  883. package/src/generators/profiles/ukrainian.ts +6 -0
  884. package/src/generators/profiles/vietnamese.ts +6 -0
  885. package/src/generators/schema-validator.ts +8 -3
  886. package/src/index.ts +54 -0
  887. package/src/interchange/from-semantic.ts +440 -0
  888. package/src/interchange/index.ts +26 -0
  889. package/src/interchange/types.ts +186 -0
  890. package/src/parser/pattern-matcher.ts +65 -15
  891. package/src/parser/semantic-parser.ts +850 -8
  892. package/src/patterns/add/index.ts +1 -9
  893. package/src/patterns/builders.ts +2 -2
  894. package/src/patterns/decrement/index.ts +1 -9
  895. package/src/patterns/event-handler/shared.ts +30 -0
  896. package/src/patterns/event-handler/tl.ts +39 -19
  897. package/src/patterns/get/index.ts +1 -9
  898. package/src/patterns/hide/index.ts +1 -9
  899. package/src/patterns/increment/index.ts +1 -9
  900. package/src/patterns/put/index.ts +1 -9
  901. package/src/patterns/registry.ts +2 -2
  902. package/src/patterns/remove/index.ts +1 -9
  903. package/src/patterns/set/index.ts +1 -9
  904. package/src/patterns/show/index.ts +1 -9
  905. package/src/patterns/toggle/index.ts +1 -9
  906. package/src/tokenizers/arabic.ts +14 -1
  907. package/src/tokenizers/base-tokenizer.ts +644 -0
  908. package/src/tokenizers/base.ts +39 -1297
  909. package/src/tokenizers/bengali.ts +37 -10
  910. package/src/tokenizers/char-classifiers.ts +79 -0
  911. package/src/tokenizers/chinese.ts +7 -0
  912. package/src/tokenizers/english.ts +8 -1
  913. package/src/tokenizers/extractors.ts +452 -0
  914. package/src/tokenizers/french.ts +16 -1
  915. package/src/tokenizers/german.ts +16 -1
  916. package/src/tokenizers/he.ts +14 -1
  917. package/src/tokenizers/hindi.ts +14 -1
  918. package/src/tokenizers/indonesian.ts +14 -1
  919. package/src/tokenizers/italian.ts +14 -1
  920. package/src/tokenizers/japanese.ts +14 -1
  921. package/src/tokenizers/korean.ts +19 -1
  922. package/src/tokenizers/morphology/index.ts +17 -0
  923. package/src/tokenizers/morphology/polish-normalizer.ts +147 -131
  924. package/src/tokenizers/morphology/russian-normalizer.ts +397 -0
  925. package/src/tokenizers/morphology/ukrainian-normalizer.ts +366 -0
  926. package/src/tokenizers/ms.ts +14 -1
  927. package/src/tokenizers/polish.ts +16 -1
  928. package/src/tokenizers/portuguese.ts +16 -1
  929. package/src/tokenizers/quechua.ts +30 -1
  930. package/src/tokenizers/russian.ts +16 -1
  931. package/src/tokenizers/spanish.ts +14 -1
  932. package/src/tokenizers/swahili.ts +14 -1
  933. package/src/tokenizers/thai.ts +14 -1
  934. package/src/tokenizers/tl.ts +14 -1
  935. package/src/tokenizers/token-utils.ts +205 -0
  936. package/src/tokenizers/turkish.ts +21 -2
  937. package/src/tokenizers/ukrainian.ts +16 -1
  938. package/src/tokenizers/vietnamese.ts +7 -0
  939. package/src/types.ts +41 -2
  940. package/src/validators/command-validator.ts +17 -40
  941. package/dist/index.d.cts +0 -3470
  942. package/dist/types-BY3Id07j.d.ts +0 -615
  943. package/src/bridge.ts +0 -275
  944. package/src/generators/event-handler-generator.ts +0 -115
  945. package/src/patterns/add/ms.ts +0 -30
  946. package/src/patterns/add/tl.ts +0 -30
  947. package/src/patterns/decrement/ms.ts +0 -30
  948. package/src/patterns/decrement/tl.ts +0 -30
  949. package/src/patterns/get/ms.ts +0 -30
  950. package/src/patterns/get/tl.ts +0 -30
  951. package/src/patterns/hide/ms.ts +0 -30
  952. package/src/patterns/hide/tl.ts +0 -30
  953. package/src/patterns/increment/ms.ts +0 -30
  954. package/src/patterns/increment/tl.ts +0 -30
  955. package/src/patterns/put/ms.ts +0 -30
  956. package/src/patterns/put/tl.ts +0 -30
  957. package/src/patterns/remove/ms.ts +0 -30
  958. package/src/patterns/remove/tl.ts +0 -30
  959. package/src/patterns/set/ms.ts +0 -30
  960. package/src/patterns/set/tl.ts +0 -30
  961. package/src/patterns/show/ms.ts +0 -30
  962. package/src/patterns/show/tl.ts +0 -30
  963. package/src/patterns/toggle/ms.ts +0 -30
  964. package/src/patterns/toggle/tl.ts +0 -30
@@ -15,15 +15,23 @@ import type {
15
15
  LanguagePattern,
16
16
  LanguageToken,
17
17
  } from '../types';
18
- import { createCommandNode, createEventHandler, createCompoundNode } from '../types';
18
+ import {
19
+ createCommandNode,
20
+ createEventHandler,
21
+ createCompoundNode,
22
+ createSelector,
23
+ createLiteral,
24
+ createReference,
25
+ } from '../types';
19
26
  import {
20
27
  tokenize as tokenizeInternal,
21
28
  getSupportedLanguages as getTokenizerLanguages,
22
29
  TokenStreamImpl,
23
30
  } from '../tokenizers';
24
31
  // Import from registry for tree-shaking (registry uses directly-registered patterns first)
25
- import { getPatternsForLanguage } from '../registry';
32
+ import { getPatternsForLanguage, tryGetProfile } from '../registry';
26
33
  import { patternMatcher } from './pattern-matcher';
34
+ import { eventNameTranslations } from '../patterns/event-handler/shared';
27
35
  import { render as renderExplicitFn } from '../explicit/renderer';
28
36
  import { parseExplicit as parseExplicitFn } from '../explicit/parser';
29
37
 
@@ -36,8 +44,12 @@ export class SemanticParserImpl implements ISemanticParser {
36
44
  * Parse input in the specified language to a semantic node.
37
45
  */
38
46
  parse(input: string, language: string): SemanticNode {
47
+ // Extract standalone event modifiers (once, debounced, throttled) from input
48
+ const { modifiers, remainingInput } = this.extractStandaloneModifiers(input, language);
49
+ const parseInput = remainingInput || input;
50
+
39
51
  // Tokenize the input
40
- const tokens = tokenizeInternal(input, language);
52
+ const tokens = tokenizeInternal(parseInput, language);
41
53
 
42
54
  // Get patterns for this language
43
55
  const patterns = getPatternsForLanguage(language);
@@ -54,7 +66,8 @@ export class SemanticParserImpl implements ISemanticParser {
54
66
  const eventMatch = patternMatcher.matchBest(tokens, eventPatterns);
55
67
 
56
68
  if (eventMatch) {
57
- return this.buildEventHandler(eventMatch, tokens, language);
69
+ const handler = this.buildEventHandler(eventMatch, tokens, language);
70
+ return modifiers ? this.applyModifiers(handler, modifiers) : handler;
58
71
  }
59
72
 
60
73
  // Try command patterns
@@ -65,7 +78,25 @@ export class SemanticParserImpl implements ISemanticParser {
65
78
  return this.buildCommand(commandMatch, language);
66
79
  }
67
80
 
68
- throw new Error(`Could not parse input in ${language}: ${input}`);
81
+ // Try SOV event trigger extraction: detect embedded event keywords
82
+ // (e.g., "クリック で" in JA, "클릭 에" in KO, "tıklama de" in TR)
83
+ // and extract them to parse the remaining tokens as command body
84
+ const sovResult = this.trySOVEventExtraction(parseInput, language, sortedPatterns);
85
+ if (sovResult) {
86
+ return modifiers
87
+ ? this.applyModifiers(sovResult as EventHandlerSemanticNode, modifiers)
88
+ : sovResult;
89
+ }
90
+
91
+ // Fallback: try parsing as multi-command compound (no event wrapper).
92
+ // This handles patterns like "put X into Y then set Z to W" that have
93
+ // then-keywords but no event trigger (e.g., custom events not in KNOWN_EVENTS).
94
+ const compoundResult = this.tryCompoundCommandParsing(tokens, commandPatterns, language);
95
+ if (compoundResult) {
96
+ return compoundResult;
97
+ }
98
+
99
+ throw new Error(`Could not parse input in ${language}: ${parseInput}`);
69
100
  }
70
101
 
71
102
  /**
@@ -131,6 +162,18 @@ export class SemanticParserImpl implements ISemanticParser {
131
162
  // Extract event modifiers (.once, .debounce(), .throttle(), etc.)
132
163
  const eventModifiers = patternMatcher.extractEventModifiers(tokens);
133
164
 
165
+ // Extract "or" conjunction events (e.g., "click or keydown")
166
+ // Combines into event value string for AST builder compatibility
167
+ const additionalEvents = this.extractOrConjunctionEvents(tokens, language);
168
+ let resolvedEventValue = eventValue;
169
+ if (additionalEvents.length > 0 && eventValue.type === 'literal') {
170
+ const allEvents = [
171
+ String(eventValue.value),
172
+ ...additionalEvents.map(e => String('value' in e ? e.value : '')),
173
+ ];
174
+ resolvedEventValue = { type: 'literal', value: allEvents.join(' or ') };
175
+ }
176
+
134
177
  let body: SemanticNode[];
135
178
 
136
179
  // Check if pattern captured an action (grammar-transformed patterns)
@@ -194,7 +237,7 @@ export class SemanticParserImpl implements ISemanticParser {
194
237
  body = this.parseBodyWithClauses(tokens, commandPatterns, language);
195
238
  }
196
239
 
197
- return createEventHandler(eventValue, body, eventModifiers, {
240
+ return createEventHandler(resolvedEventValue, body, eventModifiers, {
198
241
  sourceLanguage: language,
199
242
  patternId: match.pattern.id,
200
243
  confidence: match.confidence,
@@ -304,9 +347,348 @@ export class SemanticParserImpl implements ISemanticParser {
304
347
  }
305
348
  }
306
349
 
350
+ // If pattern matching produced nothing, try verb-anchored SOV parsing.
351
+ // The grammar transformer often puts the verb BETWEEN roles for two-role commands:
352
+ // e.g., "destination を verb patient に" instead of "destination を patient に verb"
353
+ // Pattern matching fails because it expects strict SOV order (verb at end).
354
+ if (commands.length === 0) {
355
+ const sovCommands = this.parseSOVClauseByVerbAnchoring(clauseTokens, language);
356
+ if (sovCommands.length > 0) {
357
+ return sovCommands;
358
+ }
359
+ }
360
+
361
+ return commands;
362
+ }
363
+
364
+ // ==========================================================================
365
+ // SOV Verb-Anchored Clause Parsing
366
+ // ==========================================================================
367
+
368
+ /**
369
+ * Build a lookup from native verb keywords to action names for a language profile.
370
+ */
371
+ private static buildVerbLookup(profile: {
372
+ keywords: Record<string, { primary: string; alternatives?: string[]; normalized?: string }>;
373
+ }): Map<string, string> {
374
+ const lookup = new Map<string, string>();
375
+ for (const [action, kw] of Object.entries(profile.keywords)) {
376
+ // Skip non-command keywords (on, if, else, etc.)
377
+ if (
378
+ ['on', 'if', 'else', 'when', 'where', 'while', 'for', 'end', 'then', 'and'].includes(action)
379
+ ) {
380
+ continue;
381
+ }
382
+ lookup.set(kw.primary.toLowerCase(), action);
383
+ if (kw.alternatives) {
384
+ for (const alt of kw.alternatives) {
385
+ lookup.set(alt.toLowerCase(), action);
386
+ }
387
+ }
388
+ }
389
+ return lookup;
390
+ }
391
+
392
+ /**
393
+ * Build a lookup from role marker strings to role names.
394
+ */
395
+ private static buildMarkerToRoleLookup(profile: {
396
+ roleMarkers: Record<string, { primary: string; alternatives?: string[] }>;
397
+ }): Map<string, string> {
398
+ const lookup = new Map<string, string>();
399
+ for (const [role, marker] of Object.entries(profile.roleMarkers)) {
400
+ if (!marker) continue;
401
+ lookup.set(marker.primary, role);
402
+ if (marker.alternatives) {
403
+ for (const alt of marker.alternatives) {
404
+ // Avoid overwriting more specific roles with generic ones
405
+ if (!lookup.has(alt)) {
406
+ lookup.set(alt, role);
407
+ }
408
+ }
409
+ }
410
+ }
411
+ return lookup;
412
+ }
413
+
414
+ /**
415
+ * Parse an SOV clause by finding command verbs and extracting roles from surrounding tokens.
416
+ *
417
+ * The grammar transformer often produces "verb-in-middle" order for two-role commands:
418
+ * "[role1] [marker1] [verb] [role2] [marker2]"
419
+ *
420
+ * This method:
421
+ * 1. Scans for recognized command verbs in the token stream
422
+ * 2. For each verb, extracts pre-verb and post-verb tokens as roles
423
+ * 3. Uses marker tokens to determine which semantic role each value belongs to
424
+ */
425
+ private parseSOVClauseByVerbAnchoring(
426
+ clauseTokens: LanguageToken[],
427
+ language: string
428
+ ): SemanticNode[] {
429
+ const profile = tryGetProfile(language);
430
+ if (!profile || profile.wordOrder !== 'SOV') return [];
431
+
432
+ const verbLookup = SemanticParserImpl.buildVerbLookup(profile);
433
+ const markerToRole = SemanticParserImpl.buildMarkerToRoleLookup(profile);
434
+ const commands: SemanticNode[] = [];
435
+
436
+ let pos = 0;
437
+
438
+ while (pos < clauseTokens.length) {
439
+ // Find the next verb token
440
+ let verbIdx = -1;
441
+ let verbAction = '';
442
+
443
+ for (let i = pos; i < clauseTokens.length; i++) {
444
+ const token = clauseTokens[i];
445
+ const byValue = verbLookup.get(token.value.toLowerCase());
446
+ const byNormalized = token.normalized
447
+ ? verbLookup.get(token.normalized.toLowerCase())
448
+ : undefined;
449
+ const action = byValue || byNormalized;
450
+
451
+ if (action) {
452
+ verbIdx = i;
453
+ verbAction = action;
454
+ break;
455
+ }
456
+ }
457
+
458
+ if (verbIdx === -1) break; // No more verbs found
459
+
460
+ // Tokens before verb = pre-verb arguments
461
+ const preVerbTokens = clauseTokens.slice(pos, verbIdx);
462
+
463
+ // Find end of this command: next verb, then-keyword, or end of tokens
464
+ let endIdx = clauseTokens.length;
465
+ for (let i = verbIdx + 1; i < clauseTokens.length; i++) {
466
+ const t = clauseTokens[i];
467
+ // Stop at then-keywords
468
+ if (t.kind === 'conjunction' || this.isThenKeyword(t.value, language)) {
469
+ endIdx = i;
470
+ break;
471
+ }
472
+ // Stop at the next verb (start of new command) — but only if preceded by a marker
473
+ // This prevents stopping at "value" tokens that happen to match a verb name
474
+ if (i > verbIdx + 1) {
475
+ const nextAction =
476
+ verbLookup.get(t.value.toLowerCase()) ||
477
+ (t.normalized ? verbLookup.get(t.normalized.toLowerCase()) : undefined);
478
+ if (nextAction) {
479
+ endIdx = i;
480
+ break;
481
+ }
482
+ }
483
+ }
484
+
485
+ // Tokens after verb = post-verb arguments
486
+ const postVerbTokens = clauseTokens.slice(verbIdx + 1, endIdx);
487
+
488
+ // Extract roles from pre-verb and post-verb tokens using markers
489
+ const roles = this.extractRolesFromMarkedTokens(
490
+ preVerbTokens,
491
+ postVerbTokens,
492
+ markerToRole,
493
+ verbAction,
494
+ language
495
+ );
496
+
497
+ commands.push(
498
+ createCommandNode(verbAction as ActionType, roles, {
499
+ sourceLanguage: language,
500
+ confidence: 0.7,
501
+ })
502
+ );
503
+
504
+ pos = endIdx;
505
+ // Skip conjunction/then-keyword if present
506
+ if (pos < clauseTokens.length) {
507
+ const t = clauseTokens[pos];
508
+ if (t.kind === 'conjunction' || this.isThenKeyword(t.value, language)) {
509
+ pos++;
510
+ }
511
+ }
512
+ }
513
+
307
514
  return commands;
308
515
  }
309
516
 
517
+ /**
518
+ * Extract semantic roles from pre-verb and post-verb token groups using marker analysis.
519
+ *
520
+ * Recognizes patterns like:
521
+ * pre-verb: [expr] [を] → patient (obj marker)
522
+ * post-verb: [expr] [に] → destination (to marker)
523
+ * pre-verb: [expr] [から] → source (from marker)
524
+ */
525
+ private extractRolesFromMarkedTokens(
526
+ preVerbTokens: LanguageToken[],
527
+ postVerbTokens: LanguageToken[],
528
+ markerToRole: Map<string, string>,
529
+ action: string,
530
+ _language: string
531
+ ): Record<string, SemanticValue> {
532
+ const roles: Record<string, SemanticValue> = {};
533
+
534
+ // Process a group of tokens: collect value tokens until a marker is found
535
+ const processGroup = (tokens: LanguageToken[]) => {
536
+ let valueTokens: LanguageToken[] = [];
537
+
538
+ for (const token of tokens) {
539
+ const role = markerToRole.get(token.value);
540
+ if (role && token.kind === 'particle' && valueTokens.length > 0) {
541
+ // This is a marker — assign the preceding value tokens to this role
542
+ const value = this.tokensToSemanticValue(valueTokens);
543
+ if (value) {
544
+ // Map the role name, avoiding overwrites of existing roles
545
+ const roleKey = this.mapRoleForCommand(role, action, roles);
546
+ if (roleKey) {
547
+ roles[roleKey] = value;
548
+ }
549
+ }
550
+ valueTokens = [];
551
+ } else {
552
+ valueTokens.push(token);
553
+ }
554
+ }
555
+
556
+ // Remaining tokens without a following marker
557
+ if (valueTokens.length > 0) {
558
+ const value = this.tokensToSemanticValue(valueTokens);
559
+ if (value) {
560
+ // Unmarked trailing tokens: assign based on what's missing
561
+ if (!roles.patient) {
562
+ roles.patient = value;
563
+ } else if (!roles.destination) {
564
+ roles.destination = value;
565
+ }
566
+ }
567
+ }
568
+ };
569
+
570
+ processGroup(preVerbTokens);
571
+ processGroup(postVerbTokens);
572
+
573
+ return roles;
574
+ }
575
+
576
+ /**
577
+ * Map a marker-derived role name to the appropriate semantic role for a command,
578
+ * handling cases where marker roles overlap (e.g., both patient and destination
579
+ * use similar particles in some languages).
580
+ */
581
+ private mapRoleForCommand(
582
+ markerRole: string,
583
+ _action: string,
584
+ existingRoles: Record<string, SemanticValue>
585
+ ): string | null {
586
+ // Direct mapping — if the role isn't taken yet, use it
587
+ if (!existingRoles[markerRole]) {
588
+ return markerRole;
589
+ }
590
+
591
+ // If the marker role is already taken, try to assign to a related role
592
+ // For "set" and "put": patient marker (を/i) is the destination, dest marker (に/e) is the patient value
593
+ if (markerRole === 'patient' && !existingRoles.destination) {
594
+ return 'destination';
595
+ }
596
+ if (markerRole === 'destination' && !existingRoles.patient) {
597
+ return 'patient';
598
+ }
599
+ if (markerRole === 'source' && !existingRoles.source) {
600
+ return 'source';
601
+ }
602
+
603
+ return null; // Can't assign
604
+ }
605
+
606
+ /**
607
+ * Convert a sequence of tokens into a single SemanticValue.
608
+ */
609
+ private tokensToSemanticValue(tokens: LanguageToken[]): SemanticValue | null {
610
+ if (tokens.length === 0) return null;
611
+
612
+ // Filter out noise tokens (whitespace, etc.)
613
+ const meaningful = tokens.filter(t => (t.kind as string) !== 'whitespace');
614
+ if (meaningful.length === 0) return null;
615
+
616
+ // Single token — use its type directly
617
+ if (meaningful.length === 1) {
618
+ return this.tokenToSemanticValue(meaningful[0]);
619
+ }
620
+
621
+ // Multiple tokens — concatenate values and infer type from the first token
622
+ const combined = meaningful.map(t => t.value).join('');
623
+ const first = meaningful[0];
624
+
625
+ if (
626
+ first.kind === 'selector' ||
627
+ first.value.startsWith('#') ||
628
+ first.value.startsWith('.') ||
629
+ first.value.startsWith('@') ||
630
+ first.value.startsWith('*')
631
+ ) {
632
+ return createSelector(combined);
633
+ }
634
+ if (first.kind === 'literal' || first.value.startsWith('"') || first.value.startsWith("'")) {
635
+ return createLiteral(combined);
636
+ }
637
+ if ((first.kind as string) === 'reference') {
638
+ return createReference(combined as 'me' | 'it' | 'you' | 'result');
639
+ }
640
+
641
+ return createLiteral(combined);
642
+ }
643
+
644
+ /**
645
+ * Convert a single token to a SemanticValue.
646
+ */
647
+ private tokenToSemanticValue(token: LanguageToken): SemanticValue {
648
+ const val = token.value;
649
+
650
+ // Selectors: #id, .class, @attr, *cssProperty
651
+ if (
652
+ token.kind === 'selector' ||
653
+ val.startsWith('#') ||
654
+ val.startsWith('.') ||
655
+ val.startsWith('@') ||
656
+ val.startsWith('*')
657
+ ) {
658
+ return createSelector(val);
659
+ }
660
+
661
+ // String literals
662
+ if (val.startsWith('"') || val.startsWith("'")) {
663
+ return createLiteral(val);
664
+ }
665
+
666
+ // Numbers
667
+ if (/^-?\d+(\.\d+)?$/.test(val)) {
668
+ return createLiteral(parseFloat(val));
669
+ }
670
+
671
+ // Booleans (including translated forms)
672
+ if (val === 'true' || val === '真' || val === '참' || val === 'doğru') {
673
+ return createLiteral(true);
674
+ }
675
+ if (val === 'false' || val === '偽' || val === '거짓' || val === 'yanlış') {
676
+ return createLiteral(false);
677
+ }
678
+
679
+ // References: me, it, you (check normalized form)
680
+ const ref = token.normalized?.toLowerCase();
681
+ if (ref === 'me' || ref === 'it' || ref === 'you' || ref === 'result' || ref === 'body') {
682
+ return createReference(ref as 'me' | 'it' | 'you' | 'result');
683
+ }
684
+ if ((token.kind as string) === 'reference') {
685
+ return createReference((token.normalized as 'me' | 'it' | 'you') || 'me');
686
+ }
687
+
688
+ // Default to literal
689
+ return createLiteral(val);
690
+ }
691
+
310
692
  /**
311
693
  * Parse body commands with support for grammar-transformed patterns.
312
694
  * Used after a grammar-transformed pattern with continuation marker.
@@ -390,6 +772,286 @@ export class SemanticParserImpl implements ISemanticParser {
390
772
  return commands;
391
773
  }
392
774
 
775
+ // ==========================================================================
776
+ // Multi-Command Compound Fallback
777
+ // ==========================================================================
778
+
779
+ /**
780
+ * Try parsing input as a multi-command compound (no event wrapper).
781
+ * Handles standalone command sequences separated by then-keywords.
782
+ * Used as a last resort when no event trigger is detected.
783
+ */
784
+ private tryCompoundCommandParsing(
785
+ tokens: ReturnType<typeof tokenizeInternal>,
786
+ commandPatterns: LanguagePattern[],
787
+ language: string
788
+ ): SemanticNode | null {
789
+ // Only try if the input contains then-keywords (otherwise single-command already tried)
790
+ const allTokens = tokens.tokens;
791
+ const hasThenKeyword = allTokens.some(
792
+ t =>
793
+ t.kind === 'conjunction' || (t.kind === 'keyword' && this.isThenKeyword(t.value, language))
794
+ );
795
+ if (!hasThenKeyword) return null;
796
+
797
+ // Reset token stream and parse using clause-based parsing
798
+ const freshStream = new TokenStreamImpl(allTokens as LanguageToken[], language);
799
+ const body = this.parseBodyWithClauses(freshStream, commandPatterns, language);
800
+
801
+ if (body.length === 0) return null;
802
+
803
+ // Return the compound node (or single command if only one clause parsed)
804
+ if (body.length === 1) {
805
+ return body[0];
806
+ }
807
+ return createCompoundNode(body, 'then', {
808
+ sourceLanguage: language,
809
+ confidence: 0.65,
810
+ });
811
+ }
812
+
813
+ // ==========================================================================
814
+ // SOV Event Trigger Extraction
815
+ // ==========================================================================
816
+
817
+ /**
818
+ * Known event names for detection (common DOM events).
819
+ */
820
+ private static readonly KNOWN_EVENTS = new Set([
821
+ 'click',
822
+ 'dblclick',
823
+ 'input',
824
+ 'change',
825
+ 'submit',
826
+ 'keydown',
827
+ 'keyup',
828
+ 'keypress',
829
+ 'mouseover',
830
+ 'mouseout',
831
+ 'mousedown',
832
+ 'mouseup',
833
+ 'focus',
834
+ 'blur',
835
+ 'load',
836
+ 'scroll',
837
+ 'resize',
838
+ 'contextmenu',
839
+ ]);
840
+
841
+ /**
842
+ * SOV event marker particles per language (postpositions that mark the event role).
843
+ * Korean has no event marker particle -- the event keyword stands alone.
844
+ */
845
+ private static readonly SOV_EVENT_MARKERS: Record<string, Set<string>> = {
846
+ ja: new Set(['で']),
847
+ ko: new Set(), // Korean doesn't use event marker particles
848
+ tr: new Set(['de', 'da', 'te', 'ta']),
849
+ bn: new Set(['এ']),
850
+ qu: new Set(['pi']),
851
+ };
852
+
853
+ /**
854
+ * SOV source markers ("from" equivalents) and window tokens per language.
855
+ * Used to strip "from window/elsewhere" event modifiers.
856
+ */
857
+ private static readonly SOV_SOURCE_MARKERS: Record<
858
+ string,
859
+ { markers: Set<string>; windowTokens: Set<string> }
860
+ > = {
861
+ ja: {
862
+ markers: new Set(['から']),
863
+ windowTokens: new Set(['ウィンドウ', 'ドキュメント', 'window', 'document']),
864
+ },
865
+ ko: {
866
+ markers: new Set(['에서']),
867
+ windowTokens: new Set(['창', '윈도우', '문서', 'window', 'document']),
868
+ },
869
+ tr: {
870
+ markers: new Set(['den', 'dan', 'ten', 'tan']),
871
+ windowTokens: new Set(['pencere', 'belge', 'window', 'document']),
872
+ },
873
+ bn: {
874
+ markers: new Set(['থেকে', 'মধ্যে']),
875
+ windowTokens: new Set(['উইন্ডো', 'ডকুমেন্ট', 'window', 'document']),
876
+ },
877
+ qu: {
878
+ markers: new Set(['manta']),
879
+ windowTokens: new Set(['k_iri', 'ventana', 'window', 'document']),
880
+ },
881
+ };
882
+
883
+ /**
884
+ * Try to extract an embedded event trigger from SOV grammar-transformed text.
885
+ *
886
+ * SOV languages embed the event trigger within the sentence:
887
+ * JA: ".active を クリック で 切り替え" (patient event-marker action)
888
+ * KO: ".active 를 클릭 에 토글" (patient event-marker action)
889
+ * TR: ".active i tıklama de değiştir" (patient event-marker action)
890
+ *
891
+ * This method detects the [event_keyword] [event_particle] pair,
892
+ * removes those tokens, and parses the remaining tokens as command body.
893
+ */
894
+ private trySOVEventExtraction(
895
+ input: string,
896
+ language: string,
897
+ patterns: LanguagePattern[]
898
+ ): SemanticNode | null {
899
+ const eventMarkers = SemanticParserImpl.SOV_EVENT_MARKERS[language];
900
+ if (!eventMarkers) return null;
901
+
902
+ const tokens = tokenizeInternal(input, language);
903
+ const allTokens = tokens.tokens;
904
+
905
+ // Build a set of native event names for this language (from eventNameTranslations)
906
+ const langEvents = eventNameTranslations[language];
907
+ const nativeEventNames = new Set<string>();
908
+ if (langEvents) {
909
+ for (const native of Object.keys(langEvents)) {
910
+ nativeEventNames.add(native.toLowerCase());
911
+ }
912
+ }
913
+
914
+ // Source markers for "from window/elsewhere" stripping per language
915
+ const sourceMarkers = SemanticParserImpl.SOV_SOURCE_MARKERS[language];
916
+
917
+ // Scan for event keyword + optional event marker particle pattern
918
+ let eventIndex = -1;
919
+ let eventName = '';
920
+ let keyFilter = '';
921
+ let tokensToRemove = 1; // How many tokens to strip (1 = event only, 2 = event + marker)
922
+
923
+ for (let i = 0; i < allTokens.length; i++) {
924
+ const token = allTokens[i];
925
+ const tokenValue = token.value.toLowerCase();
926
+
927
+ // Strip bracket key-filter from event token value for matching
928
+ // e.g., "keydown[key==\"Escape\"]" → "keydown" (with filter extracted)
929
+ let bareEventValue = tokenValue;
930
+ let tokenKeyFilter = '';
931
+ const bracketIdx = tokenValue.indexOf('[');
932
+ if (bracketIdx > 0) {
933
+ bareEventValue = tokenValue.slice(0, bracketIdx);
934
+ tokenKeyFilter = token.value.slice(bracketIdx);
935
+ }
936
+
937
+ // Check if this token is a known event name (by normalized value, native text, or bare value)
938
+ const normalizedLower = token.normalized?.toLowerCase();
939
+ const isEventByNormalized =
940
+ normalizedLower && SemanticParserImpl.KNOWN_EVENTS.has(normalizedLower);
941
+ const isEventByNative =
942
+ nativeEventNames.has(tokenValue) || nativeEventNames.has(bareEventValue);
943
+ const isEventByBare = SemanticParserImpl.KNOWN_EVENTS.has(bareEventValue);
944
+
945
+ if (isEventByNormalized || isEventByNative || isEventByBare) {
946
+ // Resolve the English event name
947
+ let resolvedName: string;
948
+ if (isEventByNormalized) {
949
+ resolvedName = normalizedLower!;
950
+ } else if (isEventByNative) {
951
+ resolvedName = langEvents?.[tokenValue] ?? langEvents?.[bareEventValue] ?? bareEventValue;
952
+ } else {
953
+ resolvedName = bareEventValue;
954
+ }
955
+
956
+ if (eventMarkers.size > 0) {
957
+ // Languages with event markers (JA, TR): require marker after event keyword
958
+ // The marker may be at i+1 (direct) or i+2 (if there's a bracket key-filter selector between)
959
+ let markerOffset = 1;
960
+ const nextToken = allTokens[i + 1];
961
+ // Skip over bracket selector token (e.g., [key=="Escape"]) between event and marker
962
+ if (nextToken && nextToken.kind === 'selector' && nextToken.value.startsWith('[')) {
963
+ markerOffset = 2;
964
+ }
965
+ const markerToken = allTokens[i + markerOffset];
966
+ if (
967
+ markerToken &&
968
+ (markerToken.kind === 'particle' || markerToken.kind === 'keyword') &&
969
+ eventMarkers.has(markerToken.value)
970
+ ) {
971
+ eventIndex = i;
972
+ eventName = resolvedName;
973
+ keyFilter = tokenKeyFilter || (markerOffset === 2 ? allTokens[i + 1].value : '');
974
+ tokensToRemove = markerOffset + 1; // Remove event keyword + optional filter + marker
975
+ break;
976
+ }
977
+ } else {
978
+ // Languages without event markers (KO): event keyword stands alone
979
+ eventIndex = i;
980
+ eventName = resolvedName;
981
+ keyFilter = tokenKeyFilter;
982
+ tokensToRemove = 1; // Remove event keyword only
983
+ break;
984
+ }
985
+ }
986
+ }
987
+
988
+ if (eventIndex === -1) return null;
989
+
990
+ // Build the list of indices to remove: event keyword + marker
991
+ const removeIndices = new Set<number>();
992
+ for (let i = eventIndex; i < eventIndex + tokensToRemove; i++) {
993
+ removeIndices.add(i);
994
+ }
995
+
996
+ // Strip "from window/elsewhere" source modifiers near the event
997
+ // Pattern: [source-marker] appears after event marker (JA: から, KO: 에서, TR: den/dan/ten/tan)
998
+ // Or the source element (window/ウィンドウ/창/pencere) may appear before the event
999
+ if (sourceMarkers) {
1000
+ const afterEventEnd = eventIndex + tokensToRemove;
1001
+
1002
+ // Check for source marker right after event+marker (e.g., "keydown で から")
1003
+ if (afterEventEnd < allTokens.length) {
1004
+ const afterToken = allTokens[afterEventEnd];
1005
+ if (
1006
+ (afterToken.kind === 'particle' || afterToken.kind === 'keyword') &&
1007
+ sourceMarkers.markers.has(afterToken.value)
1008
+ ) {
1009
+ removeIndices.add(afterEventEnd);
1010
+ }
1011
+ }
1012
+
1013
+ // Check for source element (window token) before the event
1014
+ // It could be immediately before, or earlier in the stream
1015
+ for (let i = 0; i < eventIndex; i++) {
1016
+ const t = allTokens[i];
1017
+ const tLower = t.value.toLowerCase();
1018
+ const tNorm = t.normalized?.toLowerCase();
1019
+ if (
1020
+ sourceMarkers.windowTokens.has(tLower) ||
1021
+ (tNorm && sourceMarkers.windowTokens.has(tNorm))
1022
+ ) {
1023
+ removeIndices.add(i);
1024
+ break;
1025
+ }
1026
+ }
1027
+ }
1028
+
1029
+ // Remove marked tokens from the array
1030
+ const bodyTokens = allTokens.filter((_, idx) => !removeIndices.has(idx));
1031
+
1032
+ if (bodyTokens.length === 0) return null;
1033
+
1034
+ // Parse body tokens as command(s)
1035
+ const commandPatterns = patterns.filter(p => p.command !== 'on');
1036
+ const bodyStream = new TokenStreamImpl(bodyTokens, language);
1037
+
1038
+ // Use clause-based parsing to handle then-chains
1039
+ const body = this.parseBodyWithClauses(bodyStream, commandPatterns, language);
1040
+
1041
+ if (body.length === 0) return null;
1042
+
1043
+ // Build event metadata including key filter and source info
1044
+ const metadata: Record<string, unknown> = {
1045
+ sourceLanguage: language,
1046
+ confidence: 0.75,
1047
+ };
1048
+ if (keyFilter) {
1049
+ metadata.keyFilter = keyFilter;
1050
+ }
1051
+
1052
+ return createEventHandler({ type: 'literal', value: eventName }, body, undefined, metadata);
1053
+ }
1054
+
393
1055
  /**
394
1056
  * Check if a token is a 'then' keyword in the given language.
395
1057
  */
@@ -399,14 +1061,16 @@ export class SemanticParserImpl implements ISemanticParser {
399
1061
  ja: new Set(['それから', '次に', 'そして']),
400
1062
  ar: new Set(['ثم', 'بعدها', 'ثمّ']),
401
1063
  es: new Set(['entonces', 'luego', 'después']),
402
- ko: new Set(['그다음', '그리고', '그런후']),
1064
+ ko: new Set(['그다음', '그리고', '그런후', '그러면']),
403
1065
  zh: new Set(['然后', '接着', '之后']),
404
1066
  tr: new Set(['sonra', 'ardından', 'daha sonra']),
405
1067
  pt: new Set(['então', 'depois', 'logo']),
406
1068
  fr: new Set(['puis', 'ensuite', 'alors']),
407
1069
  de: new Set(['dann', 'danach', 'anschließend']),
408
1070
  id: new Set(['lalu', 'kemudian', 'setelah itu']),
409
- qu: new Set(['chaymantataq', 'hinaspa', 'chaymanta']),
1071
+ tl: new Set(['pagkatapos', 'tapos']),
1072
+ bn: new Set(['তারপর', 'পরে']),
1073
+ qu: new Set(['chaymantataq', 'hinaspa', 'chaymanta', 'chayqa']),
410
1074
  sw: new Set(['kisha', 'halafu', 'baadaye']),
411
1075
  };
412
1076
  const keywords = thenKeywords[language] || thenKeywords.en;
@@ -429,12 +1093,190 @@ export class SemanticParserImpl implements ISemanticParser {
429
1093
  fr: new Set(['fin', 'terminer', 'finir']),
430
1094
  de: new Set(['ende', 'beenden', 'fertig']),
431
1095
  id: new Set(['selesai', 'akhir', 'tamat']),
1096
+ tl: new Set(['wakas', 'tapos']),
1097
+ bn: new Set(['সমাপ্ত']),
432
1098
  qu: new Set(['tukukuy', 'tukuy', 'puchukay']),
433
1099
  sw: new Set(['mwisho', 'maliza', 'tamati']),
434
1100
  };
435
1101
  const keywords = endKeywords[language] || endKeywords.en;
436
1102
  return keywords.has(value.toLowerCase());
437
1103
  }
1104
+
1105
+ /**
1106
+ * Standalone event modifier keywords (loanwords used across languages).
1107
+ * Pattern: `[modifier] [preposition?] [duration?] [rest...]`
1108
+ */
1109
+ private static readonly STANDALONE_MODIFIERS: Record<string, 'once' | 'debounce' | 'throttle'> = {
1110
+ once: 'once',
1111
+ debounced: 'debounce',
1112
+ debounce: 'debounce',
1113
+ throttled: 'throttle',
1114
+ throttle: 'throttle',
1115
+ };
1116
+
1117
+ /**
1118
+ * "Or" conjunction keywords across languages for multiple events.
1119
+ * Maps lowercase keyword → true. Used to detect "click or keydown" patterns.
1120
+ */
1121
+ private static readonly OR_KEYWORDS = new Set([
1122
+ 'or', // EN
1123
+ 'أو', // AR
1124
+ 'o', // ES, TL
1125
+ 'ou', // PT, FR
1126
+ 'oder', // DE
1127
+ 'atau', // ID
1128
+ 'atau', // MS (same as ID)
1129
+ '或', // ZH
1130
+ 'または', // JA
1131
+ '또는', // KO
1132
+ 'veya', // TR
1133
+ 'অথবা', // BN
1134
+ 'utaq', // QU
1135
+ 'au', // SW
1136
+ 'або', // UK
1137
+ 'или', // RU
1138
+ 'hoặc', // VI
1139
+ 'lub', // PL
1140
+ 'או', // HE
1141
+ 'หรือ', // TH
1142
+ 'o', // IT
1143
+ ]);
1144
+
1145
+ /**
1146
+ * Extract standalone event modifiers from the beginning of input.
1147
+ * Returns the modifiers (if any) and the remaining input string.
1148
+ */
1149
+ private extractStandaloneModifiers(
1150
+ input: string,
1151
+ _language: string
1152
+ ): {
1153
+ modifiers: { once?: boolean; debounce?: number; throttle?: number } | null;
1154
+ remainingInput: string | null;
1155
+ } {
1156
+ const tokens = tokenizeInternal(input, _language);
1157
+ const allTokens = tokens.tokens;
1158
+
1159
+ if (allTokens.length === 0) return { modifiers: null, remainingInput: null };
1160
+
1161
+ const firstToken = allTokens[0];
1162
+ const firstLower = firstToken.value.toLowerCase();
1163
+ const modType = SemanticParserImpl.STANDALONE_MODIFIERS[firstLower];
1164
+
1165
+ if (!modType) return { modifiers: null, remainingInput: null };
1166
+
1167
+ const modifiers: { once?: boolean; debounce?: number; throttle?: number } = {};
1168
+ let tokensToSkip = 1; // At least the modifier keyword
1169
+
1170
+ if (modType === 'once') {
1171
+ modifiers.once = true;
1172
+ } else {
1173
+ // debounce/throttle: look for optional preposition + duration
1174
+ let nextIdx = 1;
1175
+
1176
+ // Skip preposition tokens (sa, عند, at, etc.)
1177
+ if (nextIdx < allTokens.length) {
1178
+ const nextToken = allTokens[nextIdx];
1179
+ // Skip keyword/particle tokens that are prepositions (not selectors, literals, etc.)
1180
+ if (nextToken.kind === 'keyword' || nextToken.kind === 'particle') {
1181
+ nextIdx++;
1182
+ tokensToSkip++;
1183
+ }
1184
+ }
1185
+
1186
+ // Look for duration (number with unit like "100ms", "300ms")
1187
+ if (nextIdx < allTokens.length) {
1188
+ const durToken = allTokens[nextIdx];
1189
+ if (durToken.kind === 'literal') {
1190
+ const match = durToken.value.match(/^(\d+)(ms|s|m)?$/);
1191
+ if (match) {
1192
+ let ms = parseInt(match[1], 10);
1193
+ const unit = match[2] || 'ms';
1194
+ if (unit === 's') ms *= 1000;
1195
+ else if (unit === 'm') ms *= 60000;
1196
+ modifiers[modType] = ms;
1197
+ tokensToSkip = nextIdx + 1;
1198
+ }
1199
+ }
1200
+ }
1201
+
1202
+ // If no duration found, use default
1203
+ if (!modifiers[modType]) {
1204
+ modifiers[modType] = modType === 'debounce' ? 300 : 100;
1205
+ }
1206
+ }
1207
+
1208
+ // Reconstruct remaining input from the tokens after the modifier
1209
+ const remainingTokens = allTokens.slice(tokensToSkip);
1210
+ if (remainingTokens.length === 0) return { modifiers: null, remainingInput: null };
1211
+
1212
+ // Use position data to extract the remaining input string
1213
+ const startPos = remainingTokens[0].position.start;
1214
+ const remainingInput = input.slice(startPos);
1215
+
1216
+ return { modifiers, remainingInput };
1217
+ }
1218
+
1219
+ /**
1220
+ * Apply standalone modifiers to an event handler node.
1221
+ */
1222
+ private applyModifiers(
1223
+ node: EventHandlerSemanticNode,
1224
+ modifiers: { once?: boolean; debounce?: number; throttle?: number }
1225
+ ): EventHandlerSemanticNode {
1226
+ return {
1227
+ ...node,
1228
+ eventModifiers: {
1229
+ ...node.eventModifiers,
1230
+ ...modifiers,
1231
+ },
1232
+ };
1233
+ }
1234
+
1235
+ /**
1236
+ * Extract "or" conjunction events from the token stream.
1237
+ * If the next tokens follow the pattern "or EVENT [or EVENT ...]",
1238
+ * consume them and return the additional event values.
1239
+ *
1240
+ * The token stream is advanced past any consumed "or EVENT" tokens.
1241
+ */
1242
+ private extractOrConjunctionEvents(
1243
+ tokens: Pick<ReturnType<typeof tokenizeInternal>, 'peek' | 'advance' | 'mark' | 'reset'>,
1244
+ _language: string
1245
+ ): SemanticValue[] {
1246
+ const additionalEvents: SemanticValue[] = [];
1247
+
1248
+ while (true) {
1249
+ const mark = tokens.mark();
1250
+ const orToken = tokens.peek();
1251
+ if (!orToken) break;
1252
+
1253
+ const orLower = (orToken.normalized || orToken.value).toLowerCase();
1254
+ if (!SemanticParserImpl.OR_KEYWORDS.has(orLower)) {
1255
+ tokens.reset(mark);
1256
+ break;
1257
+ }
1258
+
1259
+ // Consume the "or" token
1260
+ tokens.advance();
1261
+
1262
+ // Next token should be the event name
1263
+ const eventToken = tokens.peek();
1264
+ if (!eventToken) {
1265
+ // "or" at end of input — revert
1266
+ tokens.reset(mark);
1267
+ break;
1268
+ }
1269
+
1270
+ // Normalize event name using shared translations
1271
+ const eventLower = (eventToken.normalized || eventToken.value).toLowerCase();
1272
+
1273
+ // Accept it as an event (could be native or English event name)
1274
+ tokens.advance();
1275
+ additionalEvents.push({ type: 'literal', value: eventLower });
1276
+ }
1277
+
1278
+ return additionalEvents;
1279
+ }
438
1280
  }
439
1281
 
440
1282
  // =============================================================================