@kernlang/core 3.1.5 → 3.1.6

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 (93) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +5 -2
  3. package/dist/codegen/data-layer.d.ts +12 -0
  4. package/dist/codegen/data-layer.js +292 -0
  5. package/dist/codegen/data-layer.js.map +1 -0
  6. package/dist/codegen/events.d.ts +9 -0
  7. package/dist/codegen/events.js +158 -0
  8. package/dist/codegen/events.js.map +1 -0
  9. package/dist/codegen/functions.d.ts +8 -0
  10. package/dist/codegen/functions.js +147 -0
  11. package/dist/codegen/functions.js.map +1 -0
  12. package/dist/codegen/ground-layer.d.ts +22 -0
  13. package/dist/codegen/ground-layer.js +317 -0
  14. package/dist/codegen/ground-layer.js.map +1 -0
  15. package/dist/codegen/machines.d.ts +9 -0
  16. package/dist/codegen/machines.js +127 -0
  17. package/dist/codegen/machines.js.map +1 -0
  18. package/dist/codegen/modules.d.ts +10 -0
  19. package/dist/codegen/modules.js +40 -0
  20. package/dist/codegen/modules.js.map +1 -0
  21. package/dist/codegen/semantic-types.d.ts +14 -0
  22. package/dist/codegen/semantic-types.js +31 -0
  23. package/dist/codegen/semantic-types.js.map +1 -0
  24. package/dist/codegen/test-gen.d.ts +7 -0
  25. package/dist/codegen/test-gen.js +56 -0
  26. package/dist/codegen/test-gen.js.map +1 -0
  27. package/dist/codegen/type-system.d.ts +11 -0
  28. package/dist/codegen/type-system.js +162 -0
  29. package/dist/codegen/type-system.js.map +1 -0
  30. package/dist/codegen-core.d.ts +26 -33
  31. package/dist/codegen-core.js +58 -1367
  32. package/dist/codegen-core.js.map +1 -1
  33. package/dist/config.d.ts +20 -1
  34. package/dist/config.js +23 -3
  35. package/dist/config.js.map +1 -1
  36. package/dist/coverage-gap.js +6 -2
  37. package/dist/coverage-gap.js.map +1 -1
  38. package/dist/decompiler.d.ts +9 -0
  39. package/dist/decompiler.js +17 -2
  40. package/dist/decompiler.js.map +1 -1
  41. package/dist/errors.d.ts +5 -0
  42. package/dist/errors.js +10 -0
  43. package/dist/errors.js.map +1 -1
  44. package/dist/index.d.ts +11 -4
  45. package/dist/index.js +9 -3
  46. package/dist/index.js.map +1 -1
  47. package/dist/node-props.d.ts +253 -0
  48. package/dist/node-props.js +35 -0
  49. package/dist/node-props.js.map +1 -0
  50. package/dist/parser-core.d.ts +5 -0
  51. package/dist/parser-core.js +363 -0
  52. package/dist/parser-core.js.map +1 -0
  53. package/dist/parser-diagnostics.d.ts +14 -0
  54. package/dist/parser-diagnostics.js +31 -0
  55. package/dist/parser-diagnostics.js.map +1 -0
  56. package/dist/parser-keywords.d.ts +5 -0
  57. package/dist/parser-keywords.js +135 -0
  58. package/dist/parser-keywords.js.map +1 -0
  59. package/dist/parser-style.d.ts +3 -0
  60. package/dist/parser-style.js +73 -0
  61. package/dist/parser-style.js.map +1 -0
  62. package/dist/parser-token-stream.d.ts +27 -0
  63. package/dist/parser-token-stream.js +69 -0
  64. package/dist/parser-token-stream.js.map +1 -0
  65. package/dist/parser-tokenizer.d.ts +11 -0
  66. package/dist/parser-tokenizer.js +188 -0
  67. package/dist/parser-tokenizer.js.map +1 -0
  68. package/dist/parser.d.ts +59 -12
  69. package/dist/parser.js +51 -862
  70. package/dist/parser.js.map +1 -1
  71. package/dist/schema.d.ts +7 -2
  72. package/dist/schema.js +7 -2
  73. package/dist/schema.js.map +1 -1
  74. package/dist/source-map.d.ts +27 -0
  75. package/dist/source-map.js +82 -0
  76. package/dist/source-map.js.map +1 -0
  77. package/dist/spec.d.ts +1 -1
  78. package/dist/spec.js +2 -0
  79. package/dist/spec.js.map +1 -1
  80. package/dist/styles-tailwind.d.ts +10 -0
  81. package/dist/styles-tailwind.js +10 -0
  82. package/dist/styles-tailwind.js.map +1 -1
  83. package/dist/template-engine.d.ts +10 -5
  84. package/dist/template-engine.js +10 -5
  85. package/dist/template-engine.js.map +1 -1
  86. package/dist/types.d.ts +8 -3
  87. package/dist/utils.d.ts +20 -0
  88. package/dist/utils.js +20 -0
  89. package/dist/utils.js.map +1 -1
  90. package/dist/walk.d.ts +40 -0
  91. package/dist/walk.js +107 -0
  92. package/dist/walk.js.map +1 -0
  93. package/package.json +2 -2
