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