@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,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ukrainian Language Profile
|
|
3
|
+
*
|
|
4
|
+
* SVO word order, prepositions, space-separated.
|
|
5
|
+
* Ukrainian is a fusional language with rich verb conjugation.
|
|
6
|
+
* Uses infinitive form in software UI (industry standard).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { LanguageProfile } from './types';
|
|
10
|
+
|
|
11
|
+
export const ukrainianProfile: LanguageProfile = {
|
|
12
|
+
code: 'uk',
|
|
13
|
+
name: 'Ukrainian',
|
|
14
|
+
nativeName: 'Українська',
|
|
15
|
+
direction: 'ltr',
|
|
16
|
+
wordOrder: 'SVO',
|
|
17
|
+
markingStrategy: 'preposition',
|
|
18
|
+
usesSpaces: true,
|
|
19
|
+
defaultVerbForm: 'infinitive',
|
|
20
|
+
verb: {
|
|
21
|
+
position: 'start',
|
|
22
|
+
subjectDrop: true,
|
|
23
|
+
suffixes: ['ти', 'тися', 'ити', 'итися', 'ати', 'атися', 'іти', 'ітися'],
|
|
24
|
+
},
|
|
25
|
+
references: {
|
|
26
|
+
me: 'я',
|
|
27
|
+
it: 'це',
|
|
28
|
+
you: 'ти',
|
|
29
|
+
result: 'результат',
|
|
30
|
+
event: 'подія',
|
|
31
|
+
target: 'ціль',
|
|
32
|
+
body: 'body',
|
|
33
|
+
},
|
|
34
|
+
possessive: {
|
|
35
|
+
marker: '',
|
|
36
|
+
markerPosition: 'after-object',
|
|
37
|
+
usePossessiveAdjectives: true,
|
|
38
|
+
specialForms: {
|
|
39
|
+
me: 'мій',
|
|
40
|
+
it: 'його',
|
|
41
|
+
you: 'твій',
|
|
42
|
+
},
|
|
43
|
+
keywords: {
|
|
44
|
+
// "my" variants (masculine/feminine/neuter/plural)
|
|
45
|
+
мій: 'me',
|
|
46
|
+
моя: 'me',
|
|
47
|
+
моє: 'me',
|
|
48
|
+
мої: 'me',
|
|
49
|
+
// "your" variants
|
|
50
|
+
твій: 'you',
|
|
51
|
+
твоя: 'you',
|
|
52
|
+
твоє: 'you',
|
|
53
|
+
твої: 'you',
|
|
54
|
+
// "its/his/her" forms
|
|
55
|
+
його: 'it', // his/its
|
|
56
|
+
її: 'it', // her/its (feminine)
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
roleMarkers: {
|
|
60
|
+
destination: { primary: 'в', alternatives: ['на', 'до'], position: 'before' },
|
|
61
|
+
source: { primary: 'з', alternatives: ['від', 'із'], position: 'before' },
|
|
62
|
+
patient: { primary: '', position: 'before' },
|
|
63
|
+
style: { primary: 'з', alternatives: ['із'], position: 'before' },
|
|
64
|
+
},
|
|
65
|
+
keywords: {
|
|
66
|
+
// Class/Attribute operations (infinitive form)
|
|
67
|
+
toggle: {
|
|
68
|
+
primary: 'перемкнути',
|
|
69
|
+
alternatives: ['перемкни'],
|
|
70
|
+
normalized: 'toggle',
|
|
71
|
+
form: 'infinitive',
|
|
72
|
+
},
|
|
73
|
+
add: { primary: 'додати', alternatives: ['додай'], normalized: 'add', form: 'infinitive' },
|
|
74
|
+
remove: {
|
|
75
|
+
primary: 'видалити',
|
|
76
|
+
alternatives: ['видали', 'прибрати', 'прибери'],
|
|
77
|
+
normalized: 'remove',
|
|
78
|
+
form: 'infinitive',
|
|
79
|
+
},
|
|
80
|
+
// Content operations
|
|
81
|
+
put: {
|
|
82
|
+
primary: 'покласти',
|
|
83
|
+
alternatives: ['поклади', 'помістити', 'помісти', 'вставити', 'встав'],
|
|
84
|
+
normalized: 'put',
|
|
85
|
+
form: 'infinitive',
|
|
86
|
+
},
|
|
87
|
+
append: {
|
|
88
|
+
primary: 'додати_в_кінець',
|
|
89
|
+
alternatives: ['дописати'],
|
|
90
|
+
normalized: 'append',
|
|
91
|
+
form: 'infinitive',
|
|
92
|
+
},
|
|
93
|
+
prepend: { primary: 'додати_на_початок', normalized: 'prepend', form: 'infinitive' },
|
|
94
|
+
take: { primary: 'взяти', alternatives: ['візьми'], normalized: 'take', form: 'infinitive' },
|
|
95
|
+
make: { primary: 'створити', alternatives: ['створи'], normalized: 'make', form: 'infinitive' },
|
|
96
|
+
clone: {
|
|
97
|
+
primary: 'клонувати',
|
|
98
|
+
alternatives: ['клонуй'],
|
|
99
|
+
normalized: 'clone',
|
|
100
|
+
form: 'infinitive',
|
|
101
|
+
},
|
|
102
|
+
swap: {
|
|
103
|
+
primary: 'поміняти',
|
|
104
|
+
alternatives: ['поміняй'],
|
|
105
|
+
normalized: 'swap',
|
|
106
|
+
form: 'infinitive',
|
|
107
|
+
},
|
|
108
|
+
morph: {
|
|
109
|
+
primary: 'трансформувати',
|
|
110
|
+
alternatives: ['трансформуй'],
|
|
111
|
+
normalized: 'morph',
|
|
112
|
+
form: 'infinitive',
|
|
113
|
+
},
|
|
114
|
+
// Variable operations
|
|
115
|
+
set: {
|
|
116
|
+
primary: 'встановити',
|
|
117
|
+
alternatives: ['встанови', 'задати', 'задай'],
|
|
118
|
+
normalized: 'set',
|
|
119
|
+
form: 'infinitive',
|
|
120
|
+
},
|
|
121
|
+
get: { primary: 'отримати', alternatives: ['отримай'], normalized: 'get', form: 'infinitive' },
|
|
122
|
+
increment: {
|
|
123
|
+
primary: 'збільшити',
|
|
124
|
+
alternatives: ['збільш'],
|
|
125
|
+
normalized: 'increment',
|
|
126
|
+
form: 'infinitive',
|
|
127
|
+
},
|
|
128
|
+
decrement: {
|
|
129
|
+
primary: 'зменшити',
|
|
130
|
+
alternatives: ['зменш'],
|
|
131
|
+
normalized: 'decrement',
|
|
132
|
+
form: 'infinitive',
|
|
133
|
+
},
|
|
134
|
+
log: { primary: 'записати', alternatives: ['запиши'], normalized: 'log', form: 'infinitive' },
|
|
135
|
+
// Visibility
|
|
136
|
+
show: { primary: 'показати', alternatives: ['покажи'], normalized: 'show', form: 'infinitive' },
|
|
137
|
+
hide: {
|
|
138
|
+
primary: 'сховати',
|
|
139
|
+
alternatives: ['сховай', 'приховати', 'приховай'],
|
|
140
|
+
normalized: 'hide',
|
|
141
|
+
form: 'infinitive',
|
|
142
|
+
},
|
|
143
|
+
transition: {
|
|
144
|
+
primary: 'анімувати',
|
|
145
|
+
alternatives: ['анімуй'],
|
|
146
|
+
normalized: 'transition',
|
|
147
|
+
form: 'infinitive',
|
|
148
|
+
},
|
|
149
|
+
// Events
|
|
150
|
+
on: { primary: 'при', alternatives: ['коли'], normalized: 'on' },
|
|
151
|
+
trigger: {
|
|
152
|
+
primary: 'викликати',
|
|
153
|
+
alternatives: ['виклич'],
|
|
154
|
+
normalized: 'trigger',
|
|
155
|
+
form: 'infinitive',
|
|
156
|
+
},
|
|
157
|
+
send: {
|
|
158
|
+
primary: 'надіслати',
|
|
159
|
+
alternatives: ['надішли'],
|
|
160
|
+
normalized: 'send',
|
|
161
|
+
form: 'infinitive',
|
|
162
|
+
},
|
|
163
|
+
// DOM focus
|
|
164
|
+
focus: {
|
|
165
|
+
primary: 'сфокусувати',
|
|
166
|
+
alternatives: ['сфокусуй', 'фокус'],
|
|
167
|
+
normalized: 'focus',
|
|
168
|
+
form: 'infinitive',
|
|
169
|
+
},
|
|
170
|
+
blur: {
|
|
171
|
+
primary: 'розфокусувати',
|
|
172
|
+
alternatives: ['розфокусуй'],
|
|
173
|
+
normalized: 'blur',
|
|
174
|
+
form: 'infinitive',
|
|
175
|
+
},
|
|
176
|
+
// Navigation
|
|
177
|
+
go: {
|
|
178
|
+
primary: 'перейти',
|
|
179
|
+
alternatives: ['перейди', 'йти', 'йди'],
|
|
180
|
+
normalized: 'go',
|
|
181
|
+
form: 'infinitive',
|
|
182
|
+
},
|
|
183
|
+
// Async
|
|
184
|
+
wait: {
|
|
185
|
+
primary: 'чекати',
|
|
186
|
+
alternatives: ['чекай', 'зачекай'],
|
|
187
|
+
normalized: 'wait',
|
|
188
|
+
form: 'infinitive',
|
|
189
|
+
},
|
|
190
|
+
fetch: {
|
|
191
|
+
primary: 'завантажити',
|
|
192
|
+
alternatives: ['завантаж'],
|
|
193
|
+
normalized: 'fetch',
|
|
194
|
+
form: 'infinitive',
|
|
195
|
+
},
|
|
196
|
+
settle: { primary: 'стабілізувати', normalized: 'settle', form: 'infinitive' },
|
|
197
|
+
// Control flow
|
|
198
|
+
if: { primary: 'якщо', normalized: 'if' },
|
|
199
|
+
when: { primary: 'коли', normalized: 'when' },
|
|
200
|
+
where: { primary: 'де', normalized: 'where' },
|
|
201
|
+
else: { primary: 'інакше', normalized: 'else' },
|
|
202
|
+
repeat: {
|
|
203
|
+
primary: 'повторити',
|
|
204
|
+
alternatives: ['повтори'],
|
|
205
|
+
normalized: 'repeat',
|
|
206
|
+
form: 'infinitive',
|
|
207
|
+
},
|
|
208
|
+
for: { primary: 'для', alternatives: ['кожний'], normalized: 'for' },
|
|
209
|
+
while: { primary: 'поки', normalized: 'while' },
|
|
210
|
+
continue: {
|
|
211
|
+
primary: 'продовжити',
|
|
212
|
+
alternatives: ['продовжуй'],
|
|
213
|
+
normalized: 'continue',
|
|
214
|
+
form: 'infinitive',
|
|
215
|
+
},
|
|
216
|
+
halt: {
|
|
217
|
+
primary: 'зупинити',
|
|
218
|
+
alternatives: ['зупинись', 'стоп'],
|
|
219
|
+
normalized: 'halt',
|
|
220
|
+
form: 'infinitive',
|
|
221
|
+
},
|
|
222
|
+
throw: { primary: 'кинути', alternatives: ['кинь'], normalized: 'throw', form: 'infinitive' },
|
|
223
|
+
call: {
|
|
224
|
+
primary: 'викликати',
|
|
225
|
+
alternatives: ['виклич'],
|
|
226
|
+
normalized: 'call',
|
|
227
|
+
form: 'infinitive',
|
|
228
|
+
},
|
|
229
|
+
return: {
|
|
230
|
+
primary: 'повернути',
|
|
231
|
+
alternatives: ['поверни'],
|
|
232
|
+
normalized: 'return',
|
|
233
|
+
form: 'infinitive',
|
|
234
|
+
},
|
|
235
|
+
then: { primary: 'потім', alternatives: ['далі', 'тоді'], normalized: 'then' },
|
|
236
|
+
and: { primary: 'і', alternatives: ['та'], normalized: 'and' },
|
|
237
|
+
end: { primary: 'кінець', normalized: 'end' },
|
|
238
|
+
// Advanced
|
|
239
|
+
js: { primary: 'js', normalized: 'js' },
|
|
240
|
+
async: { primary: 'асинхронно', alternatives: ['async'], normalized: 'async' },
|
|
241
|
+
tell: { primary: 'сказати', alternatives: ['скажи'], normalized: 'tell', form: 'infinitive' },
|
|
242
|
+
default: { primary: 'за_замовчуванням', normalized: 'default' },
|
|
243
|
+
init: {
|
|
244
|
+
primary: 'ініціалізувати',
|
|
245
|
+
alternatives: ['ініціалізуй'],
|
|
246
|
+
normalized: 'init',
|
|
247
|
+
form: 'infinitive',
|
|
248
|
+
},
|
|
249
|
+
behavior: { primary: 'поведінка', normalized: 'behavior' },
|
|
250
|
+
install: { primary: 'встановити_пакет', normalized: 'install', form: 'infinitive' },
|
|
251
|
+
measure: {
|
|
252
|
+
primary: 'виміряти',
|
|
253
|
+
alternatives: ['виміряй'],
|
|
254
|
+
normalized: 'measure',
|
|
255
|
+
form: 'infinitive',
|
|
256
|
+
},
|
|
257
|
+
// Modifiers
|
|
258
|
+
into: { primary: 'в', alternatives: ['у'], normalized: 'into' },
|
|
259
|
+
before: { primary: 'до', alternatives: ['перед'], normalized: 'before' },
|
|
260
|
+
after: { primary: 'після', normalized: 'after' },
|
|
261
|
+
// Event modifiers
|
|
262
|
+
until: { primary: 'до', alternatives: ['поки_не'], normalized: 'until' },
|
|
263
|
+
event: { primary: 'подія', normalized: 'event' },
|
|
264
|
+
from: { primary: 'з', alternatives: ['від', 'із'], normalized: 'from' },
|
|
265
|
+
},
|
|
266
|
+
eventHandler: {
|
|
267
|
+
keyword: { primary: 'при', alternatives: ['коли'], normalized: 'on' },
|
|
268
|
+
sourceMarker: { primary: 'на', alternatives: ['в', 'при'], position: 'before' },
|
|
269
|
+
},
|
|
270
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vietnamese Language Profile
|
|
3
|
+
*
|
|
4
|
+
* SVO word order, prepositions, space-separated.
|
|
5
|
+
* Vietnamese is an isolating (analytic) language with no inflection.
|
|
6
|
+
* Uses Latin script with extensive diacritics for tone marking.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { LanguageProfile } from './types';
|
|
10
|
+
|
|
11
|
+
export const vietnameseProfile: LanguageProfile = {
|
|
12
|
+
code: 'vi',
|
|
13
|
+
name: 'Vietnamese',
|
|
14
|
+
nativeName: 'Tiếng Việt',
|
|
15
|
+
direction: 'ltr',
|
|
16
|
+
wordOrder: 'SVO',
|
|
17
|
+
markingStrategy: 'preposition',
|
|
18
|
+
usesSpaces: true,
|
|
19
|
+
// Vietnamese uses base/dictionary form for commands
|
|
20
|
+
defaultVerbForm: 'base',
|
|
21
|
+
verb: {
|
|
22
|
+
position: 'start',
|
|
23
|
+
subjectDrop: true,
|
|
24
|
+
},
|
|
25
|
+
references: {
|
|
26
|
+
me: 'tôi', // "I/me"
|
|
27
|
+
it: 'nó', // "it"
|
|
28
|
+
you: 'bạn', // "you"
|
|
29
|
+
result: 'kết quả',
|
|
30
|
+
event: 'sự kiện',
|
|
31
|
+
target: 'mục tiêu',
|
|
32
|
+
body: 'body',
|
|
33
|
+
},
|
|
34
|
+
possessive: {
|
|
35
|
+
marker: 'của', // Vietnamese uses "của" for possession (của tôi = my)
|
|
36
|
+
markerPosition: 'between',
|
|
37
|
+
specialForms: {
|
|
38
|
+
me: 'của tôi', // "my"
|
|
39
|
+
it: 'của nó', // "its"
|
|
40
|
+
you: 'của bạn', // "your"
|
|
41
|
+
},
|
|
42
|
+
keywords: {
|
|
43
|
+
// Multi-word possessive phrases
|
|
44
|
+
// Note: These may require tokenizer support for multi-word recognition
|
|
45
|
+
'của tôi': 'me', // my
|
|
46
|
+
'của bạn': 'you', // your (informal)
|
|
47
|
+
'của anh': 'you', // your (male speaker, formal)
|
|
48
|
+
'của chị': 'you', // your (female speaker, formal)
|
|
49
|
+
'của nó': 'it', // its
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
roleMarkers: {
|
|
53
|
+
destination: { primary: 'vào', alternatives: ['cho', 'đến'], position: 'before' },
|
|
54
|
+
source: { primary: 'từ', alternatives: ['khỏi'], position: 'before' },
|
|
55
|
+
patient: { primary: '', position: 'before' },
|
|
56
|
+
style: { primary: 'với', position: 'before' },
|
|
57
|
+
},
|
|
58
|
+
keywords: {
|
|
59
|
+
// Class/Attribute operations
|
|
60
|
+
toggle: { primary: 'chuyển đổi', alternatives: ['bật tắt', 'chuyển'], normalized: 'toggle' },
|
|
61
|
+
add: { primary: 'thêm', alternatives: ['bổ sung'], normalized: 'add' },
|
|
62
|
+
remove: { primary: 'xóa', alternatives: ['gỡ bỏ', 'loại bỏ', 'bỏ'], normalized: 'remove' },
|
|
63
|
+
// Content operations
|
|
64
|
+
put: { primary: 'đặt', alternatives: ['để', 'đưa'], normalized: 'put' },
|
|
65
|
+
append: { primary: 'nối', normalized: 'append' },
|
|
66
|
+
prepend: { primary: 'thêm vào đầu', normalized: 'prepend' },
|
|
67
|
+
take: { primary: 'lấy', normalized: 'take' },
|
|
68
|
+
make: { primary: 'tạo', normalized: 'make' },
|
|
69
|
+
clone: { primary: 'sao chép', normalized: 'clone' },
|
|
70
|
+
swap: { primary: 'hoán đổi', normalized: 'swap' },
|
|
71
|
+
morph: { primary: 'biến đổi', normalized: 'morph' },
|
|
72
|
+
// Variable operations
|
|
73
|
+
set: { primary: 'gán', alternatives: ['thiết lập', 'đặt'], normalized: 'set' },
|
|
74
|
+
get: { primary: 'lấy giá trị', alternatives: ['nhận', 'lấy'], normalized: 'get' },
|
|
75
|
+
increment: { primary: 'tăng', alternatives: ['tăng lên'], normalized: 'increment' },
|
|
76
|
+
decrement: { primary: 'giảm', alternatives: ['giảm đi'], normalized: 'decrement' },
|
|
77
|
+
log: { primary: 'in ra', normalized: 'log' },
|
|
78
|
+
// Visibility
|
|
79
|
+
show: { primary: 'hiển thị', alternatives: ['hiện'], normalized: 'show' },
|
|
80
|
+
hide: { primary: 'ẩn', alternatives: ['che', 'giấu'], normalized: 'hide' },
|
|
81
|
+
transition: { primary: 'chuyển tiếp', normalized: 'transition' },
|
|
82
|
+
// Events
|
|
83
|
+
on: { primary: 'khi', alternatives: ['lúc', 'trên'], normalized: 'on' },
|
|
84
|
+
trigger: { primary: 'kích hoạt', normalized: 'trigger' },
|
|
85
|
+
send: { primary: 'gửi', normalized: 'send' },
|
|
86
|
+
// DOM focus
|
|
87
|
+
focus: { primary: 'tập trung', normalized: 'focus' },
|
|
88
|
+
blur: { primary: 'mất tập trung', normalized: 'blur' },
|
|
89
|
+
// Navigation
|
|
90
|
+
go: { primary: 'đi đến', alternatives: ['đi'], normalized: 'go' },
|
|
91
|
+
// Async
|
|
92
|
+
wait: { primary: 'chờ', alternatives: ['đợi'], normalized: 'wait' },
|
|
93
|
+
fetch: { primary: 'tải', normalized: 'fetch' },
|
|
94
|
+
settle: { primary: 'ổn định', normalized: 'settle' },
|
|
95
|
+
// Control flow
|
|
96
|
+
if: { primary: 'nếu', normalized: 'if' },
|
|
97
|
+
when: { primary: 'khi', normalized: 'when' },
|
|
98
|
+
where: { primary: 'ở_đâu', normalized: 'where' },
|
|
99
|
+
else: { primary: 'không thì', alternatives: ['nếu không'], normalized: 'else' },
|
|
100
|
+
repeat: { primary: 'lặp lại', normalized: 'repeat' },
|
|
101
|
+
for: { primary: 'với mỗi', normalized: 'for' },
|
|
102
|
+
while: { primary: 'trong khi', normalized: 'while' },
|
|
103
|
+
continue: { primary: 'tiếp tục', normalized: 'continue' },
|
|
104
|
+
halt: { primary: 'dừng', alternatives: ['dừng lại'], normalized: 'halt' },
|
|
105
|
+
throw: { primary: 'ném', normalized: 'throw' },
|
|
106
|
+
call: { primary: 'gọi', normalized: 'call' },
|
|
107
|
+
return: { primary: 'trả về', normalized: 'return' },
|
|
108
|
+
then: { primary: 'rồi', alternatives: ['sau đó', 'thì'], normalized: 'then' },
|
|
109
|
+
and: { primary: 'và', normalized: 'and' },
|
|
110
|
+
end: { primary: 'kết thúc', normalized: 'end' },
|
|
111
|
+
// Advanced
|
|
112
|
+
js: { primary: 'js', normalized: 'js' },
|
|
113
|
+
async: { primary: 'bất đồng bộ', normalized: 'async' },
|
|
114
|
+
tell: { primary: 'nói với', normalized: 'tell' },
|
|
115
|
+
default: { primary: 'mặc định', normalized: 'default' },
|
|
116
|
+
init: { primary: 'khởi tạo', normalized: 'init' },
|
|
117
|
+
behavior: { primary: 'hành vi', normalized: 'behavior' },
|
|
118
|
+
install: { primary: 'cài đặt', normalized: 'install' },
|
|
119
|
+
measure: { primary: 'đo lường', normalized: 'measure' },
|
|
120
|
+
// Modifiers
|
|
121
|
+
into: { primary: 'vào', alternatives: ['vào trong'], normalized: 'into' },
|
|
122
|
+
before: { primary: 'trước', alternatives: ['trước khi'], normalized: 'before' },
|
|
123
|
+
after: { primary: 'sau', alternatives: ['sau khi'], normalized: 'after' },
|
|
124
|
+
// Event modifiers
|
|
125
|
+
until: { primary: 'cho đến khi', normalized: 'until' },
|
|
126
|
+
event: { primary: 'sự kiện', normalized: 'event' },
|
|
127
|
+
from: { primary: 'từ', alternatives: ['khỏi'], normalized: 'from' },
|
|
128
|
+
},
|
|
129
|
+
eventHandler: {
|
|
130
|
+
keyword: { primary: 'khi', alternatives: ['lúc', 'trên'], normalized: 'on' },
|
|
131
|
+
sourceMarker: { primary: 'trên', alternatives: ['tại'], position: 'before' },
|
|
132
|
+
},
|
|
133
|
+
};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Error Codes
|
|
3
|
+
*
|
|
4
|
+
* Provides machine-readable error codes for schema validation.
|
|
5
|
+
* These codes enable LLMs and tooling to programmatically identify
|
|
6
|
+
* and respond to specific validation issues.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { SemanticRole } from '../types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Severity levels for schema validation items.
|
|
13
|
+
*/
|
|
14
|
+
export type SchemaValidationSeverity = 'error' | 'warning' | 'note';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A structured validation item with machine-readable code.
|
|
18
|
+
*/
|
|
19
|
+
export interface SchemaValidationItem {
|
|
20
|
+
/** Machine-readable error code */
|
|
21
|
+
code: string;
|
|
22
|
+
/** Human-readable message */
|
|
23
|
+
message: string;
|
|
24
|
+
/** Severity level */
|
|
25
|
+
severity: SchemaValidationSeverity;
|
|
26
|
+
/** Affected role, if applicable */
|
|
27
|
+
role?: SemanticRole;
|
|
28
|
+
/** Suggested fix */
|
|
29
|
+
suggestion?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Schema error codes organized by category.
|
|
34
|
+
*/
|
|
35
|
+
export const SchemaErrorCodes = {
|
|
36
|
+
// Type ambiguity issues
|
|
37
|
+
AMBIGUOUS_TYPE_LITERAL_SELECTOR: 'SCHEMA_AMBIGUOUS_TYPE_LITERAL_SELECTOR',
|
|
38
|
+
TOO_MANY_EXPECTED_TYPES: 'SCHEMA_TOO_MANY_EXPECTED_TYPES',
|
|
39
|
+
MULTI_TYPE_PATIENT_EXPECTED: 'SCHEMA_MULTI_TYPE_PATIENT_EXPECTED',
|
|
40
|
+
|
|
41
|
+
// Role issues
|
|
42
|
+
NO_REQUIRED_ROLES: 'SCHEMA_NO_REQUIRED_ROLES',
|
|
43
|
+
NO_REQUIRED_ROLES_EXPECTED: 'SCHEMA_NO_REQUIRED_ROLES_EXPECTED',
|
|
44
|
+
|
|
45
|
+
// Transition command
|
|
46
|
+
TRANSITION_PATIENT_ACCEPTS_SELECTOR: 'SCHEMA_TRANSITION_PATIENT_ACCEPTS_SELECTOR',
|
|
47
|
+
TRANSITION_MISSING_GOAL: 'SCHEMA_TRANSITION_MISSING_GOAL',
|
|
48
|
+
|
|
49
|
+
// Event handler command
|
|
50
|
+
EVENT_HANDLER_MISSING_EVENT: 'SCHEMA_EVENT_HANDLER_MISSING_EVENT',
|
|
51
|
+
EVENT_HANDLER_EVENT_NOT_REQUIRED: 'SCHEMA_EVENT_HANDLER_EVENT_NOT_REQUIRED',
|
|
52
|
+
|
|
53
|
+
// Conditional commands
|
|
54
|
+
CONDITIONAL_MISSING_CONDITION: 'SCHEMA_CONDITIONAL_MISSING_CONDITION',
|
|
55
|
+
CONDITIONAL_CONDITION_NOT_REQUIRED: 'SCHEMA_CONDITIONAL_CONDITION_NOT_REQUIRED',
|
|
56
|
+
|
|
57
|
+
// Loop commands
|
|
58
|
+
FOR_LOOP_MISSING_SOURCE: 'SCHEMA_FOR_LOOP_MISSING_SOURCE',
|
|
59
|
+
WHILE_LOOP_MISSING_CONDITION: 'SCHEMA_WHILE_LOOP_MISSING_CONDITION',
|
|
60
|
+
} as const;
|
|
61
|
+
|
|
62
|
+
export type SchemaErrorCode = (typeof SchemaErrorCodes)[keyof typeof SchemaErrorCodes];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Message templates for each error code.
|
|
66
|
+
* Use {role}, {command}, {count} placeholders for dynamic values.
|
|
67
|
+
*/
|
|
68
|
+
export const SchemaErrorMessages: Record<SchemaErrorCode, string> = {
|
|
69
|
+
// Type ambiguity
|
|
70
|
+
[SchemaErrorCodes.AMBIGUOUS_TYPE_LITERAL_SELECTOR]:
|
|
71
|
+
"Role '{role}' accepts both 'literal' and 'selector'. This may cause ambiguous type inference for values starting with special characters (* . # etc.).",
|
|
72
|
+
[SchemaErrorCodes.TOO_MANY_EXPECTED_TYPES]:
|
|
73
|
+
"Role '{role}' accepts {count} different types. This may make type inference unreliable.",
|
|
74
|
+
[SchemaErrorCodes.MULTI_TYPE_PATIENT_EXPECTED]:
|
|
75
|
+
"Role '{role}' accepts multiple types (expected for {command} command).",
|
|
76
|
+
|
|
77
|
+
// Role issues
|
|
78
|
+
[SchemaErrorCodes.NO_REQUIRED_ROLES]: 'Command has no required roles. Is this intentional?',
|
|
79
|
+
[SchemaErrorCodes.NO_REQUIRED_ROLES_EXPECTED]:
|
|
80
|
+
'Command has no required roles (expected for {command}).',
|
|
81
|
+
|
|
82
|
+
// Transition
|
|
83
|
+
[SchemaErrorCodes.TRANSITION_PATIENT_ACCEPTS_SELECTOR]:
|
|
84
|
+
"Transition command 'patient' role (CSS property name) should only accept 'literal', not 'selector'. CSS property names like 'background-color' are strings, not CSS selectors.",
|
|
85
|
+
[SchemaErrorCodes.TRANSITION_MISSING_GOAL]:
|
|
86
|
+
"Transition command requires a 'goal' role for the target value (to <value>). Without it, there's no way to specify what value to transition to.",
|
|
87
|
+
|
|
88
|
+
// Event handler
|
|
89
|
+
[SchemaErrorCodes.EVENT_HANDLER_MISSING_EVENT]:
|
|
90
|
+
"Event handler command should have an 'event' role to specify which event to listen for.",
|
|
91
|
+
[SchemaErrorCodes.EVENT_HANDLER_EVENT_NOT_REQUIRED]:
|
|
92
|
+
'Event role should be required - every event handler needs an event to listen for.',
|
|
93
|
+
|
|
94
|
+
// Conditionals
|
|
95
|
+
[SchemaErrorCodes.CONDITIONAL_MISSING_CONDITION]:
|
|
96
|
+
"Conditional command should have a 'condition' role for the boolean expression.",
|
|
97
|
+
[SchemaErrorCodes.CONDITIONAL_CONDITION_NOT_REQUIRED]:
|
|
98
|
+
'Condition role should be required - conditionals need a condition to evaluate.',
|
|
99
|
+
|
|
100
|
+
// Loops
|
|
101
|
+
[SchemaErrorCodes.FOR_LOOP_MISSING_SOURCE]:
|
|
102
|
+
"For-loop should have a 'source' role for the collection to iterate over.",
|
|
103
|
+
[SchemaErrorCodes.WHILE_LOOP_MISSING_CONDITION]:
|
|
104
|
+
"While-loop should have a 'condition' role for the loop condition.",
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Suggested fixes for each error code.
|
|
109
|
+
*/
|
|
110
|
+
export const SchemaErrorSuggestions: Partial<Record<SchemaErrorCode, string>> = {
|
|
111
|
+
[SchemaErrorCodes.AMBIGUOUS_TYPE_LITERAL_SELECTOR]:
|
|
112
|
+
'Consider being more specific about which type is expected, or use explicit type markers.',
|
|
113
|
+
[SchemaErrorCodes.TOO_MANY_EXPECTED_TYPES]:
|
|
114
|
+
'Consider narrowing the accepted types to improve type inference reliability.',
|
|
115
|
+
[SchemaErrorCodes.TRANSITION_PATIENT_ACCEPTS_SELECTOR]:
|
|
116
|
+
"Remove 'selector' from expectedTypes and only accept 'literal'.",
|
|
117
|
+
[SchemaErrorCodes.TRANSITION_MISSING_GOAL]:
|
|
118
|
+
"Add a 'goal' role with expectedTypes ['literal', 'variable'].",
|
|
119
|
+
[SchemaErrorCodes.EVENT_HANDLER_MISSING_EVENT]:
|
|
120
|
+
"Add an 'event' role with expectedTypes ['literal'].",
|
|
121
|
+
[SchemaErrorCodes.EVENT_HANDLER_EVENT_NOT_REQUIRED]: "Set required: true on the 'event' role.",
|
|
122
|
+
[SchemaErrorCodes.CONDITIONAL_MISSING_CONDITION]:
|
|
123
|
+
"Add a 'condition' role with expectedTypes ['expression'].",
|
|
124
|
+
[SchemaErrorCodes.CONDITIONAL_CONDITION_NOT_REQUIRED]:
|
|
125
|
+
"Set required: true on the 'condition' role.",
|
|
126
|
+
[SchemaErrorCodes.FOR_LOOP_MISSING_SOURCE]:
|
|
127
|
+
"Add a 'source' role for the collection to iterate over.",
|
|
128
|
+
[SchemaErrorCodes.WHILE_LOOP_MISSING_CONDITION]:
|
|
129
|
+
"Add a 'condition' role for the loop continuation condition.",
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Interpolate placeholders in a message template.
|
|
134
|
+
*/
|
|
135
|
+
function interpolate(template: string, params: Record<string, string | number>): string {
|
|
136
|
+
return template.replace(/\{(\w+)\}/g, (_, key) => String(params[key] ?? `{${key}}`));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Create a schema validation item with proper interpolation.
|
|
141
|
+
*/
|
|
142
|
+
export function createSchemaValidationItem(
|
|
143
|
+
code: SchemaErrorCode,
|
|
144
|
+
severity: SchemaValidationSeverity,
|
|
145
|
+
params: Record<string, string | number> = {},
|
|
146
|
+
role?: SemanticRole
|
|
147
|
+
): SchemaValidationItem {
|
|
148
|
+
const messageTemplate = SchemaErrorMessages[code];
|
|
149
|
+
const message = interpolate(messageTemplate, params);
|
|
150
|
+
const suggestionTemplate = SchemaErrorSuggestions[code];
|
|
151
|
+
const suggestion = suggestionTemplate ? interpolate(suggestionTemplate, params) : undefined;
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
code,
|
|
155
|
+
message,
|
|
156
|
+
severity,
|
|
157
|
+
...(role && { role }),
|
|
158
|
+
...(suggestion && { suggestion }),
|
|
159
|
+
};
|
|
160
|
+
}
|