@weave-framework/compiler 0.2.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/dist/ast.d.ts +243 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +3 -0
- package/dist/ast.js.map +1 -0
- package/dist/codegen.d.ts +25 -0
- package/dist/codegen.d.ts.map +1 -0
- package/dist/codegen.js +543 -0
- package/dist/codegen.js.map +1 -0
- package/dist/component.d.ts +60 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +116 -0
- package/dist/component.js.map +1 -0
- package/dist/css.d.ts +26 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +344 -0
- package/dist/css.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/infer.d.ts +13 -0
- package/dist/infer.d.ts.map +1 -0
- package/dist/infer.js +113 -0
- package/dist/infer.js.map +1 -0
- package/dist/parser.d.ts +15 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +721 -0
- package/dist/parser.js.map +1 -0
- package/dist/scope.d.ts +71 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +233 -0
- package/dist/scope.js.map +1 -0
- package/dist/sources.d.ts +52 -0
- package/dist/sources.d.ts.map +1 -0
- package/dist/sources.js +163 -0
- package/dist/sources.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component loader — composes the three pieces of a component (script / template
|
|
3
|
+
* / styles) into one ES module. The same hash drives both the template's scope
|
|
4
|
+
* attribute and the scoped CSS, so a single `compileComponent` call keeps them
|
|
5
|
+
* in lockstep (no cross-file coordination).
|
|
6
|
+
*
|
|
7
|
+
* Authoring contract: the script EXPORTS `setup` (a named export); the loader
|
|
8
|
+
* appends the compiled `render` and synthesizes the default export
|
|
9
|
+
* `defineComponent(render, setup)` — append-only, never edits user code.
|
|
10
|
+
*
|
|
11
|
+
* Both authoring forms reduce here: a `.weave` SFC is split by {@link parseSfc}
|
|
12
|
+
* into the same `{ script, template, styles }` triple the separate-file path
|
|
13
|
+
* passes directly.
|
|
14
|
+
*/
|
|
15
|
+
import { compileTemplate } from './codegen.js';
|
|
16
|
+
import { parseTemplate } from './parser.js';
|
|
17
|
+
import { inferCtxNames } from './infer.js';
|
|
18
|
+
import { scopeCss, scopeAttr, hostAttr, hashCss } from './css.js';
|
|
19
|
+
const HAS_SETUP = /export\s+(?:async\s+)?function\s+setup\b|export\s+(?:const|let|var)\s+setup\b/;
|
|
20
|
+
/** Compile a `{ script, template, styles }` triple into a component module + scoped CSS. */
|
|
21
|
+
export function compileComponent(src, opts = {}) {
|
|
22
|
+
const hash = opts.hash ?? hashCss(opts.filename ?? src.template);
|
|
23
|
+
const attr = scopeAttr(hash);
|
|
24
|
+
const scope = inferCtxNames(parseTemplate(src.template));
|
|
25
|
+
// Stamp the `:host` root marker only when the styles actually use `:host` (else zero cost).
|
|
26
|
+
const host = src.styles && /:host\b/.test(src.styles) ? hostAttr(hash) : undefined;
|
|
27
|
+
const compiled = compileTemplate(src.template, { mode: 'module', scope, scopeAttr: attr, hostAttr: host });
|
|
28
|
+
// Demote the template module's default export to a local `render` we can wire up.
|
|
29
|
+
const renderBody = compiled.code.replace('export default function render', 'function render');
|
|
30
|
+
const css = src.styles ? scopeCss(src.styles, hash) : '';
|
|
31
|
+
const script = src.script ?? '';
|
|
32
|
+
const setupArg = HAS_SETUP.test(script) ? 'render, setup' : 'render';
|
|
33
|
+
const code = [
|
|
34
|
+
script.trim(),
|
|
35
|
+
'import { defineComponent } from "@weave-framework/runtime/dom";',
|
|
36
|
+
renderBody,
|
|
37
|
+
`export default defineComponent(${setupArg});`,
|
|
38
|
+
]
|
|
39
|
+
.filter(Boolean)
|
|
40
|
+
.join('\n\n');
|
|
41
|
+
return { code, css, hash };
|
|
42
|
+
}
|
|
43
|
+
export function parseSfcLoc(source) {
|
|
44
|
+
const script = locateBlock(source, 'script');
|
|
45
|
+
const style = locateBlock(source, 'style');
|
|
46
|
+
let template = source;
|
|
47
|
+
for (const b of [script, style]) {
|
|
48
|
+
if (b)
|
|
49
|
+
template = blankRange(template, b.rawStart, b.rawEnd);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
script: script?.inner || undefined,
|
|
53
|
+
scriptLine: script ? lineAt(source, script.innerStart) : 0,
|
|
54
|
+
scriptOffset: script ? script.innerStart : 0,
|
|
55
|
+
template,
|
|
56
|
+
styleOffset: style ? style.innerStart : 0,
|
|
57
|
+
styles: style?.inner || undefined,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function locateBlock(source, tag) {
|
|
61
|
+
const open = source.search(new RegExp(`<${tag}(\\s[^>]*)?>`, 'i'));
|
|
62
|
+
if (open === -1)
|
|
63
|
+
return null;
|
|
64
|
+
const gt = source.indexOf('>', open);
|
|
65
|
+
const close = source.toLowerCase().indexOf(`</${tag}>`, gt);
|
|
66
|
+
if (close === -1)
|
|
67
|
+
return null;
|
|
68
|
+
const rawInner = source.slice(gt + 1, close);
|
|
69
|
+
const lead = rawInner.length - rawInner.trimStart().length;
|
|
70
|
+
return {
|
|
71
|
+
rawStart: open,
|
|
72
|
+
rawEnd: close + `</${tag}>`.length,
|
|
73
|
+
innerStart: gt + 1 + lead,
|
|
74
|
+
inner: rawInner.trim(),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Replace `[start, end)` with same-length whitespace, preserving newlines. */
|
|
78
|
+
function blankRange(s, start, end) {
|
|
79
|
+
let mid = '';
|
|
80
|
+
for (let i = start; i < end; i++)
|
|
81
|
+
mid += s[i] === '\n' ? '\n' : ' ';
|
|
82
|
+
return s.slice(0, start) + mid + s.slice(end);
|
|
83
|
+
}
|
|
84
|
+
function lineAt(s, offset) {
|
|
85
|
+
let line = 0;
|
|
86
|
+
for (let i = 0; i < offset && i < s.length; i++)
|
|
87
|
+
if (s[i] === '\n')
|
|
88
|
+
line++;
|
|
89
|
+
return line;
|
|
90
|
+
}
|
|
91
|
+
/** Split a `.weave` SFC into its `{ script, template, styles }` triple. */
|
|
92
|
+
export function parseSfc(source) {
|
|
93
|
+
const script = extractBlock(source, 'script');
|
|
94
|
+
const style = extractBlock(source, 'style');
|
|
95
|
+
const template = source
|
|
96
|
+
.replace(script.raw, '')
|
|
97
|
+
.replace(style.raw, '')
|
|
98
|
+
.trim();
|
|
99
|
+
return {
|
|
100
|
+
script: script.inner || undefined,
|
|
101
|
+
template,
|
|
102
|
+
styles: style.inner || undefined,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function extractBlock(source, tag) {
|
|
106
|
+
const open = source.search(new RegExp(`<${tag}(\\s[^>]*)?>`, 'i'));
|
|
107
|
+
if (open === -1)
|
|
108
|
+
return { raw: '', inner: '' };
|
|
109
|
+
const gt = source.indexOf('>', open);
|
|
110
|
+
const close = source.toLowerCase().indexOf(`</${tag}>`, gt);
|
|
111
|
+
if (close === -1)
|
|
112
|
+
return { raw: '', inner: '' };
|
|
113
|
+
const end = close + `</${tag}>`.length;
|
|
114
|
+
return { raw: source.slice(open, end), inner: source.slice(gt + 1, close).trim() };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
|
package/dist/css.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Weave scoped CSS — compile-time attribute scoping (Svelte-proven, SSR-safe,
|
|
3
|
+
* zero runtime cost). Each component's styles are hashed to an attribute
|
|
4
|
+
* (`data-w-<hash>`); the compiler stamps that attribute on every element the
|
|
5
|
+
* template emits (see codegen), and here we rewrite the CSS so each rule's
|
|
6
|
+
* rightmost compound selector carries the same `[data-w-<hash>]` — so the styles
|
|
7
|
+
* apply only to this component's elements.
|
|
8
|
+
*
|
|
9
|
+
* Hand-written tokenizer, no PostCSS. Handles: selector lists, descendant/child/
|
|
10
|
+
* sibling combinators, pseudo-classes/elements, `:global(...)` (unwrapped, left
|
|
11
|
+
* unscoped), native nesting (`&` and nested rules), `@media`/`@supports`/etc.
|
|
12
|
+
* (recursed into), and `@keyframes` (name kept, frame selectors not scoped).
|
|
13
|
+
*/
|
|
14
|
+
/** The attribute a given hash scopes to (stamped on elements, matched in CSS). */
|
|
15
|
+
export declare function scopeAttr(hash: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* The attribute marking a component's *root* element(s) — what `:host` targets.
|
|
18
|
+
* Weave has no shadow DOM, so `:host` resolves to the template roots (codegen
|
|
19
|
+
* stamps this only when the CSS actually uses `:host`).
|
|
20
|
+
*/
|
|
21
|
+
export declare function hostAttr(hash: string): string;
|
|
22
|
+
/** Deterministic short hash (FNV-1a, base36) for a component's style+template. */
|
|
23
|
+
export declare function hashCss(input: string): string;
|
|
24
|
+
/** Rewrite `css` so it only targets elements carrying `[data-w-<hash>]`. */
|
|
25
|
+
export declare function scopeCss(css: string, hash: string): string;
|
|
26
|
+
//# sourceMappingURL=css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|
package/dist/css.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Weave scoped CSS — compile-time attribute scoping (Svelte-proven, SSR-safe,
|
|
3
|
+
* zero runtime cost). Each component's styles are hashed to an attribute
|
|
4
|
+
* (`data-w-<hash>`); the compiler stamps that attribute on every element the
|
|
5
|
+
* template emits (see codegen), and here we rewrite the CSS so each rule's
|
|
6
|
+
* rightmost compound selector carries the same `[data-w-<hash>]` — so the styles
|
|
7
|
+
* apply only to this component's elements.
|
|
8
|
+
*
|
|
9
|
+
* Hand-written tokenizer, no PostCSS. Handles: selector lists, descendant/child/
|
|
10
|
+
* sibling combinators, pseudo-classes/elements, `:global(...)` (unwrapped, left
|
|
11
|
+
* unscoped), native nesting (`&` and nested rules), `@media`/`@supports`/etc.
|
|
12
|
+
* (recursed into), and `@keyframes` (name kept, frame selectors not scoped).
|
|
13
|
+
*/
|
|
14
|
+
/** The attribute a given hash scopes to (stamped on elements, matched in CSS). */
|
|
15
|
+
export function scopeAttr(hash) {
|
|
16
|
+
return `data-w-${hash}`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The attribute marking a component's *root* element(s) — what `:host` targets.
|
|
20
|
+
* Weave has no shadow DOM, so `:host` resolves to the template roots (codegen
|
|
21
|
+
* stamps this only when the CSS actually uses `:host`).
|
|
22
|
+
*/
|
|
23
|
+
export function hostAttr(hash) {
|
|
24
|
+
return `data-w-${hash}-h`;
|
|
25
|
+
}
|
|
26
|
+
/** Deterministic short hash (FNV-1a, base36) for a component's style+template. */
|
|
27
|
+
export function hashCss(input) {
|
|
28
|
+
let h = 0x811c9dc5;
|
|
29
|
+
for (let i = 0; i < input.length; i++) {
|
|
30
|
+
h ^= input.charCodeAt(i);
|
|
31
|
+
h = Math.imul(h, 0x01000193);
|
|
32
|
+
}
|
|
33
|
+
return (h >>> 0).toString(36).padStart(6, '0').slice(0, 6);
|
|
34
|
+
}
|
|
35
|
+
/** Rewrite `css` so it only targets elements carrying `[data-w-<hash>]`. */
|
|
36
|
+
export function scopeCss(css, hash) {
|
|
37
|
+
return transformBlock(css, scopeAttr(hash), hostAttr(hash), false);
|
|
38
|
+
}
|
|
39
|
+
/* ──────────── block-level walk ──────────── */
|
|
40
|
+
function transformBlock(css, attr, host, keyframes) {
|
|
41
|
+
let out = '';
|
|
42
|
+
let i = 0;
|
|
43
|
+
const n = css.length;
|
|
44
|
+
while (i < n) {
|
|
45
|
+
const c = css[i];
|
|
46
|
+
if (/\s/.test(c)) {
|
|
47
|
+
out += c;
|
|
48
|
+
i++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (css.startsWith('/*', i)) {
|
|
52
|
+
const end = css.indexOf('*/', i + 2);
|
|
53
|
+
const stop = end === -1 ? n : end + 2;
|
|
54
|
+
out += css.slice(i, stop);
|
|
55
|
+
i = stop;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Read a statement prelude up to a top-level ';' (declaration / @import) or '{' (block).
|
|
59
|
+
let j = i;
|
|
60
|
+
let depth = 0;
|
|
61
|
+
let kind = '';
|
|
62
|
+
while (j < n) {
|
|
63
|
+
const ch = css[j];
|
|
64
|
+
if (ch === '"' || ch === "'") {
|
|
65
|
+
j = skipString(css, j);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (css.startsWith('/*', j)) {
|
|
69
|
+
const e = css.indexOf('*/', j + 2);
|
|
70
|
+
j = e === -1 ? n : e + 2;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (ch === '(' || ch === '[')
|
|
74
|
+
depth++;
|
|
75
|
+
else if (ch === ')' || ch === ']')
|
|
76
|
+
depth--;
|
|
77
|
+
else if (depth === 0 && ch === '{') {
|
|
78
|
+
kind = 'block';
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
else if (depth === 0 && ch === ';') {
|
|
82
|
+
kind = 'decl';
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
j++;
|
|
86
|
+
}
|
|
87
|
+
if (kind === '') {
|
|
88
|
+
out += css.slice(i); // trailing text (e.g. last declaration without ';')
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
const prelude = css.slice(i, j);
|
|
92
|
+
if (kind === 'decl') {
|
|
93
|
+
out += prelude + ';';
|
|
94
|
+
i = j + 1;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
// Block: read its balanced body.
|
|
98
|
+
const bodyStart = j + 1;
|
|
99
|
+
let k = bodyStart;
|
|
100
|
+
let bd = 1;
|
|
101
|
+
while (k < n) {
|
|
102
|
+
const ch = css[k];
|
|
103
|
+
if (ch === '"' || ch === "'") {
|
|
104
|
+
k = skipString(css, k);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (css.startsWith('/*', k)) {
|
|
108
|
+
const e = css.indexOf('*/', k + 2);
|
|
109
|
+
k = e === -1 ? n : e + 2;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (ch === '{')
|
|
113
|
+
bd++;
|
|
114
|
+
else if (ch === '}') {
|
|
115
|
+
bd--;
|
|
116
|
+
if (bd === 0)
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
k++;
|
|
120
|
+
}
|
|
121
|
+
const body = css.slice(bodyStart, k);
|
|
122
|
+
const after = k < n ? k + 1 : n;
|
|
123
|
+
const trimmed = prelude.trim();
|
|
124
|
+
if (keyframes) {
|
|
125
|
+
// Frame selector (`0%`, `from`, `to`) — never scoped; body is declarations.
|
|
126
|
+
out += prelude + '{' + body + '}';
|
|
127
|
+
}
|
|
128
|
+
else if (trimmed.startsWith('@')) {
|
|
129
|
+
const kw = (/^@-?\w[\w-]*/.exec(trimmed)?.[0] ?? '').toLowerCase();
|
|
130
|
+
if (kw.endsWith('keyframes')) {
|
|
131
|
+
out += prelude + '{' + transformBlock(body, attr, host, true) + '}';
|
|
132
|
+
}
|
|
133
|
+
else if (kw === '@font-face' || kw === '@page' || kw === '@property' || kw === '@counter-style') {
|
|
134
|
+
out += prelude + '{' + body + '}'; // declarations only — nothing to scope
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
out += prelude + '{' + transformBlock(body, attr, host, false) + '}'; // @media/@supports/@container/@layer…
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
out += scopeSelectorList(prelude, attr, host) + '{' + transformBlock(body, attr, host, false) + '}';
|
|
142
|
+
}
|
|
143
|
+
i = after;
|
|
144
|
+
}
|
|
145
|
+
return out;
|
|
146
|
+
}
|
|
147
|
+
/* ──────────── selector scoping ──────────── */
|
|
148
|
+
function scopeSelectorList(prelude, attr, host) {
|
|
149
|
+
return splitTopLevel(prelude, ',')
|
|
150
|
+
.map((s) => scopeSelector(s, attr, host))
|
|
151
|
+
.join(', ');
|
|
152
|
+
}
|
|
153
|
+
function scopeSelector(raw, attr, host) {
|
|
154
|
+
const sel = raw.trim();
|
|
155
|
+
if (!sel)
|
|
156
|
+
return sel;
|
|
157
|
+
const start = rightmostCompoundStart(sel);
|
|
158
|
+
// `:host` may appear in an ancestor position (`:host .child`) — rewrite it there too.
|
|
159
|
+
const prefix = rewriteHost(unwrapGlobal(sel.slice(0, start)), host);
|
|
160
|
+
const right = sel.slice(start);
|
|
161
|
+
const rightTrim = right.trim();
|
|
162
|
+
// The rightmost compound is `:host` / `:host(.x)` → carries the host attr, not
|
|
163
|
+
// the normal element scope (a root is matched by where it is, not what it is).
|
|
164
|
+
if (rightTrim.startsWith(':host')) {
|
|
165
|
+
return prefix + rewriteHost(unwrapGlobal(right), host);
|
|
166
|
+
}
|
|
167
|
+
// `:global(...)` rightmost compound or a nesting `&` already carry/inherit scope.
|
|
168
|
+
if (rightTrim.startsWith(':global(') || right.includes('&')) {
|
|
169
|
+
return prefix + unwrapGlobal(right);
|
|
170
|
+
}
|
|
171
|
+
return prefix + insertAttr(unwrapGlobal(right), attr);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Rewrite `:host` / `:host(<sel>)` tokens to the host attribute. `:host` →
|
|
175
|
+
* `[host]`; `:host(.active)` → `.active[host]` (Angular semantics). Leaves
|
|
176
|
+
* unrelated tokens (and `:host-context(...)`, not supported) untouched.
|
|
177
|
+
*/
|
|
178
|
+
function rewriteHost(s, host) {
|
|
179
|
+
let out = '';
|
|
180
|
+
let i = 0;
|
|
181
|
+
while (i < s.length) {
|
|
182
|
+
if (s.startsWith(':host', i)) {
|
|
183
|
+
const after = s[i + 5];
|
|
184
|
+
if (after === '(') {
|
|
185
|
+
let depth = 1;
|
|
186
|
+
let j = i + 6;
|
|
187
|
+
let inner = '';
|
|
188
|
+
while (j < s.length && depth > 0) {
|
|
189
|
+
const c = s[j];
|
|
190
|
+
if (c === '(')
|
|
191
|
+
depth++;
|
|
192
|
+
else if (c === ')' && --depth === 0) {
|
|
193
|
+
j++;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
inner += c;
|
|
197
|
+
j++;
|
|
198
|
+
}
|
|
199
|
+
out += inner.trim() + `[${host}]`;
|
|
200
|
+
i = j;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
// A bare `:host` token (not `:host-context` or `:hostfoo`).
|
|
204
|
+
if (after === undefined || !/[-\w]/.test(after)) {
|
|
205
|
+
out += `[${host}]`;
|
|
206
|
+
i += 5;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
out += s[i++];
|
|
211
|
+
}
|
|
212
|
+
return out;
|
|
213
|
+
}
|
|
214
|
+
/** Index in `sel` where the rightmost compound selector begins (after the last combinator). */
|
|
215
|
+
function rightmostCompoundStart(sel) {
|
|
216
|
+
let depth = 0;
|
|
217
|
+
let start = 0;
|
|
218
|
+
let i = 0;
|
|
219
|
+
while (i < sel.length) {
|
|
220
|
+
const c = sel[i];
|
|
221
|
+
if (c === '(' || c === '[') {
|
|
222
|
+
depth++;
|
|
223
|
+
i++;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (c === ')' || c === ']') {
|
|
227
|
+
depth--;
|
|
228
|
+
i++;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if (depth === 0) {
|
|
232
|
+
if (c === '>' || c === '+' || c === '~') {
|
|
233
|
+
i++;
|
|
234
|
+
while (i < sel.length && /\s/.test(sel[i]))
|
|
235
|
+
i++;
|
|
236
|
+
start = i;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (/\s/.test(c)) {
|
|
240
|
+
let j = i;
|
|
241
|
+
while (j < sel.length && /\s/.test(sel[j]))
|
|
242
|
+
j++;
|
|
243
|
+
const next = sel[j];
|
|
244
|
+
if (j >= sel.length) {
|
|
245
|
+
i = j;
|
|
246
|
+
continue;
|
|
247
|
+
} // trailing space
|
|
248
|
+
if (next === '>' || next === '+' || next === '~') {
|
|
249
|
+
i = j;
|
|
250
|
+
continue;
|
|
251
|
+
} // space around a combinator
|
|
252
|
+
start = j; // descendant combinator
|
|
253
|
+
i = j;
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
i++;
|
|
258
|
+
}
|
|
259
|
+
return start;
|
|
260
|
+
}
|
|
261
|
+
/** Insert `[attr]` into a compound selector before its first top-level pseudo (`:`), else append. */
|
|
262
|
+
function insertAttr(compound, attr) {
|
|
263
|
+
let depth = 0;
|
|
264
|
+
for (let i = 0; i < compound.length; i++) {
|
|
265
|
+
const c = compound[i];
|
|
266
|
+
if (c === '(' || c === '[')
|
|
267
|
+
depth++;
|
|
268
|
+
else if (c === ')' || c === ']')
|
|
269
|
+
depth--;
|
|
270
|
+
else if (depth === 0 && c === ':') {
|
|
271
|
+
return compound.slice(0, i) + `[${attr}]` + compound.slice(i);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return compound + `[${attr}]`;
|
|
275
|
+
}
|
|
276
|
+
/** Replace every `:global(X)` with `X` (parens balanced). */
|
|
277
|
+
function unwrapGlobal(s) {
|
|
278
|
+
let out = '';
|
|
279
|
+
let i = 0;
|
|
280
|
+
while (i < s.length) {
|
|
281
|
+
if (s.startsWith(':global(', i)) {
|
|
282
|
+
i += ':global('.length;
|
|
283
|
+
let depth = 1;
|
|
284
|
+
while (i < s.length && depth > 0) {
|
|
285
|
+
const c = s[i];
|
|
286
|
+
if (c === '(')
|
|
287
|
+
depth++;
|
|
288
|
+
else if (c === ')') {
|
|
289
|
+
depth--;
|
|
290
|
+
if (depth === 0) {
|
|
291
|
+
i++;
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
out += c;
|
|
296
|
+
i++;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
out += s[i++];
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return out;
|
|
304
|
+
}
|
|
305
|
+
/* ──────────── shared scanners ──────────── */
|
|
306
|
+
function splitTopLevel(s, sep) {
|
|
307
|
+
const out = [];
|
|
308
|
+
let depth = 0;
|
|
309
|
+
let last = 0;
|
|
310
|
+
for (let i = 0; i < s.length; i++) {
|
|
311
|
+
const c = s[i];
|
|
312
|
+
if (c === '"' || c === "'") {
|
|
313
|
+
i = skipString(s, i) - 1;
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (c === '(' || c === '[')
|
|
317
|
+
depth++;
|
|
318
|
+
else if (c === ')' || c === ']')
|
|
319
|
+
depth--;
|
|
320
|
+
else if (c === sep && depth === 0) {
|
|
321
|
+
out.push(s.slice(last, i));
|
|
322
|
+
last = i + 1;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
out.push(s.slice(last));
|
|
326
|
+
return out;
|
|
327
|
+
}
|
|
328
|
+
/** Skip a quoted string starting at `start`; returns the index just past the closing quote. */
|
|
329
|
+
function skipString(s, start) {
|
|
330
|
+
const q = s[start];
|
|
331
|
+
let i = start + 1;
|
|
332
|
+
while (i < s.length) {
|
|
333
|
+
const c = s[i];
|
|
334
|
+
if (c === '\\') {
|
|
335
|
+
i += 2;
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
if (c === q)
|
|
339
|
+
return i + 1;
|
|
340
|
+
i++;
|
|
341
|
+
}
|
|
342
|
+
return s.length;
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=css.js.map
|
package/dist/css.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @weave-framework/compiler — turns Weave templates into fine-grained DOM code.
|
|
3
|
+
* M3: templates, interpolation, attribute/event/prop/class/ref bindings.
|
|
4
|
+
*/
|
|
5
|
+
export { compileTemplate, type CompileOptions } from './codegen.js';
|
|
6
|
+
export { parseTemplate, ParseError } from './parser.js';
|
|
7
|
+
export { scopeCss, scopeAttr, hostAttr, hashCss } from './css.js';
|
|
8
|
+
export { inferCtxNames } from './infer.js';
|
|
9
|
+
export { rewrite, ctxScope, childScope, type Scope, type Binding, type RewriteSegment, type RewriteResult, } from './scope.js';
|
|
10
|
+
export { compileComponent, parseSfc, parseSfcLoc, type ComponentSource, type ComponentSourceLoc, type ComponentOptions, type CompiledComponent, } from './component.js';
|
|
11
|
+
export { extractSources, faithfulTemplate, classifyTemplate, classifyStyle, type ExtractedSources, } from './sources.js';
|
|
12
|
+
export type * from './ast.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,OAAO,EACP,QAAQ,EACR,UAAU,EACV,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,mBAAmB,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @weave-framework/compiler — turns Weave templates into fine-grained DOM code.
|
|
3
|
+
* M3: templates, interpolation, attribute/event/prop/class/ref bindings.
|
|
4
|
+
*/
|
|
5
|
+
export { compileTemplate } from './codegen.js';
|
|
6
|
+
export { parseTemplate, ParseError } from './parser.js';
|
|
7
|
+
export { scopeCss, scopeAttr, hostAttr, hashCss } from './css.js';
|
|
8
|
+
export { inferCtxNames } from './infer.js';
|
|
9
|
+
export { rewrite, ctxScope, childScope, } from './scope.js';
|
|
10
|
+
export { compileComponent, parseSfc, parseSfcLoc, } from './component.js';
|
|
11
|
+
export { extractSources, faithfulTemplate, classifyTemplate, classifyStyle, } from './sources.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAuB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,OAAO,EACP,QAAQ,EACR,UAAU,GAKX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,WAAW,GAKZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GAEd,MAAM,cAAc,CAAC"}
|
package/dist/infer.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-scope inference: walk a template AST and return the names that should
|
|
3
|
+
* resolve to component data (`ctx.*`). Every free identifier in every template
|
|
4
|
+
* expression qualifies, minus JS globals (handled in {@link freeIdentifiers})
|
|
5
|
+
* and minus names a block *declares* — `@for` items + implicit `$` vars, `@let`
|
|
6
|
+
* names, `@if (… as alias)` — since those are bound locally (and, for `@for`
|
|
7
|
+
* `track`, used as real arrow params against the parent scope).
|
|
8
|
+
*
|
|
9
|
+
* Lexical and intentionally simple; M8 replaces it with TS-AST resolution.
|
|
10
|
+
*/
|
|
11
|
+
import type { TemplateNode } from './ast.js';
|
|
12
|
+
export declare function inferCtxNames(nodes: TemplateNode[]): string[];
|
|
13
|
+
//# sourceMappingURL=infer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../src/infer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAK7C,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAuF7D"}
|