@esportsplus/template 0.15.20 → 0.17.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/build/attributes.js +27 -23
- package/build/constants.d.ts +14 -3
- package/build/constants.js +15 -3
- package/build/event.js +7 -7
- package/build/html/cache.d.ts +2 -2
- package/build/html/cache.js +24 -16
- package/build/html/hydrate.d.ts +2 -6
- package/build/html/hydrate.js +29 -53
- package/build/html/index.d.ts +2106 -5
- package/build/html/index.js +12 -4
- package/build/render.d.ts +1 -2
- package/build/render.js +6 -10
- package/build/slot/cleanup.d.ts +4 -0
- package/build/slot/cleanup.js +51 -0
- package/build/slot/effect.d.ts +3 -0
- package/build/slot/effect.js +51 -0
- package/build/slot/index.d.ts +3 -0
- package/build/slot/index.js +15 -0
- package/build/slot/reactive.d.ts +3 -0
- package/build/slot/reactive.js +117 -0
- package/build/slot/render.d.ts +2 -0
- package/build/slot/render.js +58 -0
- package/build/svg.d.ts +1 -2
- package/build/types.d.ts +25 -21
- package/build/utilities.d.ts +3 -3
- package/build/utilities.js +12 -12
- package/package.json +2 -2
- package/src/attributes.ts +30 -28
- package/src/constants.ts +38 -4
- package/src/event.ts +8 -8
- package/src/html/cache.ts +28 -18
- package/src/html/hydrate.ts +38 -68
- package/src/html/index.ts +16 -8
- package/src/render.ts +8 -12
- package/src/slot/cleanup.ts +74 -0
- package/src/slot/effect.ts +73 -0
- package/src/slot/index.ts +23 -0
- package/src/slot/reactive.ts +167 -0
- package/src/slot/render.ts +81 -0
- package/src/svg.ts +1 -2
- package/src/types.ts +30 -20
- package/src/utilities.ts +15 -13
- package/build/slot.d.ts +0 -21
- package/build/slot.js +0 -200
- package/src/slot.ts +0 -287
package/src/slot.ts
DELETED
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
import { effect, root } from '@esportsplus/reactivity';
|
|
2
|
-
import { isArray, isFunction, isInstanceOf, isObject } from '@esportsplus/utilities';
|
|
3
|
-
import { RENDERABLE, RENDERABLE_REACTIVE } from './constants';
|
|
4
|
-
import { hydrate } from './html';
|
|
5
|
-
import { Element, Elements, HydrateResult, RenderableReactive, RenderableTemplate } from './types';
|
|
6
|
-
import { append, cloneNode, firstChild, fragment, microtask, nextSibling, nodeValue, raf, text } from './utilities'
|
|
7
|
-
import queue from '@esportsplus/queue';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const CLEANUP_KEY = Symbol();
|
|
11
|
-
|
|
12
|
-
const CONNECTED = 0;
|
|
13
|
-
|
|
14
|
-
const HYDRATING = 1;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
let cleanup = queue<VoidFunction[]>(64),
|
|
18
|
-
scheduled = false,
|
|
19
|
-
template = fragment('');
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
function after(anchor: Element, groups: HydrateResult[]) {
|
|
23
|
-
let n = groups.length;
|
|
24
|
-
|
|
25
|
-
if (n === 0) {
|
|
26
|
-
return [];
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
let fragment = cloneNode.call(template),
|
|
30
|
-
elements = new Array(n);
|
|
31
|
-
|
|
32
|
-
for (let i = 0; i < n; i++) {
|
|
33
|
-
let { elements: e, fragment: f } = groups[i];
|
|
34
|
-
|
|
35
|
-
append.call(fragment, f);
|
|
36
|
-
elements[i] = e;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
anchor.after(fragment);
|
|
40
|
-
|
|
41
|
-
return elements;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function remove(groups: Elements[]) {
|
|
45
|
-
for (let i = 0, n = groups.length; i < n; i++) {
|
|
46
|
-
let group = groups[i];
|
|
47
|
-
|
|
48
|
-
for (let j = 0, o = group.length; j < o; j++) {
|
|
49
|
-
let item = group[j];
|
|
50
|
-
|
|
51
|
-
if (CLEANUP_KEY in item) {
|
|
52
|
-
cleanup.add(item[CLEANUP_KEY] as VoidFunction[]);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
item.remove();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (!scheduled && cleanup.length) {
|
|
60
|
-
schedule();
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return groups;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function render(elements: Elements[], fragment: DocumentFragment | Node, input: unknown, slot?: Slot) {
|
|
67
|
-
if (input === false || input == null || input === '') {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
let type = typeof input;
|
|
72
|
-
|
|
73
|
-
if (type === 'string' || type === 'number') {
|
|
74
|
-
let element = text(type === 'string' ? input as string : String(input));
|
|
75
|
-
|
|
76
|
-
if (slot) {
|
|
77
|
-
slot.text = element;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
append.call(fragment, element);
|
|
81
|
-
elements.push([element]);
|
|
82
|
-
}
|
|
83
|
-
else if (isArray(input)) {
|
|
84
|
-
for (let i = 0, n = input.length; i < n; i++) {
|
|
85
|
-
render(elements, fragment, input[i]);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
else if (isObject(input) && RENDERABLE in input) {
|
|
89
|
-
if (input[RENDERABLE] === RENDERABLE_REACTIVE) {
|
|
90
|
-
let response = hydrate.reactive(input as RenderableReactive, slot!);
|
|
91
|
-
|
|
92
|
-
for (let i = 0, n = response.length; i < n; i++) {
|
|
93
|
-
let { elements: e, fragment: f } = response[i];
|
|
94
|
-
|
|
95
|
-
append.call(fragment, f);
|
|
96
|
-
elements.push(e);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
let { elements: e, fragment: f } = hydrate.static(input as RenderableTemplate<unknown>);
|
|
101
|
-
|
|
102
|
-
append.call(fragment, f);
|
|
103
|
-
elements.push(e);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
else if (isInstanceOf(input, NodeList)) {
|
|
107
|
-
let e: Elements = new Array(input.length),
|
|
108
|
-
i = 0;
|
|
109
|
-
|
|
110
|
-
for (let node = firstChild.call(input); node; node = nextSibling.call(node)) {
|
|
111
|
-
e[i++] = node;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
append.call(fragment, ...e);
|
|
115
|
-
elements.push(e);
|
|
116
|
-
}
|
|
117
|
-
else if (isInstanceOf(input, Node)) {
|
|
118
|
-
append.call(fragment, input);
|
|
119
|
-
elements.push([ input as Element ]);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function schedule() {
|
|
124
|
-
if (scheduled) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
scheduled = true;
|
|
129
|
-
microtask.add(task);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function task() {
|
|
133
|
-
let fn, fns;
|
|
134
|
-
|
|
135
|
-
while (fns = cleanup.next()) {
|
|
136
|
-
try {
|
|
137
|
-
while (fn = fns.pop()) {
|
|
138
|
-
fn();
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
catch { }
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
scheduled = false;
|
|
145
|
-
|
|
146
|
-
if (cleanup.length) {
|
|
147
|
-
schedule();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
class Slot {
|
|
153
|
-
marker: Element;
|
|
154
|
-
nodes: Elements[];
|
|
155
|
-
text: Element | null = null;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
constructor(marker: Element) {
|
|
159
|
-
ondisconnect(marker, () => this.clear());
|
|
160
|
-
|
|
161
|
-
this.marker = marker;
|
|
162
|
-
this.nodes = [];
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
get length() {
|
|
167
|
-
return this.nodes.length;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
set length(n: number) {
|
|
171
|
-
this.splice(n);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
anchor(index: number = this.nodes.length - 1) {
|
|
176
|
-
let nodes = this.nodes[index];
|
|
177
|
-
|
|
178
|
-
return nodes ? nodes[nodes.length - 1] : this.marker;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
clear() {
|
|
182
|
-
remove(this.nodes);
|
|
183
|
-
this.nodes.length = 0;
|
|
184
|
-
this.text = null;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
pop() {
|
|
188
|
-
let group = this.nodes.pop();
|
|
189
|
-
|
|
190
|
-
if (!group) {
|
|
191
|
-
return undefined;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return remove([group]);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
push(...groups: HydrateResult[]) {
|
|
198
|
-
return this.nodes.push( ...after(this.anchor(), groups) );
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
render(input: unknown, state = HYDRATING) {
|
|
202
|
-
if (isFunction(input)) {
|
|
203
|
-
ondisconnect(
|
|
204
|
-
this.marker,
|
|
205
|
-
effect(() => {
|
|
206
|
-
let v = input();
|
|
207
|
-
|
|
208
|
-
if (isFunction(v)) {
|
|
209
|
-
root(() => this.render(v(), state));
|
|
210
|
-
state = CONNECTED;
|
|
211
|
-
}
|
|
212
|
-
else if (state === HYDRATING) {
|
|
213
|
-
this.render(v, state);
|
|
214
|
-
state = CONNECTED;
|
|
215
|
-
}
|
|
216
|
-
else if (state === CONNECTED) {
|
|
217
|
-
raf.add(() => {
|
|
218
|
-
this.render(v, state);
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
})
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
return this;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (this.text && this.text.isConnected) {
|
|
228
|
-
let type = typeof input;
|
|
229
|
-
|
|
230
|
-
if (input == null || type !== 'object') {
|
|
231
|
-
nodeValue.call(this.text, (type === 'number' || type === 'string') ? input : '');
|
|
232
|
-
return this;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
this.clear();
|
|
237
|
-
|
|
238
|
-
let fragment = cloneNode.call(template),
|
|
239
|
-
nodes: Elements[] = [];
|
|
240
|
-
|
|
241
|
-
render(nodes, fragment, input, this);
|
|
242
|
-
|
|
243
|
-
this.marker.after(fragment);
|
|
244
|
-
this.nodes = nodes;
|
|
245
|
-
|
|
246
|
-
return this;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
shift() {
|
|
250
|
-
let group = this.nodes.shift();
|
|
251
|
-
|
|
252
|
-
if (!group) {
|
|
253
|
-
return undefined;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
return remove([group]);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
splice(start: number, stop: number = this.nodes.length, ...groups: HydrateResult[]) {
|
|
260
|
-
if (!groups.length) {
|
|
261
|
-
return remove(this.nodes.splice(start, stop));
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
return remove(
|
|
265
|
-
this.nodes.splice(
|
|
266
|
-
start,
|
|
267
|
-
stop,
|
|
268
|
-
...after(this.anchor(start), groups)
|
|
269
|
-
)
|
|
270
|
-
);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
unshift(...groups: HydrateResult[]) {
|
|
274
|
-
return this.nodes.unshift( ...after(this.marker, groups) );
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
const ondisconnect = (element: Element, fn: VoidFunction) => {
|
|
280
|
-
((element[CLEANUP_KEY] ??= []) as VoidFunction[]).push(fn);
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
export default (marker: Element, value: unknown) => {
|
|
285
|
-
return new Slot(marker).render(value);
|
|
286
|
-
};
|
|
287
|
-
export { ondisconnect, Slot };
|