@hyperfixi/core 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 (381) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +218 -0
  3. package/dist/__test-utils__/context-builders.d.ts +42 -0
  4. package/dist/__test-utils__/error-testing.d.ts +18 -0
  5. package/dist/__test-utils__/index.d.ts +6 -0
  6. package/dist/__test-utils__/mock-types.d.ts +57 -0
  7. package/dist/__test-utils__/parser-context-mock.d.ts +7 -0
  8. package/dist/__test-utils__/parser-helpers.d.ts +38 -0
  9. package/dist/api/dom-processor.d.ts +17 -0
  10. package/dist/api/hyperscript-api.d.ts +68 -0
  11. package/dist/api/lokascript-api.d.ts +9 -0
  12. package/dist/ast-utils/analyzer.d.ts +19 -0
  13. package/dist/ast-utils/documentation.d.ts +8 -0
  14. package/dist/ast-utils/generator.d.ts +9 -0
  15. package/dist/ast-utils/index.d.ts +12 -0
  16. package/dist/ast-utils/index.js +3366 -0
  17. package/dist/ast-utils/index.mjs +3320 -0
  18. package/dist/ast-utils/interchange/from-core.d.ts +8 -0
  19. package/dist/ast-utils/interchange/index.d.ts +6 -0
  20. package/dist/ast-utils/interchange/lsp.d.ts +108 -0
  21. package/dist/ast-utils/interchange/to-core.d.ts +8 -0
  22. package/dist/ast-utils/interchange/types.d.ts +113 -0
  23. package/dist/ast-utils/query.d.ts +25 -0
  24. package/dist/ast-utils/transformer.d.ts +14 -0
  25. package/dist/ast-utils/types.d.ts +162 -0
  26. package/dist/ast-utils/visitor.d.ts +40 -0
  27. package/dist/behaviors/boosted.d.ts +29 -0
  28. package/dist/behaviors/history-swap.d.ts +24 -0
  29. package/dist/behaviors/index.d.ts +4 -0
  30. package/dist/behaviors/index.js +1149 -0
  31. package/dist/behaviors/index.mjs +1139 -0
  32. package/dist/bundle-generator/generator.d.ts +4 -0
  33. package/dist/bundle-generator/index.d.ts +6 -0
  34. package/dist/bundle-generator/index.js +2294 -0
  35. package/dist/bundle-generator/index.mjs +2271 -0
  36. package/dist/bundle-generator/parser-templates.d.ts +6 -0
  37. package/dist/bundle-generator/template-capabilities.d.ts +10 -0
  38. package/dist/bundle-generator/templates.d.ts +11 -0
  39. package/dist/bundle-generator/types.d.ts +34 -0
  40. package/dist/bundles/test-minimal.d.ts +3 -0
  41. package/dist/bundles/test-standard.d.ts +3 -0
  42. package/dist/chunks/bridge-I6ceoWxV.js +2 -0
  43. package/dist/chunks/browser-modular-Dv6PAV3c.js +2 -0
  44. package/dist/chunks/feature-eventsource-DWb514fy.js +2 -0
  45. package/dist/chunks/feature-sockets-3PFuvCVY.js +2 -0
  46. package/dist/chunks/feature-webworker-DTm_eh-E.js +2 -0
  47. package/dist/commands/advanced/async.d.ts +28 -0
  48. package/dist/commands/advanced/js.d.ts +28 -0
  49. package/dist/commands/animation/measure.d.ts +31 -0
  50. package/dist/commands/animation/settle.d.ts +26 -0
  51. package/dist/commands/animation/take.d.ts +28 -0
  52. package/dist/commands/animation/transition.d.ts +31 -0
  53. package/dist/commands/async/fetch.d.ts +44 -0
  54. package/dist/commands/async/wait.d.ts +41 -0
  55. package/dist/commands/behaviors/install.d.ts +41 -0
  56. package/dist/commands/content/append.d.ts +27 -0
  57. package/dist/commands/control-flow/break.d.ts +15 -0
  58. package/dist/commands/control-flow/continue.d.ts +15 -0
  59. package/dist/commands/control-flow/exit.d.ts +15 -0
  60. package/dist/commands/control-flow/halt.d.ts +25 -0
  61. package/dist/commands/control-flow/if.d.ts +45 -0
  62. package/dist/commands/control-flow/repeat.d.ts +35 -0
  63. package/dist/commands/control-flow/return.d.ts +23 -0
  64. package/dist/commands/control-flow/signal-base.d.ts +25 -0
  65. package/dist/commands/control-flow/throw.d.ts +22 -0
  66. package/dist/commands/control-flow/unless.d.ts +3 -0
  67. package/dist/commands/data/decrement.d.ts +3 -0
  68. package/dist/commands/data/default.d.ts +31 -0
  69. package/dist/commands/data/get.d.ts +23 -0
  70. package/dist/commands/data/increment.d.ts +25 -0
  71. package/dist/commands/data/set.d.ts +56 -0
  72. package/dist/commands/decorators/index.d.ts +30 -0
  73. package/dist/commands/dom/__tests__/add-standalone-helpers.d.ts +11 -0
  74. package/dist/commands/dom/add.d.ts +31 -0
  75. package/dist/commands/dom/dom-modification-base.d.ts +48 -0
  76. package/dist/commands/dom/hide.d.ts +12 -0
  77. package/dist/commands/dom/make.d.ts +21 -0
  78. package/dist/commands/dom/process-partials.d.ts +39 -0
  79. package/dist/commands/dom/put.d.ts +31 -0
  80. package/dist/commands/dom/remove.d.ts +33 -0
  81. package/dist/commands/dom/show.d.ts +13 -0
  82. package/dist/commands/dom/swap.d.ts +38 -0
  83. package/dist/commands/dom/toggle.d.ts +55 -0
  84. package/dist/commands/dom/visibility-base.d.ts +20 -0
  85. package/dist/commands/events/send.d.ts +3 -0
  86. package/dist/commands/events/trigger.d.ts +36 -0
  87. package/dist/commands/execution/call.d.ts +24 -0
  88. package/dist/commands/execution/pseudo-command.d.ts +42 -0
  89. package/dist/commands/helpers/attribute-manipulation.d.ts +11 -0
  90. package/dist/commands/helpers/batch-dom-operations.d.ts +12 -0
  91. package/dist/commands/helpers/class-manipulation.d.ts +11 -0
  92. package/dist/commands/helpers/condition-helpers.d.ts +4 -0
  93. package/dist/commands/helpers/dom-mutation.d.ts +15 -0
  94. package/dist/commands/helpers/duration-parsing.d.ts +8 -0
  95. package/dist/commands/helpers/element-property-access.d.ts +7 -0
  96. package/dist/commands/helpers/element-resolution.d.ts +17 -0
  97. package/dist/commands/helpers/error-helpers.d.ts +17 -0
  98. package/dist/commands/helpers/event-helpers.d.ts +13 -0
  99. package/dist/commands/helpers/event-waiting.d.ts +37 -0
  100. package/dist/commands/helpers/index.d.ts +32 -0
  101. package/dist/commands/helpers/input-validator.d.ts +23 -0
  102. package/dist/commands/helpers/loop-executor.d.ts +53 -0
  103. package/dist/commands/helpers/numeric-target-parser.d.ts +14 -0
  104. package/dist/commands/helpers/property-target.d.ts +30 -0
  105. package/dist/commands/helpers/selector-type-detection.d.ts +24 -0
  106. package/dist/commands/helpers/smart-element.d.ts +16 -0
  107. package/dist/commands/helpers/style-manipulation.d.ts +16 -0
  108. package/dist/commands/helpers/temporal-modifiers.d.ts +15 -0
  109. package/dist/commands/helpers/url-argument-parser.d.ts +10 -0
  110. package/dist/commands/helpers/url-validation.d.ts +7 -0
  111. package/dist/commands/helpers/variable-access.d.ts +10 -0
  112. package/dist/commands/helpers/visibility-target-parser.d.ts +11 -0
  113. package/dist/commands/index.d.ts +139 -0
  114. package/dist/commands/index.js +9186 -0
  115. package/dist/commands/index.mjs +9032 -0
  116. package/dist/commands/navigation/go.d.ts +35 -0
  117. package/dist/commands/navigation/push-url.d.ts +35 -0
  118. package/dist/commands/navigation/replace-url.d.ts +3 -0
  119. package/dist/commands/templates/render.d.ts +48 -0
  120. package/dist/commands/utility/beep.d.ts +32 -0
  121. package/dist/commands/utility/copy.d.ts +29 -0
  122. package/dist/commands/utility/log.d.ts +24 -0
  123. package/dist/commands/utility/pick.d.ts +26 -0
  124. package/dist/commands/utility/tell.d.ts +26 -0
  125. package/dist/compatibility/browser-bundle-animation-generated.d.ts +16 -0
  126. package/dist/compatibility/browser-bundle-classic-i18n.d.ts +63 -0
  127. package/dist/compatibility/browser-bundle-classic.d.ts +17 -0
  128. package/dist/compatibility/browser-bundle-forms-generated.d.ts +16 -0
  129. package/dist/compatibility/browser-bundle-hybrid-complete.d.ts +28 -0
  130. package/dist/compatibility/browser-bundle-hybrid-hx.d.ts +43 -0
  131. package/dist/compatibility/browser-bundle-lite-plus.d.ts +25 -0
  132. package/dist/compatibility/browser-bundle-lite.d.ts +23 -0
  133. package/dist/compatibility/browser-bundle-minimal-generated.d.ts +16 -0
  134. package/dist/compatibility/browser-bundle-minimal-v2.d.ts +17 -0
  135. package/dist/compatibility/browser-bundle-minimal.d.ts +8 -0
  136. package/dist/compatibility/browser-bundle-modular.d.ts +18 -0
  137. package/dist/compatibility/browser-bundle-multilingual.d.ts +19 -0
  138. package/dist/compatibility/browser-bundle-semantic-complete.d.ts +24 -0
  139. package/dist/compatibility/browser-bundle-standard-v2.d.ts +17 -0
  140. package/dist/compatibility/browser-bundle-standard.d.ts +8 -0
  141. package/dist/compatibility/browser-bundle-textshelf-minimal.d.ts +16 -0
  142. package/dist/compatibility/browser-bundle-textshelf-profile.d.ts +18 -0
  143. package/dist/compatibility/browser-bundle.d.ts +140 -0
  144. package/dist/compatibility/browser-modular.d.ts +53 -0
  145. package/dist/compatibility/browser-tests/test-utils.d.ts +21 -0
  146. package/dist/compatibility/eval-hyperscript.d.ts +15 -0
  147. package/dist/compatibility/feature-loader.d.ts +8 -0
  148. package/dist/compatibility/hyperscript-adapter.d.ts +38 -0
  149. package/dist/compatibility/hyperscript-tests/test-adapter.d.ts +13 -0
  150. package/dist/core/ast-property-utils.d.ts +2 -0
  151. package/dist/core/base-expression-evaluator.d.ts +70 -0
  152. package/dist/core/binary-expression-evaluator.d.ts +7 -0
  153. package/dist/core/call-expression-evaluator.d.ts +7 -0
  154. package/dist/core/configurable-expression-evaluator.d.ts +5 -0
  155. package/dist/core/context.d.ts +15 -0
  156. package/dist/core/dom.d.ts +15 -0
  157. package/dist/core/evaluator-types.d.ts +5 -0
  158. package/dist/core/events.d.ts +48 -0
  159. package/dist/core/executor.d.ts +34 -0
  160. package/dist/core/expression-evaluator.d.ts +6 -0
  161. package/dist/core/lazy-expression-evaluator.d.ts +22 -0
  162. package/dist/core/parser.d.ts +21 -0
  163. package/dist/core/selector-evaluator.d.ts +15 -0
  164. package/dist/core/template-literal-evaluator.d.ts +5 -0
  165. package/dist/dom/attribute-processor.d.ts +40 -0
  166. package/dist/dom/minimal-attribute-processor.d.ts +20 -0
  167. package/dist/experimental/binary-tree/accessor.d.ts +10 -0
  168. package/dist/experimental/binary-tree/ast-serializer.d.ts +26 -0
  169. package/dist/experimental/binary-tree/benchmark.d.ts +24 -0
  170. package/dist/experimental/binary-tree/buffer-context.d.ts +27 -0
  171. package/dist/experimental/binary-tree/deserializer.d.ts +17 -0
  172. package/dist/experimental/binary-tree/index.d.ts +22 -0
  173. package/dist/experimental/binary-tree/serializer.d.ts +4 -0
  174. package/dist/experimental/binary-tree/types.d.ts +54 -0
  175. package/dist/expressions/base-expression.d.ts +27 -0
  176. package/dist/expressions/bundles/common-expressions.d.ts +9 -0
  177. package/dist/expressions/bundles/core-expressions.d.ts +7 -0
  178. package/dist/expressions/bundles/full-expressions.d.ts +10 -0
  179. package/dist/expressions/bundles/index.d.ts +7 -0
  180. package/dist/expressions/comparison/index.d.ts +80 -0
  181. package/dist/expressions/comparison/utils.d.ts +2 -0
  182. package/dist/expressions/conversion/impl/bridge.d.ts +117 -0
  183. package/dist/expressions/conversion/impl/index.d.ts +59 -0
  184. package/dist/expressions/conversion/index.d.ts +23 -0
  185. package/dist/expressions/expression-tiers.d.ts +13 -0
  186. package/dist/expressions/index.d.ts +11 -0
  187. package/dist/expressions/index.js +6930 -0
  188. package/dist/expressions/index.mjs +6912 -0
  189. package/dist/expressions/logical/impl/index.d.ts +54 -0
  190. package/dist/expressions/logical/impl/pattern-matching.d.ts +58 -0
  191. package/dist/expressions/logical/index.d.ts +59 -0
  192. package/dist/expressions/mathematical/index.d.ts +69 -0
  193. package/dist/expressions/positional/impl/bridge.d.ts +95 -0
  194. package/dist/expressions/positional/impl/index.d.ts +73 -0
  195. package/dist/expressions/positional/index.d.ts +26 -0
  196. package/dist/expressions/properties/impl/index.d.ts +105 -0
  197. package/dist/expressions/properties/index.d.ts +26 -0
  198. package/dist/expressions/property/index.d.ts +55 -0
  199. package/dist/expressions/property-access-utils.d.ts +23 -0
  200. package/dist/expressions/references/impl/bridge.d.ts +54 -0
  201. package/dist/expressions/references/impl/index.d.ts +65 -0
  202. package/dist/expressions/references/index.d.ts +40 -0
  203. package/dist/expressions/shared/comparison-utils.d.ts +10 -0
  204. package/dist/expressions/shared/index.d.ts +9 -0
  205. package/dist/expressions/shared/number-utils.d.ts +7 -0
  206. package/dist/expressions/shared/validation-utils.d.ts +13 -0
  207. package/dist/expressions/special/index.d.ts +104 -0
  208. package/dist/expressions/type-helpers.d.ts +11 -0
  209. package/dist/expressions/type-registry.d.ts +57 -0
  210. package/dist/expressions/validation-helpers.d.ts +15 -0
  211. package/dist/extensions/index.d.ts +3 -0
  212. package/dist/extensions/tailwind.d.ts +22 -0
  213. package/dist/features/behaviors.d.ts +153 -0
  214. package/dist/features/def.d.ts +135 -0
  215. package/dist/features/eventsource.d.ts +140 -0
  216. package/dist/features/init.d.ts +135 -0
  217. package/dist/features/on.d.ts +131 -0
  218. package/dist/features/predefined-behaviors/dropdown-behavior.d.ts +20 -0
  219. package/dist/features/predefined-behaviors/index.d.ts +12 -0
  220. package/dist/features/predefined-behaviors/modal-behavior.d.ts +18 -0
  221. package/dist/features/predefined-behaviors/toggle-group-behavior.d.ts +23 -0
  222. package/dist/features/predefined-behaviors/types.d.ts +14 -0
  223. package/dist/features/sockets.d.ts +162 -0
  224. package/dist/features/webworker.d.ts +135 -0
  225. package/dist/htmx/htmx-attribute-processor.d.ts +84 -0
  226. package/dist/htmx/htmx-translator.d.ts +19 -0
  227. package/dist/htmx/index.d.ts +3 -0
  228. package/dist/hyperfixi-classic-i18n.js +2 -0
  229. package/dist/hyperfixi-hx.js +1 -0
  230. package/dist/hyperfixi-hybrid-complete.js +1 -0
  231. package/dist/hyperfixi-lite-plus.js +1 -0
  232. package/dist/hyperfixi-lite.js +1 -0
  233. package/dist/hyperfixi-minimal.js +1 -0
  234. package/dist/hyperfixi-multilingual.js +2 -0
  235. package/dist/hyperfixi-standard.js +2 -0
  236. package/dist/hyperfixi.js +2 -0
  237. package/dist/hyperfixi.mjs +2 -0
  238. package/dist/index.d.ts +25 -0
  239. package/dist/index.js +65387 -0
  240. package/dist/index.min.js +2 -0
  241. package/dist/index.mjs +65343 -0
  242. package/dist/lib/index.d.ts +4 -0
  243. package/dist/lib/morph-adapter.d.ts +22 -0
  244. package/dist/lib/swap-executor.d.ts +22 -0
  245. package/dist/lib/view-transitions.d.ts +33 -0
  246. package/dist/lokascript-browser-classic-i18n.js +2 -0
  247. package/dist/lokascript-browser-minimal.js +1 -0
  248. package/dist/lokascript-browser-standard.js +2 -0
  249. package/dist/lokascript-browser.js +2 -0
  250. package/dist/lokascript-hybrid-complete.js +1 -0
  251. package/dist/lokascript-hybrid-hx.js +1 -0
  252. package/dist/lokascript-lite-plus.js +1 -0
  253. package/dist/lokascript-lite.js +1 -0
  254. package/dist/lokascript-multilingual.js +2 -0
  255. package/dist/lsp-metadata.d.ts +25 -0
  256. package/dist/lsp-metadata.js +680 -0
  257. package/dist/lsp-metadata.mjs +670 -0
  258. package/dist/metadata.d.ts +213 -0
  259. package/dist/metadata.js +378 -0
  260. package/dist/metadata.mjs +368 -0
  261. package/dist/mod.d.ts +63 -0
  262. package/dist/multilingual/bridge.d.ts +36 -0
  263. package/dist/multilingual/index.d.ts +32 -0
  264. package/dist/multilingual/index.js +285 -0
  265. package/dist/multilingual/index.mjs +278 -0
  266. package/dist/parser/__types__/test-helpers.d.ts +25 -0
  267. package/dist/parser/command-node-builder.d.ts +45 -0
  268. package/dist/parser/command-parsers/animation-commands.d.ts +5 -0
  269. package/dist/parser/command-parsers/async-commands.d.ts +5 -0
  270. package/dist/parser/command-parsers/control-flow-commands.d.ts +7 -0
  271. package/dist/parser/command-parsers/dom-commands.d.ts +8 -0
  272. package/dist/parser/command-parsers/event-commands.d.ts +4 -0
  273. package/dist/parser/command-parsers/utility-commands.d.ts +9 -0
  274. package/dist/parser/command-parsers/variable-commands.d.ts +12 -0
  275. package/dist/parser/error-handler.d.ts +34 -0
  276. package/dist/parser/expression-parser.d.ts +6 -0
  277. package/dist/parser/full-parser.d.ts +4 -0
  278. package/dist/parser/full-parser.js +6532 -0
  279. package/dist/parser/full-parser.mjs +6529 -0
  280. package/dist/parser/helpers/ast-helpers.d.ts +22 -0
  281. package/dist/parser/helpers/parsing-helpers.d.ts +19 -0
  282. package/dist/parser/helpers/token-helpers.d.ts +28 -0
  283. package/dist/parser/hybrid/aliases.d.ts +7 -0
  284. package/dist/parser/hybrid/aliases.js +44 -0
  285. package/dist/parser/hybrid/aliases.mjs +37 -0
  286. package/dist/parser/hybrid/ast-types.d.ts +97 -0
  287. package/dist/parser/hybrid/ast-types.js +3 -0
  288. package/dist/parser/hybrid/ast-types.mjs +2 -0
  289. package/dist/parser/hybrid/index.d.ts +6 -0
  290. package/dist/parser/hybrid/index.js +1015 -0
  291. package/dist/parser/hybrid/index.mjs +1005 -0
  292. package/dist/parser/hybrid/parser-core.d.ts +57 -0
  293. package/dist/parser/hybrid/parser-core.js +1001 -0
  294. package/dist/parser/hybrid/parser-core.mjs +999 -0
  295. package/dist/parser/hybrid/tokenizer.d.ts +9 -0
  296. package/dist/parser/hybrid/tokenizer.js +242 -0
  297. package/dist/parser/hybrid/tokenizer.mjs +239 -0
  298. package/dist/parser/hybrid-parser.d.ts +10 -0
  299. package/dist/parser/hybrid-parser.js +1078 -0
  300. package/dist/parser/hybrid-parser.mjs +1071 -0
  301. package/dist/parser/parser-constants.d.ts +102 -0
  302. package/dist/parser/parser-interface.d.ts +11 -0
  303. package/dist/parser/parser-types.d.ts +175 -0
  304. package/dist/parser/parser.d.ts +146 -0
  305. package/dist/parser/regex-parser.d.ts +4 -0
  306. package/dist/parser/regex-parser.js +412 -0
  307. package/dist/parser/regex-parser.mjs +409 -0
  308. package/dist/parser/runtime.d.ts +3 -0
  309. package/dist/parser/semantic-integration.d.ts +61 -0
  310. package/dist/parser/token-consumer.d.ts +35 -0
  311. package/dist/parser/token-predicates.d.ts +77 -0
  312. package/dist/parser/tokenizer.d.ts +57 -0
  313. package/dist/parser/types.d.ts +118 -0
  314. package/dist/performance/expression-cache.d.ts +78 -0
  315. package/dist/performance/integration.d.ts +40 -0
  316. package/dist/performance/production-monitor.d.ts +67 -0
  317. package/dist/reference/index.d.ts +41 -0
  318. package/dist/reference/index.js +586 -0
  319. package/dist/reference/index.mjs +577 -0
  320. package/dist/registry/browser-types.d.ts +20 -0
  321. package/dist/registry/browser-types.js +81 -0
  322. package/dist/registry/browser-types.mjs +76 -0
  323. package/dist/registry/context-provider-registry.d.ts +38 -0
  324. package/dist/registry/environment.d.ts +19 -0
  325. package/dist/registry/environment.js +36 -0
  326. package/dist/registry/environment.mjs +30 -0
  327. package/dist/registry/event-source-registry.d.ts +54 -0
  328. package/dist/registry/examples/server-commands.d.ts +6 -0
  329. package/dist/registry/examples/server-event-source.d.ts +32 -0
  330. package/dist/registry/index.d.ts +54 -0
  331. package/dist/registry/index.js +7636 -0
  332. package/dist/registry/index.mjs +7612 -0
  333. package/dist/registry/multilingual/examples.d.ts +16 -0
  334. package/dist/registry/multilingual/index.d.ts +68 -0
  335. package/dist/registry/runtime-integration.d.ts +30 -0
  336. package/dist/registry/universal-types.d.ts +34 -0
  337. package/dist/registry/universal-types.js +91 -0
  338. package/dist/registry/universal-types.mjs +86 -0
  339. package/dist/runtime/cleanup-registry.d.ts +47 -0
  340. package/dist/runtime/command-adapter.d.ts +63 -0
  341. package/dist/runtime/environment.d.ts +75 -0
  342. package/dist/runtime/runtime-base.d.ts +78 -0
  343. package/dist/runtime/runtime-experimental.d.ts +18 -0
  344. package/dist/runtime/runtime-factory.d.ts +30 -0
  345. package/dist/runtime/runtime.d.ts +19 -0
  346. package/dist/runtime/temporal-modifiers.d.ts +37 -0
  347. package/dist/scripts/code-generator.d.ts +64 -0
  348. package/dist/scripts/generate-missing-commands.d.ts +4 -0
  349. package/dist/test-setup.d.ts +45 -0
  350. package/dist/test-utilities.d.ts +52 -0
  351. package/dist/tokenizer.d.ts +49 -0
  352. package/dist/types/base-types.d.ts +336 -0
  353. package/dist/types/code-fix.d.ts +39 -0
  354. package/dist/types/command-metadata.d.ts +57 -0
  355. package/dist/types/command-types.d.ts +272 -0
  356. package/dist/types/context-types.d.ts +106 -0
  357. package/dist/types/core-context.d.ts +21 -0
  358. package/dist/types/core.d.ts +203 -0
  359. package/dist/types/error-codes.d.ts +207 -0
  360. package/dist/types/expression-types.d.ts +155 -0
  361. package/dist/types/feature-types.d.ts +81 -0
  362. package/dist/types/hooks.d.ts +45 -0
  363. package/dist/types/index.d.ts +32 -0
  364. package/dist/types/result.d.ts +72 -0
  365. package/dist/types/template-types.d.ts +162 -0
  366. package/dist/types/type-guards.d.ts +24 -0
  367. package/dist/types/unified-types.d.ts +99 -0
  368. package/dist/utils/debug-events.d.ts +41 -0
  369. package/dist/utils/debug.d.ts +35 -0
  370. package/dist/utils/dom-utils.d.ts +16 -0
  371. package/dist/utils/element-check.d.ts +7 -0
  372. package/dist/utils/keyboard-shortcuts.d.ts +18 -0
  373. package/dist/utils/performance.d.ts +40 -0
  374. package/dist/validation/command-pattern-validator.d.ts +53 -0
  375. package/dist/validation/common-validators.d.ts +24 -0
  376. package/dist/validation/lightweight-validators.d.ts +113 -0
  377. package/dist/validation/partial-validation-types.d.ts +50 -0
  378. package/dist/validation/partial-validator.d.ts +6 -0
  379. package/dist/validation/partial-warning-formatter.d.ts +6 -0
  380. package/dist/validation/validate-cli.d.ts +41 -0
  381. package/package.json +292 -0
