@lokascript/semantic 1.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.
- package/LICENSE +21 -0
- package/README.md +686 -0
- package/dist/browser-ar.ar.global.js +2 -0
- package/dist/browser-core.core.global.js +2 -0
- package/dist/browser-de.de.global.js +2 -0
- package/dist/browser-east-asian.east-asian.global.js +2 -0
- package/dist/browser-en-tr.en-tr.global.js +2 -0
- package/dist/browser-en.en.global.js +2 -0
- package/dist/browser-es-en.es-en.global.js +2 -0
- package/dist/browser-es.es.global.js +2 -0
- package/dist/browser-fr.fr.global.js +2 -0
- package/dist/browser-id.id.global.js +2 -0
- package/dist/browser-ja.ja.global.js +2 -0
- package/dist/browser-ko.ko.global.js +2 -0
- package/dist/browser-lazy.lazy.global.js +2 -0
- package/dist/browser-priority.priority.global.js +2 -0
- package/dist/browser-pt.pt.global.js +2 -0
- package/dist/browser-qu.qu.global.js +2 -0
- package/dist/browser-sw.sw.global.js +2 -0
- package/dist/browser-tr.tr.global.js +2 -0
- package/dist/browser-western.western.global.js +2 -0
- package/dist/browser-zh.zh.global.js +2 -0
- package/dist/browser.global.js +3 -0
- package/dist/browser.global.js.map +1 -0
- package/dist/index.cjs +35051 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3426 -0
- package/dist/index.d.ts +3426 -0
- package/dist/index.js +34890 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/ar.d.ts +78 -0
- package/dist/languages/ar.js +1622 -0
- package/dist/languages/ar.js.map +1 -0
- package/dist/languages/de.d.ts +38 -0
- package/dist/languages/de.js +1168 -0
- package/dist/languages/de.js.map +1 -0
- package/dist/languages/en.d.ts +44 -0
- package/dist/languages/en.js +3491 -0
- package/dist/languages/en.js.map +1 -0
- package/dist/languages/es.d.ts +52 -0
- package/dist/languages/es.js +1493 -0
- package/dist/languages/es.js.map +1 -0
- package/dist/languages/fr.d.ts +37 -0
- package/dist/languages/fr.js +1159 -0
- package/dist/languages/fr.js.map +1 -0
- package/dist/languages/id.d.ts +35 -0
- package/dist/languages/id.js +1152 -0
- package/dist/languages/id.js.map +1 -0
- package/dist/languages/ja.d.ts +53 -0
- package/dist/languages/ja.js +1430 -0
- package/dist/languages/ja.js.map +1 -0
- package/dist/languages/ko.d.ts +51 -0
- package/dist/languages/ko.js +1729 -0
- package/dist/languages/ko.js.map +1 -0
- package/dist/languages/pt.d.ts +37 -0
- package/dist/languages/pt.js +1127 -0
- package/dist/languages/pt.js.map +1 -0
- package/dist/languages/qu.d.ts +36 -0
- package/dist/languages/qu.js +1143 -0
- package/dist/languages/qu.js.map +1 -0
- package/dist/languages/sw.d.ts +35 -0
- package/dist/languages/sw.js +1147 -0
- package/dist/languages/sw.js.map +1 -0
- package/dist/languages/tr.d.ts +45 -0
- package/dist/languages/tr.js +1529 -0
- package/dist/languages/tr.js.map +1 -0
- package/dist/languages/zh.d.ts +58 -0
- package/dist/languages/zh.js +1257 -0
- package/dist/languages/zh.js.map +1 -0
- package/dist/types-C4dcj53L.d.ts +600 -0
- package/package.json +202 -0
- package/src/__test-utils__/index.ts +7 -0
- package/src/__test-utils__/test-helpers.ts +8 -0
- package/src/__types__/test-helpers.ts +122 -0
- package/src/analysis/index.ts +479 -0
- package/src/ast-builder/command-mappers.ts +1133 -0
- package/src/ast-builder/expression-parser/index.ts +41 -0
- package/src/ast-builder/expression-parser/parser.ts +563 -0
- package/src/ast-builder/expression-parser/tokenizer.ts +394 -0
- package/src/ast-builder/expression-parser/types.ts +208 -0
- package/src/ast-builder/index.ts +536 -0
- package/src/ast-builder/value-converters.ts +172 -0
- package/src/bridge.ts +275 -0
- package/src/browser-ar.ts +162 -0
- package/src/browser-core.ts +231 -0
- package/src/browser-de.ts +162 -0
- package/src/browser-east-asian.ts +173 -0
- package/src/browser-en-tr.ts +165 -0
- package/src/browser-en.ts +157 -0
- package/src/browser-es-en.ts +200 -0
- package/src/browser-es.ts +170 -0
- package/src/browser-fr.ts +162 -0
- package/src/browser-id.ts +162 -0
- package/src/browser-ja.ts +162 -0
- package/src/browser-ko.ts +162 -0
- package/src/browser-lazy.ts +189 -0
- package/src/browser-priority.ts +214 -0
- package/src/browser-pt.ts +162 -0
- package/src/browser-qu.ts +162 -0
- package/src/browser-sw.ts +162 -0
- package/src/browser-tr.ts +162 -0
- package/src/browser-western.ts +181 -0
- package/src/browser-zh.ts +162 -0
- package/src/browser.ts +268 -0
- package/src/cache/index.ts +14 -0
- package/src/cache/semantic-cache.ts +344 -0
- package/src/core-bridge.ts +372 -0
- package/src/explicit/converter.ts +258 -0
- package/src/explicit/index.ts +18 -0
- package/src/explicit/parser.ts +236 -0
- package/src/explicit/renderer.ts +424 -0
- package/src/generators/command-schemas.ts +1636 -0
- package/src/generators/event-handler-generator.ts +109 -0
- package/src/generators/index.ts +117 -0
- package/src/generators/language-profiles.ts +139 -0
- package/src/generators/pattern-generator.ts +537 -0
- package/src/generators/profiles/arabic.ts +131 -0
- package/src/generators/profiles/bengali.ts +132 -0
- package/src/generators/profiles/chinese.ts +124 -0
- package/src/generators/profiles/english.ts +113 -0
- package/src/generators/profiles/french.ts +125 -0
- package/src/generators/profiles/german.ts +126 -0
- package/src/generators/profiles/hindi.ts +146 -0
- package/src/generators/profiles/index.ts +46 -0
- package/src/generators/profiles/indonesian.ts +125 -0
- package/src/generators/profiles/italian.ts +139 -0
- package/src/generators/profiles/japanese.ts +149 -0
- package/src/generators/profiles/korean.ts +127 -0
- package/src/generators/profiles/marker-templates.ts +288 -0
- package/src/generators/profiles/ms.ts +130 -0
- package/src/generators/profiles/polish.ts +249 -0
- package/src/generators/profiles/portuguese.ts +115 -0
- package/src/generators/profiles/quechua.ts +113 -0
- package/src/generators/profiles/russian.ts +260 -0
- package/src/generators/profiles/spanish.ts +130 -0
- package/src/generators/profiles/swahili.ts +129 -0
- package/src/generators/profiles/thai.ts +132 -0
- package/src/generators/profiles/tl.ts +128 -0
- package/src/generators/profiles/turkish.ts +124 -0
- package/src/generators/profiles/types.ts +165 -0
- package/src/generators/profiles/ukrainian.ts +270 -0
- package/src/generators/profiles/vietnamese.ts +133 -0
- package/src/generators/schema-error-codes.ts +160 -0
- package/src/generators/schema-validator.ts +391 -0
- package/src/index.ts +429 -0
- package/src/language-building-schema.ts +3170 -0
- package/src/language-loader.ts +394 -0
- package/src/languages/_all.ts +65 -0
- package/src/languages/ar.ts +15 -0
- package/src/languages/bn.ts +16 -0
- package/src/languages/de.ts +15 -0
- package/src/languages/en.ts +29 -0
- package/src/languages/es.ts +15 -0
- package/src/languages/fr.ts +15 -0
- package/src/languages/hi.ts +26 -0
- package/src/languages/id.ts +15 -0
- package/src/languages/index.ts +18 -0
- package/src/languages/it.ts +15 -0
- package/src/languages/ja.ts +15 -0
- package/src/languages/ko.ts +15 -0
- package/src/languages/ms.ts +16 -0
- package/src/languages/pl.ts +18 -0
- package/src/languages/pt.ts +15 -0
- package/src/languages/qu.ts +15 -0
- package/src/languages/ru.ts +26 -0
- package/src/languages/sw.ts +15 -0
- package/src/languages/th.ts +16 -0
- package/src/languages/tl.ts +16 -0
- package/src/languages/tr.ts +15 -0
- package/src/languages/uk.ts +26 -0
- package/src/languages/vi.ts +16 -0
- package/src/languages/zh.ts +15 -0
- package/src/parser/index.ts +15 -0
- package/src/parser/pattern-matcher.ts +1181 -0
- package/src/parser/semantic-parser.ts +573 -0
- package/src/parser/utils/index.ts +35 -0
- package/src/parser/utils/marker-resolution.ts +111 -0
- package/src/parser/utils/possessive-keywords.ts +43 -0
- package/src/parser/utils/role-positioning.ts +70 -0
- package/src/parser/utils/type-validation.ts +134 -0
- package/src/patterns/add/ar.ts +71 -0
- package/src/patterns/add/bn.ts +70 -0
- package/src/patterns/add/hi.ts +69 -0
- package/src/patterns/add/index.ts +87 -0
- package/src/patterns/add/it.ts +61 -0
- package/src/patterns/add/ja.ts +93 -0
- package/src/patterns/add/ko.ts +74 -0
- package/src/patterns/add/ms.ts +30 -0
- package/src/patterns/add/pl.ts +62 -0
- package/src/patterns/add/ru.ts +62 -0
- package/src/patterns/add/th.ts +49 -0
- package/src/patterns/add/tl.ts +30 -0
- package/src/patterns/add/tr.ts +71 -0
- package/src/patterns/add/uk.ts +62 -0
- package/src/patterns/add/vi.ts +61 -0
- package/src/patterns/add/zh.ts +71 -0
- package/src/patterns/builders.ts +207 -0
- package/src/patterns/decrement/bn.ts +70 -0
- package/src/patterns/decrement/de.ts +42 -0
- package/src/patterns/decrement/hi.ts +68 -0
- package/src/patterns/decrement/index.ts +79 -0
- package/src/patterns/decrement/it.ts +69 -0
- package/src/patterns/decrement/ms.ts +30 -0
- package/src/patterns/decrement/pl.ts +58 -0
- package/src/patterns/decrement/ru.ts +58 -0
- package/src/patterns/decrement/th.ts +49 -0
- package/src/patterns/decrement/tl.ts +30 -0
- package/src/patterns/decrement/tr.ts +48 -0
- package/src/patterns/decrement/uk.ts +58 -0
- package/src/patterns/decrement/vi.ts +61 -0
- package/src/patterns/decrement/zh.ts +32 -0
- package/src/patterns/en.ts +302 -0
- package/src/patterns/event-handler/ar.ts +151 -0
- package/src/patterns/event-handler/bn.ts +72 -0
- package/src/patterns/event-handler/de.ts +117 -0
- package/src/patterns/event-handler/en.ts +117 -0
- package/src/patterns/event-handler/es.ts +136 -0
- package/src/patterns/event-handler/fr.ts +117 -0
- package/src/patterns/event-handler/hi.ts +64 -0
- package/src/patterns/event-handler/id.ts +117 -0
- package/src/patterns/event-handler/index.ts +119 -0
- package/src/patterns/event-handler/it.ts +54 -0
- package/src/patterns/event-handler/ja.ts +118 -0
- package/src/patterns/event-handler/ko.ts +133 -0
- package/src/patterns/event-handler/ms.ts +30 -0
- package/src/patterns/event-handler/pl.ts +62 -0
- package/src/patterns/event-handler/pt.ts +117 -0
- package/src/patterns/event-handler/qu.ts +66 -0
- package/src/patterns/event-handler/ru.ts +62 -0
- package/src/patterns/event-handler/shared.ts +270 -0
- package/src/patterns/event-handler/sw.ts +117 -0
- package/src/patterns/event-handler/th.ts +53 -0
- package/src/patterns/event-handler/tl.ts +30 -0
- package/src/patterns/event-handler/tr.ts +170 -0
- package/src/patterns/event-handler/uk.ts +62 -0
- package/src/patterns/event-handler/vi.ts +61 -0
- package/src/patterns/event-handler/zh.ts +150 -0
- package/src/patterns/get/ar.ts +49 -0
- package/src/patterns/get/bn.ts +47 -0
- package/src/patterns/get/de.ts +32 -0
- package/src/patterns/get/hi.ts +52 -0
- package/src/patterns/get/index.ts +83 -0
- package/src/patterns/get/it.ts +56 -0
- package/src/patterns/get/ja.ts +53 -0
- package/src/patterns/get/ko.ts +53 -0
- package/src/patterns/get/ms.ts +30 -0
- package/src/patterns/get/pl.ts +57 -0
- package/src/patterns/get/ru.ts +57 -0
- package/src/patterns/get/th.ts +29 -0
- package/src/patterns/get/tl.ts +30 -0
- package/src/patterns/get/uk.ts +57 -0
- package/src/patterns/get/vi.ts +48 -0
- package/src/patterns/grammar-transformed/index.ts +39 -0
- package/src/patterns/grammar-transformed/ja.ts +1713 -0
- package/src/patterns/grammar-transformed/ko.ts +1311 -0
- package/src/patterns/grammar-transformed/tr.ts +1067 -0
- package/src/patterns/hide/ar.ts +67 -0
- package/src/patterns/hide/bn.ts +47 -0
- package/src/patterns/hide/de.ts +36 -0
- package/src/patterns/hide/hi.ts +61 -0
- package/src/patterns/hide/index.ts +91 -0
- package/src/patterns/hide/it.ts +56 -0
- package/src/patterns/hide/ja.ts +69 -0
- package/src/patterns/hide/ko.ts +69 -0
- package/src/patterns/hide/ms.ts +30 -0
- package/src/patterns/hide/pl.ts +57 -0
- package/src/patterns/hide/ru.ts +57 -0
- package/src/patterns/hide/th.ts +29 -0
- package/src/patterns/hide/tl.ts +30 -0
- package/src/patterns/hide/tr.ts +65 -0
- package/src/patterns/hide/uk.ts +57 -0
- package/src/patterns/hide/vi.ts +56 -0
- package/src/patterns/hide/zh.ts +68 -0
- package/src/patterns/increment/bn.ts +70 -0
- package/src/patterns/increment/de.ts +36 -0
- package/src/patterns/increment/hi.ts +68 -0
- package/src/patterns/increment/index.ts +79 -0
- package/src/patterns/increment/it.ts +69 -0
- package/src/patterns/increment/ms.ts +30 -0
- package/src/patterns/increment/pl.ts +58 -0
- package/src/patterns/increment/ru.ts +58 -0
- package/src/patterns/increment/th.ts +49 -0
- package/src/patterns/increment/tl.ts +30 -0
- package/src/patterns/increment/tr.ts +52 -0
- package/src/patterns/increment/uk.ts +58 -0
- package/src/patterns/increment/vi.ts +61 -0
- package/src/patterns/increment/zh.ts +32 -0
- package/src/patterns/index.ts +84 -0
- package/src/patterns/languages/en/control-flow.ts +93 -0
- package/src/patterns/languages/en/fetch.ts +62 -0
- package/src/patterns/languages/en/index.ts +42 -0
- package/src/patterns/languages/en/repeat.ts +67 -0
- package/src/patterns/languages/en/set.ts +48 -0
- package/src/patterns/languages/en/swap.ts +38 -0
- package/src/patterns/languages/en/temporal.ts +57 -0
- package/src/patterns/put/ar.ts +74 -0
- package/src/patterns/put/bn.ts +53 -0
- package/src/patterns/put/en.ts +74 -0
- package/src/patterns/put/es.ts +74 -0
- package/src/patterns/put/hi.ts +69 -0
- package/src/patterns/put/id.ts +96 -0
- package/src/patterns/put/index.ts +99 -0
- package/src/patterns/put/it.ts +56 -0
- package/src/patterns/put/ja.ts +75 -0
- package/src/patterns/put/ko.ts +67 -0
- package/src/patterns/put/ms.ts +30 -0
- package/src/patterns/put/pl.ts +81 -0
- package/src/patterns/put/ru.ts +85 -0
- package/src/patterns/put/th.ts +32 -0
- package/src/patterns/put/tl.ts +30 -0
- package/src/patterns/put/tr.ts +67 -0
- package/src/patterns/put/uk.ts +85 -0
- package/src/patterns/put/vi.ts +72 -0
- package/src/patterns/put/zh.ts +62 -0
- package/src/patterns/registry.ts +163 -0
- package/src/patterns/remove/ar.ts +71 -0
- package/src/patterns/remove/bn.ts +68 -0
- package/src/patterns/remove/hi.ts +69 -0
- package/src/patterns/remove/index.ts +87 -0
- package/src/patterns/remove/it.ts +69 -0
- package/src/patterns/remove/ja.ts +74 -0
- package/src/patterns/remove/ko.ts +78 -0
- package/src/patterns/remove/ms.ts +30 -0
- package/src/patterns/remove/pl.ts +62 -0
- package/src/patterns/remove/ru.ts +62 -0
- package/src/patterns/remove/th.ts +49 -0
- package/src/patterns/remove/tl.ts +30 -0
- package/src/patterns/remove/tr.ts +78 -0
- package/src/patterns/remove/uk.ts +62 -0
- package/src/patterns/remove/vi.ts +61 -0
- package/src/patterns/remove/zh.ts +72 -0
- package/src/patterns/set/ar.ts +84 -0
- package/src/patterns/set/bn.ts +53 -0
- package/src/patterns/set/de.ts +84 -0
- package/src/patterns/set/es.ts +92 -0
- package/src/patterns/set/fr.ts +88 -0
- package/src/patterns/set/hi.ts +56 -0
- package/src/patterns/set/id.ts +84 -0
- package/src/patterns/set/index.ts +107 -0
- package/src/patterns/set/it.ts +56 -0
- package/src/patterns/set/ja.ts +86 -0
- package/src/patterns/set/ko.ts +85 -0
- package/src/patterns/set/ms.ts +30 -0
- package/src/patterns/set/pl.ts +57 -0
- package/src/patterns/set/pt.ts +84 -0
- package/src/patterns/set/ru.ts +57 -0
- package/src/patterns/set/th.ts +31 -0
- package/src/patterns/set/tl.ts +30 -0
- package/src/patterns/set/tr.ts +107 -0
- package/src/patterns/set/uk.ts +57 -0
- package/src/patterns/set/vi.ts +53 -0
- package/src/patterns/set/zh.ts +84 -0
- package/src/patterns/show/ar.ts +67 -0
- package/src/patterns/show/bn.ts +47 -0
- package/src/patterns/show/de.ts +32 -0
- package/src/patterns/show/fr.ts +32 -0
- package/src/patterns/show/hi.ts +61 -0
- package/src/patterns/show/index.ts +95 -0
- package/src/patterns/show/it.ts +56 -0
- package/src/patterns/show/ja.ts +69 -0
- package/src/patterns/show/ko.ts +73 -0
- package/src/patterns/show/ms.ts +30 -0
- package/src/patterns/show/pl.ts +57 -0
- package/src/patterns/show/ru.ts +57 -0
- package/src/patterns/show/th.ts +29 -0
- package/src/patterns/show/tl.ts +30 -0
- package/src/patterns/show/tr.ts +65 -0
- package/src/patterns/show/uk.ts +57 -0
- package/src/patterns/show/vi.ts +56 -0
- package/src/patterns/show/zh.ts +68 -0
- package/src/patterns/take/ar.ts +51 -0
- package/src/patterns/take/index.ts +31 -0
- package/src/patterns/toggle/ar.ts +61 -0
- package/src/patterns/toggle/bn.ts +70 -0
- package/src/patterns/toggle/en.ts +61 -0
- package/src/patterns/toggle/es.ts +61 -0
- package/src/patterns/toggle/hi.ts +80 -0
- package/src/patterns/toggle/index.ts +95 -0
- package/src/patterns/toggle/it.ts +69 -0
- package/src/patterns/toggle/ja.ts +156 -0
- package/src/patterns/toggle/ko.ts +113 -0
- package/src/patterns/toggle/ms.ts +30 -0
- package/src/patterns/toggle/pl.ts +62 -0
- package/src/patterns/toggle/ru.ts +62 -0
- package/src/patterns/toggle/th.ts +50 -0
- package/src/patterns/toggle/tl.ts +30 -0
- package/src/patterns/toggle/tr.ts +88 -0
- package/src/patterns/toggle/uk.ts +62 -0
- package/src/patterns/toggle/vi.ts +61 -0
- package/src/patterns/toggle/zh.ts +99 -0
- package/src/public-api.ts +286 -0
- package/src/registry.ts +441 -0
- package/src/tokenizers/arabic.ts +723 -0
- package/src/tokenizers/base.ts +1300 -0
- package/src/tokenizers/bengali.ts +289 -0
- package/src/tokenizers/chinese.ts +481 -0
- package/src/tokenizers/english.ts +416 -0
- package/src/tokenizers/french.ts +326 -0
- package/src/tokenizers/german.ts +324 -0
- package/src/tokenizers/hindi.ts +319 -0
- package/src/tokenizers/index.ts +127 -0
- package/src/tokenizers/indonesian.ts +306 -0
- package/src/tokenizers/italian.ts +458 -0
- package/src/tokenizers/japanese.ts +447 -0
- package/src/tokenizers/korean.ts +642 -0
- package/src/tokenizers/morphology/arabic-normalizer.ts +242 -0
- package/src/tokenizers/morphology/french-normalizer.ts +268 -0
- package/src/tokenizers/morphology/german-normalizer.ts +256 -0
- package/src/tokenizers/morphology/index.ts +46 -0
- package/src/tokenizers/morphology/italian-normalizer.ts +329 -0
- package/src/tokenizers/morphology/japanese-normalizer.ts +288 -0
- package/src/tokenizers/morphology/korean-normalizer.ts +428 -0
- package/src/tokenizers/morphology/polish-normalizer.ts +264 -0
- package/src/tokenizers/morphology/portuguese-normalizer.ts +310 -0
- package/src/tokenizers/morphology/spanish-normalizer.ts +327 -0
- package/src/tokenizers/morphology/turkish-normalizer.ts +412 -0
- package/src/tokenizers/morphology/types.ts +211 -0
- package/src/tokenizers/ms.ts +198 -0
- package/src/tokenizers/polish.ts +354 -0
- package/src/tokenizers/portuguese.ts +304 -0
- package/src/tokenizers/quechua.ts +339 -0
- package/src/tokenizers/russian.ts +375 -0
- package/src/tokenizers/spanish.ts +403 -0
- package/src/tokenizers/swahili.ts +303 -0
- package/src/tokenizers/thai.ts +236 -0
- package/src/tokenizers/tl.ts +198 -0
- package/src/tokenizers/turkish.ts +411 -0
- package/src/tokenizers/ukrainian.ts +369 -0
- package/src/tokenizers/vietnamese.ts +410 -0
- package/src/types/grammar-types.ts +617 -0
- package/src/types/unified-profile.ts +267 -0
- package/src/types.ts +709 -0
- package/src/utils/confidence-calculator.ts +147 -0
- package/src/validators/command-validator.ts +380 -0
- package/src/validators/index.ts +15 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expression Tokenizer
|
|
3
|
+
*
|
|
4
|
+
* Tokenizes expression strings into tokens for parsing.
|
|
5
|
+
* Focused on expression-level constructs, not full hyperscript syntax.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Token Types
|
|
10
|
+
// =============================================================================
|
|
11
|
+
|
|
12
|
+
export enum TokenType {
|
|
13
|
+
// Literals
|
|
14
|
+
NUMBER = 'NUMBER',
|
|
15
|
+
STRING = 'STRING',
|
|
16
|
+
BOOLEAN = 'BOOLEAN',
|
|
17
|
+
TEMPLATE_LITERAL = 'TEMPLATE_LITERAL',
|
|
18
|
+
|
|
19
|
+
// Selectors
|
|
20
|
+
ID_SELECTOR = 'ID_SELECTOR',
|
|
21
|
+
CLASS_SELECTOR = 'CLASS_SELECTOR',
|
|
22
|
+
ATTRIBUTE_SELECTOR = 'ATTRIBUTE_SELECTOR',
|
|
23
|
+
QUERY_SELECTOR = 'QUERY_SELECTOR',
|
|
24
|
+
|
|
25
|
+
// References
|
|
26
|
+
CONTEXT_VAR = 'CONTEXT_VAR',
|
|
27
|
+
IDENTIFIER = 'IDENTIFIER',
|
|
28
|
+
|
|
29
|
+
// Operators
|
|
30
|
+
OPERATOR = 'OPERATOR',
|
|
31
|
+
COMPARISON = 'COMPARISON',
|
|
32
|
+
LOGICAL = 'LOGICAL',
|
|
33
|
+
POSSESSIVE = 'POSSESSIVE',
|
|
34
|
+
|
|
35
|
+
// Punctuation
|
|
36
|
+
LPAREN = 'LPAREN',
|
|
37
|
+
RPAREN = 'RPAREN',
|
|
38
|
+
LBRACKET = 'LBRACKET',
|
|
39
|
+
RBRACKET = 'RBRACKET',
|
|
40
|
+
LBRACE = 'LBRACE',
|
|
41
|
+
RBRACE = 'RBRACE',
|
|
42
|
+
COMMA = 'COMMA',
|
|
43
|
+
DOT = 'DOT',
|
|
44
|
+
COLON = 'COLON',
|
|
45
|
+
|
|
46
|
+
// Special
|
|
47
|
+
TIME_EXPRESSION = 'TIME_EXPRESSION',
|
|
48
|
+
EOF = 'EOF',
|
|
49
|
+
ERROR = 'ERROR',
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface Token {
|
|
53
|
+
type: TokenType;
|
|
54
|
+
value: string;
|
|
55
|
+
start: number;
|
|
56
|
+
end: number;
|
|
57
|
+
line?: number;
|
|
58
|
+
column?: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// =============================================================================
|
|
62
|
+
// Constants
|
|
63
|
+
// =============================================================================
|
|
64
|
+
|
|
65
|
+
const CONTEXT_VARS = new Set([
|
|
66
|
+
'me',
|
|
67
|
+
'my',
|
|
68
|
+
'myself',
|
|
69
|
+
'you',
|
|
70
|
+
'your',
|
|
71
|
+
'yourself',
|
|
72
|
+
'it',
|
|
73
|
+
'its',
|
|
74
|
+
'result',
|
|
75
|
+
'event',
|
|
76
|
+
'target',
|
|
77
|
+
'body',
|
|
78
|
+
'detail',
|
|
79
|
+
'window',
|
|
80
|
+
'document',
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
const LOGICAL_OPERATORS = new Set(['and', 'or', 'not', 'no']);
|
|
84
|
+
|
|
85
|
+
const BOOLEAN_LITERALS = new Set(['true', 'false', 'null', 'undefined']);
|
|
86
|
+
|
|
87
|
+
const TIME_UNITS = new Set([
|
|
88
|
+
'ms',
|
|
89
|
+
's',
|
|
90
|
+
'seconds',
|
|
91
|
+
'second',
|
|
92
|
+
'milliseconds',
|
|
93
|
+
'millisecond',
|
|
94
|
+
'minutes',
|
|
95
|
+
'minute',
|
|
96
|
+
'hours',
|
|
97
|
+
'hour',
|
|
98
|
+
]);
|
|
99
|
+
|
|
100
|
+
// =============================================================================
|
|
101
|
+
// Tokenizer
|
|
102
|
+
// =============================================================================
|
|
103
|
+
|
|
104
|
+
export function tokenize(input: string): Token[] {
|
|
105
|
+
const tokens: Token[] = [];
|
|
106
|
+
let pos = 0;
|
|
107
|
+
let line = 1;
|
|
108
|
+
let column = 1;
|
|
109
|
+
|
|
110
|
+
// Track if the previous token allows a selector
|
|
111
|
+
// Selectors are only valid at the start or after operators, opening brackets, etc.
|
|
112
|
+
function previousTokenAllowsSelector(): boolean {
|
|
113
|
+
if (tokens.length === 0) return true;
|
|
114
|
+
const prev = tokens[tokens.length - 1];
|
|
115
|
+
// After these token types, a selector is valid
|
|
116
|
+
return [
|
|
117
|
+
TokenType.OPERATOR,
|
|
118
|
+
TokenType.COMPARISON,
|
|
119
|
+
TokenType.LOGICAL,
|
|
120
|
+
TokenType.LPAREN,
|
|
121
|
+
TokenType.LBRACKET,
|
|
122
|
+
TokenType.LBRACE,
|
|
123
|
+
TokenType.COMMA,
|
|
124
|
+
TokenType.COLON,
|
|
125
|
+
].includes(prev.type);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function peek(offset = 0): string {
|
|
129
|
+
return input[pos + offset] ?? '';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function advance(): string {
|
|
133
|
+
const char = input[pos];
|
|
134
|
+
pos++;
|
|
135
|
+
if (char === '\n') {
|
|
136
|
+
line++;
|
|
137
|
+
column = 1;
|
|
138
|
+
} else {
|
|
139
|
+
column++;
|
|
140
|
+
}
|
|
141
|
+
return char;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function skipWhitespace(): void {
|
|
145
|
+
while (pos < input.length && /\s/.test(input[pos])) {
|
|
146
|
+
advance();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function readWhile(predicate: (char: string) => boolean): string {
|
|
151
|
+
let result = '';
|
|
152
|
+
while (pos < input.length && predicate(input[pos])) {
|
|
153
|
+
result += advance();
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function readString(quote: string): string {
|
|
159
|
+
let result = quote;
|
|
160
|
+
advance(); // consume opening quote
|
|
161
|
+
while (pos < input.length && input[pos] !== quote) {
|
|
162
|
+
if (input[pos] === '\\' && pos + 1 < input.length) {
|
|
163
|
+
result += advance(); // backslash
|
|
164
|
+
result += advance(); // escaped char
|
|
165
|
+
} else {
|
|
166
|
+
result += advance();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (pos < input.length) {
|
|
170
|
+
result += advance(); // closing quote
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function readTemplateLiteral(): string {
|
|
176
|
+
let result = '`';
|
|
177
|
+
advance(); // consume opening backtick
|
|
178
|
+
while (pos < input.length && input[pos] !== '`') {
|
|
179
|
+
if (input[pos] === '\\' && pos + 1 < input.length) {
|
|
180
|
+
result += advance();
|
|
181
|
+
result += advance();
|
|
182
|
+
} else {
|
|
183
|
+
result += advance();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (pos < input.length) {
|
|
187
|
+
result += advance(); // closing backtick
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function readQuerySelector(): string {
|
|
193
|
+
let result = '<';
|
|
194
|
+
advance(); // consume <
|
|
195
|
+
while (pos < input.length) {
|
|
196
|
+
result += advance();
|
|
197
|
+
if (result.endsWith('/>')) {
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function makeToken(type: TokenType, value: string, start: number): Token {
|
|
205
|
+
return {
|
|
206
|
+
type,
|
|
207
|
+
value,
|
|
208
|
+
start,
|
|
209
|
+
end: pos,
|
|
210
|
+
line,
|
|
211
|
+
column: column - value.length,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
while (pos < input.length) {
|
|
216
|
+
skipWhitespace();
|
|
217
|
+
if (pos >= input.length) break;
|
|
218
|
+
|
|
219
|
+
const start = pos;
|
|
220
|
+
const char = peek();
|
|
221
|
+
|
|
222
|
+
// Possessive 's (check before string literals)
|
|
223
|
+
if (char === "'" && peek(1) === 's' && !/\w/.test(peek(2))) {
|
|
224
|
+
advance(); // '
|
|
225
|
+
advance(); // s
|
|
226
|
+
tokens.push(makeToken(TokenType.POSSESSIVE, "'s", start));
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// String literals
|
|
231
|
+
if (char === '"' || char === "'") {
|
|
232
|
+
const value = readString(char);
|
|
233
|
+
tokens.push(makeToken(TokenType.STRING, value, start));
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Template literals
|
|
238
|
+
if (char === '`') {
|
|
239
|
+
const value = readTemplateLiteral();
|
|
240
|
+
tokens.push(makeToken(TokenType.TEMPLATE_LITERAL, value, start));
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Query selectors <tag/>
|
|
245
|
+
if (char === '<' && /[a-zA-Z.#\[]/.test(peek(1))) {
|
|
246
|
+
const value = readQuerySelector();
|
|
247
|
+
tokens.push(makeToken(TokenType.QUERY_SELECTOR, value, start));
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ID selectors #id (only at start or after operators)
|
|
252
|
+
if (char === '#' && previousTokenAllowsSelector()) {
|
|
253
|
+
advance();
|
|
254
|
+
const name = readWhile(c => /[\w-]/.test(c));
|
|
255
|
+
tokens.push(makeToken(TokenType.ID_SELECTOR, '#' + name, start));
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Class selectors .class (only at start or after operators)
|
|
260
|
+
if (char === '.' && /[a-zA-Z_-]/.test(peek(1)) && previousTokenAllowsSelector()) {
|
|
261
|
+
advance();
|
|
262
|
+
const name = readWhile(c => /[\w-]/.test(c));
|
|
263
|
+
tokens.push(makeToken(TokenType.CLASS_SELECTOR, '.' + name, start));
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Attribute selectors [attr] or [attr="value"] (only at start or after operators)
|
|
268
|
+
if (char === '[' && previousTokenAllowsSelector()) {
|
|
269
|
+
// Check if this looks like an attribute selector (starts with @ or identifier)
|
|
270
|
+
const nextChar = peek(1);
|
|
271
|
+
if (nextChar === '@' || /[a-zA-Z]/.test(nextChar)) {
|
|
272
|
+
let value = '';
|
|
273
|
+
value += advance(); // [
|
|
274
|
+
while (pos < input.length && input[pos] !== ']') {
|
|
275
|
+
if (input[pos] === '"' || input[pos] === "'") {
|
|
276
|
+
value += readString(input[pos]);
|
|
277
|
+
} else {
|
|
278
|
+
value += advance();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (pos < input.length) {
|
|
282
|
+
value += advance(); // ]
|
|
283
|
+
}
|
|
284
|
+
tokens.push(makeToken(TokenType.ATTRIBUTE_SELECTOR, value, start));
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Array brackets [ and ]
|
|
290
|
+
if (char === '[') {
|
|
291
|
+
advance();
|
|
292
|
+
tokens.push(makeToken(TokenType.LBRACKET, '[', start));
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
if (char === ']') {
|
|
296
|
+
advance();
|
|
297
|
+
tokens.push(makeToken(TokenType.RBRACKET, ']', start));
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Numbers (including time expressions like 2s, 500ms)
|
|
302
|
+
if (/\d/.test(char)) {
|
|
303
|
+
const num = readWhile(c => /[\d.]/.test(c));
|
|
304
|
+
const unitStart = pos;
|
|
305
|
+
const unit = readWhile(c => /[a-zA-Z]/.test(c));
|
|
306
|
+
|
|
307
|
+
if (TIME_UNITS.has(unit)) {
|
|
308
|
+
tokens.push(makeToken(TokenType.TIME_EXPRESSION, num + unit, start));
|
|
309
|
+
} else {
|
|
310
|
+
// Put back the unit if it's not a time unit
|
|
311
|
+
pos = unitStart;
|
|
312
|
+
tokens.push(makeToken(TokenType.NUMBER, num, start));
|
|
313
|
+
}
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Punctuation
|
|
318
|
+
if (char === '(') {
|
|
319
|
+
advance();
|
|
320
|
+
tokens.push(makeToken(TokenType.LPAREN, '(', start));
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
if (char === ')') {
|
|
324
|
+
advance();
|
|
325
|
+
tokens.push(makeToken(TokenType.RPAREN, ')', start));
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (char === '{') {
|
|
329
|
+
advance();
|
|
330
|
+
tokens.push(makeToken(TokenType.LBRACE, '{', start));
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
if (char === '}') {
|
|
334
|
+
advance();
|
|
335
|
+
tokens.push(makeToken(TokenType.RBRACE, '}', start));
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
if (char === ',') {
|
|
339
|
+
advance();
|
|
340
|
+
tokens.push(makeToken(TokenType.COMMA, ',', start));
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (char === ':') {
|
|
344
|
+
advance();
|
|
345
|
+
tokens.push(makeToken(TokenType.COLON, ':', start));
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (char === '.') {
|
|
349
|
+
advance();
|
|
350
|
+
tokens.push(makeToken(TokenType.DOT, '.', start));
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Operators
|
|
355
|
+
if (char === '+' || char === '-' || char === '*' || char === '/' || char === '%') {
|
|
356
|
+
advance();
|
|
357
|
+
tokens.push(makeToken(TokenType.OPERATOR, char, start));
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Comparison operators
|
|
362
|
+
if (char === '=' || char === '!' || char === '<' || char === '>') {
|
|
363
|
+
let op = advance();
|
|
364
|
+
if (peek() === '=') {
|
|
365
|
+
op += advance();
|
|
366
|
+
}
|
|
367
|
+
tokens.push(makeToken(TokenType.COMPARISON, op, start));
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Identifiers and keywords
|
|
372
|
+
if (/[a-zA-Z_$]/.test(char)) {
|
|
373
|
+
const word = readWhile(c => /[\w$]/.test(c));
|
|
374
|
+
const lower = word.toLowerCase();
|
|
375
|
+
|
|
376
|
+
if (CONTEXT_VARS.has(lower)) {
|
|
377
|
+
tokens.push(makeToken(TokenType.CONTEXT_VAR, word, start));
|
|
378
|
+
} else if (LOGICAL_OPERATORS.has(lower)) {
|
|
379
|
+
tokens.push(makeToken(TokenType.LOGICAL, word, start));
|
|
380
|
+
} else if (BOOLEAN_LITERALS.has(lower)) {
|
|
381
|
+
tokens.push(makeToken(TokenType.BOOLEAN, word, start));
|
|
382
|
+
} else {
|
|
383
|
+
tokens.push(makeToken(TokenType.IDENTIFIER, word, start));
|
|
384
|
+
}
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Unknown character - skip it
|
|
389
|
+
advance();
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
tokens.push(makeToken(TokenType.EOF, '', pos));
|
|
393
|
+
return tokens;
|
|
394
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expression Parser Types
|
|
3
|
+
*
|
|
4
|
+
* Defines AST node types for expressions that can be shared between
|
|
5
|
+
* the semantic package (AST building) and core package (runtime).
|
|
6
|
+
*
|
|
7
|
+
* These types are intentionally minimal and focused on expressions only.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Base Types
|
|
12
|
+
// =============================================================================
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Base interface for all expression AST nodes
|
|
16
|
+
*/
|
|
17
|
+
export interface ExpressionNode {
|
|
18
|
+
readonly type: string;
|
|
19
|
+
readonly start?: number | undefined;
|
|
20
|
+
readonly end?: number | undefined;
|
|
21
|
+
readonly line?: number | undefined;
|
|
22
|
+
readonly column?: number | undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// Literal Nodes
|
|
27
|
+
// =============================================================================
|
|
28
|
+
|
|
29
|
+
export interface LiteralNode extends ExpressionNode {
|
|
30
|
+
readonly type: 'literal';
|
|
31
|
+
readonly value: string | number | boolean | null | undefined;
|
|
32
|
+
readonly raw?: string | undefined;
|
|
33
|
+
readonly dataType?:
|
|
34
|
+
| 'string'
|
|
35
|
+
| 'number'
|
|
36
|
+
| 'boolean'
|
|
37
|
+
| 'null'
|
|
38
|
+
| 'undefined'
|
|
39
|
+
| 'duration'
|
|
40
|
+
| undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface TemplateLiteralNode extends ExpressionNode {
|
|
44
|
+
readonly type: 'templateLiteral';
|
|
45
|
+
readonly value: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// =============================================================================
|
|
49
|
+
// Selector Nodes
|
|
50
|
+
// =============================================================================
|
|
51
|
+
|
|
52
|
+
export type SelectorKind = 'id' | 'class' | 'attribute' | 'element' | 'query' | 'complex';
|
|
53
|
+
|
|
54
|
+
export interface SelectorNode extends ExpressionNode {
|
|
55
|
+
readonly type: 'selector' | 'cssSelector' | 'idRef' | 'classRef';
|
|
56
|
+
readonly value?: string;
|
|
57
|
+
readonly selector?: string;
|
|
58
|
+
readonly selectorType?: SelectorKind;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// =============================================================================
|
|
62
|
+
// Reference Nodes
|
|
63
|
+
// =============================================================================
|
|
64
|
+
|
|
65
|
+
export type ContextType =
|
|
66
|
+
| 'me'
|
|
67
|
+
| 'you'
|
|
68
|
+
| 'it'
|
|
69
|
+
| 'its'
|
|
70
|
+
| 'my'
|
|
71
|
+
| 'your'
|
|
72
|
+
| 'result'
|
|
73
|
+
| 'event'
|
|
74
|
+
| 'target'
|
|
75
|
+
| 'body'
|
|
76
|
+
| 'detail';
|
|
77
|
+
|
|
78
|
+
export interface ContextReferenceNode extends ExpressionNode {
|
|
79
|
+
readonly type: 'contextReference' | 'symbol';
|
|
80
|
+
readonly contextType?: ContextType;
|
|
81
|
+
readonly name?: string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface IdentifierNode extends ExpressionNode {
|
|
85
|
+
readonly type: 'identifier';
|
|
86
|
+
readonly name: string;
|
|
87
|
+
readonly scope?: 'local' | 'global' | 'element';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// =============================================================================
|
|
91
|
+
// Property Access Nodes
|
|
92
|
+
// =============================================================================
|
|
93
|
+
|
|
94
|
+
export interface PropertyAccessNode extends ExpressionNode {
|
|
95
|
+
readonly type: 'propertyAccess';
|
|
96
|
+
readonly object: ExpressionNode;
|
|
97
|
+
readonly property: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface MemberExpressionNode extends ExpressionNode {
|
|
101
|
+
readonly type: 'memberExpression';
|
|
102
|
+
readonly object: ExpressionNode;
|
|
103
|
+
readonly property: ExpressionNode;
|
|
104
|
+
readonly computed?: boolean;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface PossessiveExpressionNode extends ExpressionNode {
|
|
108
|
+
readonly type: 'possessiveExpression';
|
|
109
|
+
readonly object: ExpressionNode;
|
|
110
|
+
readonly property: ExpressionNode | string;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// =============================================================================
|
|
114
|
+
// Binary/Unary Expression Nodes
|
|
115
|
+
// =============================================================================
|
|
116
|
+
|
|
117
|
+
export interface BinaryExpressionNode extends ExpressionNode {
|
|
118
|
+
readonly type: 'binaryExpression';
|
|
119
|
+
readonly operator: string;
|
|
120
|
+
readonly left: ExpressionNode;
|
|
121
|
+
readonly right: ExpressionNode;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface UnaryExpressionNode extends ExpressionNode {
|
|
125
|
+
readonly type: 'unaryExpression';
|
|
126
|
+
readonly operator: string;
|
|
127
|
+
readonly operand: ExpressionNode;
|
|
128
|
+
readonly prefix?: boolean;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// =============================================================================
|
|
132
|
+
// Call Expression Nodes
|
|
133
|
+
// =============================================================================
|
|
134
|
+
|
|
135
|
+
export interface CallExpressionNode extends ExpressionNode {
|
|
136
|
+
readonly type: 'callExpression' | 'functionCall';
|
|
137
|
+
readonly callee: ExpressionNode | string;
|
|
138
|
+
readonly arguments: ExpressionNode[];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// =============================================================================
|
|
142
|
+
// Array/Object Nodes
|
|
143
|
+
// =============================================================================
|
|
144
|
+
|
|
145
|
+
export interface ArrayLiteralNode extends ExpressionNode {
|
|
146
|
+
readonly type: 'arrayLiteral';
|
|
147
|
+
readonly elements: ExpressionNode[];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export interface ObjectLiteralNode extends ExpressionNode {
|
|
151
|
+
readonly type: 'objectLiteral';
|
|
152
|
+
readonly properties: ObjectPropertyNode[];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export interface ObjectPropertyNode extends ExpressionNode {
|
|
156
|
+
readonly type: 'objectProperty';
|
|
157
|
+
readonly key: string | ExpressionNode;
|
|
158
|
+
readonly value: ExpressionNode;
|
|
159
|
+
readonly computed?: boolean;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// =============================================================================
|
|
163
|
+
// Special Nodes
|
|
164
|
+
// =============================================================================
|
|
165
|
+
|
|
166
|
+
export interface TimeExpressionNode extends ExpressionNode {
|
|
167
|
+
readonly type: 'timeExpression';
|
|
168
|
+
readonly value: number;
|
|
169
|
+
readonly unit: 'ms' | 's' | 'seconds' | 'milliseconds' | 'minutes' | 'hours';
|
|
170
|
+
readonly raw?: string | undefined;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export interface ErrorNode extends ExpressionNode {
|
|
174
|
+
readonly type: 'error';
|
|
175
|
+
readonly message?: string;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// =============================================================================
|
|
179
|
+
// Union Type for All Expression Nodes
|
|
180
|
+
// =============================================================================
|
|
181
|
+
|
|
182
|
+
export type AnyExpressionNode =
|
|
183
|
+
| LiteralNode
|
|
184
|
+
| TemplateLiteralNode
|
|
185
|
+
| SelectorNode
|
|
186
|
+
| ContextReferenceNode
|
|
187
|
+
| IdentifierNode
|
|
188
|
+
| PropertyAccessNode
|
|
189
|
+
| MemberExpressionNode
|
|
190
|
+
| PossessiveExpressionNode
|
|
191
|
+
| BinaryExpressionNode
|
|
192
|
+
| UnaryExpressionNode
|
|
193
|
+
| CallExpressionNode
|
|
194
|
+
| ArrayLiteralNode
|
|
195
|
+
| ObjectLiteralNode
|
|
196
|
+
| TimeExpressionNode
|
|
197
|
+
| ErrorNode;
|
|
198
|
+
|
|
199
|
+
// =============================================================================
|
|
200
|
+
// Parse Result
|
|
201
|
+
// =============================================================================
|
|
202
|
+
|
|
203
|
+
export interface ExpressionParseResult {
|
|
204
|
+
readonly success: boolean;
|
|
205
|
+
readonly node?: ExpressionNode;
|
|
206
|
+
readonly error?: string;
|
|
207
|
+
readonly consumed?: number;
|
|
208
|
+
}
|