@marko/runtime-tags 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/common/helpers.d.ts +4 -0
  2. package/dist/common/types.d.ts +90 -0
  3. package/dist/debug/dom.js +1411 -0
  4. package/dist/debug/dom.js.map +7 -0
  5. package/dist/debug/dom.mjs +1388 -0
  6. package/dist/debug/dom.mjs.map +7 -0
  7. package/dist/debug/html.js +1323 -0
  8. package/dist/debug/html.js.map +7 -0
  9. package/dist/debug/html.mjs +1263 -0
  10. package/dist/debug/html.mjs.map +7 -0
  11. package/dist/dom/abort-signal.d.ts +3 -0
  12. package/dist/dom/control-flow.d.ts +14 -0
  13. package/dist/dom/dom.d.ts +14 -0
  14. package/dist/dom/event.d.ts +3 -0
  15. package/dist/dom/queue.d.ts +10 -0
  16. package/dist/dom/reconcile-domdiff.d.ts +2 -0
  17. package/dist/dom/reconcile-listdiff.d.ts +2 -0
  18. package/dist/dom/reconcile-longest-increasing-subsequence.d.ts +2 -0
  19. package/dist/dom/reconcile.d.ts +1 -0
  20. package/dist/dom/renderer.d.ts +20 -0
  21. package/dist/dom/resume.d.ts +8 -0
  22. package/dist/dom/schedule.d.ts +2 -0
  23. package/dist/dom/scope.d.ts +13 -0
  24. package/dist/dom/signals.d.ts +31 -0
  25. package/dist/dom/template.d.ts +11 -0
  26. package/dist/dom/walker.d.ts +4 -0
  27. package/dist/dom.d.ts +11 -0
  28. package/dist/dom.js +904 -0
  29. package/dist/dom.js.map +7 -0
  30. package/dist/dom.mjs +884 -0
  31. package/dist/dom.mjs.map +7 -0
  32. package/dist/html/attrs.d.ts +4 -0
  33. package/dist/html/content.d.ts +5 -0
  34. package/dist/html/dynamic-tag.d.ts +12 -0
  35. package/dist/html/reorder-runtime.d.ts +1 -0
  36. package/dist/html/serializer.d.ts +38 -0
  37. package/dist/html/template.d.ts +9 -0
  38. package/dist/html/writer.d.ts +40 -0
  39. package/dist/html.d.ts +6 -0
  40. package/dist/html.js +933 -0
  41. package/dist/html.js.map +7 -0
  42. package/dist/html.mjs +876 -0
  43. package/dist/html.mjs.map +7 -0
  44. package/package.json +39 -0
