@lokascript/framework 2.7.2 → 2.9.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 (55) hide show
  1. package/CHANGELOG.md +393 -0
  2. package/dist/api/create-dsl.d.ts +93 -1
  3. package/dist/api/create-dsl.d.ts.map +1 -1
  4. package/dist/api/domain-registry.d.ts +5 -3
  5. package/dist/api/domain-registry.d.ts.map +1 -1
  6. package/dist/api/index.js +238 -20
  7. package/dist/api/index.js.map +1 -1
  8. package/dist/core/index.js +67 -7
  9. package/dist/core/index.js.map +1 -1
  10. package/dist/core/tokenization/base-tokenizer.d.ts +39 -3
  11. package/dist/core/tokenization/base-tokenizer.d.ts.map +1 -1
  12. package/dist/core/tokenization/extractors.d.ts +6 -0
  13. package/dist/core/tokenization/extractors.d.ts.map +1 -1
  14. package/dist/core/tokenization/index.js +67 -7
  15. package/dist/core/tokenization/index.js.map +1 -1
  16. package/dist/core/tokenization/token-utils.d.ts +15 -0
  17. package/dist/core/tokenization/token-utils.d.ts.map +1 -1
  18. package/dist/generation/index.js +75 -48
  19. package/dist/generation/index.js.map +1 -1
  20. package/dist/generation/pattern-generator.d.ts +8 -1
  21. package/dist/generation/pattern-generator.d.ts.map +1 -1
  22. package/dist/generation/renderer.d.ts +53 -1
  23. package/dist/generation/renderer.d.ts.map +1 -1
  24. package/dist/index.cjs +349 -118
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.ts +4 -4
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +345 -118
  29. package/dist/index.js.map +1 -1
  30. package/dist/interfaces/value-extractor.d.ts +5 -0
  31. package/dist/interfaces/value-extractor.d.ts.map +1 -1
  32. package/dist/multilingual/index.js +66 -7
  33. package/dist/multilingual/index.js.map +1 -1
  34. package/dist/testing/index.js +4 -12
  35. package/dist/testing/index.js.map +1 -1
  36. package/package.json +4 -3
  37. package/src/api/create-dsl.test.ts +11 -0
  38. package/src/api/create-dsl.ts +278 -9
  39. package/src/api/domain-registry.ts +15 -10
  40. package/src/api/extensions.test.ts +322 -0
  41. package/src/core/tokenization/base-tokenizer.ts +78 -9
  42. package/src/core/tokenization/colon-qualifier.test.ts +129 -0
  43. package/src/core/tokenization/css-selector-extractor.test.ts +67 -0
  44. package/src/core/tokenization/extractors.ts +6 -0
  45. package/src/core/tokenization/token-utils.ts +18 -0
  46. package/src/generation/domain-renderer.test.ts +172 -0
  47. package/src/generation/pattern-generator.test.ts +102 -0
  48. package/src/generation/pattern-generator.ts +32 -20
  49. package/src/generation/renderer.test.ts +243 -4
  50. package/src/generation/renderer.ts +188 -45
  51. package/src/index.ts +9 -1
  52. package/src/interfaces/value-extractor.ts +50 -0
  53. package/src/ir/protocol-json.test.ts +21 -0
  54. package/src/ir/references.test.ts +5 -2
  55. package/src/prompts/prompt-generator.ts +4 -1
@@ -116,6 +116,11 @@ export declare class LatinExtendedIdentifierExtractor implements ValueExtractor
116
116
  canExtract(input: string, position: number): boolean;
117
117
  extract(input: string, position: number): ExtractionResult | null;
118
118
  }
119
+ export declare class CssSelectorExtractor implements ValueExtractor {
120
+ readonly name = "css-selector";
121
+ canExtract(input: string, position: number): boolean;
122
+ extract(input: string, position: number): ExtractionResult | null;
123
+ }
119
124
  /**
120
125
  * Whitespace extractor - handles spaces, tabs, newlines.
121
126
  */