@@ -0,0 +1,999 @@
1
+ const KEYWORDS = new Set([
2
+ 'on',
3
+ 'from',
4
+ 'to',
5
+ 'into',
6
+ 'before',
7
+ 'after',
8
+ 'in',
9
+ 'of',
10
+ 'at',
11
+ 'with',
12
+ 'if',
13
+ 'else',
14
+ 'unless',
15
+ 'end',
16
+ 'then',
17
+ 'and',
18
+ 'or',
19
+ 'not',
20
+ 'repeat',
21
+ 'times',
22
+ 'for',
23
+ 'each',
24
+ 'while',
25
+ 'until',
26
+ 'toggle',
27
+ 'add',
28
+ 'remove',
29
+ 'put',
30
+ 'set',
31
+ 'get',
32
+ 'call',
33
+ 'return',
34
+ 'append',
35
+ 'log',
36
+ 'send',
37
+ 'trigger',
38
+ 'wait',
39
+ 'settle',
40
+ 'fetch',
41
+ 'as',
42
+ 'show',
43
+ 'hide',
44
+ 'take',
45
+ 'increment',
46
+ 'decrement',
47
+ 'focus',
48
+ 'blur',
49
+ 'go',
50
+ 'transition',
51
+ 'over',
52
+ 'the',
53
+ 'a',
54
+ 'an',
55
+ 'my',
56
+ 'its',
57
+ 'me',
58
+ 'it',
59
+ 'you',
60
+ 'first',
61
+ 'last',
62
+ 'next',
63
+ 'previous',
64
+ 'closest',
65
+ 'parent',
66
+ 'true',
67
+ 'false',
68
+ 'null',
69
+ 'undefined',
70
+ 'is',
71
+ 'matches',
72
+ 'contains',
73
+ 'includes',
74
+ 'exists',
75
+ 'has',
76
+ 'init',
77
+ 'every',
78
+ 'by',
79
+ ]);
80
+ function tokenize(code) {
81
+ const tokens = [];
82
+ let pos = 0;
83
+ while (pos < code.length) {
84
+ if (/\s/.test(code[pos])) {
85
+ pos++;
86
+ continue;
87
+ }
88
+ if (code.slice(pos, pos + 2) === '--') {
89
+ while (pos < code.length && code[pos] !== '\n')
90
+ pos++;
91
+ continue;
92
+ }
93
+ const start = pos;
94
+ if (code[pos] === '<' && /[a-zA-Z]/.test(code[pos + 1] || '')) {
95
+ pos++;
96
+ while (pos < code.length && code[pos] !== '>')
97
+ pos++;
98
+ if (code[pos] === '>')
99
+ pos++;
100
+ const val = code.slice(start, pos);
101
+ if (val.endsWith('/>') || val.endsWith('>')) {
102
+ const normalized = val.slice(1).replace(/\/?>$/, '');
103
+ tokens.push({ type: 'selector', value: normalized, pos: start });
104
+ continue;
105
+ }
106
+ }
107
+ if (code.slice(pos, pos + 2) === "'s" && !/[a-zA-Z]/.test(code[pos + 2] || '')) {
108
+ tokens.push({ type: 'operator', value: "'s", pos: start });
109
+ pos += 2;
110
+ continue;
111
+ }
112
+ if (code[pos] === '"' || code[pos] === "'") {
113
+ const quote = code[pos++];
114
+ while (pos < code.length && code[pos] !== quote) {
115
+ if (code[pos] === '\\')
116
+ pos++;
117
+ pos++;
118
+ }
119
+ pos++;
120
+ tokens.push({ type: 'string', value: code.slice(start, pos), pos: start });
121
+ continue;
122
+ }
123
+ if (/\d/.test(code[pos]) || (code[pos] === '-' && /\d/.test(code[pos + 1] || ''))) {
124
+ if (code[pos] === '-')
125
+ pos++;
126
+ while (pos < code.length && /[\d.]/.test(code[pos]))
127
+ pos++;
128
+ if (code.slice(pos, pos + 2) === 'ms')
129
+ pos += 2;
130
+ else if (code[pos] === 's' && !/[a-zA-Z]/.test(code[pos + 1] || ''))
131
+ pos++;
132
+ else if (code.slice(pos, pos + 2) === 'px')
133
+ pos += 2;
134
+ tokens.push({ type: 'number', value: code.slice(start, pos), pos: start });
135
+ continue;
136
+ }
137
+ if (code[pos] === ':') {
138
+ pos++;
139
+ while (pos < code.length && /[\w]/.test(code[pos]))
140
+ pos++;
141
+ tokens.push({ type: 'localVar', value: code.slice(start, pos), pos: start });
142
+ continue;
143
+ }
144
+ if (code[pos] === '$') {
145
+ pos++;
146
+ while (pos < code.length && /[\w]/.test(code[pos]))
147
+ pos++;
148
+ tokens.push({ type: 'globalVar', value: code.slice(start, pos), pos: start });
149
+ continue;
150
+ }
151
+ if (code[pos] === '#' || code[pos] === '.') {
152
+ if (code[pos] === '.') {
153
+ const afterDot = code.slice(pos + 1).match(/^(once|prevent|stop|debounce|throttle)\b/i);
154
+ if (afterDot) {
155
+ tokens.push({ type: 'symbol', value: '.', pos: start });
156
+ pos++;
157
+ continue;
158
+ }
159
+ }
160
+ pos++;
161
+ while (pos < code.length && /[\w-]/.test(code[pos]))
162
+ pos++;
163
+ tokens.push({ type: 'selector', value: code.slice(start, pos), pos: start });
164
+ continue;
165
+ }
166
+ if (code[pos] === '[') {
167
+ let lookahead = pos + 1;
168
+ while (lookahead < code.length && /\s/.test(code[lookahead]))
169
+ lookahead++;
170
+ const nextChar = code[lookahead] || '';
171
+ const isArrayLiteral = /['"\d\[\]:\$\-]/.test(nextChar) || nextChar === '';
172
+ if (isArrayLiteral) {
173
+ tokens.push({ type: 'symbol', value: '[', pos: start });
174
+ pos++;
175
+ continue;
176
+ }
177
+ else {
178
+ pos++;
179
+ let depth = 1;
180
+ while (pos < code.length && depth > 0) {
181
+ if (code[pos] === '[')
182
+ depth++;
183
+ if (code[pos] === ']')
184
+ depth--;
185
+ pos++;
186
+ }
187
+ tokens.push({ type: 'selector', value: code.slice(start, pos), pos: start });
188
+ continue;
189
+ }
190
+ }
191
+ if (code[pos] === ']') {
192
+ tokens.push({ type: 'symbol', value: ']', pos: start });
193
+ pos++;
194
+ continue;
195
+ }
196
+ if (code.slice(pos, pos + 2) === "'s") {
197
+ tokens.push({ type: 'operator', value: "'s", pos: start });
198
+ pos += 2;
199
+ continue;
200
+ }
201
+ const twoChar = code.slice(pos, pos + 2);
202
+ if (['==', '!=', '<=', '>=', '&&', '||'].includes(twoChar)) {
203
+ tokens.push({ type: 'operator', value: twoChar, pos: start });
204
+ pos += 2;
205
+ continue;
206
+ }
207
+ if (code[pos] === '*' && /[a-zA-Z]/.test(code[pos + 1] || '')) {
208
+ pos++;
209
+ while (pos < code.length && /[\w-]/.test(code[pos]))
210
+ pos++;
211
+ tokens.push({ type: 'styleProperty', value: code.slice(start, pos), pos: start });
212
+ continue;
213
+ }
214
+ if ('+-*/%<>!'.includes(code[pos])) {
215
+ tokens.push({ type: 'operator', value: code[pos], pos: start });
216
+ pos++;
217
+ continue;
218
+ }
219
+ if ('()[]{},.'.includes(code[pos])) {
220
+ tokens.push({ type: 'symbol', value: code[pos], pos: start });
221
+ pos++;
222
+ continue;
223
+ }
224
+ if (/[a-zA-Z_]/.test(code[pos])) {
225
+ while (pos < code.length && /[\w-]/.test(code[pos]))
226
+ pos++;
227
+ const value = code.slice(start, pos);
228
+ const type = KEYWORDS.has(value.toLowerCase()) ? 'keyword' : 'identifier';
229
+ tokens.push({ type, value, pos: start });
230
+ continue;
231
+ }
232
+ pos++;
233
+ }
234
+ tokens.push({ type: 'eof', value: '', pos: code.length });
235
+ return tokens;
236
+ }
237
+
238
+ const COMMAND_ALIASES = {
239
+ flip: 'toggle',
240
+ switch: 'toggle',
241
+ display: 'show',
242
+ reveal: 'show',
243
+ conceal: 'hide',
244
+ increase: 'increment',
245
+ decrease: 'decrement',
246
+ fire: 'trigger',
247
+ dispatch: 'send',
248
+ navigate: 'go',
249
+ goto: 'go',
250
+ };
251
+ const EVENT_ALIASES = {
252
+ clicked: 'click',
253
+ pressed: 'keydown',
254
+ changed: 'change',
255
+ submitted: 'submit',
256
+ loaded: 'load',
257
+ };
258
+ function normalizeCommand(name) {
259
+ const lower = name.toLowerCase();
260
+ return COMMAND_ALIASES[lower] || lower;
261
+ }
262
+ function normalizeEvent(name) {
263
+ const lower = name.toLowerCase();
264
+ return EVENT_ALIASES[lower] || lower;
265
+ }
266
+
267
+ class HybridParser {
268
+ constructor(code) {
269
+ this.pos = 0;
270
+ this.tokens = tokenize(code);
271
+ }
272
+ peek(offset = 0) {
273
+ return this.tokens[Math.min(this.pos + offset, this.tokens.length - 1)];
274
+ }
275
+ advance() {
276
+ return this.tokens[this.pos++];
277
+ }
278
+ match(...values) {
279
+ const token = this.peek();
280
+ return values.some(v => token.value.toLowerCase() === v.toLowerCase());
281
+ }
282
+ matchType(...types) {
283
+ return types.includes(this.peek().type);
284
+ }
285
+ expect(value) {
286
+ if (!this.match(value) && normalizeCommand(this.peek().value) !== value) {
287
+ throw new Error(`Expected '${value}', got '${this.peek().value}'`);
288
+ }
289
+ return this.advance();
290
+ }
291
+ isAtEnd() {
292
+ return this.peek().type === 'eof';
293
+ }
294
+ parse() {
295
+ if (this.match('on'))
296
+ return this.parseEventHandler();
297
+ if (this.match('init')) {
298
+ this.advance();
299
+ return { type: 'event', event: 'init', modifiers: {}, body: this.parseCommandSequence() };
300
+ }
301
+ if (this.match('every'))
302
+ return this.parseEveryHandler();
303
+ return { type: 'sequence', commands: this.parseCommandSequence() };
304
+ }
305
+ parseEventHandler() {
306
+ this.expect('on');
307
+ const eventName = this.advance().value;
308
+ const modifiers = {};
309
+ let filter;
310
+ while (this.peek().value === '.') {
311
+ this.advance();
312
+ const mod = this.advance().value.toLowerCase();
313
+ if (mod === 'once')
314
+ modifiers.once = true;
315
+ else if (mod === 'prevent')
316
+ modifiers.prevent = true;
317
+ else if (mod === 'stop')
318
+ modifiers.stop = true;
319
+ else if (mod === 'debounce' || mod === 'throttle') {
320
+ if (this.peek().value === '(') {
321
+ this.advance();
322
+ const num = this.advance().value;
323
+ this.expect(')');
324
+ if (mod === 'debounce')
325
+ modifiers.debounce = parseInt(num) || 100;
326
+ else
327
+ modifiers.throttle = parseInt(num) || 100;
328
+ }
329
+ }
330
+ }
331
+ if (this.match('from')) {
332
+ this.advance();
333
+ filter = this.parseExpression();
334
+ }
335
+ return {
336
+ type: 'event',
337
+ event: normalizeEvent(eventName),
338
+ filter,
339
+ modifiers,
340
+ body: this.parseCommandSequence(),
341
+ };
342
+ }
343
+ parseEveryHandler() {
344
+ this.expect('every');
345
+ const interval = this.advance().value;
346
+ return {
347
+ type: 'event',
348
+ event: `interval:${interval}`,
349
+ modifiers: {},
350
+ body: this.parseCommandSequence(),
351
+ };
352
+ }
353
+ parseCommandSequence() {
354
+ const commands = [];
355
+ while (!this.isAtEnd() && !this.match('end', 'else')) {
356
+ const cmd = this.parseCommand();
357
+ if (cmd)
358
+ commands.push(cmd);
359
+ if (this.match('then', 'and'))
360
+ this.advance();
361
+ }
362
+ return commands;
363
+ }
364
+ parseCommand() {
365
+ if (this.match('if', 'unless'))
366
+ return this.parseIf();
367
+ if (this.match('repeat'))
368
+ return this.parseRepeat();
369
+ if (this.match('for'))
370
+ return this.parseFor();
371
+ if (this.match('while'))
372
+ return this.parseWhile();
373
+ if (this.match('fetch'))
374
+ return this.parseFetchBlock();
375
+ const cmdMap = {
376
+ toggle: () => this.parseToggle(),
377
+ add: () => this.parseAdd(),
378
+ remove: () => this.parseRemove(),
379
+ put: () => this.parsePut(),
380
+ append: () => this.parseAppend(),
381
+ set: () => this.parseSet(),
382
+ get: () => this.parseGet(),
383
+ call: () => this.parseCall(),
384
+ log: () => this.parseLog(),
385
+ send: () => this.parseSend(),
386
+ trigger: () => this.parseSend(),
387
+ wait: () => this.parseWait(),
388
+ show: () => this.parseShow(),
389
+ hide: () => this.parseHide(),
390
+ take: () => this.parseTake(),
391
+ increment: () => this.parseIncDec('increment'),
392
+ decrement: () => this.parseIncDec('decrement'),
393
+ focus: () => this.parseFocusBlur('focus'),
394
+ blur: () => this.parseFocusBlur('blur'),
395
+ go: () => this.parseGo(),
396
+ return: () => this.parseReturn(),
397
+ transition: () => this.parseTransition(),
398
+ };
399
+ const normalized = normalizeCommand(this.peek().value);
400
+ if (cmdMap[normalized]) {
401
+ return cmdMap[normalized]();
402
+ }
403
+ if (!this.isAtEnd() && !this.match('then', 'and', 'end', 'else')) {
404
+ this.advance();
405
+ }
406
+ return null;
407
+ }
408
+ parseIf() {
409
+ const isUnless = this.match('unless');
410
+ this.advance();
411
+ const condition = this.parseExpression();
412
+ const body = this.parseCommandSequence();
413
+ let elseBody;
414
+ if (this.match('else')) {
415
+ this.advance();
416
+ elseBody = this.parseCommandSequence();
417
+ }
418
+ if (this.match('end'))
419
+ this.advance();
420
+ return {
421
+ type: 'if',
422
+ condition: isUnless ? { type: 'unary', operator: 'not', operand: condition } : condition,
423
+ body,
424
+ elseBody,
425
+ };
426
+ }
427
+ parseRepeat() {
428
+ this.expect('repeat');
429
+ let count;
430
+ if (!this.match('until', 'while', 'forever')) {
431
+ count = this.parseExpression();
432
+ if (this.match('times'))
433
+ this.advance();
434
+ }
435
+ const body = this.parseCommandSequence();
436
+ if (this.match('end'))
437
+ this.advance();
438
+ return { type: 'repeat', condition: count, body };
439
+ }
440
+ parseFor() {
441
+ this.expect('for');
442
+ if (this.match('each'))
443
+ this.advance();
444
+ const variable = this.advance().value;
445
+ this.expect('in');
446
+ const iterable = this.parseExpression();
447
+ const body = this.parseCommandSequence();
448
+ if (this.match('end'))
449
+ this.advance();
450
+ return { type: 'for', condition: { type: 'forCondition', variable, iterable }, body };
451
+ }
452
+ parseWhile() {
453
+ this.expect('while');
454
+ const condition = this.parseExpression();
455
+ const body = this.parseCommandSequence();
456
+ if (this.match('end'))
457
+ this.advance();
458
+ return { type: 'while', condition, body };
459
+ }
460
+ parseFetchBlock() {
461
+ this.expect('fetch');
462
+ const url = this.parseExpression();
463
+ let responseType = { type: 'literal', value: 'text' };
464
+ let options;
465
+ if (this.match('{')) {
466
+ this.pos--;
467
+ options = this.parseExpression();
468
+ }
469
+ for (let i = 0; i < 2; i++) {
470
+ if (this.match('as')) {
471
+ this.advance();
472
+ if (this.match('a') || this.match('an'))
473
+ this.advance();
474
+ responseType = this.parseExpression();
475
+ continue;
476
+ }
477
+ if (this.match('with') && !options) {
478
+ this.advance();
479
+ options = this.parseExpression();
480
+ continue;
481
+ }
482
+ break;
483
+ }
484
+ if (this.match('then'))
485
+ this.advance();
486
+ const body = this.parseCommandSequence();
487
+ return { type: 'fetch', condition: { type: 'fetchConfig', url, responseType, options }, body };
488
+ }
489
+ parseToggle() {
490
+ this.expect('toggle');
491
+ const what = this.parseExpression();
492
+ let target;
493
+ if (this.match('on')) {
494
+ this.advance();
495
+ target = this.parseExpression();
496
+ }
497
+ return { type: 'command', name: 'toggle', args: [what], target };
498
+ }
499
+ parseAdd() {
500
+ this.expect('add');
501
+ const what = this.parseExpression();
502
+ let target;
503
+ if (this.match('to')) {
504
+ this.advance();
505
+ target = this.parseExpression();
506
+ }
507
+ return { type: 'command', name: 'add', args: [what], target };
508
+ }
509
+ parseRemove() {
510
+ this.expect('remove');
511
+ if (this.matchType('selector')) {
512
+ const what = this.parseExpression();
513
+ let target;
514
+ if (this.match('from')) {
515
+ this.advance();
516
+ target = this.parseExpression();
517
+ }
518
+ return { type: 'command', name: 'removeClass', args: [what], target };
519
+ }
520
+ const target = this.parseExpression();
521
+ return { type: 'command', name: 'remove', args: [], target };
522
+ }
523
+ parsePut() {
524
+ this.expect('put');
525
+ const content = this.parseExpression();
526
+ let modifier = 'into';
527
+ if (this.match('into', 'before', 'after', 'at')) {
528
+ modifier = this.advance().value;
529
+ if (modifier === 'at') {
530
+ const pos = this.advance().value;
531
+ this.expect('of');
532
+ modifier = `at ${pos} of`;
533
+ }
534
+ }
535
+ const target = this.parseExpression();
536
+ return { type: 'command', name: 'put', args: [content], target, modifier };
537
+ }
538
+ parseAppend() {
539
+ this.expect('append');
540
+ const content = this.parseExpression();
541
+ let target;
542
+ if (this.match('to')) {
543
+ this.advance();
544
+ target = this.parseExpression();
545
+ }
546
+ return { type: 'command', name: 'append', args: [content], target };
547
+ }
548
+ parseSet() {
549
+ this.expect('set');
550
+ const target = this.parseExpression();
551
+ if (this.match('to')) {
552
+ this.advance();
553
+ const value = this.parseExpression();
554
+ return { type: 'command', name: 'set', args: [target, value] };
555
+ }
556
+ return { type: 'command', name: 'set', args: [target] };
557
+ }
558
+ parseGet() {
559
+ this.expect('get');
560
+ return { type: 'command', name: 'get', args: [this.parseExpression()] };
561
+ }
562
+ parseCall() {
563
+ this.expect('call');
564
+ return { type: 'command', name: 'call', args: [this.parseExpression()] };
565
+ }
566
+ parseLog() {
567
+ this.expect('log');
568
+ const args = [];
569
+ while (!this.isAtEnd() && !this.match('then', 'and', 'end', 'else')) {
570
+ args.push(this.parseExpression());
571
+ if (this.match(','))
572
+ this.advance();
573
+ else
574
+ break;
575
+ }
576
+ return { type: 'command', name: 'log', args };
577
+ }
578
+ parseSend() {
579
+ this.advance();
580
+ const event = this.advance().value;
581
+ let target;
582
+ if (this.match('to')) {
583
+ this.advance();
584
+ target = this.parseExpression();
585
+ }
586
+ return { type: 'command', name: 'send', args: [{ type: 'literal', value: event }], target };
587
+ }
588
+ parseWait() {
589
+ this.expect('wait');
590
+ if (this.match('for')) {
591
+ this.advance();
592
+ const event = this.advance().value;
593
+ let target;
594
+ if (this.match('from')) {
595
+ this.advance();
596
+ target = this.parseExpression();
597
+ }
598
+ return {
599
+ type: 'command',
600
+ name: 'waitFor',
601
+ args: [{ type: 'literal', value: event }],
602
+ target,
603
+ };
604
+ }
605
+ return { type: 'command', name: 'wait', args: [this.parseExpression()] };
606
+ }
607
+ parseShow() {
608
+ this.expect('show');
609
+ let target;
610
+ const modifiers = {};
611
+ if (!this.isAtEnd() && !this.match('then', 'and', 'end', 'else', 'when', 'where')) {
612
+ target = this.parseExpression();
613
+ }
614
+ if (!this.isAtEnd() && this.match('when', 'where')) {
615
+ const keyword = this.advance().value;
616
+ modifiers[keyword] = this.parseExpression();
617
+ }
618
+ return { type: 'command', name: 'show', args: [], target, modifiers };
619
+ }
620
+ parseHide() {
621
+ this.expect('hide');
622
+ let target;
623
+ const modifiers = {};
624
+ if (!this.isAtEnd() && !this.match('then', 'and', 'end', 'else', 'when', 'where')) {
625
+ target = this.parseExpression();
626
+ }
627
+ if (!this.isAtEnd() && this.match('when', 'where')) {
628
+ const keyword = this.advance().value;
629
+ modifiers[keyword] = this.parseExpression();
630
+ }
631
+ return { type: 'command', name: 'hide', args: [], target, modifiers };
632
+ }
633
+ parseTake() {
634
+ this.expect('take');
635
+ const what = this.parseExpression();
636
+ let from;
637
+ if (this.match('from')) {
638
+ this.advance();
639
+ from = this.parseExpression();
640
+ }
641
+ return { type: 'command', name: 'take', args: [what], target: from };
642
+ }
643
+ parseIncDec(name) {
644
+ this.advance();
645
+ const target = this.parseExpression();
646
+ let amount = { type: 'literal', value: 1 };
647
+ if (this.match('by')) {
648
+ this.advance();
649
+ amount = this.parseExpression();
650
+ }
651
+ return { type: 'command', name, args: [target, amount] };
652
+ }
653
+ parseFocusBlur(name) {
654
+ this.advance();
655
+ let target;
656
+ if (!this.isAtEnd() && !this.match('then', 'and', 'end', 'else')) {
657
+ target = this.parseExpression();
658
+ }
659
+ return { type: 'command', name, args: [], target };
660
+ }
661
+ parseGo() {
662
+ this.expect('go');
663
+ if (this.match('to'))
664
+ this.advance();
665
+ if (this.match('url'))
666
+ this.advance();
667
+ const dest = this.parseExpression();
668
+ return { type: 'command', name: 'go', args: [dest] };
669
+ }
670
+ parseReturn() {
671
+ this.expect('return');
672
+ let value;
673
+ if (!this.isAtEnd() && !this.match('then', 'and', 'end', 'else')) {
674
+ value = this.parseExpression();
675
+ }
676
+ return { type: 'command', name: 'return', args: value ? [value] : [] };
677
+ }
678
+ parseTransition() {
679
+ this.expect('transition');
680
+ let target;
681
+ if (this.match('my', 'its')) {
682
+ const ref = this.advance().value;
683
+ target = { type: 'identifier', value: ref === 'my' ? 'me' : 'it' };
684
+ }
685
+ else if (this.matchType('selector')) {
686
+ const expr = this.parseExpression();
687
+ if (expr.type === 'possessive') {
688
+ return this.parseTransitionRest(expr.object, expr.property);
689
+ }
690
+ target = expr;
691
+ }
692
+ const propToken = this.peek();
693
+ let property;
694
+ if (propToken.type === 'styleProperty') {
695
+ property = this.advance().value;
696
+ }
697
+ else if (propToken.type === 'identifier' || propToken.type === 'keyword') {
698
+ property = this.advance().value;
699
+ }
700
+ else {
701
+ property = 'opacity';
702
+ }
703
+ return this.parseTransitionRest(target, property);
704
+ }
705
+ parseTransitionRest(target, property) {
706
+ let toValue = { type: 'literal', value: 1 };
707
+ if (this.match('to')) {
708
+ this.advance();
709
+ toValue = this.parseExpression();
710
+ }
711
+ let duration = { type: 'literal', value: 300 };
712
+ if (this.match('over')) {
713
+ this.advance();
714
+ duration = this.parseExpression();
715
+ }
716
+ return {
717
+ type: 'command',
718
+ name: 'transition',
719
+ args: [{ type: 'literal', value: property }, toValue, duration],
720
+ target,
721
+ };
722
+ }
723
+ parseExpression() {
724
+ return this.parseOr();
725
+ }
726
+ parseOr() {
727
+ let left = this.parseAnd();
728
+ while (this.match('or', '||')) {
729
+ this.advance();
730
+ left = { type: 'binary', operator: 'or', left, right: this.parseAnd() };
731
+ }
732
+ return left;
733
+ }
734
+ parseAnd() {
735
+ let left = this.parseEquality();
736
+ while (this.match('and', '&&') && !this.isCommandKeyword(this.peek(1))) {
737
+ this.advance();
738
+ left = { type: 'binary', operator: 'and', left, right: this.parseEquality() };
739
+ }
740
+ return left;
741
+ }
742
+ isCommandKeyword(token) {
743
+ const cmds = [
744
+ 'toggle',
745
+ 'add',
746
+ 'remove',
747
+ 'set',
748
+ 'put',
749
+ 'log',
750
+ 'send',
751
+ 'wait',
752
+ 'show',
753
+ 'hide',
754
+ 'increment',
755
+ 'decrement',
756
+ 'focus',
757
+ 'blur',
758
+ 'go',
759
+ ];
760
+ return cmds.includes(normalizeCommand(token.value));
761
+ }
762
+ parseEquality() {
763
+ let left = this.parseComparison();
764
+ while (this.match('==', '!=', 'is', 'matches', 'contains', 'includes', 'has')) {
765
+ const op = this.advance().value;
766
+ if (op.toLowerCase() === 'is' && this.match('not')) {
767
+ this.advance();
768
+ left = { type: 'binary', operator: 'is not', left, right: this.parseComparison() };
769
+ }
770
+ else {
771
+ left = { type: 'binary', operator: op, left, right: this.parseComparison() };
772
+ }
773
+ }
774
+ return left;
775
+ }
776
+ parseComparison() {
777
+ let left = this.parseAdditive();
778
+ while (this.match('<', '>', '<=', '>=')) {
779
+ const op = this.advance().value;
780
+ left = { type: 'binary', operator: op, left, right: this.parseAdditive() };
781
+ }
782
+ return left;
783
+ }
784
+ parseAdditive() {
785
+ let left = this.parseMultiplicative();
786
+ while (this.match('+', '-')) {
787
+ const op = this.advance().value;
788
+ left = { type: 'binary', operator: op, left, right: this.parseMultiplicative() };
789
+ }
790
+ return left;
791
+ }
792
+ parseMultiplicative() {
793
+ let left = this.parseUnary();
794
+ while (this.match('*', '/', '%')) {
795
+ const op = this.advance().value;
796
+ left = { type: 'binary', operator: op, left, right: this.parseUnary() };
797
+ }
798
+ return left;
799
+ }
800
+ parseUnary() {
801
+ if (this.match('not', '!')) {
802
+ this.advance();
803
+ return { type: 'unary', operator: 'not', operand: this.parseUnary() };
804
+ }
805
+ if (this.match('-') && this.peek(1).type === 'number') {
806
+ this.advance();
807
+ const num = this.advance();
808
+ return { type: 'literal', value: -parseFloat(num.value) };
809
+ }
810
+ return this.parsePostfix();
811
+ }
812
+ parsePostfix() {
813
+ let left = this.parsePrimary();
814
+ while (true) {
815
+ if (this.match("'s")) {
816
+ this.advance();
817
+ const next = this.peek();
818
+ const prop = next.type === 'styleProperty' ? this.advance().value : this.advance().value;
819
+ left = { type: 'possessive', object: left, property: prop };
820
+ }
821
+ else if (this.peek().type === 'styleProperty') {
822
+ const prop = this.advance().value;
823
+ left = { type: 'possessive', object: left, property: prop };
824
+ }
825
+ else if (this.peek().value === '.') {
826
+ this.advance();
827
+ const prop = this.advance().value;
828
+ left = { type: 'member', object: left, property: prop };
829
+ }
830
+ else if (this.peek().type === 'selector' && this.peek().value.startsWith('.')) {
831
+ const prop = this.advance().value.slice(1);
832
+ left = { type: 'member', object: left, property: prop };
833
+ }
834
+ else if (this.peek().value === '(') {
835
+ this.advance();
836
+ const args = [];
837
+ while (!this.match(')')) {
838
+ args.push(this.parseExpression());
839
+ if (this.match(','))
840
+ this.advance();
841
+ }
842
+ this.expect(')');
843
+ left = { type: 'call', callee: left, args };
844
+ }
845
+ else if (this.peek().value === '[' && left.type !== 'selector') {
846
+ this.advance();
847
+ const index = this.parseExpression();
848
+ this.expect(']');
849
+ left = { type: 'member', object: left, property: index, computed: true };
850
+ }
851
+ else {
852
+ break;
853
+ }
854
+ }
855
+ return left;
856
+ }
857
+ parsePrimary() {
858
+ const token = this.peek();
859
+ if (token.value === '(') {
860
+ this.advance();
861
+ const expr = this.parseExpression();
862
+ this.expect(')');
863
+ return expr;
864
+ }
865
+ if (token.value === '{')
866
+ return this.parseObjectLiteral();
867
+ if (token.value === '[')
868
+ return this.parseArrayLiteral();
869
+ if (token.type === 'number') {
870
+ this.advance();
871
+ const val = token.value;
872
+ if (val.endsWith('ms'))
873
+ return { type: 'literal', value: parseInt(val), unit: 'ms' };
874
+ if (val.endsWith('s'))
875
+ return { type: 'literal', value: parseFloat(val) * 1000, unit: 'ms' };
876
+ return { type: 'literal', value: parseFloat(val) };
877
+ }
878
+ if (token.type === 'string') {
879
+ this.advance();
880
+ return { type: 'literal', value: token.value.slice(1, -1) };
881
+ }
882
+ if (this.match('true')) {
883
+ this.advance();
884
+ return { type: 'literal', value: true };
885
+ }
886
+ if (this.match('false')) {
887
+ this.advance();
888
+ return { type: 'literal', value: false };
889
+ }
890
+ if (this.match('null')) {
891
+ this.advance();
892
+ return { type: 'literal', value: null };
893
+ }
894
+ if (this.match('undefined')) {
895
+ this.advance();
896
+ return { type: 'literal', value: undefined };
897
+ }
898
+ if (token.type === 'localVar') {
899
+ this.advance();
900
+ return { type: 'variable', name: token.value, scope: 'local' };
901
+ }
902
+ if (token.type === 'globalVar') {
903
+ this.advance();
904
+ return { type: 'variable', name: token.value, scope: 'global' };
905
+ }
906
+ if (token.type === 'selector') {
907
+ this.advance();
908
+ return { type: 'selector', value: token.value };
909
+ }
910
+ if (this.match('my')) {
911
+ this.advance();
912
+ const next = this.peek();
913
+ if ((next.type === 'identifier' || next.type === 'keyword') && !this.isCommandKeyword(next)) {
914
+ const prop = this.advance().value;
915
+ return { type: 'possessive', object: { type: 'identifier', value: 'me' }, property: prop };
916
+ }
917
+ return { type: 'identifier', value: 'me' };
918
+ }
919
+ if (this.match('its')) {
920
+ this.advance();
921
+ const next = this.peek();
922
+ if ((next.type === 'identifier' || next.type === 'keyword') && !this.isCommandKeyword(next)) {
923
+ const prop = this.advance().value;
924
+ return { type: 'possessive', object: { type: 'identifier', value: 'it' }, property: prop };
925
+ }
926
+ return { type: 'identifier', value: 'it' };
927
+ }
928
+ if (this.match('me')) {
929
+ this.advance();
930
+ return { type: 'identifier', value: 'me' };
931
+ }
932
+ if (this.match('it')) {
933
+ this.advance();
934
+ return { type: 'identifier', value: 'it' };
935
+ }
936
+ if (this.match('you')) {
937
+ this.advance();
938
+ return { type: 'identifier', value: 'you' };
939
+ }
940
+ if (this.match('the', 'a', 'an')) {
941
+ this.advance();
942
+ if (this.match('first', 'last', 'next', 'previous', 'closest', 'parent')) {
943
+ const position = this.advance().value;
944
+ const target = this.parsePositionalTarget();
945
+ return { type: 'positional', position, target };
946
+ }
947
+ return this.parsePrimary();
948
+ }
949
+ if (this.match('first', 'last', 'next', 'previous', 'closest', 'parent')) {
950
+ const position = this.advance().value;
951
+ const target = this.parsePositionalTarget();
952
+ return { type: 'positional', position, target };
953
+ }
954
+ if (token.type === 'identifier' || token.type === 'keyword') {
955
+ this.advance();
956
+ return { type: 'identifier', value: token.value };
957
+ }
958
+ this.advance();
959
+ return { type: 'identifier', value: token.value };
960
+ }
961
+ parseObjectLiteral() {
962
+ this.expect('{');
963
+ const properties = [];
964
+ while (!this.match('}')) {
965
+ const key = this.advance().value;
966
+ this.expect(':');
967
+ const value = this.parseExpression();
968
+ properties.push({ key, value });
969
+ if (this.match(','))
970
+ this.advance();
971
+ }
972
+ this.expect('}');
973
+ return { type: 'object', properties };
974
+ }
975
+ parseArrayLiteral() {
976
+ this.expect('[');
977
+ const elements = [];
978
+ while (!this.match(']')) {
979
+ elements.push(this.parseExpression());
980
+ if (this.match(','))
981
+ this.advance();
982
+ }
983
+ this.expect(']');
984
+ return { type: 'array', elements };
985
+ }
986
+ parsePositionalTarget() {
987
+ const token = this.peek();
988
+ if (token.type === 'selector') {
989
+ return { type: 'selector', value: this.advance().value };
990
+ }
991
+ if (token.type === 'identifier' || token.type === 'keyword') {
992
+ return { type: 'identifier', value: this.advance().value };
993
+ }
994
+ return this.parseExpression();
995
+ }
996
+ }
997
+
998
+ export { HybridParser };
999
+ //# sourceMappingURL=parser-core.mjs.map