@typed/template 0.9.6 → 0.10.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/RenderQueue/package.json +6 -0
- package/dist/cjs/Directive.js +1 -1
- package/dist/cjs/Directive.js.map +1 -1
- package/dist/cjs/ElementRef.js +1 -1
- package/dist/cjs/ElementRef.js.map +1 -1
- package/dist/cjs/ElementSource.js +1 -1
- package/dist/cjs/ElementSource.js.map +1 -1
- package/dist/cjs/EventHandler.js +11 -4
- package/dist/cjs/EventHandler.js.map +1 -1
- package/dist/cjs/Html.js +84 -44
- package/dist/cjs/Html.js.map +1 -1
- package/dist/cjs/HtmlChunk.js +67 -21
- package/dist/cjs/HtmlChunk.js.map +1 -1
- package/dist/cjs/Hydrate.js +6 -6
- package/dist/cjs/Hydrate.js.map +1 -1
- package/dist/cjs/Many.js +4 -4
- package/dist/cjs/Many.js.map +1 -1
- package/dist/cjs/Meta.js +10 -3
- package/dist/cjs/Meta.js.map +1 -1
- package/dist/cjs/Parser.js +1 -1
- package/dist/cjs/Placeholder.js +5 -9
- package/dist/cjs/Placeholder.js.map +1 -1
- package/dist/cjs/Platform.js +7 -5
- package/dist/cjs/Platform.js.map +1 -1
- package/dist/cjs/Render.js +8 -7
- package/dist/cjs/Render.js.map +1 -1
- package/dist/cjs/RenderContext.js +8 -92
- package/dist/cjs/RenderContext.js.map +1 -1
- package/dist/cjs/RenderEvent.js +9 -1
- package/dist/cjs/RenderEvent.js.map +1 -1
- package/dist/cjs/RenderQueue.js +341 -0
- package/dist/cjs/RenderQueue.js.map +1 -0
- package/dist/cjs/RenderTemplate.js +1 -1
- package/dist/cjs/RenderTemplate.js.map +1 -1
- package/dist/cjs/Template.js +12 -0
- package/dist/cjs/Template.js.map +1 -1
- package/dist/cjs/Test.js +64 -33
- package/dist/cjs/Test.js.map +1 -1
- package/dist/cjs/Vitest.js +12 -20
- package/dist/cjs/Vitest.js.map +1 -1
- package/dist/cjs/index.js +6 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/EventSource.js +16 -9
- package/dist/cjs/internal/EventSource.js.map +1 -1
- package/dist/cjs/internal/HydrateContext.js.map +1 -1
- package/dist/cjs/internal/browser.js +11 -10
- package/dist/cjs/internal/browser.js.map +1 -1
- package/dist/cjs/internal/character-entities.js +2141 -0
- package/dist/cjs/internal/character-entities.js.map +1 -0
- package/dist/cjs/internal/errors.js +19 -2
- package/dist/cjs/internal/errors.js.map +1 -1
- package/dist/cjs/internal/indexRefCounter.js +36 -63
- package/dist/cjs/internal/indexRefCounter.js.map +1 -1
- package/dist/cjs/internal/parser.js +18 -17
- package/dist/cjs/internal/parser.js.map +1 -1
- package/dist/cjs/internal/parser2.js +382 -0
- package/dist/cjs/internal/parser2.js.map +1 -0
- package/dist/cjs/internal/server-parts.js +124 -0
- package/dist/cjs/internal/server-parts.js.map +1 -0
- package/dist/cjs/internal/server.js +15 -185
- package/dist/cjs/internal/server.js.map +1 -1
- package/dist/cjs/internal/utils.js +73 -9
- package/dist/cjs/internal/utils.js.map +1 -1
- package/dist/cjs/internal/v2/SyncPart.js +6 -0
- package/dist/cjs/internal/v2/SyncPart.js.map +1 -0
- package/dist/cjs/internal/v2/helpers.js +15 -0
- package/dist/cjs/internal/v2/helpers.js.map +1 -0
- package/dist/cjs/internal/v2/hydrate.js +202 -0
- package/dist/cjs/internal/v2/hydrate.js.map +1 -0
- package/dist/cjs/internal/v2/hydration-template.js +269 -0
- package/dist/cjs/internal/v2/hydration-template.js.map +1 -0
- package/dist/cjs/internal/v2/parts.js +169 -0
- package/dist/cjs/internal/v2/parts.js.map +1 -0
- package/dist/cjs/internal/v2/render-entry.js +110 -0
- package/dist/cjs/internal/v2/render-entry.js.map +1 -0
- package/dist/cjs/internal/v2/render-sync-parts.js +318 -0
- package/dist/cjs/internal/v2/render-sync-parts.js.map +1 -0
- package/dist/cjs/internal/v2/render.js +417 -0
- package/dist/cjs/internal/v2/render.js.map +1 -0
- package/dist/cjs/internal/v2/sync-parts.js +115 -0
- package/dist/cjs/internal/v2/sync-parts.js.map +1 -0
- package/dist/dts/ElementRef.d.ts +1 -1
- package/dist/dts/ElementRef.d.ts.map +1 -1
- package/dist/dts/ElementSource.d.ts +1 -1
- package/dist/dts/ElementSource.d.ts.map +1 -1
- package/dist/dts/EventHandler.d.ts +12 -8
- package/dist/dts/EventHandler.d.ts.map +1 -1
- package/dist/dts/Html.d.ts +6 -5
- package/dist/dts/Html.d.ts.map +1 -1
- package/dist/dts/HtmlChunk.d.ts.map +1 -1
- package/dist/dts/Hydrate.d.ts +1 -3
- package/dist/dts/Hydrate.d.ts.map +1 -1
- package/dist/dts/Many.d.ts +9 -11
- package/dist/dts/Many.d.ts.map +1 -1
- package/dist/dts/Meta.d.ts +5 -1
- package/dist/dts/Meta.d.ts.map +1 -1
- package/dist/dts/Parser.d.ts +1 -1
- package/dist/dts/Parser.d.ts.map +1 -1
- package/dist/dts/Part.d.ts +20 -56
- package/dist/dts/Part.d.ts.map +1 -1
- package/dist/dts/Placeholder.d.ts +6 -10
- package/dist/dts/Placeholder.d.ts.map +1 -1
- package/dist/dts/Platform.d.ts +2 -4
- package/dist/dts/Platform.d.ts.map +1 -1
- package/dist/dts/Render.d.ts +4 -8
- package/dist/dts/Render.d.ts.map +1 -1
- package/dist/dts/RenderContext.d.ts +3 -22
- package/dist/dts/RenderContext.d.ts.map +1 -1
- package/dist/dts/RenderEvent.d.ts +6 -1
- package/dist/dts/RenderEvent.d.ts.map +1 -1
- package/dist/dts/RenderQueue.d.ts +103 -0
- package/dist/dts/RenderQueue.d.ts.map +1 -0
- package/dist/dts/RenderTemplate.d.ts +3 -2
- package/dist/dts/RenderTemplate.d.ts.map +1 -1
- package/dist/dts/Renderable.d.ts +1 -1
- package/dist/dts/Template.d.ts +14 -1
- package/dist/dts/Template.d.ts.map +1 -1
- package/dist/dts/Test.d.ts +14 -1
- package/dist/dts/Test.d.ts.map +1 -1
- package/dist/dts/Vitest.d.ts +11 -8
- package/dist/dts/Vitest.d.ts.map +1 -1
- package/dist/dts/index.d.ts +4 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/EventSource.d.ts +2 -1
- package/dist/dts/internal/EventSource.d.ts.map +1 -1
- package/dist/dts/internal/browser.d.ts +3 -3
- package/dist/dts/internal/browser.d.ts.map +1 -1
- package/dist/dts/internal/character-entities.d.ts +2133 -0
- package/dist/dts/internal/character-entities.d.ts.map +1 -0
- package/dist/dts/internal/errors.d.ts +9 -1
- package/dist/dts/internal/errors.d.ts.map +1 -1
- package/dist/dts/internal/indexRefCounter.d.ts +0 -4
- package/dist/dts/internal/indexRefCounter.d.ts.map +1 -1
- package/dist/dts/internal/parser.d.ts +13 -0
- package/dist/dts/internal/parser.d.ts.map +1 -1
- package/dist/dts/internal/parser2.d.ts +12 -0
- package/dist/dts/internal/parser2.d.ts.map +1 -0
- package/dist/dts/internal/server-parts.d.ts +223 -0
- package/dist/dts/internal/server-parts.d.ts.map +1 -0
- package/dist/dts/internal/server.d.ts +2 -28
- package/dist/dts/internal/server.d.ts.map +1 -1
- package/dist/dts/internal/utils.d.ts +4 -1
- package/dist/dts/internal/utils.d.ts.map +1 -1
- package/dist/dts/internal/v2/SyncPart.d.ts +87 -0
- package/dist/dts/internal/v2/SyncPart.d.ts.map +1 -0
- package/dist/dts/internal/v2/helpers.d.ts +3 -0
- package/dist/dts/internal/v2/helpers.d.ts.map +1 -0
- package/dist/dts/internal/v2/hydrate.d.ts +7 -0
- package/dist/dts/internal/v2/hydrate.d.ts.map +1 -0
- package/dist/dts/internal/v2/hydration-template.d.ts +54 -0
- package/dist/dts/internal/v2/hydration-template.d.ts.map +1 -0
- package/dist/dts/internal/v2/parts.d.ts +245 -0
- package/dist/dts/internal/v2/parts.d.ts.map +1 -0
- package/dist/dts/internal/v2/render-entry.d.ts +6 -0
- package/dist/dts/internal/v2/render-entry.d.ts.map +1 -0
- package/dist/dts/internal/v2/render-sync-parts.d.ts +22 -0
- package/dist/dts/internal/v2/render-sync-parts.d.ts.map +1 -0
- package/dist/dts/internal/v2/render.d.ts +62 -0
- package/dist/dts/internal/v2/render.d.ts.map +1 -0
- package/dist/dts/internal/v2/sync-parts.d.ts +129 -0
- package/dist/dts/internal/v2/sync-parts.d.ts.map +1 -0
- package/dist/esm/ElementRef.js.map +1 -1
- package/dist/esm/EventHandler.js +14 -4
- package/dist/esm/EventHandler.js.map +1 -1
- package/dist/esm/Html.js +91 -50
- package/dist/esm/Html.js.map +1 -1
- package/dist/esm/HtmlChunk.js +75 -24
- package/dist/esm/HtmlChunk.js.map +1 -1
- package/dist/esm/Hydrate.js +5 -5
- package/dist/esm/Hydrate.js.map +1 -1
- package/dist/esm/Many.js +3 -3
- package/dist/esm/Many.js.map +1 -1
- package/dist/esm/Meta.js +7 -1
- package/dist/esm/Meta.js.map +1 -1
- package/dist/esm/Parser.js +1 -1
- package/dist/esm/Parser.js.map +1 -1
- package/dist/esm/Placeholder.js +4 -8
- package/dist/esm/Placeholder.js.map +1 -1
- package/dist/esm/Platform.js +3 -1
- package/dist/esm/Platform.js.map +1 -1
- package/dist/esm/Render.js +6 -5
- package/dist/esm/Render.js.map +1 -1
- package/dist/esm/RenderContext.js +5 -85
- package/dist/esm/RenderContext.js.map +1 -1
- package/dist/esm/RenderEvent.js +8 -1
- package/dist/esm/RenderEvent.js.map +1 -1
- package/dist/esm/RenderQueue.js +336 -0
- package/dist/esm/RenderQueue.js.map +1 -0
- package/dist/esm/RenderTemplate.js.map +1 -1
- package/dist/esm/Template.js +12 -0
- package/dist/esm/Template.js.map +1 -1
- package/dist/esm/Test.js +71 -30
- package/dist/esm/Test.js.map +1 -1
- package/dist/esm/Vitest.js +11 -8
- package/dist/esm/Vitest.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/EventSource.js +12 -7
- package/dist/esm/internal/EventSource.js.map +1 -1
- package/dist/esm/internal/HydrateContext.js.map +1 -1
- package/dist/esm/internal/browser.js +10 -9
- package/dist/esm/internal/browser.js.map +1 -1
- package/dist/esm/internal/character-entities.js +2134 -0
- package/dist/esm/internal/character-entities.js.map +1 -0
- package/dist/esm/internal/errors.js +22 -2
- package/dist/esm/internal/errors.js.map +1 -1
- package/dist/esm/internal/indexRefCounter.js +36 -61
- package/dist/esm/internal/indexRefCounter.js.map +1 -1
- package/dist/esm/internal/parser.js +18 -18
- package/dist/esm/internal/parser.js.map +1 -1
- package/dist/esm/internal/parser2.js +393 -0
- package/dist/esm/internal/parser2.js.map +1 -0
- package/dist/esm/internal/server-parts.js +109 -0
- package/dist/esm/internal/server-parts.js.map +1 -0
- package/dist/esm/internal/server.js +12 -161
- package/dist/esm/internal/server.js.map +1 -1
- package/dist/esm/internal/utils.js +71 -7
- package/dist/esm/internal/utils.js.map +1 -1
- package/dist/esm/internal/v2/SyncPart.js +5 -0
- package/dist/esm/internal/v2/SyncPart.js.map +1 -0
- package/dist/esm/internal/v2/helpers.js +12 -0
- package/dist/esm/internal/v2/helpers.js.map +1 -0
- package/dist/esm/internal/v2/hydrate.js +195 -0
- package/dist/esm/internal/v2/hydrate.js.map +1 -0
- package/dist/esm/internal/v2/hydration-template.js +265 -0
- package/dist/esm/internal/v2/hydration-template.js.map +1 -0
- package/dist/esm/internal/v2/parts.js +150 -0
- package/dist/esm/internal/v2/parts.js.map +1 -0
- package/dist/esm/internal/v2/render-entry.js +102 -0
- package/dist/esm/internal/v2/render-entry.js.map +1 -0
- package/dist/esm/internal/v2/render-sync-parts.js +265 -0
- package/dist/esm/internal/v2/render-sync-parts.js.map +1 -0
- package/dist/esm/internal/v2/render.js +353 -0
- package/dist/esm/internal/v2/render.js.map +1 -0
- package/dist/esm/internal/v2/sync-parts.js +102 -0
- package/dist/esm/internal/v2/sync-parts.js.map +1 -0
- package/package.json +20 -13
- package/src/ElementRef.ts +1 -1
- package/src/ElementSource.ts +1 -1
- package/src/EventHandler.ts +29 -11
- package/src/Html.ts +199 -90
- package/src/HtmlChunk.ts +77 -30
- package/src/Hydrate.ts +20 -14
- package/src/Many.ts +17 -14
- package/src/Meta.ts +8 -1
- package/src/Parser.ts +1 -1
- package/src/Part.ts +22 -66
- package/src/Placeholder.ts +17 -15
- package/src/Platform.ts +5 -5
- package/src/Render.ts +23 -26
- package/src/RenderContext.ts +14 -142
- package/src/RenderEvent.ts +10 -1
- package/src/RenderQueue.ts +445 -0
- package/src/RenderTemplate.ts +7 -2
- package/src/Renderable.ts +1 -1
- package/src/Template.ts +15 -1
- package/src/Test.ts +122 -38
- package/src/Vitest.ts +20 -10
- package/src/index.ts +4 -0
- package/src/internal/EventSource.ts +14 -8
- package/src/internal/HydrateContext.ts +3 -4
- package/src/internal/browser.ts +26 -21
- package/src/internal/character-entities.ts +2136 -0
- package/src/internal/errors.ts +30 -3
- package/src/internal/indexRefCounter.ts +38 -70
- package/src/internal/parser.ts +19 -19
- package/src/internal/parser2.ts +468 -0
- package/src/internal/server-parts.ts +161 -0
- package/src/internal/server.ts +16 -272
- package/src/internal/utils.ts +83 -7
- package/src/internal/v2/SyncPart.ts +112 -0
- package/src/internal/v2/helpers.ts +13 -0
- package/src/internal/v2/hydrate.ts +289 -0
- package/src/internal/v2/hydration-template.ts +308 -0
- package/src/internal/v2/parts.ts +254 -0
- package/src/internal/v2/render-entry.ts +131 -0
- package/src/internal/v2/render-sync-parts.ts +440 -0
- package/src/internal/v2/render.ts +588 -0
- package/src/internal/v2/sync-parts.ts +133 -0
- package/dist/cjs/internal/hydrate.js +0 -274
- package/dist/cjs/internal/hydrate.js.map +0 -1
- package/dist/cjs/internal/parts.js +0 -451
- package/dist/cjs/internal/parts.js.map +0 -1
- package/dist/cjs/internal/render.js +0 -704
- package/dist/cjs/internal/render.js.map +0 -1
- package/dist/dts/internal/hydrate.d.ts +0 -33
- package/dist/dts/internal/hydrate.d.ts.map +0 -1
- package/dist/dts/internal/parts.d.ts +0 -314
- package/dist/dts/internal/parts.d.ts.map +0 -1
- package/dist/dts/internal/render.d.ts +0 -16
- package/dist/dts/internal/render.d.ts.map +0 -1
- package/dist/esm/internal/hydrate.js +0 -239
- package/dist/esm/internal/hydrate.js.map +0 -1
- package/dist/esm/internal/parts.js +0 -373
- package/dist/esm/internal/parts.js.map +0 -1
- package/dist/esm/internal/render.js +0 -689
- package/dist/esm/internal/render.js.map +0 -1
- package/src/internal/hydrate.ts +0 -366
- package/src/internal/parts.ts +0 -609
- package/src/internal/render.ts +0 -971
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import * as Fx from "@typed/fx";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { identity } from "effect/Function";
|
|
4
|
+
import { convertCharacterEntities } from "../character-entities.js";
|
|
5
|
+
import { AttributePartImpl, BooleanPartImpl, ClassNamePartImpl, CommentPartImpl, DataPartImpl, NodePartImpl, PropertyPartImpl, splitClassNames, TextPartImpl } from "./sync-parts.js";
|
|
6
|
+
import { diffable, isComment } from "@typed/wire";
|
|
7
|
+
import udomdiff from "udomdiff";
|
|
8
|
+
import { isDirective } from "../../Directive.js";
|
|
9
|
+
import { isRenderEvent } from "../../RenderEvent.js";
|
|
10
|
+
import { isCommentWithValue } from "../utils.js";
|
|
11
|
+
import { syncPartToPart } from "./parts.js";
|
|
12
|
+
export function makeAttributePart(index, element, attr) {
|
|
13
|
+
const setValue = makeAttributeValueSetter(element, attr);
|
|
14
|
+
return new AttributePartImpl(attr.name, index, ({ value }) => setValue(value), attr.value);
|
|
15
|
+
}
|
|
16
|
+
export function makeAttributeValueSetter(element, attr) {
|
|
17
|
+
let isSet = false;
|
|
18
|
+
const setValue = (value) => {
|
|
19
|
+
if (isNullOrUndefined(value)) {
|
|
20
|
+
element.removeAttribute(attr.name);
|
|
21
|
+
isSet = false;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
attr.value = value;
|
|
25
|
+
if (isSet === false) {
|
|
26
|
+
element.setAttributeNode(attr);
|
|
27
|
+
isSet = true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
return setValue;
|
|
32
|
+
}
|
|
33
|
+
export function makeBooleanAttributePart(name, index, element) {
|
|
34
|
+
return new BooleanPartImpl(name, index, ({ value }) => element.toggleAttribute(name, value === true), element.hasAttribute(name));
|
|
35
|
+
}
|
|
36
|
+
export function makeClassNamePart(index, element, initial = Array.from(element.classList)) {
|
|
37
|
+
return new ClassNamePartImpl(index, ({ previous, value }) => {
|
|
38
|
+
const { added, removed } = diffStrings(previous, value);
|
|
39
|
+
element.classList.add(...added);
|
|
40
|
+
element.classList.remove(...removed);
|
|
41
|
+
}, initial);
|
|
42
|
+
}
|
|
43
|
+
export function makeDataPart(index, element) {
|
|
44
|
+
return new DataPartImpl(index, ({ previous, value }) => {
|
|
45
|
+
const diff = diffDataSet(previous, value);
|
|
46
|
+
if (diff) {
|
|
47
|
+
const { added, removed } = diff;
|
|
48
|
+
removed.forEach((k) => delete element.dataset[k]);
|
|
49
|
+
added.forEach(([k, v]) => element.dataset[k] = v);
|
|
50
|
+
}
|
|
51
|
+
}, element.dataset);
|
|
52
|
+
}
|
|
53
|
+
export function makePropertyPart(name, index, element) {
|
|
54
|
+
return new PropertyPartImpl(name, index, ({ value }) => {
|
|
55
|
+
;
|
|
56
|
+
element[name] = value;
|
|
57
|
+
}, element[name]);
|
|
58
|
+
}
|
|
59
|
+
export function makeTextPart(index, text) {
|
|
60
|
+
return new TextPartImpl(index, ({ value }) => {
|
|
61
|
+
if (value) {
|
|
62
|
+
text.nodeValue = convertCharacterEntities(value);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
text.nodeValue = null;
|
|
66
|
+
}
|
|
67
|
+
}, text.nodeValue);
|
|
68
|
+
}
|
|
69
|
+
function isNullOrUndefined(value) {
|
|
70
|
+
return value === null || value === undefined;
|
|
71
|
+
}
|
|
72
|
+
function diffStrings(previous, current) {
|
|
73
|
+
if (previous == null || previous.length === 0) {
|
|
74
|
+
return {
|
|
75
|
+
added: current || [],
|
|
76
|
+
removed: [],
|
|
77
|
+
unchanged: []
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
else if (current == null || current.length === 0) {
|
|
81
|
+
return {
|
|
82
|
+
added: [],
|
|
83
|
+
removed: previous,
|
|
84
|
+
unchanged: []
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
const added = current.filter((c) => !previous.includes(c));
|
|
89
|
+
const removed = [];
|
|
90
|
+
const unchanged = [];
|
|
91
|
+
for (let i = 0; i < previous.length; ++i) {
|
|
92
|
+
if (current.includes(previous[i])) {
|
|
93
|
+
unchanged.push(previous[i]);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
removed.push(previous[i]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
added,
|
|
101
|
+
removed,
|
|
102
|
+
unchanged
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function diffDataSet(a, b) {
|
|
107
|
+
if (!a)
|
|
108
|
+
return b ? { added: Object.entries(b), removed: [] } : null;
|
|
109
|
+
if (!b)
|
|
110
|
+
return { added: [], removed: Object.keys(a) };
|
|
111
|
+
const { added, removed, unchanged } = diffStrings(Object.keys(a), Object.keys(b));
|
|
112
|
+
return {
|
|
113
|
+
added: added.concat(unchanged).map((k) => [k, b[k]]),
|
|
114
|
+
removed
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export function makeSparsePartHandler(parts, renderables, makePart, handleText, join, setValue) {
|
|
118
|
+
return Fx.mapEffect(Fx.withEmitter((sink) => Effect.zipRight(Effect.gen(function* () {
|
|
119
|
+
const values = new Map();
|
|
120
|
+
const expected = parts.length;
|
|
121
|
+
const setValueIfReady = () => {
|
|
122
|
+
if (values.size === expected) {
|
|
123
|
+
return sink.succeed(join(Array.from({ length: expected }, (_, i) => values.get(i))));
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
for (let i = 0; i < parts.length; ++i) {
|
|
127
|
+
const index = i;
|
|
128
|
+
const part = parts[i];
|
|
129
|
+
if (part._tag === "text") {
|
|
130
|
+
values.set(i, handleText(part.value));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const child = makePart(part.index, (value) => {
|
|
134
|
+
values.set(index, value);
|
|
135
|
+
setValueIfReady();
|
|
136
|
+
});
|
|
137
|
+
const value = renderables[part.index];
|
|
138
|
+
yield* Effect.forkScoped(matchRenderable(value, {
|
|
139
|
+
Fx: (fx) => fx.run(Fx.Sink.make((cause) => Effect.promise(() => sink.failCause(cause)), (value) => Effect.sync(() => child.update(value)))),
|
|
140
|
+
Effect: (effect) => Effect.tap(effect, (value) => child.update(value)),
|
|
141
|
+
Directive: (directive) => directive(syncPartToPart(child, ({ value }) => Effect.sync(() => child.update(value)))),
|
|
142
|
+
Otherwise: (value) => Effect.sync(() => child.update(value))
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
setValueIfReady();
|
|
147
|
+
}), Effect.never)), setValue);
|
|
148
|
+
}
|
|
149
|
+
export function handleSparseAttribute(element, attr, parts, values, schedule) {
|
|
150
|
+
const set = makeAttributeValueSetter(element, attr);
|
|
151
|
+
return Fx.drain(makeSparsePartHandler(parts, values, (index, setValue) => new AttributePartImpl(attr.name, index, ({ value }) => setValue(value), attr.value), (text) => text, (values) => values.flatMap((v) => isNullOrUndefined(v) ? [] : [v]).join(""), (value) => schedule(() => set(value))));
|
|
152
|
+
}
|
|
153
|
+
export function handleSparseClassName(element, parts, values, schedule) {
|
|
154
|
+
let previous = Array.from(element.classList);
|
|
155
|
+
return Fx.drain(makeSparsePartHandler(parts, values, (index, setValue) => new ClassNamePartImpl(index, ({ value }) => setValue(value), previous), splitClassNames, (values) => values.flat(1), (values) => schedule(() => {
|
|
156
|
+
const { added, removed } = diffStrings(previous, values);
|
|
157
|
+
element.classList.add(...added);
|
|
158
|
+
element.classList.remove(...removed);
|
|
159
|
+
previous = values;
|
|
160
|
+
})));
|
|
161
|
+
}
|
|
162
|
+
export function handleSparseComment(comment, parts, values, schedule) {
|
|
163
|
+
return Fx.drain(makeSparsePartHandler(parts, values, (index, setValue) => new CommentPartImpl(index, ({ value }) => setValue(value), comment.textContent), identity, (values) => values.flatMap((v) => isNullOrUndefined(v) ? [] : [v]).join(""), (value) => schedule(() => (comment.textContent = value))));
|
|
164
|
+
}
|
|
165
|
+
export function makeNodePart(index, comment, document, text, nodes) {
|
|
166
|
+
return new NodePartImpl(index, ({ value }) => {
|
|
167
|
+
matchNodeValue(value, (content) => {
|
|
168
|
+
if (text === null) {
|
|
169
|
+
text = document.createTextNode("");
|
|
170
|
+
}
|
|
171
|
+
text.textContent = convertCharacterEntities(content);
|
|
172
|
+
nodes = diffChildren(comment, nodes, [text], document);
|
|
173
|
+
}, (updatedNodes) => {
|
|
174
|
+
nodes = diffChildren(comment, nodes, updatedNodes, document);
|
|
175
|
+
});
|
|
176
|
+
}, nodes);
|
|
177
|
+
}
|
|
178
|
+
export function getPreviousTextSibling(node) {
|
|
179
|
+
if (!node)
|
|
180
|
+
return null;
|
|
181
|
+
if (node && node.nodeType === node.TEXT_NODE) {
|
|
182
|
+
// During hydration there should be a comment to separate these values
|
|
183
|
+
if (node.previousSibling &&
|
|
184
|
+
isCommentWithValue(node.previousSibling, "text")) {
|
|
185
|
+
return node;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
export function findPreviousNodes(comment, index, hash) {
|
|
191
|
+
const previousComments = new Set([`hole${index - 1}`, `typed-${hash}`]);
|
|
192
|
+
const nodes = [];
|
|
193
|
+
let node = comment.previousSibling;
|
|
194
|
+
while (node) {
|
|
195
|
+
if (isComment(node) && previousComments.has(node.data)) {
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
nodes.unshift(node);
|
|
199
|
+
node = node.previousSibling;
|
|
200
|
+
}
|
|
201
|
+
return nodes;
|
|
202
|
+
}
|
|
203
|
+
function diffChildren(comment, currentNodes, nextNodes, document) {
|
|
204
|
+
return udomdiff(comment.parentNode, currentNodes, nextNodes, diffable(document), comment);
|
|
205
|
+
}
|
|
206
|
+
function matchNodeValue(value, onText, onNodes) {
|
|
207
|
+
switch (typeof value) {
|
|
208
|
+
// primitives are handled as text content
|
|
209
|
+
case "string":
|
|
210
|
+
case "symbol":
|
|
211
|
+
case "number":
|
|
212
|
+
case "bigint":
|
|
213
|
+
case "boolean":
|
|
214
|
+
return onText(String(value));
|
|
215
|
+
case "undefined":
|
|
216
|
+
case "object": {
|
|
217
|
+
if (!value) {
|
|
218
|
+
return onNodes([]);
|
|
219
|
+
}
|
|
220
|
+
else if (Array.isArray(value)) {
|
|
221
|
+
// arrays can be used to cleanup, if empty
|
|
222
|
+
if (value.length === 0)
|
|
223
|
+
return onNodes([]);
|
|
224
|
+
// or diffed, if these contains nodes or "wires"
|
|
225
|
+
else if (value.some((x) => typeof x === "object")) {
|
|
226
|
+
return onNodes(value.flatMap(renderEventToArray));
|
|
227
|
+
} // in all other cases the content is stringified as is
|
|
228
|
+
else
|
|
229
|
+
return onText(String(value));
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
return onNodes(renderEventToArray(value));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
case "function":
|
|
236
|
+
return onNodes([]);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function renderEventToArray(x) {
|
|
240
|
+
if (x === null || x === undefined)
|
|
241
|
+
return [];
|
|
242
|
+
if (isRenderEvent(x)) {
|
|
243
|
+
const value = x.valueOf();
|
|
244
|
+
return Array.isArray(value) ? value : [value];
|
|
245
|
+
}
|
|
246
|
+
return [x];
|
|
247
|
+
}
|
|
248
|
+
export function makeCommentPart(index, comment) {
|
|
249
|
+
return new CommentPartImpl(index, ({ value }) => (comment.nodeValue = value ?? null), comment.textContent);
|
|
250
|
+
}
|
|
251
|
+
function matchRenderable(renderable, matches) {
|
|
252
|
+
if (Fx.isFx(renderable)) {
|
|
253
|
+
return matches.Fx(renderable);
|
|
254
|
+
}
|
|
255
|
+
else if (Effect.isEffect(renderable)) {
|
|
256
|
+
return matches.Effect(renderable);
|
|
257
|
+
}
|
|
258
|
+
else if (isDirective(renderable)) {
|
|
259
|
+
return matches.Directive(renderable);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
return matches.Otherwise(renderable);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=render-sync-parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-sync-parts.js","sourceRoot":"","sources":["../../../../src/internal/v2/render-sync-parts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import * as Context from "@typed/context";
|
|
2
|
+
import * as Fx from "@typed/fx";
|
|
3
|
+
import { persistent } from "@typed/wire";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as ExecutionStrategy from "effect/ExecutionStrategy";
|
|
6
|
+
import { flow } from "effect/Function";
|
|
7
|
+
import * as Scope from "effect/Scope";
|
|
8
|
+
import { isDirective } from "../../Directive.js";
|
|
9
|
+
import * as ElementRef from "../../ElementRef.js";
|
|
10
|
+
import * as ElementSource from "../../ElementSource.js";
|
|
11
|
+
import * as EventHandler from "../../EventHandler.js";
|
|
12
|
+
import { DomRenderEvent } from "../../RenderEvent.js";
|
|
13
|
+
import { DEFAULT_PRIORITY, RenderQueue } from "../../RenderQueue.js";
|
|
14
|
+
import { makeEventSource } from "../EventSource.js";
|
|
15
|
+
import { makeRefCounter } from "../indexRefCounter.js";
|
|
16
|
+
import { findHoleComment, findPath, keyToPartType } from "../utils.js";
|
|
17
|
+
import { isNullOrUndefined } from "./helpers.js";
|
|
18
|
+
import { EventPartImpl, RefPartImpl, syncPartToPart } from "./parts.js";
|
|
19
|
+
import { getBrowserEntry } from "./render-entry.js";
|
|
20
|
+
import * as SyncPartsInternal from "./render-sync-parts.js";
|
|
21
|
+
export const renderTemplate = (document, renderContext) => (templateStrings, values) => {
|
|
22
|
+
const entry = getBrowserEntry(document, renderContext, templateStrings);
|
|
23
|
+
if (entry.template.parts.length === 0) {
|
|
24
|
+
return Fx.succeed(DomRenderEvent(persistent(document, document.importNode(entry.content, true))));
|
|
25
|
+
}
|
|
26
|
+
return Fx.make((sink) => Effect.catchAllCause(Effect.gen(function* () {
|
|
27
|
+
// Create a context for rendering our template
|
|
28
|
+
const ctx = yield* makeTemplateContext(entry.content, document, renderContext, values, sink.onFailure);
|
|
29
|
+
// Setup all parts
|
|
30
|
+
const effects = setupParts(entry.template.parts, ctx);
|
|
31
|
+
if (effects.length > 0) {
|
|
32
|
+
yield* Effect.forEach(effects, flow(Effect.catchAllCause(ctx.onCause), Effect.forkIn(ctx.scope)));
|
|
33
|
+
}
|
|
34
|
+
// If there's anything to wait on and it's not already done, wait for an initial value
|
|
35
|
+
// for all asynchronous sources.
|
|
36
|
+
if (ctx.expected > 0 && (yield* ctx.refCounter.expect(ctx.expected))) {
|
|
37
|
+
yield* ctx.refCounter.wait;
|
|
38
|
+
}
|
|
39
|
+
// Create a persistent wire from our content
|
|
40
|
+
const wire = persistent(document, ctx.content);
|
|
41
|
+
// Setup our event listeners for our wire.
|
|
42
|
+
// We use the parentScope to allow event listeners to exist
|
|
43
|
+
// beyond the lifetime of the current Fiber, but no further than its parent template.
|
|
44
|
+
yield* ctx.eventSource.setup(wire, ctx.parentScope);
|
|
45
|
+
// Emit our DomRenderEvent
|
|
46
|
+
yield* sink.onSuccess(DomRenderEvent(wire)).pipe(
|
|
47
|
+
// Ensure our templates last forever in the DOM environment
|
|
48
|
+
// so event listeners are kept attached to the current Scope.
|
|
49
|
+
Effect.zipRight(Effect.never),
|
|
50
|
+
// Close our scope whenever the current Fiber is interrupted
|
|
51
|
+
Effect.onExit((exit) => Scope.close(ctx.scope, exit)));
|
|
52
|
+
}), sink.onFailure));
|
|
53
|
+
};
|
|
54
|
+
export function makeTemplateContext(entry, document, renderContext, values, onCause) {
|
|
55
|
+
return Effect.gen(function* () {
|
|
56
|
+
const refCounter = yield* makeRefCounter;
|
|
57
|
+
const context = yield* Effect.context();
|
|
58
|
+
const queue = Context.get(context, RenderQueue);
|
|
59
|
+
const parentScope = Context.get(context, Scope.Scope);
|
|
60
|
+
const eventSource = makeEventSource();
|
|
61
|
+
const content = document.importNode(entry, true);
|
|
62
|
+
const scope = yield* Scope.fork(parentScope, ExecutionStrategy.sequential);
|
|
63
|
+
const templateContext = {
|
|
64
|
+
context: Context.add(context, Scope.Scope, scope),
|
|
65
|
+
expected: 0,
|
|
66
|
+
content,
|
|
67
|
+
document,
|
|
68
|
+
eventSource,
|
|
69
|
+
parentScope,
|
|
70
|
+
queue,
|
|
71
|
+
refCounter,
|
|
72
|
+
renderContext,
|
|
73
|
+
scope,
|
|
74
|
+
values,
|
|
75
|
+
spreadIndex: values.length,
|
|
76
|
+
onCause
|
|
77
|
+
};
|
|
78
|
+
return templateContext;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function setupParts(parts, ctx) {
|
|
82
|
+
const effects = [];
|
|
83
|
+
for (const [part, path] of parts) {
|
|
84
|
+
const effect = setupPart(part, path, ctx);
|
|
85
|
+
if (effect) {
|
|
86
|
+
effects.push(effect);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return effects;
|
|
90
|
+
}
|
|
91
|
+
function setupPart(part, path, ctx) {
|
|
92
|
+
switch (part._tag) {
|
|
93
|
+
case "attr":
|
|
94
|
+
return setupAttrPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
|
|
95
|
+
case "boolean-part":
|
|
96
|
+
return setupBooleanPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
|
|
97
|
+
case "className-part":
|
|
98
|
+
return setupClassNamePart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
|
|
99
|
+
case "comment-part":
|
|
100
|
+
return setupCommentPart(part, findPath(ctx.content, path), ctx);
|
|
101
|
+
case "data":
|
|
102
|
+
return setupDataPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
|
|
103
|
+
case "event":
|
|
104
|
+
return setupEventPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
|
|
105
|
+
case "node": {
|
|
106
|
+
const parent = findPath(ctx.content, path);
|
|
107
|
+
const comment = findHoleComment(parent, part.index);
|
|
108
|
+
return setupNodePart(part, comment, ctx, null, []);
|
|
109
|
+
}
|
|
110
|
+
case "properties":
|
|
111
|
+
return setupPropertiesPart(part, findPath(ctx.content, path), ctx);
|
|
112
|
+
case "property":
|
|
113
|
+
return setupPropertyPart(part, findPath(ctx.content, path), ctx, ctx.values[part.index]);
|
|
114
|
+
case "ref":
|
|
115
|
+
return setupRefPart(part, findPath(ctx.content, path), ctx);
|
|
116
|
+
case "sparse-attr":
|
|
117
|
+
return setupSparseAttrPart(part, findPath(ctx.content, path), ctx);
|
|
118
|
+
case "sparse-class-name":
|
|
119
|
+
return setupSparseClassNamePart(part, findPath(ctx.content, path), ctx);
|
|
120
|
+
case "sparse-comment":
|
|
121
|
+
return setupSparseCommentPart(part, findPath(ctx.content, path), ctx);
|
|
122
|
+
case "text-part": {
|
|
123
|
+
const parent = findPath(ctx.content, path);
|
|
124
|
+
const comment = findHoleComment(parent, part.index);
|
|
125
|
+
return setupTextPart(part, comment, ctx);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export function setupAttrPart({ index, name }, element, ctx, renderable) {
|
|
130
|
+
const attr = element.getAttributeNode(name) ?? ctx.document.createAttribute(name);
|
|
131
|
+
const part = SyncPartsInternal.makeAttributePart(index, element, attr);
|
|
132
|
+
return matchSyncPart(renderable, ctx, part);
|
|
133
|
+
}
|
|
134
|
+
export function setupBooleanPart({ index, name }, element, ctx, renderable) {
|
|
135
|
+
const part = SyncPartsInternal.makeBooleanAttributePart(name, index, element);
|
|
136
|
+
return matchSyncPart(renderable, ctx, part);
|
|
137
|
+
}
|
|
138
|
+
export function setupClassNamePart({ index }, element, ctx, renderable) {
|
|
139
|
+
const part = SyncPartsInternal.makeClassNamePart(index, element);
|
|
140
|
+
return matchSyncPart(renderable, ctx, part);
|
|
141
|
+
}
|
|
142
|
+
export function setupCommentPart({ index }, comment, ctx) {
|
|
143
|
+
const part = SyncPartsInternal.makeCommentPart(index, comment);
|
|
144
|
+
const renderable = ctx.values[index];
|
|
145
|
+
return matchSyncPart(renderable, ctx, part);
|
|
146
|
+
}
|
|
147
|
+
export function setupDataPart({ index }, element, ctx, renderable) {
|
|
148
|
+
const part = SyncPartsInternal.makeDataPart(index, element);
|
|
149
|
+
return matchSyncPart(renderable, ctx, part);
|
|
150
|
+
}
|
|
151
|
+
export function setupEventPart({ index, name }, element, ctx, renderable) {
|
|
152
|
+
if (isNullOrUndefined(renderable))
|
|
153
|
+
return null;
|
|
154
|
+
if (isDirective(renderable)) {
|
|
155
|
+
return renderable(new EventPartImpl(name, index, ElementSource.fromElement(element), ctx.onCause, (handler) => ctx.eventSource.addEventListener(element, name, handler)));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const handler = getEventHandler(renderable, ctx.context, ctx.onCause);
|
|
159
|
+
if (handler === null)
|
|
160
|
+
return null;
|
|
161
|
+
ctx.eventSource.addEventListener(element, name, handler);
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export function getEventHandler(renderable, ctx, onCause) {
|
|
166
|
+
if (renderable && typeof renderable === "object") {
|
|
167
|
+
if (EventHandler.EventHandlerTypeId in renderable) {
|
|
168
|
+
return EventHandler.make((ev) => Effect.provide(Effect.catchAllCause(renderable.handler(ev), onCause), ctx), renderable.options);
|
|
169
|
+
}
|
|
170
|
+
else if (Effect.EffectTypeId in renderable) {
|
|
171
|
+
return EventHandler.make(() => Effect.provide(Effect.catchAllCause(renderable, onCause), ctx));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
export function setupNodePart({ index }, comment, ctx, text, nodes) {
|
|
177
|
+
const part = SyncPartsInternal.makeNodePart(index, comment, ctx.document, text, nodes);
|
|
178
|
+
const renderable = ctx.values[index];
|
|
179
|
+
return matchSyncPart(renderable, ctx, part);
|
|
180
|
+
}
|
|
181
|
+
export function setupPropertyPart({ index, name }, element, ctx, renderable) {
|
|
182
|
+
const part = SyncPartsInternal.makePropertyPart(name, index, element);
|
|
183
|
+
return matchSyncPart(renderable, ctx, part);
|
|
184
|
+
}
|
|
185
|
+
export function setupRefPart({ index }, element, ctx) {
|
|
186
|
+
const renderable = ctx.values[index];
|
|
187
|
+
if (isNullOrUndefined(renderable))
|
|
188
|
+
return null;
|
|
189
|
+
else if (isDirective(renderable)) {
|
|
190
|
+
return renderable(new RefPartImpl(ElementSource.fromElement(element), index));
|
|
191
|
+
}
|
|
192
|
+
else if (ElementRef.isElementRef(renderable)) {
|
|
193
|
+
// TODO: We need to enable only setting these values once the Template has been rendered into the DOM
|
|
194
|
+
return ElementRef.set(renderable, element);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export function setupPropertiesPart({ index }, element, ctx) {
|
|
201
|
+
const renderable = ctx.values[index];
|
|
202
|
+
if (renderable && typeof renderable === "object") {
|
|
203
|
+
const effects = [];
|
|
204
|
+
const addEffect = (effect) => {
|
|
205
|
+
if (isNullOrUndefined(effect))
|
|
206
|
+
return;
|
|
207
|
+
effects.push(effect);
|
|
208
|
+
};
|
|
209
|
+
for (const [key, value] of Object.entries(renderable)) {
|
|
210
|
+
const [type, name] = keyToPartType(key);
|
|
211
|
+
const index = ++ctx.spreadIndex;
|
|
212
|
+
switch (type) {
|
|
213
|
+
case "attr":
|
|
214
|
+
addEffect(setupAttrPart({ index, name }, element, ctx, value));
|
|
215
|
+
break;
|
|
216
|
+
case "boolean":
|
|
217
|
+
addEffect(setupBooleanPart({ index, name }, element, ctx, value));
|
|
218
|
+
break;
|
|
219
|
+
case "class":
|
|
220
|
+
addEffect(setupClassNamePart({ index }, element, ctx, value));
|
|
221
|
+
break;
|
|
222
|
+
case "data":
|
|
223
|
+
addEffect(setupDataPart({ index }, element, ctx, value));
|
|
224
|
+
break;
|
|
225
|
+
case "event":
|
|
226
|
+
addEffect(setupEventPart({ index, name }, element, ctx, value));
|
|
227
|
+
break;
|
|
228
|
+
case "property":
|
|
229
|
+
addEffect(setupPropertyPart({ index, name }, element, ctx, value));
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return Effect.all(effects, { concurrency: "unbounded" });
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
export function setupSparseAttrPart({ name, nodes }, element, ctx) {
|
|
238
|
+
ctx.expected++;
|
|
239
|
+
const attr = element.getAttributeNode(name) ?? ctx.document.createAttribute(name);
|
|
240
|
+
const index = nodes.find((n) => n._tag === "attr").index;
|
|
241
|
+
return SyncPartsInternal.handleSparseAttribute(element, attr, nodes, ctx.values, (f) => Effect.zipRight(ctx.queue.add(attr, f, DEFAULT_PRIORITY), ctx.refCounter.release(index)));
|
|
242
|
+
}
|
|
243
|
+
export function setupSparseClassNamePart({ nodes }, element, ctx) {
|
|
244
|
+
ctx.expected++;
|
|
245
|
+
const index = nodes.find((n) => n._tag === "className-part").index;
|
|
246
|
+
return SyncPartsInternal.handleSparseClassName(element, nodes, ctx.values, (f) => Effect.zipRight(ctx.queue.add(element.classList, f, DEFAULT_PRIORITY), ctx.refCounter.release(index)));
|
|
247
|
+
}
|
|
248
|
+
export function setupSparseCommentPart({ nodes }, comment, ctx) {
|
|
249
|
+
ctx.expected++;
|
|
250
|
+
const index = nodes.find((n) => n._tag === "comment-part").index;
|
|
251
|
+
return SyncPartsInternal.handleSparseComment(comment, nodes, ctx.values, (f) => Effect.zipRight(ctx.queue.add(comment, f, DEFAULT_PRIORITY), ctx.refCounter.release(index)));
|
|
252
|
+
}
|
|
253
|
+
export function setupTextPart({ index }, comment, ctx) {
|
|
254
|
+
const text = comment.previousSibling
|
|
255
|
+
? SyncPartsInternal.getPreviousTextSibling(comment.previousSibling) ?? createText(ctx.document, comment)
|
|
256
|
+
: createText(ctx.document, comment);
|
|
257
|
+
const part = SyncPartsInternal.makeTextPart(index, text);
|
|
258
|
+
const renderable = ctx.values[index];
|
|
259
|
+
return matchSyncPart(renderable, ctx, part);
|
|
260
|
+
}
|
|
261
|
+
function createText(document, comment) {
|
|
262
|
+
const text = document.createTextNode("");
|
|
263
|
+
comment.parentNode.insertBefore(text, comment);
|
|
264
|
+
return text;
|
|
265
|
+
}
|
|
266
|
+
export function matchSyncPart(renderable, ctx, syncPart) {
|
|
267
|
+
return matchRenderable(renderable, ctx, {
|
|
268
|
+
Fx: (fx) => fx.run(Fx.Sink.make(ctx.onCause, (value) => runSyncUpdate(syncPart, value, ctx))),
|
|
269
|
+
Effect: (effect) => Effect.flatMap(effect, (value) => runSyncUpdate(syncPart, value, ctx)),
|
|
270
|
+
Directive: (directive) => directive(syncPartToPart(syncPart, ({ value }) => runSyncUpdate(syncPart, value, ctx))),
|
|
271
|
+
Otherwise: (value) => {
|
|
272
|
+
syncPart.update(value);
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
function unwrapRenderable(renderable) {
|
|
278
|
+
switch (typeof renderable) {
|
|
279
|
+
case "undefined":
|
|
280
|
+
case "object": {
|
|
281
|
+
if (renderable === null || renderable === undefined)
|
|
282
|
+
return Fx.succeed(null);
|
|
283
|
+
else if (Array.isArray(renderable)) {
|
|
284
|
+
return renderable.length === 0
|
|
285
|
+
? Fx.succeed(null)
|
|
286
|
+
// TODO: We need to ensure the ordering of these values in server environments
|
|
287
|
+
: Fx.map(Fx.tuple(renderable.map(unwrapRenderable)), (xs) => xs.flat());
|
|
288
|
+
}
|
|
289
|
+
else if (Fx.TypeId in renderable) {
|
|
290
|
+
return renderable;
|
|
291
|
+
}
|
|
292
|
+
else if (Effect.EffectTypeId in renderable) {
|
|
293
|
+
return Fx.fromFxEffect(Effect.map(renderable, (unwrapRenderable)));
|
|
294
|
+
}
|
|
295
|
+
else
|
|
296
|
+
return Fx.succeed(renderable);
|
|
297
|
+
}
|
|
298
|
+
default:
|
|
299
|
+
return Fx.succeed(renderable);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
export function runSyncUpdate(syncPart, value, ctx) {
|
|
303
|
+
return Effect.zipRight(ctx.queue.add(syncPart, () => syncPart.update(value), DEFAULT_PRIORITY), ctx.refCounter.release(syncPart.index));
|
|
304
|
+
}
|
|
305
|
+
export function matchRenderable(renderable, ctx, matches) {
|
|
306
|
+
if (Fx.isFx(renderable)) {
|
|
307
|
+
ctx.expected++;
|
|
308
|
+
return matches.Fx(renderable);
|
|
309
|
+
}
|
|
310
|
+
else if (Effect.isEffect(renderable)) {
|
|
311
|
+
ctx.expected++;
|
|
312
|
+
return matches.Effect(renderable);
|
|
313
|
+
}
|
|
314
|
+
else if (isDirective(renderable)) {
|
|
315
|
+
ctx.expected++;
|
|
316
|
+
return matches.Directive(renderable);
|
|
317
|
+
}
|
|
318
|
+
else if (Array.isArray(renderable)) {
|
|
319
|
+
return matches.Fx(unwrapRenderable(renderable));
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
return matches.Otherwise(renderable);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
export function attachRoot(cache, where, what // TODO: Should we support HTML RenderEvents here too?,
|
|
326
|
+
) {
|
|
327
|
+
return Effect.sync(() => {
|
|
328
|
+
const wire = what?.valueOf();
|
|
329
|
+
const previous = cache.get(where);
|
|
330
|
+
if (wire !== previous) {
|
|
331
|
+
if (previous && !wire)
|
|
332
|
+
removeChildren(where, previous);
|
|
333
|
+
cache.set(where, wire || null);
|
|
334
|
+
if (wire)
|
|
335
|
+
replaceChildren(where, wire);
|
|
336
|
+
return wire;
|
|
337
|
+
}
|
|
338
|
+
return previous;
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
export function removeChildren(where, previous) {
|
|
342
|
+
for (const node of getNodes(previous)) {
|
|
343
|
+
where.removeChild(node);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
export function replaceChildren(where, wire) {
|
|
347
|
+
where.replaceChildren(...getNodes(wire));
|
|
348
|
+
}
|
|
349
|
+
export function getNodes(rendered) {
|
|
350
|
+
const value = rendered.valueOf();
|
|
351
|
+
return Array.isArray(value) ? value : [value];
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=render.js.map
|