@@ -1 +1 @@
1
- {"version":3,"file":"value-extractor.d.ts","sourceRoot":"","sources":["../../src/interfaces/value-extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"value-extractor.d.ts","sourceRoot":"","sources":["../../src/interfaces/value-extractor.ts"],"names":[],"mappings":"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"}
@@ -323,6 +323,9 @@ function isQuote(char) {
323
323
  function isDigit(char) {
324
324
  return /\d/.test(char);
325
325
  }
326
+ function stripOptionalDiacritics(word) {
327
+ return word.replace(/[ً-ْٰ]/g, "");
328
+ }
326
329
  function isAsciiLetter(char) {
327
330
  return /[a-zA-Z]/.test(char);
328
331
  }
@@ -890,7 +893,39 @@ var _BaseTokenizer = class _BaseTokenizer {
890
893
  pos++;
891
894
  }
892
895
  }
893
- return new TokenStreamImpl(tokens, this.language);
896
+ return new TokenStreamImpl(this.mergeColonQualifiedNames(tokens), this.language);
897
+ }
898
+ /**
899
+ * Fuse `name` + `:qualifier` into ONE identifier (`draggable:start`).
900
+ *
901
+ * `:name` is hyperscript's local-variable sigil, but a colon IMMEDIATELY
902
+ * preceded by an identifier is a qualifier (custom event namespace), not a
903
+ * sigil. The English tokenizer already merges these inside
904
+ * EnglishKeywordExtractor; this post-pass gives the other 23 languages the
905
+ * same stream. Strict position adjacency is the discriminator: whitespace
906
+ * between the tokens (`trigger :start`) breaks `end === start`, so a spaced
907
+ * local-variable reference survives untouched.
908
+ *
909
+ * Self-gating for non-hyperscript tokenizers (domain DSLs): their extractor
910
+ * sets tokenize `:` as bare punctuation (length 1), which never matches
911
+ * COLON_QUALIFIER, so this pass is a no-op for them.
912
+ */
913
+ mergeColonQualifiedNames(tokens) {
914
+ const out = [];
915
+ for (const tok of tokens) {
916
+ const prev = out[out.length - 1];
917
+ if (prev && _BaseTokenizer.ASCII_WORD.test(prev.value) && _BaseTokenizer.COLON_QUALIFIER.test(tok.value) && prev.position.end === tok.position.start) {
918
+ const merged = prev.value + tok.value;
919
+ out[out.length - 1] = createToken(
920
+ merged,
921
+ this.classifyToken(merged),
922
+ createPosition(prev.position.start, tok.position.end)
923
+ );
924
+ continue;
925
+ }
926
+ out.push(tok);
927
+ }
928
+ return out;
894
929
  }
895
930
  /**
896
931
  * Classify an unknown character when no extractor matches.
@@ -1023,7 +1058,7 @@ var _BaseTokenizer = class _BaseTokenizer {
1023
1058
  * @returns Word without diacritics
1024
1059
  */
1025
1060
  removeDiacritics(word) {
1026
- return word.replace(/[\u064B-\u0652\u0670]/g, "");
1061
+ return stripOptionalDiacritics(word);
1027
1062
  }
1028
1063
  /**
1029
1064
  * Try to match a keyword from profile at the current position.
@@ -1114,24 +1149,40 @@ var _BaseTokenizer = class _BaseTokenizer {
1114
1149
  });
1115
1150
  }
1116
1151
  /**
1117
- * Look up a keyword by native word (case-insensitive).
1152
+ * Look up a keyword by native word (case-insensitive, diacritic-insensitive).
1118
1153
  * O(1) lookup using the keyword map.
1119
1154
  *
1155
+ * The map is INDEXED both with and without diacritics (see
1156
+ * `initializeKeywordsFromProfile`), so a stripped QUERY is the other half of
1157
+ * that: it lets a surface form carrying harakat the profile does not happen to
1158
+ * spell still find its entry. Only consulted after the exact lookup misses, so
1159
+ * every previously-matching word resolves byte-identically.
1160
+ *
1161
+ * Half-implementing this — indexing stripped but querying exact — is what made
1162
+ * diacritized `بَدِّل` (toggle) tokenize as `kind=particle normalized=with`:
1163
+ * `isKeyword` returned false, so the guard in `ArabicProcliticExtractor` that
1164
+ * exists to prevent exactly that handed the word on, and the single-char `ب`
1165
+ * bi- proclitic claimed it. A wrong CONCEPT, not a failed parse.
1166
+ *
1120
1167
  * @param native - Native word to look up
1121
1168
  * @returns KeywordEntry if found, undefined otherwise
1122
1169
  */
1123
1170
  lookupKeyword(native) {
1124
- return this.profileKeywordMap.get(native.toLowerCase());
1171
+ const exact = this.profileKeywordMap.get(native.toLowerCase());
1172
+ if (exact) return exact;
1173
+ const stripped = this.removeDiacritics(native);
1174
+ if (stripped === native) return void 0;
1175
+ return this.profileKeywordMap.get(stripped.toLowerCase());
1125
1176
  }
1126
1177
  /**
1127
- * Check if a word is a known keyword (case-insensitive).
1128
- * O(1) lookup using the keyword map.
1178
+ * Check if a word is a known keyword (case-insensitive, diacritic-insensitive).
1179
+ * O(1) lookup using the keyword map. See {@link lookupKeyword}.
1129
1180
  *
1130
1181
  * @param native - Native word to check
1131
1182
  * @returns true if the word is a keyword
1132
1183
  */
1133
1184
  isKeyword(native) {
1134
- return this.profileKeywordMap.has(native.toLowerCase());
1185
+ return this.lookupKeyword(native) !== void 0;
1135
1186
  }
1136
1187
  /**
1137
1188
  * Set the morphological normalizer for this tokenizer.
@@ -1396,6 +1447,14 @@ var _BaseTokenizer = class _BaseTokenizer {
1396
1447
  return null;
1397
1448
  }
1398
1449
  };
1450
+ /**
1451
+ * ASCII word of the shape the English word-walker produces. Excludes `:`, so a
1452
+ * token that already carries a qualifier never merges again — `a:b:c` yields
1453
+ * `a:b` + `:c`, byte-matching the English extractor's single-segment merge.
1454
+ */
1455
+ _BaseTokenizer.ASCII_WORD = /^[A-Za-z_][A-Za-z0-9_]*$/;
1456
+ /** `:name` — only a variable-ref-style extractor ever emits this token shape. */
1457
+ _BaseTokenizer.COLON_QUALIFIER = /^:[A-Za-z_][A-Za-z0-9_]*$/;
1399
1458
  /**
1400
1459
  * Configuration for native language time units.
1401
1460
  * Maps patterns to their standard suffix (ms, s, m, h).