package/dist/html.mjs ADDED
@@ -0,0 +1,876 @@
1
+ // src/html/content.ts
2
+ function toString(val) {
3
+ return val || val === 0 ? val + "" : "";
4
+ }
5
+ var escapeXML = escapeIfNeeded((val) => {
6
+ let result = "", lastPos = 0;
7
+ for (let i = 0, len = val.length; i < len; i++) {
8
+ let replacement;
9
+ switch (val[i]) {
10
+ case "<":
11
+ replacement = "&lt;";
12
+ break;
13
+ case "&":
14
+ replacement = "&amp;";
15
+ break;
16
+ default:
17
+ continue;
18
+ }
19
+ result += val.slice(lastPos, i) + replacement, lastPos = i + 1;
20
+ }
21
+ return lastPos ? result + val.slice(lastPos) : val;
22
+ }), escapeScript = escapeIfNeeded(escapeTagEnding("script")), escapeStyle = escapeIfNeeded(escapeTagEnding("style"));
23
+ function escapeTagEnding(tagName) {
24
+ let openTag = `</${tagName}`, escaped = `<\\/${tagName}`;
25
+ return (val) => {
26
+ let result = "", lastPos = 0, i = val.indexOf(openTag, lastPos);
27
+ for (; i !== -1; )
28
+ result += val.slice(lastPos, i) + escaped, lastPos = i + 1, i = val.indexOf(openTag, lastPos);
29
+ return lastPos ? result + val.slice(lastPos) : val;
30
+ };
31
+ }
32
+ function escapeAttrValue(val) {
33
+ let len = val.length, i = 0;
34
+ do
35
+ switch (val[i]) {
36
+ case '"':
37
+ return quoteValue(val, i + 1, "'", "&#39;");
38
+ case "'":
39
+ case ">":
40
+ case " ":
41
+ case " ":
42
+ case `
43
+ `:
44
+ case "\r":
45
+ case "\f":
46
+ return quoteValue(val, i + 1, '"', "&#34;");
47
+ default:
48
+ i++;
49
+ break;
50
+ }
51
+ while (i < len);
52
+ return val;
53
+ }
54
+ function escapeIfNeeded(escape) {
55
+ return (val) => {
56
+ if (!val && val !== 0)
57
+ return "&zwj;";
58
+ switch (typeof val) {
59
+ case "string":
60
+ return escape(val);
61
+ case "boolean":
62
+ return "true";
63
+ case "number":
64
+ return val + "";
65
+ default:
66
+ return escape(val + "");
67
+ }
68
+ };
69
+ }
70
+ function quoteValue(val, startPos, quote2, escaped) {
71
+ let result = quote2, lastPos = 0;
72
+ for (let i = startPos, len = val.length; i < len; i++)
73
+ val[i] === quote2 && (result += val.slice(lastPos, i) + escaped, lastPos = i + 1);
74
+ return result + (lastPos ? val.slice(lastPos) : val) + quote2;
75
+ }
76
+
77
+ // src/common/helpers.ts
78
+ function classValue(value) {
79
+ return toDelimitedString(value, " ", stringifyClassObject);
80
+ }
81
+ function stringifyClassObject(name, value) {
82
+ return isVoid(value) ? "" : name;
83
+ }
84
+ function styleValue(value) {
85
+ return toDelimitedString(value, ";", stringifyStyleObject);
86
+ }
87
+ var NON_DIMENSIONAL = /^(--|ta|or|li|z)|n-c|i(do|nk|m|t)|w$|we/;
88
+ function stringifyStyleObject(name, value) {
89
+ return isVoid(value) ? "" : (typeof value == "number" && value && !NON_DIMENSIONAL.test(name) && (value += "px"), `${name}:${value}`);
90
+ }
91
+ function toDelimitedString(val, delimiter, stringify) {
92
+ switch (typeof val) {
93
+ case "string":
94
+ return val;
95
+ case "object":
96
+ if (val !== null) {
97
+ let result = "", curDelimiter = "";
98
+ if (Array.isArray(val))
99
+ for (let v of val) {
100
+ let part = toDelimitedString(v, delimiter, stringify);
101
+ part !== "" && (result += curDelimiter + part, curDelimiter = delimiter);
102
+ }
103
+ else
104
+ for (let name in val) {
105
+ let v = val[name], part = stringify(name, v);
106
+ part !== "" && (result += curDelimiter + part, curDelimiter = delimiter);
107
+ }
108
+ return result;
109
+ }
110
+ }
111
+ return "";
112
+ }
113
+ function isVoid(value) {
114
+ return value == null || value === !1;
115
+ }
116
+
117
+ // src/html/attrs.ts
118
+ function classAttr(val) {
119
+ return stringAttr("class", classValue(val));
120
+ }
121
+ function styleAttr(val) {
122
+ return stringAttr("style", styleValue(val));
123
+ }
124
+ function attr(name, val) {
125
+ return isVoid(val) ? "" : nonVoidUntypedAttr(name, val);
126
+ }
127
+ function attrs(data) {
128
+ let result = "";
129
+ for (let name in data) {
130
+ if (/^on[A-Z-]/.test(name))
131
+ continue;
132
+ let val = data[name];
133
+ switch (name) {
134
+ case "class":
135
+ result += classAttr(val);
136
+ break;
137
+ case "style":
138
+ result += styleAttr(val);
139
+ break;
140
+ case "renderBody":
141
+ break;
142
+ default:
143
+ isVoid(val) || isInvalidAttrName(name) || (result += nonVoidUntypedAttr(name, val));
144
+ }
145
+ }
146
+ return result;
147
+ }
148
+ function stringAttr(name, val) {
149
+ return val && ` ${name}=${escapeAttrValue(val)}`;
150
+ }
151
+ function nonVoidUntypedAttr(name, val) {
152
+ switch (typeof val) {
153
+ case "string":
154
+ return ` ${name + attrAssignment(val)}`;
155
+ case "boolean":
156
+ return ` ${name}`;
157
+ case "number":
158
+ return ` ${name}=${val}`;
159
+ case "object":
160
+ if (val instanceof RegExp)
161
+ return ` ${name}=${escapeAttrValue(val.source)}`;
162
+ default:
163
+ return ` ${name + attrAssignment(val + "")}`;
164
+ }
165
+ }
166
+ function attrAssignment(val) {
167
+ return val ? `=${escapeAttrValue(val)}` : "";
168
+ }
169
+ function isInvalidAttrName(name) {
170
+ for (let i = name.length; i--; )
171
+ if (name[i] === ">")
172
+ return !0;
173
+ return !1;
174
+ }
175
+
176
+ // src/html/serializer.ts
177
+ var { hasOwnProperty } = Object.prototype, PARAM_BIND = "b", PARAM_SCOPE = "s", REF_START_CHARS = "hjkmoquxzABCDEFGHIJKLNPQRTUVWXYZ$_", REF_START_CHARS_LEN = REF_START_CHARS.length, REF_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$_", REF_CHARS_LEN = REF_CHARS.length, SYMBOL_REGISTRY_ID = Symbol("REGISTRY_ID"), SYMBOL_SCOPE = Symbol("SCOPE"), SYMBOL_SERIALIZE = Symbol("SERIALIZE"), Scope = class {
178
+ }, serializedScope = (scopeId) => {
179
+ let scope = new Scope();
180
+ return makeSerializable(scope, (s, a) => {
181
+ s.value(s.scopeLookup.get(scopeId), a);
182
+ });
183
+ };
184
+ function register(entry, registryId, scopeId) {
185
+ return entry[SYMBOL_REGISTRY_ID] = registryId, entry[SYMBOL_SCOPE] = scopeId, entry;
186
+ }
187
+ function getRegistryInfo(entry) {
188
+ return [entry[SYMBOL_REGISTRY_ID], entry[SYMBOL_SCOPE]];
189
+ }
190
+ function makeSerializable(object, serialize) {
191
+ return object[SYMBOL_SERIALIZE] = serialize, object;
192
+ }
193
+ var Serializer = class {
194
+ // TODO: hoist these back out?
195
+ STACK = [];
196
+ BUFFER = [""];
197
+ ASSIGNMENTS = /* @__PURE__ */ new Map();
198
+ INDEX_OR_REF = /* @__PURE__ */ new WeakMap();
199
+ REF_COUNT = 0;
200
+ // These stay
201
+ PARENTS = /* @__PURE__ */ new WeakMap();
202
+ KEYS = /* @__PURE__ */ new WeakMap();
203
+ VALUES = /* @__PURE__ */ new Map();
204
+ scopeLookup;
205
+ constructor(scopeLookup) {
206
+ this.scopeLookup = scopeLookup, this.BUFFER.pop();
207
+ }
208
+ stringify(root) {
209
+ if (this.writeProp(root, "")) {
210
+ let { BUFFER, REF_COUNT, ASSIGNMENTS, INDEX_OR_REF } = this, result = BUFFER[0];
211
+ for (let i = 1, len = BUFFER.length; i < len; i++)
212
+ result += BUFFER[i];
213
+ if (REF_COUNT) {
214
+ if (ASSIGNMENTS.size) {
215
+ let ref = INDEX_OR_REF.get(root);
216
+ typeof ref == "number" && (ref = toRefParam(this.REF_COUNT++), result = ref + "=" + result);
217
+ for (let [assignmentRef, assignments] of ASSIGNMENTS)
218
+ result += "," + assignments + assignmentRef;
219
+ result += "," + ref, this.ASSIGNMENTS = /* @__PURE__ */ new Map();
220
+ }
221
+ result = "(" + PARAM_BIND + "," + PARAM_SCOPE + "," + this.refParamsString() + ")=>(" + result + ")";
222
+ } else
223
+ root && root.constructor === Object && (result = "(" + PARAM_BIND + "," + PARAM_SCOPE + ")=>(" + result + ")");
224
+ return BUFFER.length = 0, this.INDEX_OR_REF = /* @__PURE__ */ new WeakMap(), result;
225
+ }
226
+ return "void 0";
227
+ }
228
+ code(code) {
229
+ return this.BUFFER.push(code), this;
230
+ }
231
+ value(value, accessor = "") {
232
+ return !this.writeProp(value, accessor) && !this.STACK.includes(value) && this.BUFFER.push("void 0"), this;
233
+ }
234
+ writeProp(cur, accessor) {
235
+ let { BUFFER } = this;
236
+ switch (typeof cur) {
237
+ case "string":
238
+ BUFFER.push(quote(cur, 0));
239
+ break;
240
+ case "number":
241
+ BUFFER.push(cur + "");
242
+ break;
243
+ case "boolean":
244
+ BUFFER.push(cur ? "!0" : "!1");
245
+ break;
246
+ case "function":
247
+ case "object":
248
+ if (cur === null)
249
+ BUFFER.push("null");
250
+ else {
251
+ let ref = this.getRef(cur, accessor);
252
+ switch (ref) {
253
+ case !0:
254
+ return !1;
255
+ case !1:
256
+ switch (cur.constructor) {
257
+ case Object:
258
+ this.writeObject(cur);
259
+ break;
260
+ case Array:
261
+ this.writeArray(cur);
262
+ break;
263
+ case Date:
264
+ BUFFER.push(
265
+ 'new Date("' + cur.toISOString() + '")'
266
+ );
267
+ break;
268
+ case RegExp:
269
+ BUFFER.push(cur + "");
270
+ break;
271
+ case Map:
272
+ BUFFER.push("new Map("), this.writeArray(
273
+ Array.from(cur)
274
+ ), BUFFER.push(")");
275
+ break;
276
+ case Set:
277
+ BUFFER.push("new Set("), this.writeArray(
278
+ Array.from(cur)
279
+ ), BUFFER.push(")");
280
+ break;
281
+ case void 0:
282
+ BUFFER.push("Object.assign(Object.create(null),"), this.writeObject(cur), BUFFER.push("))");
283
+ break;
284
+ default:
285
+ return this.writeRegistered(
286
+ cur,
287
+ accessor
288
+ );
289
+ }
290
+ break;
291
+ default:
292
+ BUFFER.push(ref);
293
+ break;
294
+ }
295
+ }
296
+ break;
297
+ default:
298
+ return !1;
299
+ }
300
+ return !0;
301
+ }
302
+ writeRegistered(value, accessor) {
303
+ let {
304
+ [SYMBOL_REGISTRY_ID]: registryId,
305
+ [SYMBOL_SCOPE]: scopeId,
306
+ [SYMBOL_SERIALIZE]: serialize
307
+ } = value, { BUFFER } = this;
308
+ if (registryId) {
309
+ let scope = scopeId !== void 0 ? this.scopeLookup.get(scopeId) ?? !1 : void 0, ref = scope && this.getRef(scope, "");
310
+ if (ref === !0) {
311
+ let { STACK, INDEX_OR_REF, ASSIGNMENTS } = this, parent = STACK[STACK.length - 1], parentRef = INDEX_OR_REF.get(parent), resolvedRef = INDEX_OR_REF.get(scope);
312
+ return ASSIGNMENTS.set(
313
+ `${PARAM_BIND}("${registryId}",${resolvedRef})`,
314
+ (ASSIGNMENTS.get(ref) || "") + toAssignment(parentRef, accessor) + "="
315
+ ), !1;
316
+ } else {
317
+ if (ref === !1)
318
+ throw new Error(
319
+ "The scope has not yet been defined. This needs to be fixed in the serializer."
320
+ );
321
+ return BUFFER.push(`${PARAM_BIND}("${registryId}"${ref ? "," + ref : ""})`), !0;
322
+ }
323
+ } else if (serialize) {
324
+ let prevSize = BUFFER.length;
325
+ return serialize(this, accessor), prevSize !== BUFFER.length;
326
+ }
327
+ return !1;
328
+ }
329
+ writeObject(obj) {
330
+ let { STACK, BUFFER } = this, sep = "{";
331
+ STACK.push(obj);
332
+ for (let key in obj)
333
+ if (hasOwnProperty.call(obj, key)) {
334
+ let val = obj[key], escapedKey = toObjectKey(key);
335
+ BUFFER.push(sep + escapedKey + ":"), this.writeProp(val, escapedKey) ? sep = "," : BUFFER.pop();
336
+ }
337
+ sep === "{" ? BUFFER.push("{}") : BUFFER.push("}"), STACK.pop();
338
+ }
339
+ writeArray(arr) {
340
+ let { STACK, BUFFER } = this;
341
+ BUFFER.push("["), STACK.push(arr), this.writeProp(arr[0], 0);
342
+ for (let i = 1, len = arr.length; i < len; i++)
343
+ BUFFER.push(","), this.writeProp(arr[i], i);
344
+ STACK.pop(), BUFFER.push("]");
345
+ }
346
+ getRef(cur, accessor) {
347
+ let { STACK, BUFFER, INDEX_OR_REF, ASSIGNMENTS, PARENTS, KEYS } = this, ref = INDEX_OR_REF.get(cur);
348
+ if (ref === void 0) {
349
+ INDEX_OR_REF.set(cur, BUFFER.length);
350
+ let knownParent = PARENTS.get(cur);
351
+ if (knownParent === void 0) {
352
+ let parent = STACK[STACK.length - 1];
353
+ return parent && (PARENTS.set(cur, parent), KEYS.set(cur, toObjectKey(accessor))), !1;
354
+ } else {
355
+ let ref2 = "";
356
+ for (; knownParent; )
357
+ ref2 = toPropertyAccess(KEYS.get(cur)) + ref2, knownParent = PARENTS.get(cur = knownParent);
358
+ return PARAM_SCOPE + ref2;
359
+ }
360
+ }
361
+ if (typeof ref == "number" && (ref = this.insertAndGetRef(cur, ref)), STACK.includes(cur)) {
362
+ let parent = STACK[STACK.length - 1], parentRef = INDEX_OR_REF.get(parent);
363
+ return typeof parentRef == "number" && (parentRef = this.insertAndGetRef(parent, parentRef)), accessor !== "" && ASSIGNMENTS.set(
364
+ ref,
365
+ (ASSIGNMENTS.get(ref) || "") + toAssignment(parentRef, accessor) + "="
366
+ ), !0;
367
+ }
368
+ return ref;
369
+ }
370
+ insertAndGetRef(obj, pos) {
371
+ let ref = toRefParam(this.REF_COUNT++);
372
+ return this.INDEX_OR_REF.set(obj, ref), pos ? this.BUFFER[pos - 1] += ref + "=" : this.BUFFER[pos] = ref + "=" + this.BUFFER[pos], ref;
373
+ }
374
+ refParamsString() {
375
+ let result = REF_START_CHARS[0];
376
+ for (let i = 1; i < this.REF_COUNT; i++)
377
+ result += "," + toRefParam(i);
378
+ return this.REF_COUNT = 0, result;
379
+ }
380
+ };
381
+ function toAssignment(parent, key) {
382
+ return parent + toPropertyAccess(key);
383
+ }
384
+ function toPropertyAccess(key) {
385
+ return typeof key == "number" || key[0] === '"' ? "[" + key + "]" : "." + key;
386
+ }
387
+ function toObjectKey(name) {
388
+ if (typeof name != "string")
389
+ return name;
390
+ let char = name[0];
391
+ if (char >= "0" && char <= "9") {
392
+ for (let i = 1, len = name.length; i < len; i++)
393
+ if (char = name[i], !(char >= "0" && char <= "9"))
394
+ return quote(name, i);
395
+ return parseInt(name, 10);
396
+ } else
397
+ for (let i = 0, len = name.length; i < len; i++)
398
+ if (char = name[i], !(char >= "a" && char <= "z" || char >= "A" && char <= "Z" || char >= "0" && char <= "9" || char === "$" || char === "_"))
399
+ return quote(name, i);
400
+ return name;
401
+ }
402
+ function quote(str, startPos) {
403
+ let result = "", lastPos = 0;
404
+ for (let i = startPos, len = str.length; i < len; i++) {
405
+ let replacement;
406
+ switch (str[i]) {
407
+ case '"':
408
+ replacement = '\\"';
409
+ break;
410
+ case "\\":
411
+ replacement = "\\\\";
412
+ break;
413
+ case "<":
414
+ replacement = "\\x3C";
415
+ break;
416
+ case `
417
+ `:
418
+ replacement = "\\n";
419
+ break;
420
+ case "\r":
421
+ replacement = "\\r";
422
+ break;
423
+ case "\u2028":
424
+ replacement = "\\u2028";
425
+ break;
426
+ case "\u2029":
427
+ replacement = "\\u2029";
428
+ break;
429
+ default:
430
+ continue;
431
+ }
432
+ result += str.slice(lastPos, i) + replacement, lastPos = i + 1;
433
+ }
434
+ return lastPos === startPos ? result = str : result += str.slice(lastPos), '"' + result + '"';
435
+ }
436
+ function toRefParam(index) {
437
+ let mod = index % REF_START_CHARS_LEN, ref = REF_START_CHARS[mod];
438
+ for (index = (index - mod) / REF_START_CHARS_LEN; index > 0; )
439
+ mod = index % REF_CHARS_LEN, ref += REF_CHARS[mod], index = (index - mod) / REF_CHARS_LEN;
440
+ return ref;
441
+ }
442
+
443
+ // src/html/reorder-runtime.ts
444
+ function reorder_runtime_default(id, doc, walker, node, replacementNode, targetParent, targetNode, refNode, nextNode, runtimePrefix) {
445
+ for (runtimePrefix = "RUNTIME_ID$", id = runtimePrefix + id, doc = document, walker = doc[runtimePrefix + "w"] || (doc[runtimePrefix + "w"] = doc.createTreeWalker(
446
+ doc,
447
+ 128
448
+ )); node = walker.nextNode(); )
449
+ node.data.indexOf(runtimePrefix) === 0 && (walker[node.data] = node);
450
+ for (replacementNode = doc.getElementById(id), targetNode = walker[id], targetParent = targetNode.parentNode; refNode = replacementNode.firstChild; )
451
+ targetParent.insertBefore(refNode, targetNode);
452
+ for (nextNode = replacementNode.parentNode, nextNode.removeChild(replacementNode.nextSibling), nextNode.removeChild(replacementNode), refNode = walker[id + "/"]; targetNode && (nextNode = targetNode.nextSibling, targetParent.removeChild(targetNode) !== refNode); )
453
+ targetNode = nextNode;
454
+ }
455
+
456
+ // src/html/writer.ts
457
+ var runtimeId = "M" /* DefaultRuntimeId */, reorderRuntimeString = String(reorder_runtime_default).replace(
458
+ "RUNTIME_ID",
459
+ runtimeId
460
+ ), $_buffer = null, $_streamData = null;
461
+ function createRenderFn(renderer) {
462
+ return (stream, input = {}, $global, streamState = {}) => {
463
+ let remainingChildren = 1, originalBuffer = $_buffer, originalStreamState = $_streamData, reject = (err) => {
464
+ stream.emit("error", err);
465
+ }, async = (complete) => {
466
+ remainingChildren += complete ? -1 : 1, remainingChildren || setImmediate(() => stream.end());
467
+ };
468
+ $_buffer = createInitialBuffer(stream), streamState.global = $global, $_streamData = createStreamState(streamState), $_buffer.onReject = reject, $_buffer.onAsync = async;
469
+ try {
470
+ scheduleFlush(), renderer(input), async(!0);
471
+ } catch (err) {
472
+ reject(err);
473
+ } finally {
474
+ $_buffer = originalBuffer, $_streamData = originalStreamState;
475
+ }
476
+ };
477
+ }
478
+ function write(data) {
479
+ $_buffer.content += data;
480
+ }
481
+ var TARGET_BUFFER_SIZE = 64e3;
482
+ function maybeFlush() {
483
+ !$_buffer.prev && $_buffer.content.length > TARGET_BUFFER_SIZE;
484
+ }
485
+ function scheduleFlush() {
486
+ let buffer = $_buffer, streamState = $_streamData;
487
+ buffer.prev || setImmediate(() => flushToStream(buffer, streamState));
488
+ }
489
+ function flushToStream(buffer, streamState) {
490
+ for (; buffer.prev; )
491
+ buffer = buffer.prev;
492
+ if (buffer.disabled)
493
+ return;
494
+ let stream = buffer.stream, { content, calls, scopes } = buffer;
495
+ for (buffer.flushed = !0; !buffer.pending && buffer.next; )
496
+ clearBuffer(buffer), buffer = buffer.next, buffer.prev = null, buffer.flushed = !0, content += buffer.content, calls += buffer.calls, buffer.scopes && (scopes ? Object.assign(scopes, buffer.scopes) : scopes = buffer.scopes);
497
+ let data = content + getResumeScript(calls, scopes, streamState);
498
+ data && (stream.write(data), stream.flush?.()), clearBuffer(buffer);
499
+ }
500
+ function createStreamState(state) {
501
+ return state.scopeId ??= 0, state.tagId ??= 0, state.placeholderId ??= 0, state.scopeLookup ??= /* @__PURE__ */ new Map(), state.runtimeFlushed ??= !1, state;
502
+ }
503
+ function createNextBuffer(prevBuffer) {
504
+ let newBuffer = {
505
+ stream: prevBuffer.stream,
506
+ pending: !1,
507
+ flushed: !1,
508
+ disabled: !1,
509
+ prev: prevBuffer,
510
+ next: prevBuffer?.next ?? null,
511
+ content: "",
512
+ calls: "",
513
+ scopes: null,
514
+ onReject: prevBuffer.onReject,
515
+ onAsync: prevBuffer.onAsync
516
+ };
517
+ return prevBuffer.next && (prevBuffer.next.prev = prevBuffer), prevBuffer.next = newBuffer, newBuffer;
518
+ }
519
+ function createDetatchedBuffer(parentBuffer) {
520
+ return {
521
+ stream: parentBuffer.stream,
522
+ pending: !1,
523
+ flushed: !1,
524
+ disabled: !0,
525
+ prev: null,
526
+ next: null,
527
+ content: "",
528
+ calls: "",
529
+ scopes: null,
530
+ onReject: parentBuffer.onReject,
531
+ onAsync: parentBuffer.onAsync
532
+ };
533
+ }
534
+ function createInitialBuffer(stream) {
535
+ return {
536
+ stream,
537
+ pending: !1,
538
+ flushed: !1,
539
+ disabled: !1,
540
+ prev: null,
541
+ next: null,
542
+ content: "",
543
+ calls: "",
544
+ scopes: null,
545
+ onReject: void 0,
546
+ onAsync: void 0
547
+ };
548
+ }
549
+ async function fork(promise, renderResult) {
550
+ let originalBuffer = $_buffer, originalStreamState = $_streamData;
551
+ scheduleFlush(), $_buffer.pending = !0, $_buffer.onAsync?.(!1), $_buffer = createNextBuffer($_buffer);
552
+ try {
553
+ let result;
554
+ try {
555
+ result = await promise, originalBuffer.pending = !1;
556
+ } finally {
557
+ $_buffer = originalBuffer, $_streamData = originalStreamState, scheduleFlush();
558
+ }
559
+ renderResult(result);
560
+ } catch (err) {
561
+ $_buffer.onReject?.(err);
562
+ } finally {
563
+ $_buffer.onAsync?.(!0), clearScope();
564
+ }
565
+ }
566
+ function tryCatch(renderBody, renderError) {
567
+ let id = nextPlaceholderId(), err = null, originalBuffer = $_buffer, tryBuffer = createDetatchedBuffer(originalBuffer), finalTryBuffer;
568
+ tryBuffer.onReject = (asyncErr) => {
569
+ let errorBuffer = createDetatchedBuffer(originalBuffer);
570
+ $_buffer = errorBuffer, renderError(asyncErr), replaceBuffers(
571
+ id,
572
+ tryBuffer,
573
+ finalTryBuffer,
574
+ errorBuffer,
575
+ $_buffer
576
+ );
577
+ };
578
+ try {
579
+ $_buffer = tryBuffer, renderBody();
580
+ } catch (_err) {
581
+ err = _err;
582
+ } finally {
583
+ err ? ($_buffer = originalBuffer, renderError(err)) : (tryBuffer.disabled = !1, originalBuffer.next = tryBuffer, tryBuffer.prev = originalBuffer, $_buffer !== tryBuffer && (tryBuffer.content = `<!${marker(id)}>` + tryBuffer.content, markReplaceEnd(id), finalTryBuffer = $_buffer, $_buffer = createNextBuffer(finalTryBuffer)), $_buffer.onReject = originalBuffer.onReject);
584
+ }
585
+ }
586
+ function tryPlaceholder(renderBody, renderPlaceholder) {
587
+ let originalBuffer = $_buffer, asyncBuffer = createDetatchedBuffer(originalBuffer), id, placeholderBuffer, finalPlaceholderBuffer, finalAsyncBuffer, remainingChildren = 0, remainingPlaceholders = 0;
588
+ asyncBuffer.onAsync = (complete, isPlaceholder) => {
589
+ let delta = complete ? -1 : 1;
590
+ isPlaceholder ? remainingPlaceholders += delta : remainingChildren += delta, remainingChildren || (isPlaceholder || replaceBuffers(
591
+ id,
592
+ placeholderBuffer,
593
+ finalPlaceholderBuffer,
594
+ asyncBuffer,
595
+ finalAsyncBuffer
596
+ ), remainingPlaceholders || originalBuffer.onAsync?.(!0, !0));
597
+ }, $_buffer = asyncBuffer, renderBody(), $_buffer === asyncBuffer ? (originalBuffer.next = asyncBuffer, asyncBuffer.prev = originalBuffer, asyncBuffer.disabled = !1, asyncBuffer.onAsync = originalBuffer.onAsync) : (id = nextPlaceholderId(), placeholderBuffer = createNextBuffer(originalBuffer), finalAsyncBuffer = $_buffer, $_buffer = placeholderBuffer, markReplaceStart(id), renderPlaceholder(), markReplaceEnd(id), finalPlaceholderBuffer = $_buffer, $_buffer = createNextBuffer(finalPlaceholderBuffer), originalBuffer.onAsync?.(!1, !0));
598
+ }
599
+ function clearBuffer(buffer) {
600
+ buffer.content = "", buffer.calls = "", buffer.scopes = null;
601
+ }
602
+ function clearScope() {
603
+ $_buffer = $_streamData = null;
604
+ }
605
+ function markReplaceStart(id) {
606
+ return $_buffer.content += `<!${marker(id)}>`;
607
+ }
608
+ function markReplaceEnd(id) {
609
+ return $_buffer.content += `<!${marker(id)}/>`;
610
+ }
611
+ function replaceBuffers(id, placeholderStart, placeholderEnd, replacementStart, replacementEnd) {
612
+ if (placeholderStart.flushed) {
613
+ addReplacementWrapper(id, replacementStart, replacementEnd);
614
+ let next = placeholderEnd.next;
615
+ if (placeholderEnd.flushed)
616
+ for (; next && !next.pending && next.flushed; )
617
+ next = next.next;
618
+ next && (replacementStart.next = next, next.prev = replacementEnd), $_buffer = replacementStart, scheduleFlush();
619
+ } else {
620
+ let prev = placeholderStart.prev, next = placeholderEnd.next;
621
+ prev && (prev.next = replacementStart, replacementStart.prev = prev), next && (next.prev = replacementEnd, replacementEnd.next = next);
622
+ }
623
+ replacementStart.disabled = !1;
624
+ }
625
+ function addReplacementWrapper(id, replacementStart, replacementEnd) {
626
+ let runtimeCall = runtimeId + "$r" /* VarReorderRuntime */;
627
+ $_streamData.runtimeFlushed || (runtimeCall = `(${runtimeCall}=${reorderRuntimeString})`, $_streamData.runtimeFlushed = !0), replacementStart.content = `<t id="${marker(id)}">` + replacementStart.content, replacementEnd.content += `</t><script>${runtimeCall}(${id})</script>`;
628
+ }
629
+ function marker(id) {
630
+ return `${runtimeId}$${id}`;
631
+ }
632
+ function nextTagId() {
633
+ return "s" + $_streamData.tagId++;
634
+ }
635
+ function nextPlaceholderId() {
636
+ return $_streamData.placeholderId++;
637
+ }
638
+ function nextScopeId() {
639
+ return $_streamData.scopeId++;
640
+ }
641
+ function peekNextScopeId() {
642
+ return $_streamData.scopeId;
643
+ }
644
+ function peekSerializedScope() {
645
+ return serializedScope(peekNextScopeId());
646
+ }
647
+ function writeEffect(scopeId, fnId) {
648
+ $_buffer.calls += `${scopeId},"${fnId}",`;
649
+ }
650
+ function writeScope(scopeId, scope, assignTo = $_streamData.scopeLookup.get(scopeId)) {
651
+ assignTo !== void 0 && (Array.isArray(assignTo) ? assignTo.push(scope) : scope = Object.assign(assignTo, scope)), $_buffer.scopes ??= {
652
+ $global: getFilteredGlobals($_streamData.global)
653
+ }, $_buffer.scopes[scopeId] = scope, $_streamData.scopeLookup.set(scopeId, scope);
654
+ }
655
+ function markResumeNode(scopeId, index) {
656
+ return `<!${runtimeId}*${scopeId} ${index}>`;
657
+ }
658
+ function markResumeScopeStart(scopeId, key) {
659
+ return `<!${runtimeId}[${scopeId}${key ? " " + key : ""}>`;
660
+ }
661
+ function markResumeControlEnd(scopeId, index) {
662
+ return `<!${runtimeId}]${scopeId} ${index}>`;
663
+ }
664
+ function markResumeControlSingleNodeEnd(scopeId, index, childScopeIds) {
665
+ return `<!${runtimeId}|${scopeId} ${index} ${childScopeIds ?? ""}>`;
666
+ }
667
+ function getResumeScript(calls, scopes, streamState) {
668
+ if (calls || scopes) {
669
+ let isFirstFlush, serializer = streamState.serializer;
670
+ return (isFirstFlush = !serializer) && (serializer = streamState.serializer = new Serializer(
671
+ streamState.scopeLookup
672
+ )), `<script>${isFirstFlush ? `(${runtimeId + "$h" /* VarResume */}=[])` : runtimeId + "$h" /* VarResume */}.push(${serializer.stringify(scopes)},[${calls}])</script>`;
673
+ }
674
+ return "";
675
+ }
676
+ function getFilteredGlobals($global) {
677
+ if (!$global)
678
+ return;
679
+ let serializedGlobals = $global.serializedGlobals;
680
+ if (!serializedGlobals)
681
+ return;
682
+ let filtered;
683
+ if (Array.isArray(serializedGlobals))
684
+ for (let key of serializedGlobals) {
685
+ let value = $global[key];
686
+ value !== void 0 && (filtered ? filtered[key] = value : filtered = { [key]: value });
687
+ }
688
+ else
689
+ for (let key in serializedGlobals)
690
+ if (serializedGlobals[key]) {
691
+ let value = $global[key];
692
+ value !== void 0 && (filtered ? filtered[key] = value : filtered = { [key]: value });
693
+ }
694
+ return filtered;
695
+ }
696
+
697
+ // src/html/dynamic-tag.ts
698
+ var voidElements = /* @__PURE__ */ new Set([
699
+ "area",
700
+ "base",
701
+ "br",
702
+ "col",
703
+ "embed",
704
+ "hr",
705
+ "img",
706
+ "input",
707
+ "link",
708
+ "meta",
709
+ "param",
710
+ "source",
711
+ "track",
712
+ "wbr"
713
+ ]);
714
+ function dynamicTagInput(tag, input, renderBody) {
715
+ if (!tag && !renderBody)
716
+ return;
717
+ let futureScopeId = peekNextScopeId(), futureScope = serializedScope(futureScopeId);
718
+ if (write(`${markResumeScopeStart(futureScopeId)}`), writeScope(futureScopeId, {}), !tag)
719
+ return renderBody(), futureScope;
720
+ if (typeof tag == "string")
721
+ return nextScopeId(), write(`<${tag}${attrs(input)}>`), voidElements.has(tag) || (renderBody && renderBody(), write(`</${tag}>`)), futureScope;
722
+ let renderer = getDynamicRenderer(tag);
723
+ if (typeof renderer == "function")
724
+ return renderer(renderBody ? { ...input, renderBody } : input), futureScope;
725
+ }
726
+ function dynamicTagArgs(tag, args) {
727
+ if (!tag)
728
+ return;
729
+ let futureScopeId = peekNextScopeId(), futureScope = serializedScope(futureScopeId);
730
+ if (write(`${markResumeScopeStart(futureScopeId)}`), writeScope(futureScopeId, {}), typeof tag == "string")
731
+ return nextScopeId(), write(`<${tag}${attrs(args[0])}></${tag}>`), futureScope;
732
+ let renderer = getDynamicRenderer(tag);
733
+ if (typeof renderer == "function")
734
+ return renderer(...args), futureScope;
735
+ }
736
+ var getDynamicRenderer = (tag) => tag._ || tag.renderBody || tag, createRenderer = (fn) => fn;
737
+ function patchDynamicTag(newGetDynamicRenderer, newCreateRenderer) {
738
+ getDynamicRenderer = newGetDynamicRenderer, createRenderer = newCreateRenderer;
739
+ }
740
+
741
+ // src/html/template.ts
742
+ var createTemplate = (renderer, id = "") => register(new ServerTemplate(renderer), id);
743
+ function deferred() {
744
+ let resolve, reject;
745
+ return { promise: new Promise((res, rej) => {
746
+ resolve = res, reject = rej;
747
+ }), resolve, reject };
748
+ }
749
+ async function stringFromAsync(iterable) {
750
+ let str = "";
751
+ for await (let part of iterable)
752
+ str += part;
753
+ return str;
754
+ }
755
+ var ServerRenderResult = class {
756
+ #iterable;
757
+ #promise;
758
+ constructor(iterable) {
759
+ this.#iterable = iterable;
760
+ }
761
+ [Symbol.asyncIterator]() {
762
+ return this.#iterable;
763
+ }
764
+ [Symbol.toStringTag] = "RenderResult";
765
+ then(onfulfilled, onrejected) {
766
+ return (this.#promise ||= stringFromAsync(this.#iterable)).then(
767
+ onfulfilled,
768
+ onrejected
769
+ );
770
+ }
771
+ catch(onrejected) {
772
+ return this.then(void 0, onrejected);
773
+ }
774
+ finally(onfinally) {
775
+ return this.then(void 0, void 0).finally(onfinally);
776
+ }
777
+ toReadable() {
778
+ return new ReadableStream({
779
+ start: async (controller) => {
780
+ try {
781
+ for await (let chunk of this.#iterable)
782
+ chunk && controller.enqueue(chunk);
783
+ controller.close();
784
+ } catch (err) {
785
+ controller.error(err);
786
+ }
787
+ }
788
+ });
789
+ }
790
+ }, ServerTemplate = class {
791
+ #writeTo;
792
+ _;
793
+ constructor(renderer) {
794
+ this._ = renderer, this.#writeTo = createRenderFn(renderer);
795
+ }
796
+ mount() {
797
+ throw new Error(
798
+ "mount() is not implemented for the HTML compilation of a Marko template"
799
+ );
800
+ }
801
+ render(templateInput = {}) {
802
+ let { $global, ...input } = templateInput, buffer = "", done = !1, pending = deferred();
803
+ return this.#writeTo(
804
+ {
805
+ write(data) {
806
+ buffer += data;
807
+ },
808
+ flush() {
809
+ pending.resolve({
810
+ value: buffer,
811
+ done: !1
812
+ }), buffer = "", pending = deferred();
813
+ },
814
+ emit(name, error) {
815
+ name === "error" && pending.reject(error);
816
+ },
817
+ end() {
818
+ done = !0, pending.resolve({
819
+ value: "",
820
+ done
821
+ });
822
+ }
823
+ },
824
+ input,
825
+ $global
826
+ ), new ServerRenderResult({
827
+ [Symbol.asyncIterator]() {
828
+ return this;
829
+ },
830
+ async next() {
831
+ if (buffer || done) {
832
+ let value = buffer;
833
+ return buffer = "", { value, done };
834
+ }
835
+ return pending.promise;
836
+ }
837
+ });
838
+ }
839
+ };
840
+ export {
841
+ $_streamData,
842
+ attr,
843
+ attrs,
844
+ classAttr,
845
+ createRenderFn,
846
+ createRenderer,
847
+ createTemplate,
848
+ dynamicTagArgs,
849
+ dynamicTagInput,
850
+ escapeAttrValue,
851
+ escapeScript,
852
+ escapeStyle,
853
+ escapeXML,
854
+ fork,
855
+ getRegistryInfo,
856
+ makeSerializable,
857
+ markResumeControlEnd,
858
+ markResumeControlSingleNodeEnd,
859
+ markResumeNode,
860
+ markResumeScopeStart,
861
+ maybeFlush,
862
+ nextScopeId,
863
+ nextTagId,
864
+ patchDynamicTag,
865
+ peekSerializedScope,
866
+ register,
867
+ serializedScope,
868
+ styleAttr,
869
+ toString,
870
+ tryCatch,
871
+ tryPlaceholder,
872
+ write,
873
+ writeEffect,
874
+ writeScope
875
+ };
876
+ //# sourceMappingURL=html.mjs.map