@typed/template 0.2.0 → 0.3.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/dist/cjs/Directive.js +1 -1
- package/dist/cjs/Directive.js.map +1 -1
- package/dist/cjs/ElementRef.js +23 -13
- package/dist/cjs/ElementRef.js.map +1 -1
- package/dist/cjs/ElementSource.js +16 -18
- package/dist/cjs/ElementSource.js.map +1 -1
- package/dist/cjs/EventHandler.js +1 -1
- package/dist/cjs/EventHandler.js.map +1 -1
- package/dist/cjs/Html.js +31 -32
- package/dist/cjs/Html.js.map +1 -1
- package/dist/cjs/HtmlChunk.js +4 -1
- package/dist/cjs/HtmlChunk.js.map +1 -1
- package/dist/cjs/Hydrate.js +1 -1
- package/dist/cjs/Hydrate.js.map +1 -1
- package/dist/cjs/Many.js +14 -13
- package/dist/cjs/Many.js.map +1 -1
- package/dist/cjs/Parser.js +11 -323
- package/dist/cjs/Parser.js.map +1 -1
- package/dist/cjs/Placeholder.js +3 -3
- package/dist/cjs/Placeholder.js.map +1 -1
- package/dist/cjs/Platform.js +4 -4
- package/dist/cjs/Platform.js.map +1 -1
- package/dist/cjs/Render.js +1 -1
- package/dist/cjs/Render.js.map +1 -1
- package/dist/cjs/RenderContext.js +48 -27
- package/dist/cjs/RenderContext.js.map +1 -1
- package/dist/cjs/RenderTemplate.js +2 -17
- package/dist/cjs/RenderTemplate.js.map +1 -1
- package/dist/cjs/Template.js +27 -1
- package/dist/cjs/Template.js.map +1 -1
- package/dist/cjs/TemplateInstance.js +2 -2
- package/dist/cjs/TemplateInstance.js.map +1 -1
- package/dist/cjs/Test.js +20 -7
- package/dist/cjs/Test.js.map +1 -1
- package/dist/cjs/index.js +0 -12
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internal/EventSource.js +95 -0
- package/dist/cjs/internal/EventSource.js.map +1 -0
- package/dist/cjs/internal/browser.js +11 -11
- package/dist/cjs/internal/browser.js.map +1 -1
- package/dist/cjs/internal/chunks.js +4 -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 +113 -80
- package/dist/cjs/internal/hydrate.js.map +1 -1
- package/dist/cjs/internal/indexRefCounter.js +49 -2
- package/dist/cjs/internal/indexRefCounter.js.map +1 -1
- package/dist/cjs/internal/parser.js +72 -21
- package/dist/cjs/internal/parser.js.map +1 -1
- package/dist/cjs/internal/parts.js +128 -28
- package/dist/cjs/internal/parts.js.map +1 -1
- package/dist/cjs/internal/render.js +460 -161
- package/dist/cjs/internal/render.js.map +1 -1
- package/dist/cjs/internal/server.js +5 -2
- package/dist/cjs/internal/server.js.map +1 -1
- package/dist/dts/Directive.d.ts.map +1 -1
- package/dist/dts/ElementRef.d.ts +4 -2
- package/dist/dts/ElementRef.d.ts.map +1 -1
- package/dist/dts/ElementSource.d.ts +10 -5
- package/dist/dts/ElementSource.d.ts.map +1 -1
- package/dist/dts/EventHandler.d.ts.map +1 -1
- package/dist/dts/Html.d.ts +1 -1
- package/dist/dts/Html.d.ts.map +1 -1
- package/dist/dts/HtmlChunk.d.ts.map +1 -1
- package/dist/dts/Many.d.ts +13 -11
- package/dist/dts/Many.d.ts.map +1 -1
- package/dist/dts/Parser.d.ts +3 -6
- package/dist/dts/Parser.d.ts.map +1 -1
- package/dist/dts/Part.d.ts +13 -3
- package/dist/dts/Part.d.ts.map +1 -1
- package/dist/dts/Placeholder.d.ts +2 -2
- package/dist/dts/Placeholder.d.ts.map +1 -1
- package/dist/dts/Render.d.ts +2 -1
- package/dist/dts/Render.d.ts.map +1 -1
- package/dist/dts/RenderContext.d.ts +5 -4
- package/dist/dts/RenderContext.d.ts.map +1 -1
- package/dist/dts/RenderTemplate.d.ts +2 -16
- package/dist/dts/RenderTemplate.d.ts.map +1 -1
- package/dist/dts/Renderable.d.ts +2 -2
- package/dist/dts/Renderable.d.ts.map +1 -1
- package/dist/dts/Template.d.ts +21 -3
- package/dist/dts/Template.d.ts.map +1 -1
- package/dist/dts/TemplateInstance.d.ts +3 -2
- package/dist/dts/TemplateInstance.d.ts.map +1 -1
- package/dist/dts/Test.d.ts +4 -6
- package/dist/dts/Test.d.ts.map +1 -1
- package/dist/dts/index.d.ts +0 -4
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/EventSource.d.ts +12 -0
- package/dist/dts/internal/EventSource.d.ts.map +1 -0
- package/dist/dts/internal/browser.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/indexRefCounter.d.ts +5 -0
- package/dist/dts/internal/indexRefCounter.d.ts.map +1 -1
- package/dist/dts/internal/module-augmentation.d.ts +0 -4
- package/dist/dts/internal/module-augmentation.d.ts.map +1 -1
- package/dist/dts/internal/parser.d.ts +8 -0
- package/dist/dts/internal/parser.d.ts.map +1 -1
- package/dist/dts/internal/parts.d.ts +66 -56
- package/dist/dts/internal/parts.d.ts.map +1 -1
- package/dist/dts/internal/render.d.ts +1 -15
- package/dist/dts/internal/render.d.ts.map +1 -1
- package/dist/dts/internal/server.d.ts.map +1 -1
- package/dist/esm/Directive.js +1 -1
- package/dist/esm/Directive.js.map +1 -1
- package/dist/esm/ElementRef.js +12 -7
- package/dist/esm/ElementRef.js.map +1 -1
- package/dist/esm/ElementSource.js +16 -13
- package/dist/esm/ElementSource.js.map +1 -1
- package/dist/esm/EventHandler.js +1 -1
- package/dist/esm/EventHandler.js.map +1 -1
- package/dist/esm/Html.js +29 -24
- package/dist/esm/Html.js.map +1 -1
- package/dist/esm/HtmlChunk.js +6 -1
- package/dist/esm/HtmlChunk.js.map +1 -1
- package/dist/esm/Hydrate.js +1 -1
- package/dist/esm/Hydrate.js.map +1 -1
- package/dist/esm/Many.js +14 -10
- package/dist/esm/Many.js.map +1 -1
- package/dist/esm/Parser.js +6 -335
- package/dist/esm/Parser.js.map +1 -1
- package/dist/esm/Placeholder.js +2 -2
- package/dist/esm/Placeholder.js.map +1 -1
- package/dist/esm/Platform.js +2 -2
- package/dist/esm/Platform.js.map +1 -1
- package/dist/esm/Render.js +1 -1
- package/dist/esm/Render.js.map +1 -1
- package/dist/esm/RenderContext.js +38 -17
- package/dist/esm/RenderContext.js.map +1 -1
- package/dist/esm/RenderTemplate.js +2 -12
- package/dist/esm/RenderTemplate.js.map +1 -1
- package/dist/esm/Template.js +24 -0
- package/dist/esm/Template.js.map +1 -1
- package/dist/esm/TemplateInstance.js +2 -2
- package/dist/esm/TemplateInstance.js.map +1 -1
- package/dist/esm/Test.js +20 -7
- package/dist/esm/Test.js.map +1 -1
- package/dist/esm/index.js +0 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/EventSource.js +91 -0
- package/dist/esm/internal/EventSource.js.map +1 -0
- package/dist/esm/internal/browser.js +12 -12
- package/dist/esm/internal/browser.js.map +1 -1
- package/dist/esm/internal/chunks.js +2 -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 +113 -76
- package/dist/esm/internal/hydrate.js.map +1 -1
- package/dist/esm/internal/indexRefCounter.js +50 -2
- package/dist/esm/internal/indexRefCounter.js.map +1 -1
- package/dist/esm/internal/parser.js +98 -22
- package/dist/esm/internal/parser.js.map +1 -1
- package/dist/esm/internal/parts.js +110 -27
- package/dist/esm/internal/parts.js.map +1 -1
- package/dist/esm/internal/render.js +446 -157
- package/dist/esm/internal/render.js.map +1 -1
- package/dist/esm/internal/server.js +5 -4
- package/dist/esm/internal/server.js.map +1 -1
- package/package.json +10 -26
- package/src/Directive.ts +1 -1
- package/src/ElementRef.ts +18 -14
- package/src/ElementSource.ts +62 -47
- package/src/EventHandler.ts +1 -1
- package/src/Html.ts +58 -57
- package/src/HtmlChunk.ts +15 -1
- package/src/Hydrate.ts +1 -1
- package/src/Many.ts +53 -43
- package/src/Parser.ts +10 -453
- package/src/Part.ts +15 -3
- package/src/Placeholder.ts +4 -4
- package/src/Platform.ts +2 -2
- package/src/Render.ts +7 -2
- package/src/RenderContext.ts +47 -19
- package/src/RenderTemplate.ts +9 -54
- package/src/Renderable.ts +2 -1
- package/src/Template.ts +26 -0
- package/src/TemplateInstance.ts +9 -9
- package/src/Test.ts +40 -21
- package/src/index.ts +0 -4
- package/src/internal/EventSource.ts +153 -0
- package/src/internal/browser.ts +26 -25
- package/src/internal/chunks.ts +4 -0
- package/src/internal/errors.ts +4 -0
- package/src/internal/hydrate.ts +161 -107
- package/src/internal/indexRefCounter.ts +63 -2
- package/src/internal/module-augmentation.ts +0 -4
- package/src/internal/parser.ts +107 -25
- package/src/internal/parts.ts +158 -73
- package/src/internal/render.ts +638 -289
- package/src/internal/server.ts +5 -3
- package/Token/package.json +0 -6
- package/Tokenizer/package.json +0 -6
- package/dist/cjs/Token.js +0 -270
- package/dist/cjs/Token.js.map +0 -1
- package/dist/cjs/Tokenizer.js +0 -18
- package/dist/cjs/Tokenizer.js.map +0 -1
- package/dist/cjs/internal/readAttribute.js +0 -34
- package/dist/cjs/internal/readAttribute.js.map +0 -1
- package/dist/cjs/internal/tokenizer.js +0 -264
- package/dist/cjs/internal/tokenizer.js.map +0 -1
- package/dist/dts/Token.d.ts +0 -202
- package/dist/dts/Token.d.ts.map +0 -1
- package/dist/dts/Tokenizer.d.ts +0 -6
- package/dist/dts/Tokenizer.d.ts.map +0 -1
- package/dist/dts/internal/readAttribute.d.ts +0 -9
- package/dist/dts/internal/readAttribute.d.ts.map +0 -1
- package/dist/dts/internal/tokenizer.d.ts +0 -3
- package/dist/dts/internal/tokenizer.d.ts.map +0 -1
- package/dist/esm/Token.js +0 -264
- package/dist/esm/Token.js.map +0 -1
- package/dist/esm/Tokenizer.js +0 -9
- package/dist/esm/Tokenizer.js.map +0 -1
- package/dist/esm/internal/readAttribute.js +0 -24
- package/dist/esm/internal/readAttribute.js.map +0 -1
- package/dist/esm/internal/tokenizer.js +0 -296
- package/dist/esm/internal/tokenizer.js.map +0 -1
- package/src/Token.ts +0 -269
- package/src/Tokenizer.ts +0 -10
- package/src/internal/readAttribute.ts +0 -28
- package/src/internal/tokenizer.ts +0 -338
|
@@ -4,25 +4,23 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.attachRoot = attachRoot;
|
|
7
|
-
exports.buildParts = buildParts;
|
|
8
7
|
exports.buildTemplate = buildTemplate;
|
|
9
8
|
exports.getBrowserEntry = getBrowserEntry;
|
|
10
|
-
exports.
|
|
11
|
-
exports.renderSparsePart = renderSparsePart;
|
|
9
|
+
exports.renderPart2 = renderPart2;
|
|
12
10
|
exports.renderTemplate = void 0;
|
|
13
|
-
exports.renderValues = renderValues;
|
|
14
11
|
var Fx = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@typed/fx/Fx"));
|
|
15
|
-
var Subject = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@typed/fx/Subject"));
|
|
16
12
|
var _TypeId = /*#__PURE__*/require("@typed/fx/TypeId");
|
|
17
13
|
var _wire = /*#__PURE__*/require("@typed/wire");
|
|
18
14
|
var _effect = /*#__PURE__*/require("effect");
|
|
19
|
-
var
|
|
15
|
+
var Context = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Context"));
|
|
16
|
+
var _Scope = /*#__PURE__*/require("effect/Scope");
|
|
20
17
|
var _Directive = /*#__PURE__*/require("../Directive.js");
|
|
21
18
|
var ElementRef = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../ElementRef.js"));
|
|
19
|
+
var ElementSource = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../ElementSource.js"));
|
|
22
20
|
var EventHandler = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../EventHandler.js"));
|
|
23
21
|
var _RenderEvent = /*#__PURE__*/require("../RenderEvent.js");
|
|
24
|
-
var _TemplateInstance = /*#__PURE__*/require("../TemplateInstance.js");
|
|
25
22
|
var _browser = /*#__PURE__*/require("./browser.js");
|
|
23
|
+
var _EventSource = /*#__PURE__*/require("./EventSource.js");
|
|
26
24
|
var _HydrateContext = /*#__PURE__*/require("./HydrateContext.js");
|
|
27
25
|
var _indexRefCounter = /*#__PURE__*/require("./indexRefCounter.js");
|
|
28
26
|
var _parser = /*#__PURE__*/require("./parser.js");
|
|
@@ -30,73 +28,407 @@ var _parts = /*#__PURE__*/require("./parts.js");
|
|
|
30
28
|
var _utils = /*#__PURE__*/require("./utils.js");
|
|
31
29
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
32
30
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
31
|
+
const RenderPartMap = {
|
|
32
|
+
"attr": (templatePart, node, ctx) => {
|
|
33
|
+
const {
|
|
34
|
+
document,
|
|
35
|
+
refCounter,
|
|
36
|
+
renderContext,
|
|
37
|
+
values
|
|
38
|
+
} = ctx;
|
|
39
|
+
const element = node;
|
|
40
|
+
const attr = createAttribute(document, element, templatePart.name);
|
|
41
|
+
const renderable = values[templatePart.index];
|
|
42
|
+
let isSet = true;
|
|
43
|
+
const setValue = value => {
|
|
44
|
+
if (isNullOrUndefined(value)) {
|
|
45
|
+
element.removeAttribute(templatePart.name);
|
|
46
|
+
isSet = false;
|
|
47
|
+
} else {
|
|
48
|
+
attr.value = String(value);
|
|
49
|
+
if (isSet === false) {
|
|
50
|
+
element.setAttributeNode(attr);
|
|
51
|
+
isSet = true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
return matchSettablePart(renderable, setValue, () => _parts.AttributePartImpl.browser(templatePart.index, element, templatePart.name, renderContext), f => _effect.Effect.zipRight(renderContext.queue.add(element, f), refCounter.release(templatePart.index)), () => ctx.expected++);
|
|
56
|
+
},
|
|
57
|
+
"boolean-part": (templatePart, node, ctx) => {
|
|
58
|
+
const {
|
|
59
|
+
refCounter,
|
|
60
|
+
renderContext,
|
|
61
|
+
values
|
|
62
|
+
} = ctx;
|
|
63
|
+
const element = node;
|
|
64
|
+
const renderable = values[templatePart.index];
|
|
65
|
+
const setValue = value => {
|
|
66
|
+
element.toggleAttribute(templatePart.name, isNullOrUndefined(value) ? false : Boolean(value));
|
|
67
|
+
};
|
|
68
|
+
return matchSettablePart(renderable, setValue, () => _parts.BooleanPartImpl.browser(templatePart.index, element, templatePart.name, renderContext), f => _effect.Effect.zipRight(renderContext.queue.add(element, f), refCounter.release(templatePart.index)), () => ctx.expected++);
|
|
69
|
+
},
|
|
70
|
+
"className-part": (templatePart, node, ctx) => {
|
|
71
|
+
const {
|
|
72
|
+
refCounter,
|
|
73
|
+
renderContext,
|
|
74
|
+
values
|
|
75
|
+
} = ctx;
|
|
76
|
+
const element = node;
|
|
77
|
+
const renderable = values[templatePart.index];
|
|
78
|
+
let classNames = new Set();
|
|
79
|
+
const setValue = value => {
|
|
80
|
+
if (isNullOrUndefined(value)) {
|
|
81
|
+
element.classList.remove(...classNames);
|
|
82
|
+
classNames.clear();
|
|
83
|
+
} else {
|
|
84
|
+
const newClassNames = new Set(Array.isArray(value) ? value : [String(value)]);
|
|
85
|
+
const {
|
|
86
|
+
added,
|
|
87
|
+
removed
|
|
88
|
+
} = diffClassNames(classNames, newClassNames);
|
|
89
|
+
if (removed.length > 0) {
|
|
90
|
+
element.classList.remove(...removed);
|
|
91
|
+
}
|
|
92
|
+
if (added.length > 0) element.classList.add(...added);
|
|
93
|
+
classNames = newClassNames;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
return matchSettablePart(renderable, setValue, () => _parts.ClassNamePartImpl.browser(templatePart.index, element, renderContext), f => _effect.Effect.zipRight(renderContext.queue.add(element, f), refCounter.release(templatePart.index)), () => ctx.expected++);
|
|
97
|
+
},
|
|
98
|
+
"comment-part": (templatePart, node, ctx) => {
|
|
99
|
+
const {
|
|
100
|
+
refCounter,
|
|
101
|
+
renderContext,
|
|
102
|
+
values
|
|
103
|
+
} = ctx;
|
|
104
|
+
const comment = (0, _utils.findHoleComment)(node, templatePart.index);
|
|
105
|
+
const renderable = values[templatePart.index];
|
|
106
|
+
const setValue = value => {
|
|
107
|
+
comment.textContent = isNullOrUndefined(value) ? "" : String(value);
|
|
108
|
+
};
|
|
109
|
+
return matchSettablePart(renderable, setValue, () => _parts.CommentPartImpl.browser(templatePart.index, comment, renderContext), f => _effect.Effect.zipRight(renderContext.queue.add(comment, f), refCounter.release(templatePart.index)), () => ctx.expected++);
|
|
110
|
+
},
|
|
111
|
+
"data": (templatePart, node, ctx) => {
|
|
112
|
+
const element = node;
|
|
113
|
+
const renderable = ctx.values[templatePart.index];
|
|
114
|
+
const previousKeys = new Set(Object.keys(element.dataset));
|
|
115
|
+
const setValue = value => {
|
|
116
|
+
if (isNullOrUndefined(value)) {
|
|
117
|
+
for (const key of previousKeys) {
|
|
118
|
+
delete element.dataset[key];
|
|
119
|
+
}
|
|
120
|
+
previousKeys.clear();
|
|
121
|
+
} else {
|
|
122
|
+
for (const key of previousKeys) {
|
|
123
|
+
if (!(key in value)) {
|
|
124
|
+
delete element.dataset[key];
|
|
125
|
+
previousKeys.delete(key);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const key of Object.keys(value)) {
|
|
129
|
+
if (!previousKeys.has(key)) {
|
|
130
|
+
previousKeys.add(key);
|
|
131
|
+
}
|
|
132
|
+
element.dataset[key] = value[key] || "";
|
|
66
133
|
}
|
|
67
|
-
|
|
68
|
-
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
return matchSettablePart(renderable, setValue, () => _parts.DataPartImpl.browser(templatePart.index, element, ctx.renderContext), f => _effect.Effect.zipRight(ctx.renderContext.queue.add(element, f), ctx.refCounter.release(templatePart.index)), () => ctx.expected++);
|
|
137
|
+
},
|
|
138
|
+
"event": (templatePart, node, ctx) => {
|
|
139
|
+
const element = node;
|
|
140
|
+
const renderable = ctx.values[templatePart.index];
|
|
141
|
+
const handler = getEventHandler(renderable, ctx.context, ctx.onCause);
|
|
142
|
+
if (handler) {
|
|
143
|
+
ctx.eventSource.addEventListener(element, templatePart.name, handler);
|
|
69
144
|
}
|
|
70
|
-
|
|
145
|
+
return null;
|
|
146
|
+
},
|
|
147
|
+
"node": (templatePart, node, ctx) => {
|
|
148
|
+
const makeHydrateContext = ctx.makeHydrateContext;
|
|
149
|
+
const part = (0, _browser.makeRenderNodePart)(templatePart.index, node, ctx.renderContext, ctx.document, !!makeHydrateContext);
|
|
150
|
+
ctx.expected++;
|
|
151
|
+
const handle = handlePart(ctx.values[templatePart.index], value => _effect.Effect.zipRight(part.update(value), ctx.refCounter.release(templatePart.index)));
|
|
152
|
+
if (makeHydrateContext) {
|
|
153
|
+
return _effect.Effect.provideService(handle, _HydrateContext.HydrateContext, makeHydrateContext(templatePart.index));
|
|
154
|
+
} else {
|
|
155
|
+
return handle;
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
"property": (templatePart, node, ctx) => {
|
|
159
|
+
const element = node;
|
|
160
|
+
const renderable = ctx.values[templatePart.index];
|
|
161
|
+
const setValue = value => {
|
|
162
|
+
if (isNullOrUndefined(value)) {
|
|
163
|
+
delete element[templatePart.name];
|
|
164
|
+
} else {
|
|
165
|
+
;
|
|
166
|
+
element[templatePart.name] = value;
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
return matchSettablePart(renderable, setValue, () => _parts.PropertyPartImpl.browser(templatePart.index, element, templatePart.name, ctx.renderContext), f => _effect.Effect.zipRight(ctx.renderContext.queue.add(element, f), ctx.refCounter.release(templatePart.index)), () => ctx.expected++);
|
|
170
|
+
},
|
|
171
|
+
"properties": (templatePart, node, ctx) => {
|
|
172
|
+
const renderable = ctx.values[templatePart.index];
|
|
173
|
+
if (isNullOrUndefined(renderable)) return null;else if (Fx.isFx(renderable) || _effect.Effect.isEffect(renderable)) {
|
|
174
|
+
throw new Error(`Properties Part must utilize an Record of renderable values.`);
|
|
175
|
+
} else if (typeof renderable === "object" && !Array.isArray(renderable)) {
|
|
176
|
+
const element = node;
|
|
177
|
+
const toggleBoolean = (key, value) => {
|
|
178
|
+
element.toggleAttribute(key, isNullOrUndefined(value) ? false : Boolean(value));
|
|
179
|
+
};
|
|
180
|
+
const setAttribute = (key, value) => {
|
|
181
|
+
if (isNullOrUndefined(value)) {
|
|
182
|
+
element.removeAttribute(key);
|
|
183
|
+
} else {
|
|
184
|
+
element.setAttribute(key, String(value));
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const setProperty = (key, value) => {
|
|
188
|
+
if (isNullOrUndefined(value)) {
|
|
189
|
+
delete element[key];
|
|
190
|
+
} else {
|
|
191
|
+
;
|
|
192
|
+
element[key] = value;
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
const effects = [];
|
|
196
|
+
// We need indexes to track async values that won't conflict
|
|
197
|
+
// with any other Parts, we can start end of the current values.length
|
|
198
|
+
// As there should only ever be exactly 1 properties part.
|
|
199
|
+
let i = ctx.values.length;
|
|
200
|
+
loop: for (const [key, value] of Object.entries(renderable)) {
|
|
201
|
+
const index = ++i;
|
|
202
|
+
switch (key[0]) {
|
|
203
|
+
case "?":
|
|
204
|
+
{
|
|
205
|
+
const name = key.slice(1);
|
|
206
|
+
const eff = matchSettablePart(value, value => toggleBoolean(name, value), () => _parts.BooleanPartImpl.browser(index, element, name, ctx.renderContext), f => _effect.Effect.zipRight(ctx.renderContext.queue.add(element, f), ctx.refCounter.release(index)), () => ctx.expected++);
|
|
207
|
+
if (eff !== null) {
|
|
208
|
+
effects.push(eff);
|
|
209
|
+
}
|
|
210
|
+
continue loop;
|
|
211
|
+
}
|
|
212
|
+
case ".":
|
|
213
|
+
{
|
|
214
|
+
const name = key.slice(1);
|
|
215
|
+
const eff = matchSettablePart(value, value => setProperty(name, value), () => _parts.PropertyPartImpl.browser(index, element, name, ctx.renderContext), f => _effect.Effect.zipRight(ctx.renderContext.queue.add(element, f), ctx.refCounter.release(index)), () => ctx.expected++);
|
|
216
|
+
if (eff !== null) {
|
|
217
|
+
effects.push(eff);
|
|
218
|
+
}
|
|
219
|
+
continue loop;
|
|
220
|
+
}
|
|
221
|
+
case "@":
|
|
222
|
+
{
|
|
223
|
+
const name = key.slice(1);
|
|
224
|
+
const handler = getEventHandler(value, ctx.context, ctx.onCause);
|
|
225
|
+
if (handler) {
|
|
226
|
+
ctx.eventSource.addEventListener(element, name, handler);
|
|
227
|
+
}
|
|
228
|
+
continue loop;
|
|
229
|
+
}
|
|
230
|
+
case "o":
|
|
231
|
+
{
|
|
232
|
+
if (key[1] === "n") {
|
|
233
|
+
const name = key.slice(2);
|
|
234
|
+
const handler = getEventHandler(value, ctx.context, ctx.onCause);
|
|
235
|
+
if (handler) {
|
|
236
|
+
ctx.eventSource.addEventListener(element, name, handler);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
continue loop;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const eff = matchSettablePart(value, value => setAttribute(key, value), () => _parts.AttributePartImpl.browser(index, element, key, ctx.renderContext), f => _effect.Effect.zipRight(ctx.renderContext.queue.add(element, f), ctx.refCounter.release(index)), () => ctx.expected++);
|
|
243
|
+
if (eff !== null) {
|
|
244
|
+
effects.push(eff);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return effects;
|
|
248
|
+
} else {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
"ref": (templatePart, node, ctx) => {
|
|
253
|
+
const element = node;
|
|
254
|
+
const renderable = ctx.values[templatePart.index];
|
|
255
|
+
if ((0, _Directive.isDirective)(renderable)) {
|
|
256
|
+
return renderable(new _parts.RefPartImpl(ElementSource.fromElement(element), templatePart.index));
|
|
257
|
+
} else if (ElementRef.isElementRef(renderable)) {
|
|
258
|
+
return ElementRef.set(renderable, element);
|
|
259
|
+
}
|
|
260
|
+
return null;
|
|
261
|
+
},
|
|
262
|
+
"sparse-attr": (templatePart, node, ctx) => {
|
|
263
|
+
const values = Array.from({
|
|
264
|
+
length: templatePart.nodes.length
|
|
265
|
+
}, () => "");
|
|
266
|
+
const element = node;
|
|
267
|
+
const attr = createAttribute(ctx.document, element, templatePart.name);
|
|
268
|
+
const setValue = (value, index) => _effect.Effect.suspend(() => {
|
|
269
|
+
values[index] = value || "";
|
|
270
|
+
return ctx.renderContext.queue.add(element, () => attr.value = values.join(""));
|
|
271
|
+
});
|
|
272
|
+
const effects = [];
|
|
273
|
+
for (let i = 0; i < templatePart.nodes.length; ++i) {
|
|
274
|
+
const node = templatePart.nodes[i];
|
|
275
|
+
if (node._tag === "text") {
|
|
276
|
+
values[i] = node.value;
|
|
277
|
+
} else {
|
|
278
|
+
const renderable = ctx.values[node.index];
|
|
279
|
+
const index = i;
|
|
280
|
+
const effect = matchSettablePart(renderable, value => setValue(value, index), () => new _parts.AttributePartImpl(templatePart.name, node.index, ({
|
|
281
|
+
value
|
|
282
|
+
}) => setValue(value, index), null), f => _effect.Effect.zipRight(ctx.renderContext.queue.add(element, f), ctx.refCounter.release(node.index)), () => ctx.expected++);
|
|
283
|
+
if (effect !== null) {
|
|
284
|
+
effects.push(effect);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return effects;
|
|
289
|
+
},
|
|
290
|
+
"sparse-class-name": (templatePart, node, ctx) => {
|
|
291
|
+
const element = node;
|
|
292
|
+
const effects = templatePart.nodes.flatMap(node => {
|
|
293
|
+
if (node._tag === "text") {
|
|
294
|
+
const split = splitClassNames(node.value);
|
|
295
|
+
if (split.length > 0) element.classList.add(...split);
|
|
296
|
+
return [];
|
|
297
|
+
} else {
|
|
298
|
+
const eff = RenderPartMap[node._tag](node, element, ctx);
|
|
299
|
+
if (eff === null) return [];
|
|
300
|
+
return Array.isArray(eff) ? eff : [eff];
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
return effects;
|
|
304
|
+
},
|
|
305
|
+
"sparse-comment": (templatePart, node, ctx) => {
|
|
306
|
+
const values = Array.from({
|
|
307
|
+
length: templatePart.nodes.length
|
|
308
|
+
}, () => "");
|
|
309
|
+
const comment = node;
|
|
310
|
+
const setValue = (value, index) => _effect.Effect.suspend(() => {
|
|
311
|
+
values[index] = value || "";
|
|
312
|
+
return ctx.renderContext.queue.add(comment, () => comment.textContent = values.join(""));
|
|
313
|
+
});
|
|
314
|
+
const effects = [];
|
|
315
|
+
for (let i = 0; i < templatePart.nodes.length; ++i) {
|
|
316
|
+
const node = templatePart.nodes[i];
|
|
317
|
+
if (node._tag === "text") {
|
|
318
|
+
values[i] = node.value;
|
|
319
|
+
} else {
|
|
320
|
+
const renderable = ctx.values[node.index];
|
|
321
|
+
const index = i;
|
|
322
|
+
const effect = matchSettablePart(renderable, value => setValue(value, index), () => new _parts.CommentPartImpl(node.index, ({
|
|
323
|
+
value
|
|
324
|
+
}) => setValue(value, index), null), f => _effect.Effect.zipRight(ctx.renderContext.queue.add(comment, f), ctx.refCounter.release(node.index)), () => ctx.expected++);
|
|
325
|
+
if (effect !== null) {
|
|
326
|
+
effects.push(effect);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return effects;
|
|
331
|
+
},
|
|
332
|
+
"text-part": (templatePart, node, ctx) => {
|
|
333
|
+
const part = _parts.TextPartImpl.browser(ctx.document, templatePart.index, node, ctx.renderContext);
|
|
334
|
+
ctx.expected++;
|
|
335
|
+
return handlePart(ctx.values[templatePart.index], value => _effect.Effect.zipRight(part.update(value), ctx.refCounter.release(templatePart.index)));
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
const SPACE_REGEXP = /\s+/g;
|
|
339
|
+
function splitClassNames(value) {
|
|
340
|
+
return value.split(SPACE_REGEXP).flatMap(a => {
|
|
341
|
+
const trimmed = a.trim();
|
|
342
|
+
return trimmed.length > 0 ? [trimmed] : [];
|
|
343
|
+
});
|
|
71
344
|
}
|
|
72
|
-
function
|
|
73
|
-
|
|
74
|
-
return _effect.Effect.forkScoped(Fx.observe(unwrapSparsePartRenderables(part.parts.map(p => p._tag === "static/text" ? Fx.succeed(p.value) : values[p.index]), part), value => _effect.Effect.tap(part.update(value), () => _effect.Effect.forEach(indexes, a => refCounter.release(a)))));
|
|
345
|
+
function isNullOrUndefined(value) {
|
|
346
|
+
return value === null || value === undefined;
|
|
75
347
|
}
|
|
76
|
-
function
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
} else {
|
|
89
|
-
const renderable = values[partIndex];
|
|
90
|
-
if (renderable === null || renderable === undefined) return refCounter.release(partIndex);
|
|
91
|
-
return handlePart(values[partIndex], value => _effect.Effect.tap(part.update(value), () => refCounter.release(partIndex)));
|
|
348
|
+
function diffClassNames(oldClassNames, newClassNames) {
|
|
349
|
+
const added = [];
|
|
350
|
+
const removed = [];
|
|
351
|
+
for (const className of oldClassNames) {
|
|
352
|
+
if (!newClassNames.has(className)) {
|
|
353
|
+
removed.push(className);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
for (const className of newClassNames) {
|
|
357
|
+
if (!oldClassNames.has(className) && className.trim()) {
|
|
358
|
+
added.push(className);
|
|
359
|
+
}
|
|
92
360
|
}
|
|
361
|
+
return {
|
|
362
|
+
added,
|
|
363
|
+
removed
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* @internal
|
|
368
|
+
*/
|
|
369
|
+
function renderPart2(part, content, path, ctx) {
|
|
370
|
+
return RenderPartMap[part._tag](part, (0, _utils.findPath)(content, path), ctx);
|
|
93
371
|
}
|
|
94
|
-
|
|
372
|
+
/**
|
|
373
|
+
* Here for "standard" browser rendering, a TemplateInstance is effectively a live
|
|
374
|
+
* view into the contents rendered by the Template.
|
|
375
|
+
*/
|
|
376
|
+
const renderTemplate = (document, renderContext) => (templateStrings, values) => {
|
|
377
|
+
const entry = getBrowserEntry(document, renderContext, templateStrings);
|
|
378
|
+
if (values.length === 0) {
|
|
379
|
+
return Fx.sync(() => (0, _RenderEvent.DomRenderEvent)((0, _wire.persistent)(document.importNode(entry.content, true))));
|
|
380
|
+
}
|
|
381
|
+
return Fx.make(sink => {
|
|
382
|
+
return _effect.Effect.gen(function* (_) {
|
|
383
|
+
const content = document.importNode(entry.content, true);
|
|
384
|
+
const context = yield* _(_effect.Effect.context());
|
|
385
|
+
const refCounter = yield* _((0, _indexRefCounter.indexRefCounter2)());
|
|
386
|
+
const ctx = {
|
|
387
|
+
context,
|
|
388
|
+
document,
|
|
389
|
+
eventSource: (0, _EventSource.makeEventSource)(),
|
|
390
|
+
expected: 0,
|
|
391
|
+
refCounter,
|
|
392
|
+
renderContext,
|
|
393
|
+
onCause: sink.onFailure,
|
|
394
|
+
values
|
|
395
|
+
};
|
|
396
|
+
// Connect our interpolated values to our template parts
|
|
397
|
+
const effects = [];
|
|
398
|
+
for (const [part, path] of entry.template.parts) {
|
|
399
|
+
const eff = renderPart2(part, content, path, ctx);
|
|
400
|
+
if (eff !== null) {
|
|
401
|
+
effects.push(...(Array.isArray(eff) ? eff : [eff]));
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// Fork any effects necessary
|
|
405
|
+
if (effects.length > 0) {
|
|
406
|
+
yield* _(_effect.Effect.forkAll(effects));
|
|
407
|
+
}
|
|
408
|
+
// If there's anything to wait on and it's not already done, wait for an initial value
|
|
409
|
+
// for all asynchronous sources.
|
|
410
|
+
if (ctx.expected > 0 && (yield* _(refCounter.expect(ctx.expected)))) {
|
|
411
|
+
yield* _(refCounter.wait);
|
|
412
|
+
}
|
|
413
|
+
// Create a persistent wire from our content
|
|
414
|
+
const wire = (0, _wire.persistent)(content);
|
|
415
|
+
// Set the element when it is ready
|
|
416
|
+
yield* _(ctx.eventSource.setup(wire, Context.get(context, _Scope.Scope)));
|
|
417
|
+
// Emit our DomRenderEvent
|
|
418
|
+
yield* _(sink.onSuccess((0, _RenderEvent.DomRenderEvent)(wire)));
|
|
419
|
+
// Ensure our templates last forever in the DOM environment
|
|
420
|
+
// so event listeners are kept attached to the current Scope.
|
|
421
|
+
yield* _(_effect.Effect.never);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
};
|
|
425
|
+
exports.renderTemplate = renderTemplate;
|
|
426
|
+
function getEventHandler(renderable, ctx, onCause) {
|
|
95
427
|
if (renderable && typeof renderable === "object") {
|
|
96
428
|
if (EventHandler.EventHandlerTypeId in renderable) {
|
|
97
|
-
return EventHandler.make(ev => _effect.Effect.catchAllCause(renderable.handler(ev), onCause), renderable.options);
|
|
429
|
+
return EventHandler.make(ev => _effect.Effect.provide(_effect.Effect.catchAllCause(renderable.handler(ev), onCause), ctx), renderable.options);
|
|
98
430
|
} else if (_effect.Effect.EffectTypeId in renderable) {
|
|
99
|
-
return EventHandler.make(() => _effect.Effect.catchAllCause(renderable, onCause));
|
|
431
|
+
return EventHandler.make(() => _effect.Effect.provide(_effect.Effect.catchAllCause(renderable, onCause), ctx));
|
|
100
432
|
}
|
|
101
433
|
}
|
|
102
434
|
return null;
|
|
@@ -107,7 +439,7 @@ function handlePart(renderable, update) {
|
|
|
107
439
|
case "object":
|
|
108
440
|
{
|
|
109
441
|
if (renderable === null || renderable === undefined) return update(null);else if (Array.isArray(renderable)) {
|
|
110
|
-
return renderable.length === 0 ? update(null) : _effect.Effect.forkScoped(Fx.observe(Fx.
|
|
442
|
+
return renderable.length === 0 ? update(null) : _effect.Effect.forkScoped(Fx.observe(Fx.tuple(renderable.map(unwrapRenderable)), update));
|
|
111
443
|
} else if (_TypeId.TypeId in renderable) {
|
|
112
444
|
return _effect.Effect.forkScoped(Fx.observe(renderable, update));
|
|
113
445
|
} else if (_effect.Effect.EffectTypeId in renderable) {
|
|
@@ -124,7 +456,7 @@ function unwrapRenderable(renderable) {
|
|
|
124
456
|
case "object":
|
|
125
457
|
{
|
|
126
458
|
if (renderable === null || renderable === undefined) return Fx.succeed(null);else if (Array.isArray(renderable)) {
|
|
127
|
-
return renderable.length === 0 ? Fx.succeed(null) : Fx.
|
|
459
|
+
return renderable.length === 0 ? Fx.succeed(null) : Fx.tuple(renderable.map(unwrapRenderable));
|
|
128
460
|
} else if (_TypeId.TypeId in renderable) {
|
|
129
461
|
return renderable;
|
|
130
462
|
} else if (_effect.Effect.EffectTypeId in renderable) {
|
|
@@ -135,20 +467,6 @@ function unwrapRenderable(renderable) {
|
|
|
135
467
|
return Fx.succeed(renderable);
|
|
136
468
|
}
|
|
137
469
|
}
|
|
138
|
-
function unwrapSparsePartRenderables(renderables, part) {
|
|
139
|
-
return Fx.combine(
|
|
140
|
-
// @ts-ignore type too deep
|
|
141
|
-
renderables.map((renderable, i) => {
|
|
142
|
-
const p = part.parts[i];
|
|
143
|
-
if (p._tag === "static/text") {
|
|
144
|
-
return Fx.succeed(p.value);
|
|
145
|
-
}
|
|
146
|
-
if ((0, _Directive.isDirective)(renderable)) {
|
|
147
|
-
return Fx.fromEffect(_effect.Effect.map(renderable(p), () => p.value));
|
|
148
|
-
}
|
|
149
|
-
return Fx.mapEffect(unwrapRenderable(renderable), u => _effect.Effect.map(p.update(u), () => p.value));
|
|
150
|
-
}));
|
|
151
|
-
}
|
|
152
470
|
function attachRoot(cache, where, what // TODO: Should we support HTML RenderEvents here too?
|
|
153
471
|
) {
|
|
154
472
|
return _effect.Effect.sync(() => {
|
|
@@ -191,86 +509,6 @@ function getBrowserEntry(document, ctx, templateStrings) {
|
|
|
191
509
|
return cached;
|
|
192
510
|
}
|
|
193
511
|
}
|
|
194
|
-
function buildParts(document, ctx, template, content, ref, onCause, isHydrating) {
|
|
195
|
-
return _effect.Effect.all(template.parts.map(([part, path]) => buildPartWithNode(document, ctx, part, (0, _utils.findPath)(content, path), ref, onCause, isHydrating)));
|
|
196
|
-
}
|
|
197
|
-
function buildPartWithNode(document, ctx, part, node, ref, onCause, isHydrating) {
|
|
198
|
-
switch (part._tag) {
|
|
199
|
-
case "attr":
|
|
200
|
-
return _effect.Effect.succeed(_parts.AttributePartImpl.browser(part.index, node, part.name, ctx));
|
|
201
|
-
case "boolean-part":
|
|
202
|
-
return _effect.Effect.succeed(_parts.BooleanPartImpl.browser(part.index, node, part.name, ctx));
|
|
203
|
-
case "className-part":
|
|
204
|
-
return _effect.Effect.succeed(_parts.ClassNamePartImpl.browser(part.index, node, ctx));
|
|
205
|
-
case "comment-part":
|
|
206
|
-
return _effect.Effect.succeed(_parts.CommentPartImpl.browser(part.index, node, ctx));
|
|
207
|
-
case "data":
|
|
208
|
-
return _effect.Effect.succeed(_parts.DataPartImpl.browser(part.index, node, ctx));
|
|
209
|
-
case "event":
|
|
210
|
-
return _parts.EventPartImpl.browser(part.name, part.index, ref, node, onCause);
|
|
211
|
-
case "node":
|
|
212
|
-
return _effect.Effect.succeed((0, _browser.makeRenderNodePart)(part.index, node, ctx, document, isHydrating));
|
|
213
|
-
case "property":
|
|
214
|
-
return _effect.Effect.succeed(_parts.PropertyPartImpl.browser(part.index, node, part.name, ctx));
|
|
215
|
-
case "ref":
|
|
216
|
-
return _effect.Effect.succeed(new _parts.RefPartImpl(ref.query(node), part.index));
|
|
217
|
-
case "sparse-attr":
|
|
218
|
-
{
|
|
219
|
-
const parts = Array(part.nodes.length);
|
|
220
|
-
const sparse = _parts.SparseAttributePartImpl.browser(part.name, parts, node, ctx);
|
|
221
|
-
for (let i = 0; i < part.nodes.length; ++i) {
|
|
222
|
-
const node = part.nodes[i];
|
|
223
|
-
if (node._tag === "text") {
|
|
224
|
-
parts.push(new _parts.StaticTextImpl(node.value));
|
|
225
|
-
sparse.value[i] = node.value;
|
|
226
|
-
} else {
|
|
227
|
-
parts.push(new _parts.AttributePartImpl(node.name, node.index, ({
|
|
228
|
-
value
|
|
229
|
-
}) => sparse.update((0, _ReadonlyArray.replace)(sparse.value, i, value || "")), sparse.value[i]));
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return _effect.Effect.succeed(sparse);
|
|
233
|
-
}
|
|
234
|
-
case "sparse-class-name":
|
|
235
|
-
{
|
|
236
|
-
const parts = [];
|
|
237
|
-
const values = []; // TODO: Do this for all other sparse attrs
|
|
238
|
-
const sparse = _parts.SparseClassNamePartImpl.browser(parts, node, ctx, values);
|
|
239
|
-
for (let i = 0; i < part.nodes.length; ++i) {
|
|
240
|
-
const node = part.nodes[i];
|
|
241
|
-
if (node._tag === "text") {
|
|
242
|
-
parts.push(new _parts.StaticTextImpl(node.value));
|
|
243
|
-
values.push(node.value);
|
|
244
|
-
} else {
|
|
245
|
-
values.push([]);
|
|
246
|
-
parts.push(new _parts.ClassNamePartImpl(node.index, ({
|
|
247
|
-
value
|
|
248
|
-
}) => sparse.update((0, _ReadonlyArray.replace)(sparse.value, i, value || "")), []));
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
return _effect.Effect.succeed(sparse);
|
|
252
|
-
}
|
|
253
|
-
case "sparse-comment":
|
|
254
|
-
{
|
|
255
|
-
const parts = Array(part.nodes.length);
|
|
256
|
-
const sparse = _parts.SparseCommentPartImpl.browser(node, parts, ctx);
|
|
257
|
-
for (let i = 0; i < part.nodes.length; ++i) {
|
|
258
|
-
const node = part.nodes[i];
|
|
259
|
-
if (node._tag === "text") {
|
|
260
|
-
parts.push(new _parts.StaticTextImpl(node.value));
|
|
261
|
-
sparse.value[i] = node.value;
|
|
262
|
-
} else {
|
|
263
|
-
parts.push(new _parts.CommentPartImpl(node.index, ({
|
|
264
|
-
value
|
|
265
|
-
}) => sparse.update((0, _ReadonlyArray.replace)(sparse.value, i, value || "")), sparse.value[i]));
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
return _effect.Effect.succeed(sparse);
|
|
269
|
-
}
|
|
270
|
-
case "text-part":
|
|
271
|
-
return _effect.Effect.succeed(_parts.TextPartImpl.browser(document, part.index, node, ctx));
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
512
|
function buildTemplate(document, {
|
|
275
513
|
nodes
|
|
276
514
|
}) {
|
|
@@ -296,6 +534,33 @@ function buildNode(document, node, isSvgContext) {
|
|
|
296
534
|
case "comment-part":
|
|
297
535
|
case "node":
|
|
298
536
|
return document.createComment(`hole${node.index}`);
|
|
537
|
+
case "doctype":
|
|
538
|
+
return document.implementation.createDocumentType(node.name, docTypeNameToPublicId(node.name), docTypeNameToSystemId(node.name));
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
function docTypeNameToPublicId(name) {
|
|
542
|
+
switch (name) {
|
|
543
|
+
case "html":
|
|
544
|
+
return "-//W3C//DTD HTML 4.01//EN";
|
|
545
|
+
case "svg":
|
|
546
|
+
return "-//W3C//DTD SVG 1.1//EN";
|
|
547
|
+
case "math":
|
|
548
|
+
return "-//W3C//DTD MathML 2.0//EN";
|
|
549
|
+
default:
|
|
550
|
+
return "";
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
function docTypeNameToSystemId(name) {
|
|
554
|
+
switch (name) {
|
|
555
|
+
// HTML5
|
|
556
|
+
case "html":
|
|
557
|
+
return "http://www.w3.org/TR/html4/strict.dtd";
|
|
558
|
+
case "svg":
|
|
559
|
+
return "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";
|
|
560
|
+
case "math":
|
|
561
|
+
return "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd";
|
|
562
|
+
default:
|
|
563
|
+
return "";
|
|
299
564
|
}
|
|
300
565
|
}
|
|
301
566
|
const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
|
|
@@ -329,4 +594,38 @@ function buildTextChild(document, node) {
|
|
|
329
594
|
}
|
|
330
595
|
return document.createComment(`hole${node.index}`);
|
|
331
596
|
}
|
|
597
|
+
function createAttribute(document, element, name) {
|
|
598
|
+
return element.getAttributeNode(name) ?? document.createAttribute(name);
|
|
599
|
+
}
|
|
600
|
+
function matchSettablePart(renderable, setValue, makePart, schedule, expect) {
|
|
601
|
+
return matchRenderable(renderable, {
|
|
602
|
+
Fx: fx => {
|
|
603
|
+
expect();
|
|
604
|
+
return Fx.observe(fx, a => schedule(() => setValue(a)));
|
|
605
|
+
},
|
|
606
|
+
Effect: effect => {
|
|
607
|
+
expect();
|
|
608
|
+
return _effect.Effect.flatMap(effect, a => schedule(() => setValue(a)));
|
|
609
|
+
},
|
|
610
|
+
Directive: directive => {
|
|
611
|
+
expect();
|
|
612
|
+
return directive(makePart());
|
|
613
|
+
},
|
|
614
|
+
Otherwise: otherwise => {
|
|
615
|
+
setValue(otherwise);
|
|
616
|
+
return null;
|
|
617
|
+
}
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
function matchRenderable(renderable, matches) {
|
|
621
|
+
if (Fx.isFx(renderable)) {
|
|
622
|
+
return matches.Fx(renderable);
|
|
623
|
+
} else if (_effect.Effect.isEffect(renderable)) {
|
|
624
|
+
return matches.Effect(renderable);
|
|
625
|
+
} else if ((0, _Directive.isDirective)(renderable)) {
|
|
626
|
+
return matches.Directive(renderable);
|
|
627
|
+
} else {
|
|
628
|
+
return matches.Otherwise(renderable);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
332
631
|
//# sourceMappingURL=render.js.map
|