@ketvietlab/ketjs-view 0.1.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 +21 -0
- package/README.md +18 -0
- package/dist/host.d.ts +45 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +177 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/island.d.ts +74 -0
- package/dist/island.d.ts.map +1 -0
- package/dist/island.js +278 -0
- package/dist/island.js.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +3 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +2 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +46 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +117 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/mount.d.ts +13 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/mount.js +44 -0
- package/dist/mount.js.map +1 -0
- package/dist/render.d.ts +39 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +536 -0
- package/dist/render.js.map +1 -0
- package/dist/signal.d.ts +18 -0
- package/dist/signal.d.ts.map +1 -0
- package/dist/signal.js +132 -0
- package/dist/signal.js.map +1 -0
- package/dist/ssr.d.ts +30 -0
- package/dist/ssr.d.ts.map +1 -0
- package/dist/ssr.js +145 -0
- package/dist/ssr.js.map +1 -0
- package/dist/template.d.ts +27 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +129 -0
- package/dist/template.js.map +1 -0
- package/package.json +54 -0
package/dist/signal.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// Reactivity is runtime, not compile-time. That single choice is what keeps the
|
|
2
|
+
// template compiler small enough to write without a JS parser: it never has to
|
|
3
|
+
// analyse dependencies, because the graph builds itself while the effect runs.
|
|
4
|
+
let active = null;
|
|
5
|
+
let batchDepth = 0;
|
|
6
|
+
const pending = new Set();
|
|
7
|
+
let flushing = false;
|
|
8
|
+
export function signal(initial) {
|
|
9
|
+
let value = initial;
|
|
10
|
+
const subs = new Set();
|
|
11
|
+
const read = (() => {
|
|
12
|
+
if (active) {
|
|
13
|
+
subs.add(active);
|
|
14
|
+
active.deps.add(subs);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
});
|
|
18
|
+
read.set = (next) => {
|
|
19
|
+
const v = typeof next === 'function' ? next(value) : next;
|
|
20
|
+
if (Object.is(v, value))
|
|
21
|
+
return value; // a no-op write costs nothing
|
|
22
|
+
value = v;
|
|
23
|
+
for (const s of subs)
|
|
24
|
+
pending.add(s);
|
|
25
|
+
if (batchDepth === 0)
|
|
26
|
+
flush();
|
|
27
|
+
return value;
|
|
28
|
+
};
|
|
29
|
+
read.peek = () => value;
|
|
30
|
+
return read;
|
|
31
|
+
}
|
|
32
|
+
function flush() {
|
|
33
|
+
if (flushing || batchDepth > 0)
|
|
34
|
+
return;
|
|
35
|
+
flushing = true;
|
|
36
|
+
try {
|
|
37
|
+
while (pending.size) {
|
|
38
|
+
// Derived values must settle before ordinary effects observe them. Picking one
|
|
39
|
+
// item at a time also lets a computed enqueue another computed ahead of a
|
|
40
|
+
// render that was already waiting, without a second render or a stale read.
|
|
41
|
+
let next;
|
|
42
|
+
for (const effect of pending) {
|
|
43
|
+
if (!effect.computed)
|
|
44
|
+
continue;
|
|
45
|
+
next = effect;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
next ??= pending.values().next().value;
|
|
49
|
+
if (!next)
|
|
50
|
+
break;
|
|
51
|
+
pending.delete(next);
|
|
52
|
+
runEffect(next);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
flushing = false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function runEffect(eff) {
|
|
60
|
+
if (eff.disposed)
|
|
61
|
+
return;
|
|
62
|
+
const cleanup = eff.cleanup;
|
|
63
|
+
eff.cleanup = null;
|
|
64
|
+
for (const dep of eff.deps)
|
|
65
|
+
dep.delete(eff);
|
|
66
|
+
eff.deps.clear();
|
|
67
|
+
cleanup?.();
|
|
68
|
+
const prev = active;
|
|
69
|
+
active = eff;
|
|
70
|
+
try {
|
|
71
|
+
const cleanup = eff.fn();
|
|
72
|
+
if (typeof cleanup === 'function')
|
|
73
|
+
eff.cleanup = cleanup;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
active = prev;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function makeEffect(fn, computed) {
|
|
80
|
+
const eff = { fn, deps: new Set(), disposed: false, cleanup: null, computed };
|
|
81
|
+
try {
|
|
82
|
+
runEffect(eff);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// An effect that fails during its eager first run never reaches its caller, so
|
|
86
|
+
// nobody can dispose it. Roll its subscriptions back here or a later signal
|
|
87
|
+
// write would revive a half-created render/hydration effect.
|
|
88
|
+
eff.disposed = true;
|
|
89
|
+
pending.delete(eff);
|
|
90
|
+
for (const dep of eff.deps)
|
|
91
|
+
dep.delete(eff);
|
|
92
|
+
eff.deps.clear();
|
|
93
|
+
eff.cleanup?.();
|
|
94
|
+
eff.cleanup = null;
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
return () => {
|
|
98
|
+
eff.disposed = true;
|
|
99
|
+
pending.delete(eff);
|
|
100
|
+
for (const d of eff.deps)
|
|
101
|
+
d.delete(eff);
|
|
102
|
+
eff.deps.clear();
|
|
103
|
+
eff.cleanup?.();
|
|
104
|
+
eff.cleanup = null;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function effect(fn) {
|
|
108
|
+
return makeEffect(fn, false);
|
|
109
|
+
}
|
|
110
|
+
export function computed(fn) {
|
|
111
|
+
const s = signal(undefined);
|
|
112
|
+
const dispose = makeEffect(() => {
|
|
113
|
+
s.set(fn());
|
|
114
|
+
}, true);
|
|
115
|
+
const read = (() => s());
|
|
116
|
+
read.peek = s.peek;
|
|
117
|
+
read.dispose = dispose;
|
|
118
|
+
return read;
|
|
119
|
+
}
|
|
120
|
+
export function batch(fn) {
|
|
121
|
+
batchDepth++;
|
|
122
|
+
try {
|
|
123
|
+
return fn();
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
batchDepth--;
|
|
127
|
+
if (batchDepth === 0) {
|
|
128
|
+
flush();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../../../packages/ketjs-view/src/signal.ts"],"names":[],"mappings":"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"}
|
package/dist/ssr.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TemplateResult } from './render.ts';
|
|
2
|
+
export declare const HOLE_MARKER = "k";
|
|
3
|
+
export declare const HOLE_OPEN = "k[";
|
|
4
|
+
export declare function renderToString(result: TemplateResult): string;
|
|
5
|
+
/**
|
|
6
|
+
* Markup that has already been escaped by something trusted to do it.
|
|
7
|
+
*
|
|
8
|
+
* The only producer is the KTL compiler, which escapes every interpolation and
|
|
9
|
+
* cannot run code — so what arrives here is a string of markup rather than a
|
|
10
|
+
* string of data. Escaping it again would render the tags as text, which is what
|
|
11
|
+
* a plain string value correctly does and why this needs its own kind.
|
|
12
|
+
*
|
|
13
|
+
* Branded, so it cannot be made from an arbitrary string without saying so. Same
|
|
14
|
+
* move as RouteResult: the dangerous construction has one name and one place.
|
|
15
|
+
*/
|
|
16
|
+
declare const MARKUP: unique symbol;
|
|
17
|
+
export type Markup = {
|
|
18
|
+
readonly html: string;
|
|
19
|
+
readonly [MARKUP]: true;
|
|
20
|
+
};
|
|
21
|
+
export declare const isMarkup: (v: unknown) => v is Markup;
|
|
22
|
+
/** Only for output a sandboxed compiler produced. Never for user data. */
|
|
23
|
+
export declare const trustedMarkup: (html: string) => Markup;
|
|
24
|
+
export declare class HydrationMismatch extends Error {
|
|
25
|
+
code: string;
|
|
26
|
+
hint: string | null;
|
|
27
|
+
constructor(what: string, expected: string, got: string);
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=ssr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssr.d.ts","sourceRoot":"","sources":["../../../../packages/ketjs-view/src/ssr.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,aAAa,CAAA;AAG7D,eAAO,MAAM,WAAW,MAAM,CAAA;AAC9B,eAAO,MAAM,SAAS,OAAO,CAAA;AAkB7B,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAI7D;AAED;;;;;;;;;;GAUG;AACH,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,MAAM,CAAA;AACnC,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,CAAA;AACvE,eAAO,MAAM,QAAQ,MAAO,OAAO,KAAG,CAAC,IAAI,MAId,CAAA;AAE7B,0EAA0E;AAC1E,eAAO,MAAM,aAAa,SAAU,MAAM,KAAG,MAA6D,CAAA;AA4F1G,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,IAAI,SAAyB;IAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,YAAY,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAMtD;CACF"}
|
package/dist/ssr.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// Server rendering and hydration.
|
|
2
|
+
//
|
|
3
|
+
// The server walks the same parsed template the client does and emits the same
|
|
4
|
+
// structure, with one comment marker per hole. Hydration then adopts the existing
|
|
5
|
+
// DOM instead of rebuilding it: the static parts are already correct, so only the
|
|
6
|
+
// holes need to be located and wired up.
|
|
7
|
+
//
|
|
8
|
+
// Only holes need markers. Everything else is described by the template itself, so
|
|
9
|
+
// the walk knows exactly how many nodes each construct occupies.
|
|
10
|
+
import { templateFor } from './template.js';
|
|
11
|
+
import { isResult, isEach } from './render.js';
|
|
12
|
+
import { escapeHtml } from './host.js';
|
|
13
|
+
export const HOLE_MARKER = 'k';
|
|
14
|
+
export const HOLE_OPEN = 'k[';
|
|
15
|
+
const VOID = new Set([
|
|
16
|
+
'area',
|
|
17
|
+
'base',
|
|
18
|
+
'br',
|
|
19
|
+
'col',
|
|
20
|
+
'embed',
|
|
21
|
+
'hr',
|
|
22
|
+
'img',
|
|
23
|
+
'input',
|
|
24
|
+
'link',
|
|
25
|
+
'meta',
|
|
26
|
+
'source',
|
|
27
|
+
'track',
|
|
28
|
+
'wbr',
|
|
29
|
+
]);
|
|
30
|
+
export function renderToString(result) {
|
|
31
|
+
const out = [];
|
|
32
|
+
writeResult(result, out);
|
|
33
|
+
return out.join('');
|
|
34
|
+
}
|
|
35
|
+
export const isMarkup = (v) => typeof v === 'object' &&
|
|
36
|
+
v !== null &&
|
|
37
|
+
typeof v.html === 'string' &&
|
|
38
|
+
MARKUP_TAG in v;
|
|
39
|
+
const MARKUP_TAG = Symbol.for('ket.markup');
|
|
40
|
+
/** Only for output a sandboxed compiler produced. Never for user data. */
|
|
41
|
+
export const trustedMarkup = (html) => ({ html, [MARKUP_TAG]: true });
|
|
42
|
+
function writeValue(value, out) {
|
|
43
|
+
if (isMarkup(value)) {
|
|
44
|
+
out.push(value.html);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (isResult(value)) {
|
|
48
|
+
writeResult(value, out);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (isEach(value)) {
|
|
52
|
+
const list = value;
|
|
53
|
+
for (let i = 0; i < list.items.length; i++)
|
|
54
|
+
writeResult(list.render(list.items[i], i), out);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (value == null || value === false)
|
|
58
|
+
return;
|
|
59
|
+
out.push(escapeHtml(value));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Inside these, an HTML parser does not read `<!--` as a comment — the content is
|
|
63
|
+
* text, and a hydration marker written there arrives as literal characters. It is
|
|
64
|
+
* why a page title rendered as "<!--k[-->KetSuite<!--k-->" in the browser tab.
|
|
65
|
+
*
|
|
66
|
+
* Nothing is lost by leaving the markers out: the reason they exist is to keep
|
|
67
|
+
* adjacent text nodes apart so the hydration walk counts correctly, and neither of
|
|
68
|
+
* these elements has children to walk.
|
|
69
|
+
*/
|
|
70
|
+
const RCDATA = new Set(['title', 'textarea']);
|
|
71
|
+
function writeResult(result, out) {
|
|
72
|
+
const tpl = templateFor(result.strings);
|
|
73
|
+
const write = (node, raw = false) => {
|
|
74
|
+
if (node.type === 'text') {
|
|
75
|
+
out.push(node.value);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (node.type === 'hole') {
|
|
79
|
+
// A hole is fenced on both sides. The closing marker is the anchor the client
|
|
80
|
+
// builds too; the opening one exists because an HTML parser merges adjacent
|
|
81
|
+
// text, so "giá trị " and "5" would arrive as a single node and the walk would
|
|
82
|
+
// be one node short. A comment cannot merge, so it keeps them apart.
|
|
83
|
+
if (raw) {
|
|
84
|
+
writeValue(result.values[node.index], out);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
out.push(`<!--${HOLE_OPEN}-->`);
|
|
88
|
+
writeValue(result.values[node.index], out);
|
|
89
|
+
out.push(`<!--${HOLE_MARKER}-->`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const el = node;
|
|
93
|
+
out.push(`<${el.tag}`);
|
|
94
|
+
for (const a of el.attrs) {
|
|
95
|
+
// on:* is behaviour, not markup. It is attached during hydration and must
|
|
96
|
+
// never appear in the HTML, where it would be a dead string at best.
|
|
97
|
+
if (a.name.startsWith('on:'))
|
|
98
|
+
continue;
|
|
99
|
+
const v = a.hole != null ? result.values[a.hole] : a.value;
|
|
100
|
+
if (v == null || v === false)
|
|
101
|
+
continue;
|
|
102
|
+
out.push(` ${a.name}="${escapeHtml(v)}"`);
|
|
103
|
+
}
|
|
104
|
+
out.push('>');
|
|
105
|
+
if (VOID.has(el.tag))
|
|
106
|
+
return;
|
|
107
|
+
const rcdata = raw || RCDATA.has(el.tag);
|
|
108
|
+
for (const c of el.children)
|
|
109
|
+
write(c, rcdata);
|
|
110
|
+
out.push(`</${el.tag}>`);
|
|
111
|
+
};
|
|
112
|
+
for (const n of tpl.children)
|
|
113
|
+
write(n);
|
|
114
|
+
}
|
|
115
|
+
// --- hydration ------------------------------------------------------------
|
|
116
|
+
// The walk itself lives in render.ts, next to the Instance and Part it has to
|
|
117
|
+
// build. Only the error type is shared.
|
|
118
|
+
/**
|
|
119
|
+
* An HTML parser does not give back exactly the markup it was handed: it inserts
|
|
120
|
+
* implied elements. `<table><tr>` becomes `<table><tbody><tr>`, and a template that
|
|
121
|
+
* omitted the tbody then walks into a node it never wrote. The mismatch is real and
|
|
122
|
+
* the fix is to write the element, so the error says so instead of leaving the
|
|
123
|
+
* author to discover it.
|
|
124
|
+
*/
|
|
125
|
+
const IMPLIED = {
|
|
126
|
+
tbody: 'table',
|
|
127
|
+
thead: 'table',
|
|
128
|
+
tfoot: 'table',
|
|
129
|
+
tr: 'tbody',
|
|
130
|
+
html: '(document)',
|
|
131
|
+
head: 'html',
|
|
132
|
+
body: 'html',
|
|
133
|
+
};
|
|
134
|
+
export class HydrationMismatch extends Error {
|
|
135
|
+
code = 'E_HYDRATION_MISMATCH';
|
|
136
|
+
hint;
|
|
137
|
+
constructor(what, expected, got) {
|
|
138
|
+
super(`hydration mismatch at ${what}: expected ${expected}, found ${got}`);
|
|
139
|
+
const implied = Object.keys(IMPLIED).find((tag) => got.includes(`<${tag}>`));
|
|
140
|
+
this.hint = implied
|
|
141
|
+
? `the HTML parser inserted <${implied}> on its own — write it in the template so the server and the browser agree`
|
|
142
|
+
: 'the markup does not match the template that rendered it; fall back to a clean client render';
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=ssr.js.map
|
package/dist/ssr.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssr.js","sourceRoot":"","sources":["../../../../../packages/ketjs-view/src/ssr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type TplText = {
|
|
2
|
+
type: 'text';
|
|
3
|
+
value: string;
|
|
4
|
+
};
|
|
5
|
+
export type TplHole = {
|
|
6
|
+
type: 'hole';
|
|
7
|
+
index: number;
|
|
8
|
+
};
|
|
9
|
+
export type TplAttr = {
|
|
10
|
+
name: string;
|
|
11
|
+
value?: string;
|
|
12
|
+
hole?: number;
|
|
13
|
+
};
|
|
14
|
+
export type TplEl = {
|
|
15
|
+
type: 'el';
|
|
16
|
+
tag: string;
|
|
17
|
+
attrs: TplAttr[];
|
|
18
|
+
children: TplNode[];
|
|
19
|
+
};
|
|
20
|
+
export type TplNode = TplText | TplHole | TplEl;
|
|
21
|
+
export type TplRoot = {
|
|
22
|
+
type: 'root';
|
|
23
|
+
children: TplNode[];
|
|
24
|
+
};
|
|
25
|
+
export declare function parseTemplate(strings: readonly string[]): TplRoot;
|
|
26
|
+
export declare function templateFor(strings: readonly string[]): TplRoot;
|
|
27
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../../packages/ketjs-view/src/template.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AACrD,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AACrD,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AACrE,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAA;AACtF,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAA;AAC/C,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAA;AAoB3D,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAyFjE;AAGD,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAO/D"}
|
package/dist/template.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// A tiny HTML template parser. It runs over the *static* strings of a tagged
|
|
2
|
+
// template, which are stable per call site by spec — so this runs once per call
|
|
3
|
+
// site for the life of the process, and every later render only touches holes.
|
|
4
|
+
const MARK = ''; // OBJECT REPLACEMENT CHARACTER: never appears in real markup
|
|
5
|
+
const holeRe = new RegExp(MARK + '(\\d+)' + MARK);
|
|
6
|
+
const VOID = new Set([
|
|
7
|
+
'area',
|
|
8
|
+
'base',
|
|
9
|
+
'br',
|
|
10
|
+
'col',
|
|
11
|
+
'embed',
|
|
12
|
+
'hr',
|
|
13
|
+
'img',
|
|
14
|
+
'input',
|
|
15
|
+
'link',
|
|
16
|
+
'meta',
|
|
17
|
+
'source',
|
|
18
|
+
'track',
|
|
19
|
+
'wbr',
|
|
20
|
+
]);
|
|
21
|
+
export function parseTemplate(strings) {
|
|
22
|
+
const src = strings.reduce((acc, s, i) => acc + s + (i < strings.length - 1 ? MARK + i + MARK : ''), '');
|
|
23
|
+
let i = 0;
|
|
24
|
+
const root = { type: 'root', children: [] };
|
|
25
|
+
const stack = [root];
|
|
26
|
+
const top = () => stack[stack.length - 1];
|
|
27
|
+
const pushText = (raw) => {
|
|
28
|
+
let rest = raw;
|
|
29
|
+
for (;;) {
|
|
30
|
+
if (!rest)
|
|
31
|
+
return;
|
|
32
|
+
const m = holeRe.exec(rest);
|
|
33
|
+
if (!m) {
|
|
34
|
+
top().children.push({ type: 'text', value: rest });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (m.index > 0)
|
|
38
|
+
top().children.push({ type: 'text', value: rest.slice(0, m.index) });
|
|
39
|
+
top().children.push({ type: 'hole', index: Number(m[1]) });
|
|
40
|
+
rest = rest.slice(m.index + m[0].length);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
while (i < src.length) {
|
|
44
|
+
const lt = src.indexOf('<', i);
|
|
45
|
+
if (lt === -1) {
|
|
46
|
+
pushText(src.slice(i));
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
pushText(src.slice(i, lt));
|
|
50
|
+
if (src.startsWith('<!--', lt)) {
|
|
51
|
+
i = src.indexOf('-->', lt) + 3;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (src[lt + 1] === '/') {
|
|
55
|
+
const gt = src.indexOf('>', lt);
|
|
56
|
+
if (stack.length > 1)
|
|
57
|
+
stack.pop();
|
|
58
|
+
i = gt + 1;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
let j = lt + 1;
|
|
62
|
+
while (j < src.length && /[^\s/>]/.test(src[j]))
|
|
63
|
+
j++;
|
|
64
|
+
const tag = src.slice(lt + 1, j);
|
|
65
|
+
const attrs = [];
|
|
66
|
+
for (;;) {
|
|
67
|
+
while (j < src.length && /\s/.test(src[j]))
|
|
68
|
+
j++;
|
|
69
|
+
if (src[j] === '>' || src.startsWith('/>', j))
|
|
70
|
+
break;
|
|
71
|
+
let k = j;
|
|
72
|
+
while (k < src.length && /[^\s=/>]/.test(src[k]))
|
|
73
|
+
k++;
|
|
74
|
+
const name = src.slice(j, k);
|
|
75
|
+
if (!name) {
|
|
76
|
+
j = k + 1;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
while (k < src.length && /\s/.test(src[k]))
|
|
80
|
+
k++;
|
|
81
|
+
if (src[k] !== '=') {
|
|
82
|
+
attrs.push({ name, value: '' });
|
|
83
|
+
j = k;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
k++;
|
|
87
|
+
while (k < src.length && /\s/.test(src[k]))
|
|
88
|
+
k++;
|
|
89
|
+
let raw;
|
|
90
|
+
const ch = src[k];
|
|
91
|
+
if (ch === '"' || ch === "'") {
|
|
92
|
+
const end = src.indexOf(ch, k + 1);
|
|
93
|
+
raw = src.slice(k + 1, end);
|
|
94
|
+
k = end + 1;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
let e = k;
|
|
98
|
+
while (e < src.length && !/[\s/>]/.test(src[e]))
|
|
99
|
+
e++;
|
|
100
|
+
raw = src.slice(k, e);
|
|
101
|
+
k = e;
|
|
102
|
+
}
|
|
103
|
+
const hm = holeRe.exec(raw);
|
|
104
|
+
if (hm && hm[0] === raw)
|
|
105
|
+
attrs.push({ name, hole: Number(hm[1]) });
|
|
106
|
+
else
|
|
107
|
+
attrs.push({ name, value: raw });
|
|
108
|
+
j = k;
|
|
109
|
+
}
|
|
110
|
+
const selfClosing = src.startsWith('/>', j);
|
|
111
|
+
const gt = src.indexOf('>', j);
|
|
112
|
+
const el = { type: 'el', tag, attrs, children: [] };
|
|
113
|
+
top().children.push(el);
|
|
114
|
+
if (!selfClosing && !VOID.has(tag))
|
|
115
|
+
stack.push(el);
|
|
116
|
+
i = gt + 1;
|
|
117
|
+
}
|
|
118
|
+
return root;
|
|
119
|
+
}
|
|
120
|
+
const cache = new WeakMap();
|
|
121
|
+
export function templateFor(strings) {
|
|
122
|
+
let t = cache.get(strings);
|
|
123
|
+
if (!t) {
|
|
124
|
+
t = parseTemplate(strings);
|
|
125
|
+
cache.set(strings, t);
|
|
126
|
+
}
|
|
127
|
+
return t;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../../../packages/ketjs-view/src/template.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ketvietlab/ketjs-view",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Ket view layer — signals, surgical DOM rendering, SSR, hydration and islands. Browser-safe, zero dependencies.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/ketvietlab/ketjs.git",
|
|
12
|
+
"directory": "packages/ketjs-view"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/ketvietlab/ketjs#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/ketvietlab/ketjs/issues"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"signals",
|
|
20
|
+
"ssr",
|
|
21
|
+
"hydration",
|
|
22
|
+
"islands",
|
|
23
|
+
"typescript"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=24.0.0"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"prepack": "npm run build --prefix ../.."
|
|
30
|
+
},
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"default": "./dist/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./jsx-runtime": {
|
|
37
|
+
"types": "./dist/jsx-runtime.d.ts",
|
|
38
|
+
"default": "./dist/jsx-runtime.js"
|
|
39
|
+
},
|
|
40
|
+
"./jsx-dev-runtime": {
|
|
41
|
+
"types": "./dist/jsx-dev-runtime.d.ts",
|
|
42
|
+
"default": "./dist/jsx-dev-runtime.js"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public",
|
|
48
|
+
"provenance": true,
|
|
49
|
+
"registry": "https://registry.npmjs.org/"
|
|
50
|
+
},
|
|
51
|
+
"files": [
|
|
52
|
+
"dist"
|
|
53
|
+
]
|
|
54
|
+
}
|