@typed/template 0.3.0 → 0.3.2
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/dist/cjs/internal/EventSource.js +46 -19
- package/dist/cjs/internal/EventSource.js.map +1 -1
- package/dist/cjs/internal/chunks.js +15 -1
- package/dist/cjs/internal/chunks.js.map +1 -1
- package/dist/cjs/internal/errors.js +4 -0
- package/dist/cjs/internal/errors.js.map +1 -1
- package/dist/cjs/internal/hydrate.js +92 -58
- package/dist/cjs/internal/hydrate.js.map +1 -1
- package/dist/cjs/internal/parser.js +14 -6
- package/dist/cjs/internal/parser.js.map +1 -1
- package/dist/cjs/internal/render.js +17 -151
- package/dist/cjs/internal/render.js.map +1 -1
- package/dist/dts/internal/EventSource.d.ts.map +1 -1
- package/dist/dts/internal/chunks.d.ts +1 -0
- package/dist/dts/internal/chunks.d.ts.map +1 -1
- package/dist/dts/internal/errors.d.ts +1 -0
- package/dist/dts/internal/errors.d.ts.map +1 -1
- package/dist/dts/internal/hydrate.d.ts +9 -16
- package/dist/dts/internal/hydrate.d.ts.map +1 -1
- package/dist/dts/internal/parser.d.ts.map +1 -1
- package/dist/dts/internal/render.d.ts +0 -14
- package/dist/dts/internal/render.d.ts.map +1 -1
- package/dist/esm/internal/EventSource.js +51 -21
- package/dist/esm/internal/EventSource.js.map +1 -1
- package/dist/esm/internal/chunks.js +13 -0
- package/dist/esm/internal/chunks.js.map +1 -1
- package/dist/esm/internal/errors.js +3 -0
- package/dist/esm/internal/errors.js.map +1 -1
- package/dist/esm/internal/hydrate.js +94 -56
- package/dist/esm/internal/hydrate.js.map +1 -1
- package/dist/esm/internal/parser.js +16 -7
- package/dist/esm/internal/parser.js.map +1 -1
- package/dist/esm/internal/render.js +18 -147
- package/dist/esm/internal/render.js.map +1 -1
- package/package.json +2 -2
- package/src/internal/EventSource.ts +63 -34
- package/src/internal/chunks.ts +16 -0
- package/src/internal/errors.ts +4 -0
- package/src/internal/hydrate.ts +124 -77
- package/src/internal/parser.ts +17 -8
- package/src/internal/render.ts +30 -293
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/internal/parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/internal/parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAe1C;;GAEG;AACH,eAAO,MAAM,qBAAqB,aAOhC,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,aAiB5B,CAAA;AAEF,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAA;CACjE;AAED,wBAAgB,KAAK,CAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAE/E;AAmoBD,eAAO,MAAM,MAAM,EAAE,MAAmF,CAAA;AAMxG;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,UAc1D"}
|
|
@@ -1,30 +1,16 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import type { Cause } from "effect/Cause";
|
|
3
|
-
import * as Context from "effect/Context";
|
|
4
|
-
import { Scope } from "effect/Scope";
|
|
5
2
|
import type { BrowserEntry } from "../Entry.js";
|
|
6
|
-
import type { Part, Parts, SparsePart } from "../Part.js";
|
|
7
|
-
import type { Placeholder } from "../Placeholder.js";
|
|
8
3
|
import type { ToRendered } from "../Render.js";
|
|
9
|
-
import type { Renderable } from "../Renderable.js";
|
|
10
4
|
import type { RenderContext } from "../RenderContext.js";
|
|
11
5
|
import type { RenderEvent } from "../RenderEvent.js";
|
|
12
6
|
import type { RenderTemplate } from "../RenderTemplate.js";
|
|
13
7
|
import type * as Template from "../Template.js";
|
|
14
|
-
import { type EventSource } from "./EventSource.js";
|
|
15
|
-
import { HydrateContext } from "./HydrateContext.js";
|
|
16
|
-
import type { IndexRefCounter } from "./indexRefCounter.js";
|
|
17
|
-
import type { ParentChildNodes } from "./utils.js";
|
|
18
8
|
/**
|
|
19
9
|
* Here for "standard" browser rendering, a TemplateInstance is effectively a live
|
|
20
10
|
* view into the contents rendered by the Template.
|
|
21
11
|
*/
|
|
22
12
|
export declare const renderTemplate: (document: Document, renderContext: RenderContext) => RenderTemplate;
|
|
23
|
-
export declare function renderValues<Values extends ReadonlyArray<Renderable<any, any>>>(values: Values, parts: Parts, refCounter: IndexRefCounter, ctx: Context.Context<any> | Context.Context<never>, makeHydrateContext?: (index: number) => HydrateContext): Effect.Effect<Placeholder.Context<Values[number]> | Scope, never, void>;
|
|
24
|
-
export declare function renderSparsePart(values: ReadonlyArray<Renderable<any, any>>, part: SparsePart, refCounter: IndexRefCounter): Effect.Effect<unknown, never, import("effect/Fiber").RuntimeFiber<unknown, void>>;
|
|
25
|
-
export declare function renderPart<Values extends ReadonlyArray<Renderable<any, any>>>(values: Values, part: Part, refCounter: IndexRefCounter, ctx: Context.Context<any> | Context.Context<never>, hydrateCtx?: () => HydrateContext): Effect.Effect<any, never, void>;
|
|
26
13
|
export declare function attachRoot<T extends RenderEvent | null>(cache: RenderContext["renderCache"], where: HTMLElement, what: RenderEvent | null): Effect.Effect<never, never, ToRendered<T>>;
|
|
27
14
|
export declare function getBrowserEntry(document: Document, ctx: RenderContext, templateStrings: TemplateStringsArray): BrowserEntry;
|
|
28
|
-
export declare function buildParts<E>(document: Document, ctx: RenderContext, template: Template.Template, content: ParentChildNodes, eventSource: EventSource, onCause: (cause: Cause<E>) => Effect.Effect<never, never, void>, isHydrating: boolean): Parts;
|
|
29
15
|
export declare function buildTemplate(document: Document, { nodes }: Template.Template): DocumentFragment;
|
|
30
16
|
//# sourceMappingURL=render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/internal/render.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/internal/render.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAS/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAsf/C;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,KAAK,cAmEhF,CAAA;AAkEH,wBAAgB,UAAU,CAAC,CAAC,SAAS,WAAW,GAAG,IAAI,EACrD,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,EACnC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,WAAW,GAAG,IAAI,GACvB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAiB5C;AAiBD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,aAAa,EAClB,eAAe,EAAE,oBAAoB,GACpC,YAAY,CAkBd;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,gBAAgB,CAQhG"}
|
|
@@ -1,21 +1,36 @@
|
|
|
1
1
|
import { Effect, Scope } from "effect";
|
|
2
|
+
import * as Fiber from "effect/Fiber";
|
|
2
3
|
import * as Runtime from "effect/Runtime";
|
|
3
4
|
import { getElements } from "../ElementSource";
|
|
4
5
|
const disposable = (f) => ({
|
|
5
6
|
[Symbol.dispose]: f
|
|
6
7
|
});
|
|
8
|
+
const dispose = (d) => d[Symbol.dispose]();
|
|
7
9
|
export function makeEventSource() {
|
|
8
10
|
const bubbleListeners = new Map();
|
|
9
11
|
const captureListeners = new Map();
|
|
10
12
|
function addListener(listeners, event, entry) {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
const sets = listeners.get(event);
|
|
14
|
+
const isOnce = entry[1].options?.once === true;
|
|
15
|
+
if (sets === undefined) {
|
|
16
|
+
const normal = new Set();
|
|
17
|
+
const once = new Set();
|
|
18
|
+
if (isOnce) {
|
|
19
|
+
once.add(entry);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
normal.add(entry);
|
|
23
|
+
}
|
|
24
|
+
listeners.set(event, [normal, once]);
|
|
16
25
|
}
|
|
17
26
|
else {
|
|
18
|
-
|
|
27
|
+
const [normal, once] = sets;
|
|
28
|
+
if (isOnce) {
|
|
29
|
+
once.add(entry);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
normal.add(entry);
|
|
33
|
+
}
|
|
19
34
|
}
|
|
20
35
|
}
|
|
21
36
|
function addEventListener(element, event, handler) {
|
|
@@ -28,35 +43,45 @@ export function makeEventSource() {
|
|
|
28
43
|
}
|
|
29
44
|
function setupBubbleListeners(element, run) {
|
|
30
45
|
const disposables = [];
|
|
31
|
-
for (const [event,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
46
|
+
for (const [event, sets] of bubbleListeners) {
|
|
47
|
+
for (const handlers of sets) {
|
|
48
|
+
const listener = (ev) => run(Effect.forEach(handlers, ([el, handler]) => ev.target === el || el.contains(ev.target) ? handler.handler(ev) : Effect.unit));
|
|
49
|
+
element.addEventListener(event, listener, getDerivedAddEventListenerOptions(handlers));
|
|
50
|
+
disposables.push(disposable(() => element.removeEventListener(event, listener)));
|
|
51
|
+
}
|
|
35
52
|
}
|
|
36
53
|
return disposables;
|
|
37
54
|
}
|
|
38
55
|
function setupCaptureListeners(element, run) {
|
|
39
56
|
const disposables = [];
|
|
40
|
-
for (const [event,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
57
|
+
for (const [event, sets] of captureListeners) {
|
|
58
|
+
for (const handlers of sets) {
|
|
59
|
+
const listener = (ev) => run(Effect.forEach(handlers, ([el, handler]) => ev.target === el || el.contains(ev.target)
|
|
60
|
+
? handler.handler(proxyCurrentTargetForCaptureEvents(ev, el))
|
|
61
|
+
: Effect.unit));
|
|
62
|
+
element.addEventListener(event, listener, getDerivedAddEventListenerOptions(handlers));
|
|
63
|
+
disposables.push(disposable(() => element.removeEventListener(event, listener)));
|
|
64
|
+
}
|
|
46
65
|
}
|
|
47
66
|
return disposables;
|
|
48
67
|
}
|
|
49
68
|
function setup(rendered, scope) {
|
|
50
69
|
const hasBubbleListeners = bubbleListeners.size > 0;
|
|
51
70
|
const hasCaptureListeners = captureListeners.size > 0;
|
|
52
|
-
|
|
71
|
+
const elements = getElements(rendered);
|
|
72
|
+
if (elements.length === 0 || (!hasBubbleListeners && !hasCaptureListeners)) {
|
|
53
73
|
return Effect.unit;
|
|
54
74
|
}
|
|
55
75
|
return Effect.flatMap(Effect.runtime(), (runtime) => {
|
|
56
|
-
const elements = getElements(rendered);
|
|
57
76
|
const disposables = [];
|
|
77
|
+
const fibers = new Map();
|
|
58
78
|
const runFork = Runtime.runFork(runtime);
|
|
59
|
-
const run = (effect) =>
|
|
79
|
+
const run = (effect) => {
|
|
80
|
+
const id = Symbol();
|
|
81
|
+
const fiber = runFork(Effect.onExit(effect, () => Effect.sync(() => fibers.delete(id))));
|
|
82
|
+
fibers.set(id, fiber);
|
|
83
|
+
return fiber;
|
|
84
|
+
};
|
|
60
85
|
for (const element of elements) {
|
|
61
86
|
if (hasBubbleListeners) {
|
|
62
87
|
disposables.push(...setupBubbleListeners(element, run));
|
|
@@ -65,7 +90,12 @@ export function makeEventSource() {
|
|
|
65
90
|
disposables.push(...setupCaptureListeners(element, run));
|
|
66
91
|
}
|
|
67
92
|
}
|
|
68
|
-
return Scope.addFinalizer(scope, Effect.
|
|
93
|
+
return Scope.addFinalizer(scope, Effect.suspend(() => {
|
|
94
|
+
disposables.forEach(dispose);
|
|
95
|
+
if (fibers.size === 0)
|
|
96
|
+
return Effect.unit;
|
|
97
|
+
return Fiber.interruptAll(fibers.values());
|
|
98
|
+
}));
|
|
69
99
|
});
|
|
70
100
|
}
|
|
71
101
|
return {
|
|
@@ -84,7 +114,7 @@ function proxyCurrentTargetForCaptureEvents(event, currentTarget) {
|
|
|
84
114
|
function getDerivedAddEventListenerOptions(entries) {
|
|
85
115
|
const hs = Array.from(entries);
|
|
86
116
|
return {
|
|
87
|
-
once: hs.
|
|
117
|
+
once: hs.every((h) => h[1].options?.once === true),
|
|
88
118
|
passive: hs.every((h) => h[1].options?.passive === true)
|
|
89
119
|
};
|
|
90
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventSource.js","sourceRoot":"","sources":["../../../src/internal/EventSource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"EventSource.js","sourceRoot":"","sources":["../../../src/internal/EventSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,19 @@ export const getAllTextUntilElementClose = (tagName) => {
|
|
|
28
28
|
return chunker(new RegExp(`([^<]+)(\\s*<\\/${tagName}\\s*>)`, "gi"));
|
|
29
29
|
};
|
|
30
30
|
export const getWhitespace = chunker(/(\s+)/g);
|
|
31
|
+
const tagNameRegexCache = new Map();
|
|
32
|
+
const tagNameRegex = (tagName) => {
|
|
33
|
+
return `(<\\/\\s*${tagName}\\s*>)`;
|
|
34
|
+
};
|
|
35
|
+
export const getClosingTagName = (tagName) => {
|
|
36
|
+
const current = tagNameRegexCache.get(tagName);
|
|
37
|
+
if (current !== undefined) {
|
|
38
|
+
return current;
|
|
39
|
+
}
|
|
40
|
+
const matcher = chunker(new RegExp(tagNameRegex(tagName), "gi"));
|
|
41
|
+
tagNameRegexCache.set(tagName, matcher);
|
|
42
|
+
return matcher;
|
|
43
|
+
};
|
|
31
44
|
function chunker(regex) {
|
|
32
45
|
return (str, pos) => {
|
|
33
46
|
regex.lastIndex = pos;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunks.js","sourceRoot":"","sources":["../../../src/internal/chunks.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAA;AAE5D,MAAM,CAAC,MAAM,UAAU,GAAG,0BAA0B,CAAA;AAEpD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAA;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,uCAAuC,CAAC,CAAA;AAE7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;AAEtD,+BAA+B;AAC/B,sEAAsE;AACtE,6BAA6B;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AAEzF,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AAEzD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAEpD,gDAAgD;AAChD,qFAAqF;AACrF,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAA;AAExE,gDAAgD;AAChD,sFAAsF;AACtF,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAEhE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAC3C,uDAAuD,CACxD,CAAA;AAED,0EAA0E;AAC1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAC9C,uDAAuD,CACxD,CAAA;AAED,oDAAoD;AAEpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC,sDAAsD,CAAC,CAAA;AAElG,qEAAqE;AACrE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAe,EAAE,EAAE;IAC7D,OAAO,OAAO,CAAC,IAAI,MAAM,CAAC,mBAAmB,OAAO,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;AACtE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE9C,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,CAAC,GAAW,EAAE,GAAW,EAAyB,EAAE;QACzD,KAAK,CAAC,SAAS,GAAG,GAAG,CAAA;QACrB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC7B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAA;QAEnB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;YAClC,OAAM;QACR,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;gBACvB,KAAK;aACG,CAAA;QACZ,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"chunks.js","sourceRoot":"","sources":["../../../src/internal/chunks.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,4 +12,7 @@ export class CouldNotFindRootElement extends Error {
|
|
|
12
12
|
this.partIndex = partIndex;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
+
export function isHydrationError(e) {
|
|
16
|
+
return e instanceof CouldNotFindCommentError || e instanceof CouldNotFindRootElement;
|
|
17
|
+
}
|
|
15
18
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/internal/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAC5B;IAArB,YAAqB,SAAiB;QACpC,KAAK,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAA;QADlC,cAAS,GAAT,SAAS,CAAQ;IAEtC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAC3B;IAArB,YAAqB,SAAiB;QACpC,KAAK,CAAC,yCAAyC,SAAS,EAAE,CAAC,CAAA;QADxC,cAAS,GAAT,SAAS,CAAQ;IAEtC,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/internal/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAC5B;IAArB,YAAqB,SAAiB;QACpC,KAAK,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAA;QADlC,cAAS,GAAT,SAAS,CAAQ;IAEtC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAC3B;IAArB,YAAqB,SAAiB;QACpC,KAAK,CAAC,yCAAyC,SAAS,EAAE,CAAC,CAAA;QADxC,cAAS,GAAT,SAAS,CAAQ;IAEtC,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAO,CAAC,YAAY,wBAAwB,IAAI,CAAC,YAAY,uBAAuB,CAAA;AACtF,CAAC"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import * as Fx from "@typed/fx/Fx";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import { DomRenderEvent } from "../RenderEvent.js";
|
|
4
|
-
import {
|
|
4
|
+
import { indexRefCounter2 } from "./indexRefCounter.js";
|
|
5
5
|
import { unsafeGet } from "@typed/context";
|
|
6
|
+
import { Either } from "effect";
|
|
6
7
|
import { Scope } from "effect/Scope";
|
|
7
8
|
import { CouldNotFindCommentError, CouldNotFindRootElement } from "./errors.js";
|
|
8
9
|
import { makeEventSource } from "./EventSource.js";
|
|
9
10
|
import { HydrateContext } from "./HydrateContext.js";
|
|
10
|
-
import {
|
|
11
|
+
import { getBrowserEntry, renderPart2, renderTemplate } from "./render.js";
|
|
11
12
|
import { findPath, getPreviousNodes, isComment, isCommentWithValue, isHtmlElement } from "./utils.js";
|
|
12
|
-
// TODO: Handle missing comment errors
|
|
13
13
|
/**
|
|
14
14
|
* Here for "standard" browser rendering, a TemplateInstance is effectively a live
|
|
15
15
|
* view into the contents rendered by the Template.
|
|
@@ -18,7 +18,6 @@ export const hydrateTemplate = (document, renderContext) => {
|
|
|
18
18
|
const render_ = renderTemplate(document, renderContext);
|
|
19
19
|
return (templateStrings, values) => {
|
|
20
20
|
return Fx.make((sink) => Effect.gen(function* (_) {
|
|
21
|
-
const eventSource = makeEventSource();
|
|
22
21
|
const context = yield* _(Effect.context());
|
|
23
22
|
const hydrateCtx = unsafeGet(context, HydrateContext);
|
|
24
23
|
const scope = unsafeGet(context, Scope);
|
|
@@ -26,30 +25,57 @@ export const hydrateTemplate = (document, renderContext) => {
|
|
|
26
25
|
if (hydrateCtx.hydrate === false) {
|
|
27
26
|
return render_(templateStrings, values);
|
|
28
27
|
}
|
|
29
|
-
const
|
|
28
|
+
const either = getHydrateEntry({
|
|
30
29
|
...hydrateCtx,
|
|
31
30
|
document,
|
|
32
31
|
renderContext,
|
|
33
|
-
|
|
34
|
-
strings: templateStrings,
|
|
35
|
-
onCause: sink.onFailure
|
|
32
|
+
strings: templateStrings
|
|
36
33
|
});
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// Do the work
|
|
41
|
-
yield* _(renderValues(values, parts, refCounter, context, (index) => ({
|
|
42
|
-
where,
|
|
43
|
-
rootIndex: index,
|
|
44
|
-
parentTemplate: template,
|
|
45
|
-
hydrate: true
|
|
46
|
-
})));
|
|
47
|
-
// Wait for initial work to be completed
|
|
48
|
-
yield* _(refCounter.wait);
|
|
34
|
+
if (Either.isLeft(either)) {
|
|
35
|
+
hydrateCtx.hydrate = false;
|
|
36
|
+
return render_(templateStrings, values);
|
|
49
37
|
}
|
|
50
|
-
|
|
51
|
-
|
|
38
|
+
const { template, where, wire } = either.right;
|
|
39
|
+
if (values.length === 0)
|
|
40
|
+
return yield* _(sink.onSuccess(DomRenderEvent(wire)), Effect.zipRight(Effect.never));
|
|
41
|
+
const makeHydrateContext = (index) => ({
|
|
42
|
+
where,
|
|
43
|
+
rootIndex: index,
|
|
44
|
+
parentTemplate: template,
|
|
45
|
+
hydrate: true
|
|
46
|
+
});
|
|
47
|
+
const refCounter = yield* _(indexRefCounter2());
|
|
48
|
+
const ctx = {
|
|
49
|
+
context,
|
|
50
|
+
document,
|
|
51
|
+
eventSource: makeEventSource(),
|
|
52
|
+
expected: 0,
|
|
53
|
+
refCounter,
|
|
54
|
+
renderContext,
|
|
55
|
+
onCause: sink.onFailure,
|
|
56
|
+
values,
|
|
57
|
+
makeHydrateContext
|
|
58
|
+
};
|
|
59
|
+
// Connect our interpolated values to our template parts
|
|
60
|
+
const effects = [];
|
|
61
|
+
for (const [part, path] of template.parts) {
|
|
62
|
+
const eff = renderPart2(part, where, path, ctx);
|
|
63
|
+
if (eff !== null) {
|
|
64
|
+
effects.push(...(Array.isArray(eff) ? eff : [eff]));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Fork any effects necessary
|
|
68
|
+
if (effects.length > 0) {
|
|
69
|
+
yield* _(Effect.forkAll(effects));
|
|
70
|
+
}
|
|
71
|
+
// Set the element when it is ready
|
|
72
|
+
yield* _(ctx.eventSource.setup(wire, scope));
|
|
73
|
+
// Emit our DomRenderEvent
|
|
52
74
|
yield* _(sink.onSuccess(DomRenderEvent(wire)));
|
|
75
|
+
// Stop hydrating
|
|
76
|
+
hydrateCtx.hydrate = false;
|
|
77
|
+
// Ensure our templates last forever in the DOM environment
|
|
78
|
+
// so event listeners are kept attached to the current Scope.
|
|
53
79
|
yield* _(Effect.never);
|
|
54
80
|
}));
|
|
55
81
|
};
|
|
@@ -65,44 +91,54 @@ const START = "typed-start";
|
|
|
65
91
|
const END = "typed-end";
|
|
66
92
|
// Finds all of the childNodes between the "typed-start" and "typed-end" comments
|
|
67
93
|
export function findRootChildNodes(where) {
|
|
68
|
-
|
|
69
|
-
let
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
94
|
+
let start = -1;
|
|
95
|
+
let end = -1;
|
|
96
|
+
const { childNodes } = where;
|
|
97
|
+
const length = childNodes.length;
|
|
98
|
+
for (let i = 0; i < length; i++) {
|
|
99
|
+
const node = childNodes[i];
|
|
100
|
+
if (node.nodeType === node.COMMENT_NODE && node.nodeValue === START) {
|
|
101
|
+
start = i;
|
|
102
|
+
break;
|
|
78
103
|
}
|
|
79
104
|
}
|
|
80
|
-
for (let i =
|
|
81
|
-
const node =
|
|
82
|
-
if (node.nodeType === node.COMMENT_NODE) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
105
|
+
for (let i = length - 1; i >= start; i--) {
|
|
106
|
+
const node = childNodes[i];
|
|
107
|
+
if (node.nodeType === node.COMMENT_NODE && node.nodeValue === END) {
|
|
108
|
+
end = i;
|
|
109
|
+
break;
|
|
87
110
|
}
|
|
88
111
|
}
|
|
89
|
-
|
|
90
|
-
|
|
112
|
+
// If we can't find the start and end comments, just return all childNodes
|
|
113
|
+
if (start === -1 && end === -1) {
|
|
114
|
+
return Array.from(childNodes);
|
|
91
115
|
}
|
|
92
|
-
|
|
116
|
+
start = start === -1 ? 0 : start;
|
|
117
|
+
end = end === -1 ? length - 1 : end;
|
|
118
|
+
const rootChildNodes = Array(end - start);
|
|
119
|
+
for (let i = start + 1, j = 0; i <= end; i++) {
|
|
120
|
+
rootChildNodes[j++] = childNodes[i];
|
|
121
|
+
}
|
|
122
|
+
return rootChildNodes;
|
|
93
123
|
}
|
|
94
124
|
export function findTemplateResultPartChildNodes(where, parentTemplate, childTemplate, partIndex, childIndex) {
|
|
95
125
|
const [, path] = parentTemplate.parts[partIndex];
|
|
96
126
|
const parentNode = findPath(where, path);
|
|
97
|
-
const
|
|
127
|
+
const childNodesEither = findPartChildNodes(parentNode, childTemplate.hash, partIndex);
|
|
128
|
+
if (Either.isLeft(childNodesEither))
|
|
129
|
+
return Either.left(childNodesEither.left);
|
|
130
|
+
const childNodes = childNodesEither.right;
|
|
98
131
|
const parentChildNodes = {
|
|
99
132
|
parentNode,
|
|
100
133
|
childNodes: childIndex !== undefined ? [childNodes[childIndex]] : childNodes
|
|
101
134
|
};
|
|
102
|
-
return parentChildNodes;
|
|
135
|
+
return Either.right(parentChildNodes);
|
|
103
136
|
}
|
|
104
137
|
export function findPartChildNodes({ childNodes }, hash, partIndex) {
|
|
105
|
-
const
|
|
138
|
+
const either = findPartComment(childNodes, partIndex);
|
|
139
|
+
if (Either.isLeft(either))
|
|
140
|
+
return Either.left(either.left);
|
|
141
|
+
const [comment, index] = either.right;
|
|
106
142
|
const nodes = [];
|
|
107
143
|
const previousHoleValue = `hole${partIndex - 1}`;
|
|
108
144
|
if (hash) {
|
|
@@ -117,30 +153,33 @@ export function findPartChildNodes({ childNodes }, hash, partIndex) {
|
|
|
117
153
|
}
|
|
118
154
|
}
|
|
119
155
|
else {
|
|
120
|
-
return [...getPreviousNodes(comment, partIndex), comment];
|
|
156
|
+
return Either.right([...getPreviousNodes(comment, partIndex), comment]);
|
|
121
157
|
}
|
|
122
158
|
if (nodes.length === 0) {
|
|
123
|
-
|
|
159
|
+
return Either.left(new CouldNotFindRootElement(partIndex));
|
|
124
160
|
}
|
|
125
161
|
nodes.push(comment);
|
|
126
|
-
return nodes;
|
|
162
|
+
return Either.right(nodes);
|
|
127
163
|
}
|
|
128
164
|
export function findPartComment(childNodes, partIndex) {
|
|
129
165
|
const search = partIndex === -1 ? `typed-end` : `hole${partIndex}`;
|
|
130
166
|
for (let i = 0; i < childNodes.length; ++i) {
|
|
131
167
|
const node = childNodes[i];
|
|
132
168
|
if (isCommentWithValue(node, search)) {
|
|
133
|
-
return [node, i];
|
|
169
|
+
return Either.right([node, i]);
|
|
134
170
|
}
|
|
135
171
|
}
|
|
136
|
-
|
|
172
|
+
return Either.left(new CouldNotFindCommentError(partIndex));
|
|
137
173
|
}
|
|
138
|
-
export function getHydrateEntry({ childIndex, document,
|
|
174
|
+
export function getHydrateEntry({ childIndex, document, parentTemplate, renderContext, rootIndex, strings, where }) {
|
|
139
175
|
const { template } = getBrowserEntry(document, renderContext, strings);
|
|
140
176
|
if (parentTemplate) {
|
|
141
|
-
|
|
177
|
+
const either = findTemplateResultPartChildNodes(where, parentTemplate, template, rootIndex, childIndex);
|
|
178
|
+
if (Either.isLeft(either)) {
|
|
179
|
+
return Either.left(either.left);
|
|
180
|
+
}
|
|
181
|
+
where = either.right;
|
|
142
182
|
}
|
|
143
|
-
const parts = buildParts(document, renderContext, template, where, eventSource, onCause, true);
|
|
144
183
|
const wire = (() => {
|
|
145
184
|
if (!parentTemplate) {
|
|
146
185
|
const childNodes = Array.from(where.childNodes).filter((node) => isComment(node) ? !isCommentWithValue(node, END) : true);
|
|
@@ -154,11 +193,10 @@ export function getHydrateEntry({ childIndex, document, eventSource, onCause, pa
|
|
|
154
193
|
}
|
|
155
194
|
return Array.from(where.childNodes).filter((node) => !isCommentWithValue(node, `hole${rootIndex}`));
|
|
156
195
|
})();
|
|
157
|
-
return {
|
|
196
|
+
return Either.right({
|
|
158
197
|
template,
|
|
159
198
|
wire,
|
|
160
|
-
parts,
|
|
161
199
|
where
|
|
162
|
-
};
|
|
200
|
+
});
|
|
163
201
|
}
|
|
164
202
|
//# sourceMappingURL=hydrate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydrate.js","sourceRoot":"","sources":["../../../src/internal/hydrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"hydrate.js","sourceRoot":"","sources":["../../../src/internal/hydrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import * as Chunk from "effect/Chunk";
|
|
|
2
2
|
import { globalValue } from "effect/GlobalValue";
|
|
3
3
|
import * as Option from "effect/Option";
|
|
4
4
|
import * as Template from "../Template.js";
|
|
5
|
-
import { getPart, getStrictPart, getTextUntilCloseBrace, getTextUntilPart, getWhitespace, PART_STRING } from "./chunks.js";
|
|
5
|
+
import { getClosingTagName, getPart, getStrictPart, getTextUntilCloseBrace, getTextUntilPart, getWhitespace, PART_STRING } from "./chunks.js";
|
|
6
6
|
// TODO: Consider ways to surface useful errors and warnings.
|
|
7
7
|
// TODO: Profile for performance optimization
|
|
8
8
|
/**
|
|
@@ -66,6 +66,7 @@ const isWhitespaceToken = (input, pos) => SPACE_REGEX.test(input[pos]);
|
|
|
66
66
|
const isOpenTagEndToken = (input, pos) => input[pos] === chars.greaterThan;
|
|
67
67
|
const isSelfClosingTagEndToken = (input, pos) => input[pos] === chars.slash && input[pos + 1] === chars.greaterThan;
|
|
68
68
|
const isCommentEndToken = (input, pos) => input[pos] === chars.hypen && input[pos + 1] === chars.hypen && input[pos + 2] === chars.greaterThan;
|
|
69
|
+
const isGreaterThanToken = (input, pos) => input[pos] === chars.greaterThan;
|
|
69
70
|
const Continue = (a) => ["continue", a];
|
|
70
71
|
const Break = (a) => ["break", Option.fromNullable(a)];
|
|
71
72
|
const Skip = ["skip"];
|
|
@@ -182,9 +183,12 @@ class ParserImpl {
|
|
|
182
183
|
this.consumeAmount(2);
|
|
183
184
|
return [this.parseComment()];
|
|
184
185
|
}
|
|
185
|
-
else {
|
|
186
|
+
else if (nextChar.toLowerCase() === "d") {
|
|
186
187
|
return [this.parseDocType()];
|
|
187
188
|
}
|
|
189
|
+
else {
|
|
190
|
+
throw new SyntaxError(`Unknown comment type ${nextChar}`);
|
|
191
|
+
}
|
|
188
192
|
}
|
|
189
193
|
else if (nextChar === "/") { // Self-closing tag
|
|
190
194
|
return this.selfClosingTagEnd();
|
|
@@ -242,9 +246,14 @@ class ParserImpl {
|
|
|
242
246
|
const children = this.parseTemplateChildren();
|
|
243
247
|
this.path.pop();
|
|
244
248
|
const element = new Template.ElementNode(tagName, attributes, children);
|
|
249
|
+
this.skipWhitespace();
|
|
250
|
+
this.consumeClosingTag(tagName);
|
|
245
251
|
return element;
|
|
246
252
|
}
|
|
247
253
|
}
|
|
254
|
+
consumeClosingTag(tagName) {
|
|
255
|
+
this.chunk(getClosingTagName(tagName));
|
|
256
|
+
}
|
|
248
257
|
parseSelfClosingElement(tagName) {
|
|
249
258
|
const attributes = this.parseAttributes();
|
|
250
259
|
return new Template.SelfClosingElementNode(tagName, attributes);
|
|
@@ -272,7 +281,7 @@ class ParserImpl {
|
|
|
272
281
|
return this.addPart(new Template.SparseCommentNode(textAndParts));
|
|
273
282
|
}
|
|
274
283
|
parseDocType() {
|
|
275
|
-
this.parseTextUntil(
|
|
284
|
+
this.parseTextUntil(isGreaterThanToken);
|
|
276
285
|
this.consumeAmount(1);
|
|
277
286
|
this.skipWhitespace();
|
|
278
287
|
return new Template.DocType("html");
|
|
@@ -406,16 +415,16 @@ class ParserImpl {
|
|
|
406
415
|
return f(index);
|
|
407
416
|
}
|
|
408
417
|
parseTextUntil(predicate) {
|
|
409
|
-
|
|
418
|
+
const start = this.pos;
|
|
419
|
+
let i = 0;
|
|
410
420
|
while (this.pos < this.length) {
|
|
411
|
-
const char = this.nextChar();
|
|
412
421
|
if (predicate(this.input, this.pos)) {
|
|
413
422
|
break;
|
|
414
423
|
}
|
|
415
|
-
|
|
424
|
+
i++;
|
|
416
425
|
this.consumeAmount(1);
|
|
417
426
|
}
|
|
418
|
-
return
|
|
427
|
+
return this.input.slice(start, start + i);
|
|
419
428
|
}
|
|
420
429
|
parseTextUntilMany(predicates) {
|
|
421
430
|
const [keys, length] = getPredicatesCache(predicates);
|