@@ -0,0 +1,14 @@
1
+ /** @internal Parser diagnostics infrastructure — not part of the public API. */
2
+ import type { ParseDiagnostic, ParseErrorCode } from './types.js';
3
+ import { type KernRuntime } from './runtime.js';
4
+ export interface ParseState {
5
+ diagnostics: ParseDiagnostic[];
6
+ }
7
+ interface EmitDiagnosticOptions {
8
+ endCol?: number;
9
+ suggestion?: string;
10
+ }
11
+ export declare function createParseState(): ParseState;
12
+ export declare function commitParseState(state: ParseState, runtime?: KernRuntime): void;
13
+ export declare function emitDiagnostic(state: ParseState, code: ParseErrorCode, severity: ParseDiagnostic['severity'], message: string, line: number, col: number, options?: EmitDiagnosticOptions): void;
14
+ export {};
@@ -0,0 +1,31 @@
1
+ import { defaultRuntime } from './runtime.js';
2
+ const DIAGNOSTIC_SUGGESTIONS = {
3
+ UNCLOSED_EXPR: 'Close the `{{ ... }}` expression or move the unfinished code into a quoted string.',
4
+ UNCLOSED_STYLE: 'Close the `{ ... }` style block with `}` and keep any commas inside the block.',
5
+ UNCLOSED_STRING: 'Add the missing closing quote or escape any embedded quotes inside the string.',
6
+ UNEXPECTED_TOKEN: 'Remove the stray token or quote it so the parser can treat it as a value.',
7
+ EMPTY_DOCUMENT: 'Add at least one root KERN node such as `screen`, `view`, or `text`.',
8
+ INVALID_INDENT: 'Replace tabs with spaces so indentation is consistent across sibling nodes.',
9
+ UNKNOWN_NODE_TYPE: 'Rename this node to a supported KERN keyword or register it as an evolved node type.',
10
+ INDENT_JUMP: 'Align this line with an existing indentation level so the parent-child structure is unambiguous.',
11
+ DUPLICATE_PROP: 'Remove the duplicate property or merge the values into a single prop assignment.',
12
+ DROPPED_LINE: 'Rewrite this line so it starts with a valid KERN node type and move stray symbols into props.',
13
+ };
14
+ export function createParseState() {
15
+ return { diagnostics: [] };
16
+ }
17
+ export function commitParseState(state, runtime = defaultRuntime) {
18
+ runtime.lastParseDiagnostics = state.diagnostics.map(d => ({ ...d }));
19
+ }
20
+ export function emitDiagnostic(state, code, severity, message, line, col, options = {}) {
21
+ state.diagnostics.push({
22
+ code,
23
+ severity,
24
+ message,
25
+ line,
26
+ col,
27
+ endCol: Math.max(options.endCol ?? (col + 1), col),
28
+ suggestion: options.suggestion ?? DIAGNOSTIC_SUGGESTIONS[code],
29
+ });
30
+ }
31
+ //# sourceMappingURL=parser-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-diagnostics.js","sourceRoot":"","sources":["../src/parser-diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAC;AAWhE,MAAM,sBAAsB,GAAmC;IAC7D,aAAa,EAAE,oFAAoF;IACnG,cAAc,EAAE,gFAAgF;IAChG,eAAe,EAAE,gFAAgF;IACjG,gBAAgB,EAAE,2EAA2E;IAC7F,cAAc,EAAE,sEAAsE;IACtF,cAAc,EAAE,6EAA6E;IAC7F,iBAAiB,EAAE,sFAAsF;IACzG,WAAW,EAAE,kGAAkG;IAC/G,cAAc,EAAE,kFAAkF;IAClG,YAAY,EAAE,+FAA+F;CAC9G,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAiB,EAAE,UAAuB,cAAc;IACvF,OAAO,CAAC,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAiB,EACjB,IAAoB,EACpB,QAAqC,EACrC,OAAe,EACf,IAAY,EACZ,GAAW,EACX,UAAiC,EAAE;IAEnC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;QACrB,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,IAAI;QACJ,GAAG;QACH,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;QAClD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,sBAAsB,CAAC,IAAI,CAAC;KAC/D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** @internal Keyword-specific parsing handlers for KERN node types. */
2
+ import { TokenStream } from './parser-token-stream.js';
3
+ type KeywordHandler = (s: TokenStream, props: Record<string, unknown>, content: string) => void;
4
+ export declare const KEYWORD_HANDLERS: Map<string, KeywordHandler>;
5
+ export {};
@@ -0,0 +1,135 @@
1
+ /** Consume a bare identifier into props if it's not a key=value pair. */
2
+ function consumeBareIdent(s, props, propName) {
3
+ s.skipWS();
4
+ if (s.isKeyValue())
5
+ return;
6
+ const id = s.tryIdent();
7
+ if (id)
8
+ props[propName] = id;
9
+ }
10
+ export const KEYWORD_HANDLERS = new Map([
11
+ ['theme', (s, props) => {
12
+ consumeBareIdent(s, props, 'name');
13
+ }],
14
+ ['import', (s, props) => {
15
+ s.skipWS();
16
+ const pos = s.position();
17
+ const id = s.tryIdent();
18
+ if (id === 'default') {
19
+ if (!s.done() && s.peek()?.kind !== 'equals') {
20
+ props.default = true;
21
+ s.skipWS();
22
+ }
23
+ else if (s.peek()?.kind === 'equals') {
24
+ s.setPosition(pos);
25
+ return;
26
+ }
27
+ else {
28
+ props.default = true;
29
+ return;
30
+ }
31
+ }
32
+ else if (id) {
33
+ s.setPosition(pos);
34
+ }
35
+ if (!s.isKeyValue()) {
36
+ s.skipWS();
37
+ const name = s.tryIdent();
38
+ if (name)
39
+ props.name = name;
40
+ }
41
+ }],
42
+ ['route', (s, props) => {
43
+ s.skipWS();
44
+ const pos = s.position();
45
+ const verb = s.tryIdent();
46
+ if (verb && /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)$/i.test(verb)) {
47
+ props.method = verb.toLowerCase();
48
+ s.skipWS();
49
+ const tok = s.peek();
50
+ if (tok && tok.kind === 'slash') {
51
+ props.path = tok.value;
52
+ s.next();
53
+ }
54
+ }
55
+ else if (verb) {
56
+ s.setPosition(pos);
57
+ }
58
+ }],
59
+ ['params', (s, props, content) => {
60
+ s.skipWS();
61
+ const remaining = s.remainingRaw(content);
62
+ if (remaining.length > 0) {
63
+ const items = [];
64
+ const parts = remaining.split(',').map(p => p.trim()).filter(Boolean);
65
+ for (const part of parts) {
66
+ const m = part.match(/^([A-Za-z_]\w*):([A-Za-z_]\w*(?:\[\])?)(?:\s*=\s*(.+))?$/);
67
+ if (m) {
68
+ const item = { name: m[1], type: m[2] };
69
+ if (m[3] !== undefined)
70
+ item.default = m[3].trim();
71
+ items.push(item);
72
+ }
73
+ }
74
+ props.items = items;
75
+ }
76
+ }],
77
+ ['auth', (s, props) => { consumeBareIdent(s, props, 'mode'); }],
78
+ ['validate', (s, props) => { consumeBareIdent(s, props, 'schema'); }],
79
+ ['error', (s, props) => {
80
+ s.skipWS();
81
+ const num = s.tryNumber();
82
+ if (num) {
83
+ props.status = parseInt(num, 10);
84
+ s.skipWS();
85
+ const tok = s.peek();
86
+ if (tok && tok.kind === 'quoted') {
87
+ props.message = tok.value;
88
+ s.next();
89
+ }
90
+ }
91
+ }],
92
+ ['derive', (s, props) => { consumeBareIdent(s, props, 'name'); }],
93
+ ['guard', (s, props) => { consumeBareIdent(s, props, 'name'); }],
94
+ ['effect', (s, props) => { consumeBareIdent(s, props, 'name'); }],
95
+ ['strategy', (s, props) => { consumeBareIdent(s, props, 'name'); }],
96
+ ['trigger', (s, props) => { consumeBareIdent(s, props, 'kind'); }],
97
+ ['respond', (s, props) => {
98
+ s.skipWS();
99
+ const num = s.tryNumber();
100
+ if (num)
101
+ props.status = parseInt(num, 10);
102
+ }],
103
+ // Rule syntax — native .kern lint rules
104
+ ['rule', (s, props) => {
105
+ // rule id severity=error category=bug confidence=0.9
106
+ consumeBareIdent(s, props, 'id');
107
+ }],
108
+ ['message', (s, props) => {
109
+ // message "template with {{interpolation}}"
110
+ s.skipWS();
111
+ const tok = s.peek();
112
+ if (tok && tok.kind === 'quoted') {
113
+ props.template = tok.value;
114
+ s.next();
115
+ }
116
+ }],
117
+ ['middleware', (s, props, content) => {
118
+ s.skipWS();
119
+ if (!s.hasMore())
120
+ return;
121
+ if (s.hasEquals())
122
+ return;
123
+ const remaining = s.remainingRaw(content).trim();
124
+ if (remaining.length > 0) {
125
+ const names = remaining.split(',').map(n => n.trim()).filter(Boolean);
126
+ if (names.length > 1) {
127
+ props.names = names;
128
+ }
129
+ else if (names.length === 1) {
130
+ props.name = names[0];
131
+ }
132
+ }
133
+ }],
134
+ ]);
135
+ //# sourceMappingURL=parser-keywords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-keywords.js","sourceRoot":"","sources":["../src/parser-keywords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** @internal Style block parsing for KERN nodes. */
2
+ export declare function splitStylePairs(block: string): string[];
3
+ export declare function parseStyleBlock(block: string, styles: Record<string, string>, pseudoStyles: Record<string, Record<string, string>>): void;
@@ -0,0 +1,73 @@
1
+ /** @internal Style block parsing for KERN nodes. */
2
+ export function splitStylePairs(block) {
3
+ const pairs = [];
4
+ let current = '';
5
+ let inQuote = false;
6
+ let parenDepth = 0;
7
+ for (let i = 0; i < block.length; i++) {
8
+ const ch = block[i];
9
+ if (ch === '\\' && i + 1 < block.length) {
10
+ current += ch + block[i + 1];
11
+ i++;
12
+ }
13
+ else if (ch === '"') {
14
+ inQuote = !inQuote;
15
+ current += ch;
16
+ }
17
+ else if (!inQuote && ch === '(') {
18
+ parenDepth++;
19
+ current += ch;
20
+ }
21
+ else if (!inQuote && ch === ')') {
22
+ parenDepth--;
23
+ current += ch;
24
+ }
25
+ else if (!inQuote && parenDepth === 0 && ch === ',') {
26
+ if (current.trim())
27
+ pairs.push(current.trim());
28
+ current = '';
29
+ }
30
+ else {
31
+ current += ch;
32
+ }
33
+ }
34
+ if (current.trim())
35
+ pairs.push(current.trim());
36
+ return pairs;
37
+ }
38
+ export function parseStyleBlock(block, styles, pseudoStyles) {
39
+ const pairs = splitStylePairs(block);
40
+ for (const pair of pairs) {
41
+ // Pseudo-selector: :press:bg:#005BB5
42
+ const pseudoMatch = pair.match(/^:([a-z]+):([A-Za-z0-9_-]+):(.+)$/);
43
+ if (pseudoMatch) {
44
+ const [, pseudo, key, value] = pseudoMatch;
45
+ if (!pseudoStyles[pseudo])
46
+ pseudoStyles[pseudo] = {};
47
+ pseudoStyles[pseudo][key] = value.trim();
48
+ continue;
49
+ }
50
+ // Quoted key: "backdrop-filter":"blur(8px)"
51
+ const quotedKeyMatch = pair.match(/^"([^"]+)"\s*:\s*(.*)/);
52
+ if (quotedKeyMatch) {
53
+ const key = quotedKeyMatch[1];
54
+ let value = quotedKeyMatch[2].trim();
55
+ if (value.startsWith('"') && value.endsWith('"')) {
56
+ value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
57
+ }
58
+ styles[key] = value;
59
+ continue;
60
+ }
61
+ // Normal: key:value (value may be quoted)
62
+ const colonIdx = pair.indexOf(':');
63
+ if (colonIdx > 0) {
64
+ const key = pair.slice(0, colonIdx).trim();
65
+ let value = pair.slice(colonIdx + 1).trim();
66
+ if (value.startsWith('"') && value.endsWith('"')) {
67
+ value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
68
+ }
69
+ styles[key] = value;
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=parser-style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-style.js","sourceRoot":"","sources":["../src/parser-style.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** @internal Token stream cursor for KERN parser. */
2
+ import type { Token } from './parser-tokenizer.js';
3
+ export declare class TokenStream {
4
+ private tokens;
5
+ private idx;
6
+ constructor(tokens: Token[]);
7
+ peek(): Token | undefined;
8
+ next(): Token | undefined;
9
+ done(): boolean;
10
+ position(): number;
11
+ setPosition(pos: number): void;
12
+ skipWS(): void;
13
+ /** Try to consume an identifier. Returns its value or null. */
14
+ tryIdent(): string | null;
15
+ /** Try to consume a number token. Returns its value or null. */
16
+ tryNumber(): string | null;
17
+ /** Check if the next non-WS token is an identifier followed by '='. */
18
+ isKeyValue(): boolean;
19
+ /** Check if any remaining token contains '='. */
20
+ hasEquals(): boolean;
21
+ /** Check if there are more non-whitespace tokens. */
22
+ hasMore(): boolean;
23
+ /** Get remaining raw text from current position (for fallback / params). */
24
+ remainingRaw(line: string): string;
25
+ /** Consume any single non-whitespace token as a value (for evolved positional args). */
26
+ consumeAnyValue(): Token | undefined;
27
+ }
@@ -0,0 +1,69 @@
1
+ export class TokenStream {
2
+ tokens;
3
+ idx = 0;
4
+ constructor(tokens) { this.tokens = tokens; }
5
+ peek() { return this.tokens[this.idx]; }
6
+ next() { return this.tokens[this.idx++]; }
7
+ done() { return this.idx >= this.tokens.length; }
8
+ position() { return this.idx; }
9
+ setPosition(pos) { this.idx = pos; }
10
+ skipWS() {
11
+ while (this.idx < this.tokens.length && this.tokens[this.idx].kind === 'whitespace')
12
+ this.idx++;
13
+ }
14
+ /** Try to consume an identifier. Returns its value or null. */
15
+ tryIdent() {
16
+ if (this.idx < this.tokens.length && this.tokens[this.idx].kind === 'identifier') {
17
+ return this.tokens[this.idx++].value;
18
+ }
19
+ return null;
20
+ }
21
+ /** Try to consume a number token. Returns its value or null. */
22
+ tryNumber() {
23
+ if (this.idx < this.tokens.length && this.tokens[this.idx].kind === 'number') {
24
+ return this.tokens[this.idx++].value;
25
+ }
26
+ return null;
27
+ }
28
+ /** Check if the next non-WS token is an identifier followed by '='. */
29
+ isKeyValue() {
30
+ let j = this.idx;
31
+ while (j < this.tokens.length && this.tokens[j].kind === 'whitespace')
32
+ j++;
33
+ if (j >= this.tokens.length || this.tokens[j].kind !== 'identifier')
34
+ return false;
35
+ return j + 1 < this.tokens.length && this.tokens[j + 1].kind === 'equals';
36
+ }
37
+ /** Check if any remaining token contains '='. */
38
+ hasEquals() {
39
+ for (let j = this.idx; j < this.tokens.length; j++) {
40
+ if (this.tokens[j].kind === 'equals')
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ /** Check if there are more non-whitespace tokens. */
46
+ hasMore() {
47
+ let j = this.idx;
48
+ while (j < this.tokens.length && this.tokens[j].kind === 'whitespace')
49
+ j++;
50
+ return j < this.tokens.length;
51
+ }
52
+ /** Get remaining raw text from current position (for fallback / params). */
53
+ remainingRaw(line) {
54
+ if (this.idx >= this.tokens.length)
55
+ return '';
56
+ const startPos = this.tokens[this.idx].pos;
57
+ this.idx = this.tokens.length;
58
+ return line.slice(startPos);
59
+ }
60
+ /** Consume any single non-whitespace token as a value (for evolved positional args). */
61
+ consumeAnyValue() {
62
+ this.skipWS();
63
+ const tok = this.peek();
64
+ if (!tok || tok.kind === 'whitespace')
65
+ return undefined;
66
+ return this.next();
67
+ }
68
+ }
69
+ //# sourceMappingURL=parser-token-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-token-stream.js","sourceRoot":"","sources":["../src/parser-token-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** @internal Tokenizer for KERN source lines. */
2
+ import type { ParseState } from './parser-diagnostics.js';
3
+ export type TokenKind = 'identifier' | 'number' | 'equals' | 'quoted' | 'expr' | 'style' | 'themeRef' | 'slash' | 'comma' | 'whitespace' | 'unknown';
4
+ export interface Token {
5
+ kind: TokenKind;
6
+ value: string;
7
+ pos: number;
8
+ }
9
+ /** @internal Character-by-character tokenizer for a single KERN line (after indent stripped). */
10
+ export declare function tokenizeLineInternal(line: string, state?: ParseState): Token[];
11
+ export declare function tokenizeLine(line: string): Token[];
@@ -0,0 +1,188 @@
1
+ import { emitDiagnostic } from './parser-diagnostics.js';
2
+ // ── Tokenizer ────────────────────────────────────────────────────────────
3
+ function isIdentStart(ch) {
4
+ return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch === '_';
5
+ }
6
+ function isIdentChar(ch) {
7
+ return isIdentStart(ch) || (ch >= '0' && ch <= '9') || ch === '-';
8
+ }
9
+ function isDigit(ch) {
10
+ return ch >= '0' && ch <= '9';
11
+ }
12
+ /** @internal Character-by-character tokenizer for a single KERN line (after indent stripped). */
13
+ export function tokenizeLineInternal(line, state) {
14
+ const tokens = [];
15
+ let i = 0;
16
+ while (i < line.length) {
17
+ const ch = line[i];
18
+ // Whitespace
19
+ if (ch === ' ' || ch === '\t') {
20
+ const start = i;
21
+ while (i < line.length && (line[i] === ' ' || line[i] === '\t'))
22
+ i++;
23
+ tokens.push({ kind: 'whitespace', value: line.slice(start, i), pos: start });
24
+ continue;
25
+ }
26
+ // Expression block {{ ... }}
27
+ if (ch === '{' && i + 1 < line.length && line[i + 1] === '{') {
28
+ const start = i;
29
+ i += 2;
30
+ let depth = 1;
31
+ while (i < line.length - 1 && depth > 0) {
32
+ if (line[i] === '{' && line[i + 1] === '{') {
33
+ depth++;
34
+ i += 2;
35
+ }
36
+ else if (line[i] === '}' && line[i + 1] === '}') {
37
+ depth--;
38
+ if (depth === 0)
39
+ break;
40
+ i += 2;
41
+ }
42
+ else
43
+ i++;
44
+ }
45
+ if (depth > 0) {
46
+ if (state) {
47
+ emitDiagnostic(state, 'UNCLOSED_EXPR', 'error', `Unclosed expression block '{{' at column ${start + 1}`, 0, start + 1, { endCol: start + 3 });
48
+ }
49
+ }
50
+ const inner = line.slice(start + 2, i).trim();
51
+ if (i < line.length - 1)
52
+ i += 2;
53
+ else
54
+ i = line.length;
55
+ tokens.push({ kind: 'expr', value: inner, pos: start });
56
+ continue;
57
+ }
58
+ // Style block { ... } — find matching } respecting quotes
59
+ if (ch === '{') {
60
+ const start = i;
61
+ let inQuote = false;
62
+ let j = i + 1;
63
+ let closed = false;
64
+ while (j < line.length) {
65
+ if (line[j] === '\\' && j + 1 < line.length) {
66
+ j += 2;
67
+ continue;
68
+ }
69
+ if (line[j] === '"')
70
+ inQuote = !inQuote;
71
+ if (!inQuote && line[j] === '}') {
72
+ j++;
73
+ closed = true;
74
+ break;
75
+ }
76
+ j++;
77
+ }
78
+ if (!closed) {
79
+ if (state) {
80
+ emitDiagnostic(state, 'UNCLOSED_STYLE', 'error', `Unclosed style block '{' at column ${start + 1}`, 0, start + 1, { endCol: start + 2 });
81
+ }
82
+ }
83
+ tokens.push({ kind: 'style', value: line.slice(start + 1, closed ? j - 1 : j), pos: start });
84
+ i = j;
85
+ continue;
86
+ }
87
+ // Quoted string "..." with \" escape support
88
+ if (ch === '"') {
89
+ const start = i;
90
+ i++;
91
+ let inner = '';
92
+ while (i < line.length && line[i] !== '"') {
93
+ if (line[i] === '\\' && i + 1 < line.length) {
94
+ const next = line[i + 1];
95
+ if (next === '"') {
96
+ inner += '"';
97
+ i += 2;
98
+ }
99
+ else if (next === '\\') {
100
+ inner += '\\';
101
+ i += 2;
102
+ }
103
+ else {
104
+ inner += line[i];
105
+ i++;
106
+ }
107
+ }
108
+ else {
109
+ inner += line[i];
110
+ i++;
111
+ }
112
+ }
113
+ if (i >= line.length) {
114
+ if (state) {
115
+ emitDiagnostic(state, 'UNCLOSED_STRING', 'error', `Unclosed quoted string at column ${start + 1}`, 0, start + 1, { endCol: start + 2 });
116
+ }
117
+ }
118
+ else {
119
+ i++; // skip closing quote
120
+ }
121
+ tokens.push({ kind: 'quoted', value: inner, pos: start });
122
+ continue;
123
+ }
124
+ // Theme ref $name
125
+ if (ch === '$' && i + 1 < line.length && isIdentStart(line[i + 1])) {
126
+ const start = i;
127
+ i++;
128
+ while (i < line.length && isIdentChar(line[i]))
129
+ i++;
130
+ tokens.push({ kind: 'themeRef', value: line.slice(start + 1, i), pos: start });
131
+ continue;
132
+ }
133
+ // Equals
134
+ if (ch === '=') {
135
+ tokens.push({ kind: 'equals', value: '=', pos: i });
136
+ i++;
137
+ continue;
138
+ }
139
+ // Comma
140
+ if (ch === ',') {
141
+ tokens.push({ kind: 'comma', value: ',', pos: i });
142
+ i++;
143
+ continue;
144
+ }
145
+ // Slash-prefixed path: /something
146
+ if (ch === '/') {
147
+ const start = i;
148
+ while (i < line.length && line[i] !== ' ' && line[i] !== '\t' && line[i] !== '{' && line[i] !== '$')
149
+ i++;
150
+ tokens.push({ kind: 'slash', value: line.slice(start, i), pos: start });
151
+ continue;
152
+ }
153
+ // Number (pure digits)
154
+ if (isDigit(ch)) {
155
+ const start = i;
156
+ while (i < line.length && isDigit(line[i]))
157
+ i++;
158
+ tokens.push({ kind: 'number', value: line.slice(start, i), pos: start });
159
+ continue;
160
+ }
161
+ // Identifier: [A-Za-z_][A-Za-z0-9_-]*
162
+ // Handles evolved: prefix (evolved:keyword → strips prefix, returns keyword)
163
+ if (isIdentStart(ch)) {
164
+ const start = i;
165
+ while (i < line.length && isIdentChar(line[i]))
166
+ i++;
167
+ if (line[i] === ':' && line.slice(start, i) === 'evolved' && i + 1 < line.length && isIdentStart(line[i + 1])) {
168
+ i++;
169
+ const nameStart = i;
170
+ while (i < line.length && isIdentChar(line[i]))
171
+ i++;
172
+ tokens.push({ kind: 'identifier', value: line.slice(nameStart, i), pos: start });
173
+ }
174
+ else {
175
+ tokens.push({ kind: 'identifier', value: line.slice(start, i), pos: start });
176
+ }
177
+ continue;
178
+ }
179
+ // Unknown character
180
+ tokens.push({ kind: 'unknown', value: ch, pos: i });
181
+ i++;
182
+ }
183
+ return tokens;
184
+ }
185
+ export function tokenizeLine(line) {
186
+ return tokenizeLineInternal(line);
187
+ }
188
+ //# sourceMappingURL=parser-tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-tokenizer.js","sourceRoot":"","sources":["../src/parser-tokenizer.ts"],"names":[],"mappings":"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"}