@velarscript/web 0.10.1
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 +201 -0
- package/README.md +89 -0
- package/dist/analyzer.d.ts +302 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +2931 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/ast.d.ts +220 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +102 -0
- package/dist/ast.js.map +1 -0
- package/dist/browser-test.d.ts +29 -0
- package/dist/browser-test.d.ts.map +1 -0
- package/dist/browser-test.js +33 -0
- package/dist/browser-test.js.map +1 -0
- package/dist/compiler.d.ts +9 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +715 -0
- package/dist/compiler.js.map +1 -0
- package/dist/css-tokens.d.ts +46 -0
- package/dist/css-tokens.d.ts.map +1 -0
- package/dist/css-tokens.js +363 -0
- package/dist/css-tokens.js.map +1 -0
- package/dist/editor.d.ts +3 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +147 -0
- package/dist/editor.js.map +1 -0
- package/dist/elements.d.ts +11 -0
- package/dist/elements.d.ts.map +1 -0
- package/dist/elements.js +24 -0
- package/dist/elements.js.map +1 -0
- package/dist/emitter.d.ts +79 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +2699 -0
- package/dist/emitter.js.map +1 -0
- package/dist/host.d.ts +7 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +224 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/inspection.d.ts +3 -0
- package/dist/inspection.d.ts.map +1 -0
- package/dist/inspection.js +82 -0
- package/dist/inspection.js.map +1 -0
- package/dist/keyframes.d.ts +16 -0
- package/dist/keyframes.d.ts.map +1 -0
- package/dist/keyframes.js +29 -0
- package/dist/keyframes.js.map +1 -0
- package/dist/lexer.d.ts +85 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +422 -0
- package/dist/lexer.js.map +1 -0
- package/dist/look-static.d.ts +31 -0
- package/dist/look-static.d.ts.map +1 -0
- package/dist/look-static.js +266 -0
- package/dist/look-static.js.map +1 -0
- package/dist/look.d.ts +134 -0
- package/dist/look.d.ts.map +1 -0
- package/dist/look.js +627 -0
- package/dist/look.js.map +1 -0
- package/dist/parser.d.ts +71 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +976 -0
- package/dist/parser.js.map +1 -0
- package/dist/project-config.d.ts +33 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +199 -0
- package/dist/project-config.js.map +1 -0
- package/dist/runtime-foundation.d.ts +7 -0
- package/dist/runtime-foundation.d.ts.map +1 -0
- package/dist/runtime-foundation.js +1245 -0
- package/dist/runtime-foundation.js.map +1 -0
- package/dist/runtime.d.ts +7 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +3444 -0
- package/dist/runtime.js.map +1 -0
- package/dist/semantic.d.ts +3 -0
- package/dist/semantic.d.ts.map +1 -0
- package/dist/semantic.js +150 -0
- package/dist/semantic.js.map +1 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +178 -0
- package/dist/types.js.map +1 -0
- package/dist/websocket-runtime.d.ts +2 -0
- package/dist/websocket-runtime.d.ts.map +1 -0
- package/dist/websocket-runtime.js +30 -0
- package/dist/websocket-runtime.js.map +1 -0
- package/dist/worker-runtime.d.ts +2 -0
- package/dist/worker-runtime.d.ts.map +1 -0
- package/dist/worker-runtime.js +72 -0
- package/dist/worker-runtime.js.map +1 -0
- package/package.json +52 -0
package/dist/lexer.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Span } from "@velarscript/compiler";
|
|
2
|
+
import type { CompilerFormattingOpaqueSourceScan, CompilerLexicalScanContext, CompilerLexicalScanResult, OpaqueEmbeddedSourceScan } from "@velarscript/compiler/extension";
|
|
3
|
+
/**
|
|
4
|
+
* The words the Web extension owns at a statement or expression head. D30
|
|
5
|
+
* item 16 made every one of them contextual: the lexer leaves them ordinary
|
|
6
|
+
* identifiers and the Web parser claims one only where its declaration shape
|
|
7
|
+
* appears, so `const state = ...` and `component state(...)` can share a
|
|
8
|
+
* module. The lifecycle hooks are not here — D43 item 67 gave them the
|
|
9
|
+
* '@mounted:' and '@cleanup:' spellings, which cannot collide at all.
|
|
10
|
+
*/
|
|
11
|
+
export declare const WEB_CONTEXTUAL_KEYWORDS: ReadonlySet<string>;
|
|
12
|
+
export declare const WEB_JSX_TOKEN = "@velarscript/web:jsx";
|
|
13
|
+
export declare const WEB_LOOK_TOKEN = "@velarscript/web:look";
|
|
14
|
+
export declare const WEB_KEYFRAMES_TOKEN = "@velarscript/web:keyframes";
|
|
15
|
+
export declare const WEB_UNSAFE_CSS_TOKEN = "@velarscript/web:unsafe-css";
|
|
16
|
+
/** Raw CSS carried only by the Web lexical extension; Core never names CSS. */
|
|
17
|
+
export interface WebUnsafeCssBlockSyntax {
|
|
18
|
+
readonly kind: "WebUnsafeCssBlockSyntax";
|
|
19
|
+
readonly css: string;
|
|
20
|
+
readonly contentSpan: Span;
|
|
21
|
+
readonly span: Span;
|
|
22
|
+
}
|
|
23
|
+
export interface WebExpressionSource {
|
|
24
|
+
readonly source: string;
|
|
25
|
+
readonly span: Span;
|
|
26
|
+
readonly openingIndent: string;
|
|
27
|
+
}
|
|
28
|
+
export interface WebJsxAttributeSyntax {
|
|
29
|
+
readonly name: string;
|
|
30
|
+
readonly value: string | WebExpressionSource | null;
|
|
31
|
+
readonly span: Span;
|
|
32
|
+
}
|
|
33
|
+
export type WebJsxChildSyntax = WebJsxElementSyntax | WebJsxTextSyntax | WebJsxExpressionSyntax;
|
|
34
|
+
export interface WebJsxElementSyntax {
|
|
35
|
+
readonly kind: "WebJsxElementSyntax";
|
|
36
|
+
readonly tag: string;
|
|
37
|
+
readonly tagSpan: Span;
|
|
38
|
+
readonly attributes: readonly WebJsxAttributeSyntax[];
|
|
39
|
+
readonly children: readonly WebJsxChildSyntax[];
|
|
40
|
+
readonly span: Span;
|
|
41
|
+
}
|
|
42
|
+
export interface WebJsxTextSyntax {
|
|
43
|
+
readonly kind: "WebJsxTextSyntax";
|
|
44
|
+
readonly value: string;
|
|
45
|
+
readonly span: Span;
|
|
46
|
+
}
|
|
47
|
+
export interface WebJsxExpressionSyntax {
|
|
48
|
+
readonly kind: "WebJsxExpressionSyntax";
|
|
49
|
+
readonly expression: WebExpressionSource;
|
|
50
|
+
readonly span: Span;
|
|
51
|
+
}
|
|
52
|
+
export interface WebLookLineSyntax {
|
|
53
|
+
readonly indent: number;
|
|
54
|
+
readonly text: string;
|
|
55
|
+
readonly start: number;
|
|
56
|
+
readonly end: number;
|
|
57
|
+
readonly openingIndent: string;
|
|
58
|
+
}
|
|
59
|
+
export interface WebLookBlockSyntax {
|
|
60
|
+
readonly kind: "WebLookBlockSyntax";
|
|
61
|
+
readonly lines: readonly WebLookLineSyntax[];
|
|
62
|
+
readonly span: Span;
|
|
63
|
+
}
|
|
64
|
+
export interface WebKeyframesBlockSyntax {
|
|
65
|
+
readonly kind: "WebKeyframesBlockSyntax";
|
|
66
|
+
readonly lines: readonly WebLookLineSyntax[];
|
|
67
|
+
readonly span: Span;
|
|
68
|
+
}
|
|
69
|
+
export declare function scanWebToken(context: CompilerLexicalScanContext): CompilerLexicalScanResult | null;
|
|
70
|
+
/**
|
|
71
|
+
* Recognizes the Web-owned raw block without teaching Core's formatter or
|
|
72
|
+
* lexer the `css` word. Both Web consumers share this wrapper so its header
|
|
73
|
+
* and closing-tail rules cannot drift.
|
|
74
|
+
*/
|
|
75
|
+
export declare function scanWebUnsafeCssLiteral(source: string, start: number): (OpaqueEmbeddedSourceScan & CompilerFormattingOpaqueSourceScan) | null;
|
|
76
|
+
/**
|
|
77
|
+
* The token kinds a JSX element may follow. `<` is otherwise the less-than
|
|
78
|
+
* operator, so the decision is made from the previous token: every kind here is
|
|
79
|
+
* a position where a value begins and a comparison cannot. The list is published
|
|
80
|
+
* in charter §14 (GRM-A3); `nullish` and `and` joined it so `{name ?? <Fallback
|
|
81
|
+
* />}` parses and `{ready and <Panel />}` reaches its type rejection instead of
|
|
82
|
+
* an untargeted parse cascade.
|
|
83
|
+
*/
|
|
84
|
+
export declare const WEB_JSX_PREVIOUS_TOKEN_KINDS: readonly string[];
|
|
85
|
+
//# sourceMappingURL=lexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
|
package/dist/lexer.js
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { findInterpolatedExpressionEnd, scanOpaqueEmbeddedSource } from "@velarscript/compiler/extension";
|
|
2
|
+
import { WEB_VOID_ELEMENTS } from "./elements.js";
|
|
3
|
+
/**
|
|
4
|
+
* The words the Web extension owns at a statement or expression head. D30
|
|
5
|
+
* item 16 made every one of them contextual: the lexer leaves them ordinary
|
|
6
|
+
* identifiers and the Web parser claims one only where its declaration shape
|
|
7
|
+
* appears, so `const state = ...` and `component state(...)` can share a
|
|
8
|
+
* module. The lifecycle hooks are not here — D43 item 67 gave them the
|
|
9
|
+
* '@mounted:' and '@cleanup:' spellings, which cannot collide at all.
|
|
10
|
+
*/
|
|
11
|
+
export const WEB_CONTEXTUAL_KEYWORDS = new Set([
|
|
12
|
+
"component", "state", "computed", "resource", "action", "watch", "exposes", "expose", "look", "keyframes", "css",
|
|
13
|
+
]);
|
|
14
|
+
export const WEB_JSX_TOKEN = "@velarscript/web:jsx";
|
|
15
|
+
export const WEB_LOOK_TOKEN = "@velarscript/web:look";
|
|
16
|
+
export const WEB_KEYFRAMES_TOKEN = "@velarscript/web:keyframes";
|
|
17
|
+
export const WEB_UNSAFE_CSS_TOKEN = "@velarscript/web:unsafe-css";
|
|
18
|
+
export function scanWebToken(context) {
|
|
19
|
+
const unsafeCss = scanUnsafeCssBlock(context);
|
|
20
|
+
if (unsafeCss)
|
|
21
|
+
return unsafeCss;
|
|
22
|
+
const visualBlock = visualBlockKeyword(context.tokens);
|
|
23
|
+
if (visualBlock)
|
|
24
|
+
return scanVisualBlock(context, visualBlock);
|
|
25
|
+
if (context.source[context.offset] !== "<" || !shouldStartJsx(context))
|
|
26
|
+
return null;
|
|
27
|
+
const scanner = new WebJsxScanner(context.source, context.offset);
|
|
28
|
+
const syntax = scanner.scan();
|
|
29
|
+
return {
|
|
30
|
+
token: extensionToken(WEB_JSX_TOKEN, syntax.span, syntax),
|
|
31
|
+
nextOffset: syntax.span.end,
|
|
32
|
+
diagnostics: scanner.diagnostics,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function scanUnsafeCssBlock(context) {
|
|
36
|
+
if (context.source[context.offset] !== "`")
|
|
37
|
+
return null;
|
|
38
|
+
const css = context.tokens.at(-1);
|
|
39
|
+
const unsafe = context.tokens.at(-2);
|
|
40
|
+
if (css?.kind !== "identifier" || css.value !== "css" || unsafe?.kind !== "unsafe")
|
|
41
|
+
return null;
|
|
42
|
+
if (!/^[ \t]+$/u.test(context.source.slice(unsafe.span.end, css.span.start)))
|
|
43
|
+
return null;
|
|
44
|
+
if (!/^[ \t]*$/u.test(context.source.slice(css.span.end, context.offset)))
|
|
45
|
+
return null;
|
|
46
|
+
const lineStart = previousPhysicalLineStart(context.source, unsafe.span.start);
|
|
47
|
+
const declarationIndentation = context.source.slice(lineStart, unsafe.span.start);
|
|
48
|
+
if (!/^[ \t]*$/u.test(declarationIndentation))
|
|
49
|
+
return null;
|
|
50
|
+
const scanned = scanWebUnsafeCssLiteral(context.source, context.offset);
|
|
51
|
+
if (!scanned)
|
|
52
|
+
return null;
|
|
53
|
+
const tokenSpan = { start: context.offset, end: scanned.end };
|
|
54
|
+
const diagnostics = [];
|
|
55
|
+
if (!scanned.openingLineBreak) {
|
|
56
|
+
diagnostics.push(diagnostic("VEL5037", "Inline unsafe CSS is a multiline raw block; put the source on the line after the opening backtick", tokenSpan));
|
|
57
|
+
}
|
|
58
|
+
if (!scanned.closed) {
|
|
59
|
+
diagnostics.push(diagnostic("VEL5037", "Unterminated inline unsafe CSS block; close it with an aligned backtick followed by 'before look' or 'after look'", tokenSpan));
|
|
60
|
+
}
|
|
61
|
+
const payload = {
|
|
62
|
+
kind: "WebUnsafeCssBlockSyntax",
|
|
63
|
+
css: context.source.slice(scanned.sourceStart, scanned.sourceEnd),
|
|
64
|
+
contentSpan: { start: scanned.sourceStart, end: scanned.sourceEnd },
|
|
65
|
+
span: tokenSpan,
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
token: extensionToken(WEB_UNSAFE_CSS_TOKEN, tokenSpan, payload),
|
|
69
|
+
nextOffset: scanned.end,
|
|
70
|
+
diagnostics,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Recognizes the Web-owned raw block without teaching Core's formatter or
|
|
75
|
+
* lexer the `css` word. Both Web consumers share this wrapper so its header
|
|
76
|
+
* and closing-tail rules cannot drift.
|
|
77
|
+
*/
|
|
78
|
+
export function scanWebUnsafeCssLiteral(source, start) {
|
|
79
|
+
if (source[start] !== "`")
|
|
80
|
+
return null;
|
|
81
|
+
const lineStart = previousPhysicalLineStart(source, start);
|
|
82
|
+
const header = /^([ \t]*)unsafe[ \t]+css[ \t]*$/u.exec(source.slice(lineStart, start));
|
|
83
|
+
if (!header)
|
|
84
|
+
return null;
|
|
85
|
+
// The neutral scanner owns only the raw, aligned backtick boundary. Web
|
|
86
|
+
// alone recognizes the closing-line vocabulary.
|
|
87
|
+
const scanned = scanOpaqueEmbeddedSource(source, start, header[1] ?? "", (tail) => /^[ \t]+(?:before|after)[ \t]+look[ \t]*$/u.test(tail));
|
|
88
|
+
return { ...scanned, attachedToPrevious: true };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The token kinds a JSX element may follow. `<` is otherwise the less-than
|
|
92
|
+
* operator, so the decision is made from the previous token: every kind here is
|
|
93
|
+
* a position where a value begins and a comparison cannot. The list is published
|
|
94
|
+
* in charter §14 (GRM-A3); `nullish` and `and` joined it so `{name ?? <Fallback
|
|
95
|
+
* />}` parses and `{ready and <Panel />}` reaches its type rejection instead of
|
|
96
|
+
* an untargeted parse cascade.
|
|
97
|
+
*/
|
|
98
|
+
export const WEB_JSX_PREVIOUS_TOKEN_KINDS = [
|
|
99
|
+
"assign", "return", "fatArrow", "leftParen", "leftBracket", "leftBrace",
|
|
100
|
+
"comma", "colon", "question", "newline", "indent", "nullish", "and", "or",
|
|
101
|
+
];
|
|
102
|
+
function shouldStartJsx(context) {
|
|
103
|
+
if (!/[A-Za-z>]/u.test(context.source[context.offset + 1] ?? ""))
|
|
104
|
+
return false;
|
|
105
|
+
const previous = context.tokens.at(-1)?.kind;
|
|
106
|
+
return previous === undefined || WEB_JSX_PREVIOUS_TOKEN_KINDS.includes(previous);
|
|
107
|
+
}
|
|
108
|
+
// A Look block opens at the first indented line after `look:`. Blank lines and
|
|
109
|
+
// comment lines between the two produce their own newline tokens (a comment
|
|
110
|
+
// leaves no token of its own), so every newline in between is skipped; without
|
|
111
|
+
// that, a comment as the first line inside a Look block left the block
|
|
112
|
+
// untokenized and unravelled into a five-diagnostic cascade.
|
|
113
|
+
function visualBlockKeyword(tokens) {
|
|
114
|
+
if (tokens.at(-1)?.kind !== "indent")
|
|
115
|
+
return null;
|
|
116
|
+
let index = tokens.length - 2;
|
|
117
|
+
if (tokens[index]?.kind !== "newline")
|
|
118
|
+
return null;
|
|
119
|
+
while (tokens[index]?.kind === "newline")
|
|
120
|
+
index -= 1;
|
|
121
|
+
if (tokens[index]?.kind !== "colon")
|
|
122
|
+
return null;
|
|
123
|
+
index -= 1;
|
|
124
|
+
const word = tokens[index];
|
|
125
|
+
if (word?.kind !== "identifier")
|
|
126
|
+
return null;
|
|
127
|
+
// `look:` and `keyframes:` are contextual: the block opens only when the word
|
|
128
|
+
// is immediately followed by ':' and an indented body, which is a shape no
|
|
129
|
+
// ordinary read of the same name can take.
|
|
130
|
+
return word.value === "look" || word.value === "keyframes" ? word.value : null;
|
|
131
|
+
}
|
|
132
|
+
function scanVisualBlock(context, keyword) {
|
|
133
|
+
const lines = [];
|
|
134
|
+
const diagnostics = [];
|
|
135
|
+
let cursor = context.offset;
|
|
136
|
+
let first = true;
|
|
137
|
+
while (cursor < context.source.length) {
|
|
138
|
+
const physicalStart = cursor;
|
|
139
|
+
const physicalLineStart = previousPhysicalLineStart(context.source, physicalStart);
|
|
140
|
+
const lineBreak = nextPhysicalLineBreak(context.source, physicalStart);
|
|
141
|
+
const physicalEnd = lineBreak?.start ?? context.source.length;
|
|
142
|
+
let content = physicalStart;
|
|
143
|
+
let width = first ? context.currentIndent : 0;
|
|
144
|
+
if (!first) {
|
|
145
|
+
while (content < physicalEnd && (context.source[content] === " " || context.source[content] === "\t")) {
|
|
146
|
+
if (context.source[content] === "\t") {
|
|
147
|
+
diagnostics.push(diagnostic("VEL1002", "Tabs are not allowed for indentation", { start: content, end: content + 1 }));
|
|
148
|
+
width += 4;
|
|
149
|
+
}
|
|
150
|
+
else
|
|
151
|
+
width += 1;
|
|
152
|
+
content += 1;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const raw = context.source.slice(content, physicalEnd);
|
|
156
|
+
const blank = raw.trim().length === 0;
|
|
157
|
+
if (!first && !blank && width < context.currentIndent)
|
|
158
|
+
break;
|
|
159
|
+
if (!blank) {
|
|
160
|
+
const leading = /^\s*/u.exec(raw)?.[0] ?? "";
|
|
161
|
+
const text = raw.slice(leading.length).trimEnd();
|
|
162
|
+
if (text && !text.startsWith("//")) {
|
|
163
|
+
const start = content + leading.length;
|
|
164
|
+
const openingIndent = leadingWhitespace(context.source.slice(physicalLineStart, start));
|
|
165
|
+
const layout = /^([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z][A-Za-z0-9]*)*)\s*=\s*(?:rf|fr|f|r)?(["'])$/u.exec(text);
|
|
166
|
+
const close = layout && lineBreak
|
|
167
|
+
? findLookLayoutClose(context.source, lineBreak.end, openingIndent, layout[2])
|
|
168
|
+
: null;
|
|
169
|
+
if (close) {
|
|
170
|
+
lines.push({
|
|
171
|
+
indent: Math.max(0, width - context.currentIndent),
|
|
172
|
+
text: context.source.slice(start, close.lineEnd),
|
|
173
|
+
start,
|
|
174
|
+
end: close.lineEnd,
|
|
175
|
+
openingIndent,
|
|
176
|
+
});
|
|
177
|
+
cursor = close.nextStart;
|
|
178
|
+
first = false;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
lines.push({
|
|
182
|
+
indent: Math.max(0, width - context.currentIndent),
|
|
183
|
+
text,
|
|
184
|
+
start,
|
|
185
|
+
end: content + raw.length,
|
|
186
|
+
openingIndent,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (!lineBreak) {
|
|
191
|
+
cursor = context.source.length;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
cursor = lineBreak.end;
|
|
195
|
+
first = false;
|
|
196
|
+
}
|
|
197
|
+
const tokenSpan = { start: context.offset, end: cursor };
|
|
198
|
+
return {
|
|
199
|
+
token: keyword === "look"
|
|
200
|
+
? extensionToken(WEB_LOOK_TOKEN, tokenSpan, { kind: "WebLookBlockSyntax", lines, span: tokenSpan })
|
|
201
|
+
: extensionToken(WEB_KEYFRAMES_TOKEN, tokenSpan, { kind: "WebKeyframesBlockSyntax", lines, span: tokenSpan }),
|
|
202
|
+
nextOffset: cursor,
|
|
203
|
+
diagnostics,
|
|
204
|
+
startsLine: cursor < context.source.length,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function findLookLayoutClose(source, start, openingIndent, quote) {
|
|
208
|
+
const openingWidth = indentationWidth(openingIndent);
|
|
209
|
+
let cursor = start;
|
|
210
|
+
while (cursor < source.length) {
|
|
211
|
+
const lineBreak = nextPhysicalLineBreak(source, cursor);
|
|
212
|
+
const lineEnd = lineBreak?.start ?? source.length;
|
|
213
|
+
const line = source.slice(cursor, lineEnd);
|
|
214
|
+
const indent = leadingWhitespace(line);
|
|
215
|
+
const body = line.slice(indent.length);
|
|
216
|
+
if (body.length > 0 && indentationWidth(indent) <= openingWidth) {
|
|
217
|
+
if (indent === openingIndent && body.startsWith(quote)) {
|
|
218
|
+
return { lineEnd, nextStart: lineBreak?.end ?? source.length };
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
if (!lineBreak)
|
|
223
|
+
return null;
|
|
224
|
+
cursor = lineBreak.end;
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
function previousPhysicalLineStart(source, index) {
|
|
229
|
+
while (index > 0 && source[index - 1] !== "\n" && source[index - 1] !== "\r")
|
|
230
|
+
index -= 1;
|
|
231
|
+
return index;
|
|
232
|
+
}
|
|
233
|
+
function leadingWhitespace(value) {
|
|
234
|
+
return /^[ \t]*/u.exec(value)?.[0] ?? "";
|
|
235
|
+
}
|
|
236
|
+
function indentationWidth(value) {
|
|
237
|
+
let width = 0;
|
|
238
|
+
for (const character of value)
|
|
239
|
+
width += character === "\t" ? 4 : 1;
|
|
240
|
+
return width;
|
|
241
|
+
}
|
|
242
|
+
function nextPhysicalLineBreak(source, start) {
|
|
243
|
+
for (let index = start; index < source.length; index += 1) {
|
|
244
|
+
if (source[index] === "\r")
|
|
245
|
+
return { start: index, end: index + (source[index + 1] === "\n" ? 2 : 1) };
|
|
246
|
+
if (source[index] === "\n")
|
|
247
|
+
return { start: index, end: index + 1 };
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
class WebJsxScanner {
|
|
252
|
+
diagnostics = [];
|
|
253
|
+
source;
|
|
254
|
+
index;
|
|
255
|
+
constructor(source, start) {
|
|
256
|
+
this.source = source;
|
|
257
|
+
this.index = start;
|
|
258
|
+
}
|
|
259
|
+
scan() {
|
|
260
|
+
this.skipWhitespace();
|
|
261
|
+
return this.scanElement();
|
|
262
|
+
}
|
|
263
|
+
scanElement() {
|
|
264
|
+
const start = this.index;
|
|
265
|
+
this.expect("<", "Expected '<' to start JSX");
|
|
266
|
+
const tagStart = this.index;
|
|
267
|
+
const tag = this.readName();
|
|
268
|
+
const tagSpan = { start: tagStart, end: this.index };
|
|
269
|
+
const fragment = !tag && this.peek() === ">";
|
|
270
|
+
if (!tag && !fragment)
|
|
271
|
+
this.report("VEL5001", "Expected a JSX tag name or fragment", start, this.index);
|
|
272
|
+
const attributes = [];
|
|
273
|
+
let selfClosing = false;
|
|
274
|
+
while (this.index < this.source.length) {
|
|
275
|
+
this.skipWhitespace();
|
|
276
|
+
if (this.index >= this.source.length) {
|
|
277
|
+
this.report("VEL5004", `JSX ${fragment ? "fragment" : `element '<${tag}>'`} is not closed`, start, this.index);
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
if (this.source.startsWith("/>", this.index)) {
|
|
281
|
+
this.index += 2;
|
|
282
|
+
selfClosing = true;
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
if (this.peek() === ">") {
|
|
286
|
+
this.index += 1;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
const attributeStart = this.index;
|
|
290
|
+
const name = this.readAttributeName();
|
|
291
|
+
if (!name) {
|
|
292
|
+
this.report("VEL5002", "Expected a JSX attribute", this.index, this.index + 1);
|
|
293
|
+
this.index += 1;
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
this.skipWhitespace();
|
|
297
|
+
let value = null;
|
|
298
|
+
if (this.peek() === "=") {
|
|
299
|
+
this.index += 1;
|
|
300
|
+
this.skipWhitespace();
|
|
301
|
+
// D51 (audit 12): a backtick is a VelarScript string delimiter, and
|
|
302
|
+
// charter section 3 promises the two delimiters hold in the same
|
|
303
|
+
// positions. A JSX attribute is exactly the position the backtick
|
|
304
|
+
// exists for — a quoted attribute selector, an HTML fragment — and it
|
|
305
|
+
// was the one position that refused it while accepting the HTML habit
|
|
306
|
+
// of a single quote.
|
|
307
|
+
if (this.peek() === '"' || this.peek() === "'" || this.peek() === "`")
|
|
308
|
+
value = this.readQuoted();
|
|
309
|
+
else if (this.peek() === "{")
|
|
310
|
+
value = this.readEmbedded();
|
|
311
|
+
else
|
|
312
|
+
this.report("VEL5003", "JSX attribute values use quotes, backticks, or '{...}'", this.index, this.index + 1);
|
|
313
|
+
}
|
|
314
|
+
attributes.push({ name, value, span: { start: attributeStart, end: this.index } });
|
|
315
|
+
}
|
|
316
|
+
const children = [];
|
|
317
|
+
if (!selfClosing && !(tag === tag.toLowerCase() && WEB_VOID_ELEMENTS.has(tag))) {
|
|
318
|
+
while (this.index < this.source.length && !this.source.startsWith("</", this.index)) {
|
|
319
|
+
// WEB-U13: an HTML comment inside markup is the first thing a Web author
|
|
320
|
+
// reaches for. It has no JSX spelling, so it is skipped with one message
|
|
321
|
+
// rather than unravelling into a five-diagnostic tag cascade.
|
|
322
|
+
if (this.source.startsWith("<!--", this.index)) {
|
|
323
|
+
const commentStart = this.index;
|
|
324
|
+
const close = this.source.indexOf("-->", this.index + 4);
|
|
325
|
+
this.index = close < 0 ? this.source.length : close + 3;
|
|
326
|
+
this.report("VEL5002", "JSX has no comment form; write a '//' comment on its own line outside the markup", commentStart, this.index);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
if (this.peek() === "<")
|
|
330
|
+
children.push(this.scanElement());
|
|
331
|
+
else if (this.peek() === "{") {
|
|
332
|
+
const childStart = this.index;
|
|
333
|
+
const expression = this.readEmbedded();
|
|
334
|
+
children.push({ kind: "WebJsxExpressionSyntax", expression, span: { start: childStart, end: this.index } });
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
const textStart = this.index;
|
|
338
|
+
while (this.index < this.source.length && this.peek() !== "<" && this.peek() !== "{")
|
|
339
|
+
this.index += 1;
|
|
340
|
+
children.push({ kind: "WebJsxTextSyntax", value: this.source.slice(textStart, this.index), span: { start: textStart, end: this.index } });
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (!this.source.startsWith("</", this.index)) {
|
|
344
|
+
this.report("VEL5004", `JSX ${fragment ? "fragment" : `element '<${tag}>'`} is not closed`, start, this.index);
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
this.index += 2;
|
|
348
|
+
const closingStart = this.index;
|
|
349
|
+
const closing = this.readName();
|
|
350
|
+
if (closing !== tag) {
|
|
351
|
+
this.report("VEL5005", fragment ? "Expected '</>' to close the JSX fragment" : `Expected '</${tag}>' but received '</${closing}>'`, closingStart, this.index);
|
|
352
|
+
}
|
|
353
|
+
this.skipWhitespace();
|
|
354
|
+
this.expect(">", "Expected '>' after JSX closing tag");
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return { kind: "WebJsxElementSyntax", tag, tagSpan, attributes, children, span: { start, end: this.index } };
|
|
358
|
+
}
|
|
359
|
+
readEmbedded() {
|
|
360
|
+
this.expect("{", "Expected '{'");
|
|
361
|
+
const start = this.index;
|
|
362
|
+
const openingIndent = leadingWhitespace(this.source.slice(previousPhysicalLineStart(this.source, start), start));
|
|
363
|
+
const close = findInterpolatedExpressionEnd(this.source, start);
|
|
364
|
+
if (close >= 0) {
|
|
365
|
+
this.index = close + 1;
|
|
366
|
+
return { source: this.source.slice(start, close), span: { start, end: close }, openingIndent };
|
|
367
|
+
}
|
|
368
|
+
this.index = this.source.length;
|
|
369
|
+
this.report("VEL5006", "Unclosed JSX expression", start - 1, this.index);
|
|
370
|
+
return { source: this.source.slice(start), span: { start, end: this.index }, openingIndent };
|
|
371
|
+
}
|
|
372
|
+
readQuoted() {
|
|
373
|
+
const quote = this.source[this.index++];
|
|
374
|
+
let value = "";
|
|
375
|
+
while (this.index < this.source.length) {
|
|
376
|
+
const character = this.source[this.index++];
|
|
377
|
+
if (character === quote)
|
|
378
|
+
return value;
|
|
379
|
+
if (character === "\\" && this.index < this.source.length)
|
|
380
|
+
value += character + this.source[this.index++];
|
|
381
|
+
else
|
|
382
|
+
value += character;
|
|
383
|
+
}
|
|
384
|
+
this.report("VEL5007", "Unclosed JSX attribute string", this.index, this.index);
|
|
385
|
+
return value;
|
|
386
|
+
}
|
|
387
|
+
readName() {
|
|
388
|
+
const start = this.index;
|
|
389
|
+
while (/[A-Za-z0-9_.:-]/u.test(this.peek()))
|
|
390
|
+
this.index += 1;
|
|
391
|
+
return this.source.slice(start, this.index);
|
|
392
|
+
}
|
|
393
|
+
readAttributeName() {
|
|
394
|
+
return this.readName();
|
|
395
|
+
}
|
|
396
|
+
skipWhitespace() {
|
|
397
|
+
while (/\s/u.test(this.peek()))
|
|
398
|
+
this.index += 1;
|
|
399
|
+
}
|
|
400
|
+
expect(character, message) {
|
|
401
|
+
if (this.peek() === character)
|
|
402
|
+
this.index += 1;
|
|
403
|
+
else
|
|
404
|
+
this.report("VEL5001", message, this.index, this.index + 1);
|
|
405
|
+
}
|
|
406
|
+
peek() {
|
|
407
|
+
return this.source[this.index] ?? "\0";
|
|
408
|
+
}
|
|
409
|
+
report(code, message, start, end) {
|
|
410
|
+
this.diagnostics.push(diagnostic(code, message, {
|
|
411
|
+
start: Math.min(start, this.source.length),
|
|
412
|
+
end: Math.min(Math.max(start, end), this.source.length),
|
|
413
|
+
}));
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
function extensionToken(value, tokenSpan, payload) {
|
|
417
|
+
return { kind: "extensionToken", value, span: tokenSpan, payload };
|
|
418
|
+
}
|
|
419
|
+
function diagnostic(code, message, sourceSpan) {
|
|
420
|
+
return { code, message, span: sourceSpan };
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Expression, Program } from "@velarscript/compiler/extension";
|
|
2
|
+
export type LookStaticValue = {
|
|
3
|
+
readonly kind: "number";
|
|
4
|
+
readonly value: number;
|
|
5
|
+
} | {
|
|
6
|
+
readonly kind: "unit";
|
|
7
|
+
readonly value: number;
|
|
8
|
+
readonly unit: string;
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: "css";
|
|
11
|
+
readonly value: string;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: "object";
|
|
14
|
+
readonly properties: Readonly<Record<string, LookStaticValue>>;
|
|
15
|
+
};
|
|
16
|
+
export declare function isLookStaticValue(value: unknown): value is LookStaticValue;
|
|
17
|
+
/**
|
|
18
|
+
* The static CSS a Look value lowers to at compile time: literals, unit values,
|
|
19
|
+
* arithmetic over them, `velar/look` builder calls, and const bindings — local
|
|
20
|
+
* or imported — that hold any of those. `keyframes:` needs the text itself
|
|
21
|
+
* because a stop becomes a real `@keyframes` rule, while a Look property keeps
|
|
22
|
+
* its runtime value; this is the one checker both spellings read, so a design
|
|
23
|
+
* token written once works in both (D60 rule 151).
|
|
24
|
+
*/
|
|
25
|
+
export declare function lookStaticCssValue(expression: Expression, values?: ReadonlyMap<string, LookStaticValue>): string | null;
|
|
26
|
+
export declare function evaluateLookStaticExpression(expression: Expression, values: ReadonlyMap<string, LookStaticValue>): LookStaticValue | null;
|
|
27
|
+
export declare function collectLookStaticValues(program: Program, imported?: ReadonlyMap<string, LookStaticValue>): ReadonlyMap<string, LookStaticValue>;
|
|
28
|
+
export declare function exportedLookStaticValues(program: Program): ReadonlyMap<string, LookStaticValue>;
|
|
29
|
+
export declare function lookStaticCss(value: LookStaticValue): string | null;
|
|
30
|
+
export declare function lookStaticIdentity(value: unknown): string;
|
|
31
|
+
//# sourceMappingURL=look-static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"look-static.d.ts","sourceRoot":"","sources":["../src/look-static.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAI3E,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAA;CAAE,CAAC;AA2ChG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAW1E;AA4BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,MAAM,GAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAa,GACvD,MAAM,GAAG,IAAI,CA0Df;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,GAC3C,eAAe,GAAG,IAAI,CAwCxB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,QAAQ,GAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAa,GACzD,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAQtC;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAU/F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMzD"}
|