diff --git a/.sizes.json b/.sizes.json index 939193f94..4d3386521 100644 --- a/.sizes.json +++ b/.sizes.json @@ -7,68 +7,68 @@ { "name": "*", "total": { - "min": 13988, - "brotli": 5409 + "min": 14514, + "brotli": 5587 } }, { "name": "counter", "user": { "min": 301, - "brotli": 211 + "brotli": 210 }, "runtime": { - "min": 3670, - "brotli": 1543 + "min": 3774, + "brotli": 1588 }, "total": { - "min": 3971, - "brotli": 1754 + "min": 4075, + "brotli": 1798 } }, { "name": "counter 💧", "user": { "min": 219, - "brotli": 160 + "brotli": 161 }, "runtime": { - "min": 2297, - "brotli": 1086 + "min": 2555, + "brotli": 1162 }, "total": { - "min": 2516, - "brotli": 1246 + "min": 2774, + "brotli": 1323 } }, { "name": "comments", "user": { - "min": 1071, - "brotli": 588 + "min": 1066, + "brotli": 592 }, "runtime": { - "min": 7435, - "brotli": 3064 + "min": 7677, + "brotli": 3176 }, "total": { - "min": 8506, - "brotli": 3652 + "min": 8743, + "brotli": 3768 } }, { "name": "comments 💧", "user": { - "min": 934, + "min": 939, "brotli": 544 }, "runtime": { - "min": 7927, - "brotli": 3302 + "min": 8178, + "brotli": 3379 }, "total": { - "min": 8861, - "brotli": 3846 + "min": 9117, + "brotli": 3923 } } ] diff --git a/.sizes/comments.csr/entry.js b/.sizes/comments.csr/entry.js index 2c7cc6db2..e9dfaaf7e 100644 --- a/.sizes/comments.csr/entry.js +++ b/.sizes/comments.csr/entry.js @@ -2,30 +2,30 @@ import { r as s, c as n, a, - i as o, - v as t, - b as l, - l as i, + o, + b as t, + v as l, + q as i, d as c, e as u, f as m, - g as d, - q as e, + i as d, + g as e, h as r, j as v, - o as $, - k as f, + k as $, + l as f, m as b, n as p, -} from "./runtime-BUIbQm-R.js"; -const h = o(2, (s) => { +} from "./runtime-BHYPJMig.js"; +const h = e(2, (s) => { const { _: { 6: n, 8: a }, } = s; H(s[0], { comments: n.comments, path: a }); }), - k = a(8, null, void 0, h), - K = a(6, null, void 0, h), + k = t(8, null, void 0, h), + K = t(6, null, void 0, h), T = s( "QURHKITf", n( @@ -37,47 +37,47 @@ const h = o(2, (s) => { [K, k], ), ), - _ = o(2, (s) => { + _ = e(2, (s) => { const { _: { 2: n }, 7: a, } = s; U(s, `${n.path || "c"}-${a}`); }), - j = r(4), - E = v("ZcKJNKFe", (s) => - $( + j = v(4), + E = a("ZcKJNKFe", (s) => + o( s[2], "click", ((s) => { const { 9: n } = s; return function () { - f(s, F, !n); + i(s, F, !n); }; })(s), ), ), - F = t(9, (s, n) => { - m(s[0], "hidden", !n), d(s[3], n ? "[-]" : "[+]"), e(s, E); + F = l(9, (s, n) => { + c(s[0], "hidden", !n), u(s[3], n ? "[-]" : "[+]"), m(s, E); }), - U = t(8, (s, n) => m(s[0], "id", n), u(k, 4)), - Z = t(7, null, _), - g = t( + U = l(8, (s, n) => c(s[0], "id", n), r(k, 4)), + Z = l(7, null, _), + g = l( 6, (s, n) => { - d(s[1], n.text), j(s, n.comments ? T : null); + u(s[1], n.text), j(s, n.comments ? T : null); }, - l([j, u(K, 4)]), + d([j, r(K, 4)]), ), - q = t( + q = l( 5, (s, n) => { g(s, n[0]), Z(s, n[1]); }, - l([g, Z]), + d([g, Z]), ), - x = a(2, null, void 0, _), - D = i( + x = t(2, null, void 0, _), + D = f( 0, s( "$F_EaYZk", @@ -93,11 +93,11 @@ const h = o(2, (s) => { ), ), ), - H = t(2, (s, n) => D(s, [n.comments]), l([D, c(x, 0)])), + H = l(2, (s, n) => D(s, [n.comments]), d([D, $(x, 0)])), I = "", J = " b", N = function () {}, - Q = t(2, (s, n) => H(s[0], n), p(0, H)); + Q = l(2, (s, n) => H(s[0], n), p(0, H)); b( n( `${I}`, @@ -107,7 +107,7 @@ b( }, void 0, void 0, - t(1, (s, n) => Q(s, n[0]), Q), + l(1, (s, n) => Q(s, n[0]), Q), ), "rUbTinTf", ).mount(); diff --git a/.sizes/comments.ssr/entry.js b/.sizes/comments.ssr/entry.js index 7745951fb..a72da3628 100644 --- a/.sizes/comments.ssr/entry.js +++ b/.sizes/comments.ssr/entry.js @@ -2,29 +2,29 @@ import { r as s, c as n, a, - b as t, - o, + o as t, + b as o, v as l, - d as c, - e as i, - i as u, - f as m, - q as e, + q as c, + d as i, + e as u, + i as m, + f as e, g as d, h as r, j as f, k as p, l as v, m as $, -} from "./runtime-C35w6ZnD.js"; -const b = m(2, (s) => { +} from "./runtime-CcsLIbdY.js"; +const b = e(2, (s) => { const { _: { 6: n, 8: a }, } = s; I(s[0], { comments: n.comments, path: a }); }), - h = t(8, null, void 0, b), - k = t(6, null, void 0, b), + h = o(8, null, void 0, b), + k = o(6, null, void 0, b), K = s( "QURHKITf", n( @@ -36,7 +36,7 @@ const b = m(2, (s) => { [k, h], ), ), - _ = m(2, (s) => { + _ = e(2, (s) => { const { _: { 2: n }, 7: a, @@ -45,37 +45,37 @@ const b = m(2, (s) => { }), j = r(4), E = a("ZcKJNKFe", (s) => - o( + t( s[2], "click", ((s) => { const { 9: n } = s; return function () { - e(s, F, !n); + c(s, F, !n); }; })(s), ), ), F = l(9, (s, n) => { - c(s[0], "hidden", !n), i(s[3], n ? "[-]" : "[+]"), p(s, E); + i(s[0], "hidden", !n), u(s[3], n ? "[-]" : "[+]"), f(s, E); }), - Z = l(8, (s, n) => c(s[0], "id", n), d(h, 4)), + Z = l(8, (s, n) => i(s[0], "id", n), d(h, 4)), g = l(7, null, _), q = l( 6, (s, n) => { - i(s[1], n.text), j(s, n.comments ? K : null); + u(s[1], n.text), j(s, n.comments ? K : null); }, - u([j, d(k, 4)]), + m([j, d(k, 4)]), ), x = l( 5, (s, n) => { q(s, n[0]), g(s, n[1]); }, - u([q, g]), + m([q, g]), ), - D = t(2, null, void 0, _), + D = o(2, null, void 0, _), H = v( 0, s( @@ -92,7 +92,7 @@ const b = m(2, (s) => { ), ), ), - I = l(2, (s, n) => H(s, [n.comments]), u([H, f(D, 0)])), + I = l(2, (s, n) => H(s, [n.comments]), m([H, p(D, 0)])), J = "", N = " b", Q = function () {}; diff --git a/.sizes/counter.csr/entry.js b/.sizes/counter.csr/entry.js index da12fb0be..72e2a72e4 100644 --- a/.sizes/counter.csr/entry.js +++ b/.sizes/counter.csr/entry.js @@ -1,30 +1,30 @@ import { - c as s, - a as t, - v as a, - d as n, + r as s, + c as t, + o as a, + a as n, q as o, - r as c, - o as i, + v as c, + d as i, b as r, -} from "./runtime-C853KoX8.js"; -const u = c("XBSGKvBc", (s) => - i( +} from "./runtime-BhCks4YK.js"; +const u = s("XBSGKvBc", (s) => + a( s[0], "click", ((s) => { const { 2: t } = s; return function () { - r(s, m, t + 1); + o(s, m, t + 1); }; })(s), ), ), - m = a(2, (s, t) => { - n(s[1], t), o(s, u); + m = c(2, (s, t) => { + i(s[1], t), r(s, u); }); -s( - t("
", "D D m", (s) => { +t( + n("
", "D D m", (s) => { m(s, 0); }), "tPaZsVqd", diff --git a/.sizes/counter.ssr/entry.js b/.sizes/counter.ssr/entry.js index c4f5b1b86..e357bcc32 100644 --- a/.sizes/counter.ssr/entry.js +++ b/.sizes/counter.ssr/entry.js @@ -6,7 +6,7 @@ import { d as o, a as r, i as t, -} from "./runtime-BOMPXhWq.js"; +} from "./runtime-BP-z7kLQ.js"; const i = s("XBSGKvBc", (s) => a( s[0], diff --git a/.sizes/dom.js b/.sizes/dom.js index 8d7f88fba..cc50cb816 100644 --- a/.sizes/dom.js +++ b/.sizes/dom.js @@ -1,5 +1,5 @@ function e(e) { - return { p: 1, $global: e }; + return { B: 1, $global: e }; } var t = e({}); function n(e) { @@ -7,13 +7,13 @@ function n(e) { } function r(e) { return (t, n) => { - t.i ??= new Map(); - let r = t.i.get(n); - return r || ((r = e(t, n)), t.i.set(n, r)), r; + t.m ??= new Map(); + let r = t.m.get(n); + return r || ((r = e(t, n)), t.m.set(n, r)), r; }; } -var o = r((e, t) => t && { ...t, j: e }), - l = r((e, t) => +var o = r((e, t) => t && { ...t, n: e }), + i = r((e, t) => t.length ? function (...n) { return t.call(this, e, ...n); @@ -22,20 +22,20 @@ var o = r((e, t) => t && { ...t, j: e }), return t.call(this, e); }, ); -function i(e) { - f(e), e._?.g?.delete(e); - let t = e.q?.c; - if (t) for (let n of t) n.h?.(e); +function l(e) { + f(e), e._?.j?.delete(e); + let t = e.C?.c; + if (t) for (let n of t) n.k?.(e); return e; } function f(e) { - let t = e.g; + let t = e.j; if (t) for (let e of t) f(e); - let n = e.k; + let n = e.o; if (n) for (let e of n.values()) e.abort(); } function u(e) { - i(e); + l(e); let t = e.a, n = e.b.nextSibling; for (; t !== n; ) { @@ -56,12 +56,12 @@ function s(e, t) { return t ? e : ""; } var d = /^(--|ta|or|li|z)|n-c|i(do|nk|m|t)|w$|we/; -function g(e, t) { +function h(e, t) { return t || 0 === t ? `${e}:${"number" == typeof t && t && !d.test(e) ? t + "px" : t}` : ""; } -function h(e, t, n) { +function g(e, t, n) { switch (typeof e) { case "string": return e; @@ -70,14 +70,14 @@ function h(e, t, n) { let r = "", o = ""; if (Array.isArray(e)) - for (let l of e) { - let e = h(l, t, n); + for (let i of e) { + let e = g(i, t, n); "" !== e && ((r += o + e), (o = t)); } else - for (let l in e) { - let i = n(l, e[l]); - "" !== i && ((r += o + i), (o = t)); + for (let i in e) { + let l = n(i, e[i]); + "" !== l && ((r += o + l), (o = t)); } return r; } @@ -85,41 +85,41 @@ function h(e, t, n) { return ""; } function p(e, t) { - let n = e.k; + let n = e.o; if (n) { let e = n.get(t); e && (e.abort(), n.delete(t)); } } function b(e, t) { - let n = (e.k ??= new Map()), + let n = (e.o ??= new Map()), r = n.get(t); return ( r || ((function (e) { let t = e._; - for (; t && !t.g?.has(e); ) (t.g ||= new Set()).add(e), (t = (e = t)._); + for (; t && !t.j?.has(e); ) (t.j ||= new Set()).add(e), (t = (e = t)._); })(e), n.set(t, (r = new AbortController()))), r.signal ); } var v = new Map(), - m = new WeakMap(), - y = { capture: !0 }; -function w(e, t, n) { + w = new WeakMap(), + m = { capture: !0 }; +function y(e, t, n) { let r = v.get(t); r || v.set(t, (r = new WeakMap())), r.has(e) || (function (e, t) { let n = e.getRootNode(), - r = m.get(n); - r || m.set(n, (r = new Set())), - r.has(t) || (r.add(t), n.addEventListener(t, N, y)); + r = w.get(n); + r || w.set(n, (r = new Set())), + r.has(t) || (r.add(t), n.addEventListener(t, C, m)); })(e, t), r.set(e, n || void 0); } -function N(e) { +function C(e) { let t = e.target; if (t) { let n = v.get(e.type); @@ -127,9 +127,9 @@ function N(e) { for (; (t = t.parentElement) && !e.cancelBubble; ) n.get(t)?.(e, t); } } -var S = /^on[A-Z-]/; -function C(e, t, n) { - x( +var x = /^on[A-Z-]/; +function $(e, t, n) { + S( e, t, (function (e) { @@ -137,28 +137,28 @@ function C(e, t, n) { })(n), ); } -function x(e, t, n) { +function S(e, t, n) { void 0 === n ? e.removeAttribute(t) : e.setAttribute(t, n); } -function $(e, t) { - x( +function N(e, t) { + S( e, "class", (function (e) { - return h(e, " ", s); - })(t) || void 0, - ); -} -function k(e, t) { - x( - e, - "style", - (function (e) { - return h(e, ";", g); + return g(e, " ", s); })(t) || void 0, ); } function M(e, t) { + S( + e, + "style", + (function (e) { + return g(e, ";", h); + })(t) || void 0, + ); +} +function k(e, t) { let n = (function (e) { return e || 0 === e ? e + "" : "‍"; })(t); @@ -172,51 +172,51 @@ function A(e, t, n) { let t = n[e]; switch (e) { case "class": - $(o, t); + N(o, t); break; case "style": - k(o, t); + M(o, t); break; case "renderBody": break; default: - S.test(e) + x.test(e) ? ((r ??= {})["-" === e[2] ? e.slice(3) : e.slice(2).toLowerCase()] = t) - : C(o, e, t); + : $(o, e, t); } } e[t + "~"] = r; } -function T(e, t) { +function _(e, t) { let n = e[t], r = e[t + "~"]; - for (let e in r) w(n, e, r[e]); + for (let e in r) y(n, e, r[e]); } var E = document.createElement("template"); function B(e, t, n) { let r = e[n], o = e[n + "-"] || r, - l = r.parentNode, - i = o.nextSibling; + i = r.parentNode, + l = o.nextSibling; E.innerHTML = t || 0 === t ? `${t}` : ""; let f = E.content; - (e[n] = f.firstChild), (e[n + "-"] = f.lastChild), l.insertBefore(f, r); + (e[n] = f.firstChild), (e[n + "-"] = f.lastChild), i.insertBefore(f, r); let u = r; - for (; u !== i; ) { + for (; u !== l; ) { let e = u.nextSibling; u.remove(), (u = e); } } -function _(e, t, n) { +function I(e, t, n) { let r = e[n], o = e[n + "-"], - l = e[t]; - if (o) for (let e in o) e in r || (l[e] = void 0); - for (let e in r) l[e] = r[e]; + i = e[t]; + if (o) for (let e in o) e in r || (i[e] = void 0); + for (let e in r) i[e] = r[e]; e[n + "-"] = r; } -function j(e, t, n) { +function T(e, t, n) { let r = e[t]; r ? (Object.assign(r, n), r.onUpdate?.()) @@ -224,19 +224,19 @@ function j(e, t, n) { n.onMount?.(), (b(e, "-" + t).onabort = () => n.onDestroy?.())); } -var I = {}, +var j = {}, O = {}, q = {}; -function W(e, t) { +function R(e, t) { let n = e + "#"; return (e, r) => { - r !== I && void 0 === e[n] && t(e, r); + r !== j && void 0 === e[n] && t(e, r); }; } -function L(e, t) { +function z(e, t) { let n = e + "#"; return (r, o) => { - if (o !== I && o !== O && o !== q) { + if (o !== j && o !== O && o !== q) { if (null != o && "function" != typeof o) throw new Error(`Invalid value ${o} for change handler '${e}'`); if (void 0 !== r[n]) { @@ -254,113 +254,114 @@ function L(e, t) { t(r, o); }; } -function R(e, t, n) { +function D(e, t, n) { let r = e + "#"; - return (o, l) => { - if (l === I) 1 === (o[r] = (o[r] ?? 0) + 1) && n?.(o, I); - else if (l !== q) { - let i = void 0 !== o[r]; + return (o, i) => { + if (i === j) 1 === (o[r] = (o[r] ?? 0) + 1) && n?.(o, j); + else if (i !== q) { + let l = void 0 !== o[r]; 1 === (o[r] ||= 1) && - (l === O || (i && o[e] === l) + (i === O || (l && o[e] === i) ? n?.(o, O) - : ((o[e] = l), t?.(o, l), n?.(o, q))), + : ((o[e] = i), t?.(o, i), n?.(o, q))), o[r]--; } }; } -var D = 0; -function F(e, t, n) { - let r = "?" + D++, +var F = 0; +function L(e, t, n) { + let r = "?" + F++, o = r + "#"; - return (l, i) => { - i === I - ? 1 === (l[o] = (l[o] ?? 0) + 1) && n?.(l, I) - : void 0 === l[o] - ? ((l[o] = e - 1), (l[r] = !0)) - : 0 == --l[o] - ? i === q || l[r] - ? ((l[r] = !1), t(l, 0), n?.(l, q)) - : n?.(l, O) - : (l[r] ||= i === q); + return (i, l) => { + l === j + ? 1 === (i[o] = (i[o] ?? 0) + 1) && n?.(i, j) + : void 0 === i[o] + ? ((i[o] = e - 1), (i[r] = !0)) + : 0 == --i[o] + ? l === q || i[r] + ? ((i[r] = !1), t(i, 0), n?.(i, q)) + : n?.(i, O) + : (i[r] ||= l === q); }; } -var H = (e) => e._; -function z(e, t, n, r) { - let o = "?" + D++, - l = o + 1, - i = n || H, +var W = (e) => e._; +function P(e, t, n, r) { + let o = "?" + F++, + i = o + 1, + l = n || W, f = "function" == typeof e ? e : () => e; return (e, n) => { - if (n === I) 1 === (e[l] = (e[l] ?? 0) + 1) && r?.(e, I); + if (n === j) 1 === (e[i] = (e[i] ?? 0) + 1) && r?.(e, j); else { let u, a; - if (void 0 === e[l]) { - (u = i(e)), (a = f(e)); + if (void 0 === e[i]) { + (u = l(e)), (a = f(e)); let t = u[a + "#"], - r = void 0 === t ? !u.p : 0 === t; - (e[l] = r ? 1 : 2), (n = q); + r = void 0 === t ? !u.B : 0 === t; + (e[i] = r ? 1 : 2), (n = q); } - 0 == --e[l] + 0 == --e[i] ? n === q || e[o] - ? ((e[o] = !1), (u ??= i(e)), (a ??= f(e)), t?.(e, u[a]), r?.(e, q)) + ? ((e[o] = !1), (u ??= l(e)), (a ??= f(e)), t?.(e, u[a]), r?.(e, q)) : r?.(e, O) : (e[o] ||= n === q); } }; } -function J(e, t, n, r) { - let o = n || H, - i = "function" == typeof e ? e : () => e, - f = z(i, t, o, r); +function G(e, t, n, r) { + let o = n || W, + l = "function" == typeof e ? e : () => e, + f = P(l, t, o, r); return ( - (f.e = (e) => { + (f.g = (e) => { let t = o(e), - n = i(e) + "*"; - (t[n] ??= new Set()), t[n].add(l(e, f)); + n = l(e) + "*"; + (t[n] ??= new Set()), t[n].add(i(e, f)); }), - (f.h = (e) => { + (f.k = (e) => { let t = o(e), - n = i(e) + "*"; - t[n]?.delete(l(e, f)); + n = l(e) + "*"; + t[n]?.delete(i(e, f)); }), f ); } -function U(e, t) { +function H(e, t) { let n = (n, r) => { let o = n[t]; for (let t of e) t(o, r); }; return ( - (n.e = (n) => { + (n.g = (n) => { let r = n[t]; - for (let t of e) t.e?.(r); + for (let t of e) t.g?.(r); }), - (n.h = (n) => { + (n.k = (n) => { let r = n[t]; - for (let t of e) t.h?.(r); + for (let t of e) t.k?.(r); }), n ); } -function V(e) { +function J(e) { let t = e + "*"; return (e, n) => { let r = e[t]; if (r) for (let e of r) e(n); }; } -function Z(e, t, n) { +function U(e, t, n) { e[t]["/"] = (t) => n(e, t); } -var G = (e, t) => e["/"]?.(t), +var Z = (e, t) => e["/"]?.(t), K = (e, t, n) => { let r = e?.c; if (r) for (let e of r) e(t, n); }, - P = 0; -function Q() { - return "c" + P++; + Q = new WeakMap(); +function V({ $global: e }) { + let t = Q.get(e) || 0; + return Q.set(e, t + 1), "c" + e.runtimeId + e.renderId + t.toString(36); } function X(e, t) { return (n, r) => { @@ -385,17 +386,17 @@ function ne(e, t, n) { } function re(t, n, r) { let o, - l = 0, i = 0, + l = 0, f = 0; for (; (o = t.charCodeAt(r++)); ) - if (((i = l), (l = 0), o >= 117)) l = 10 * i + o - 117; + if (((l = i), (i = 0), o >= 117)) i = 10 * l + o - 117; else if (o >= 107) { - for (o = 10 * i + o - 107; o--; ) ee.parentNode(); + for (o = 10 * l + o - 107; o--; ) ee.parentNode(); ee.nextSibling(); } else if (o >= 97) - for (o = 10 * i + o - 97; o--; ) !ee.nextSibling() && ee.nextNode(); - else if (o >= 67) for (o = 20 * i + o - 67; o--; ) ee.nextNode(); + for (o = 10 * l + o - 97; o--; ) !ee.nextSibling() && ee.nextNode(); + else if (o >= 67) for (o = 20 * l + o - 67; o--; ) ee.nextNode(); else if (47 === o) r = re(t, (n[f++] = e(n.$global)), r); else { if (38 === o) return r; @@ -414,51 +415,51 @@ function re(t, n, r) { } function oe(t, n, r) { let o = e(n); - if (((o._ = t.j || r), (o.q = t), le(t, o), t.c)) for (let e of t.c) e.e?.(o); + if (((o._ = t.n || r), (o.C = t), ie(t, o), t.c)) for (let e of t.c) e.g?.(o); return o; } -function le(e, t) { - let n = "string" == typeof e ? document.createElement(e) : e.f(); +function ie(e, t) { + let n = "string" == typeof e ? document.createElement(e) : e.l(); return ( - ne(11 === n.nodeType ? n.firstChild : n, e.l ?? " ", t), + ne(11 === n.nodeType ? n.firstChild : n, e.p ?? " ", t), (t.a = 11 === n.nodeType ? n.firstChild : n), (t.b = 11 === n.nodeType ? n.lastChild : n), - e.m && e.m(t), + e.q && e.q(t), n ); } -function ie(e, t, n) { - return (r, l) => { - let i = r[e + "("]; - if (!i || i === t || l === q) return; +function le(e, t, n) { + return (r, i) => { + let l = r[e + "("]; + if (!l || l === t || i === q) return; let f = r[e + "!"]; - if (l === I || l === O) return i.d?.(f, l); - if ("string" == typeof i) A(f, 0, l()), he(f, 0, t && o(r, t)); - else if (i.d) { - let e = l(); - i.d(f, n ? e : [t ? { ...e, renderBody: o(r, t) } : e]); + if (i === j || i === O) return l.f?.(f, i); + if ("string" == typeof l) A(f, 0, i()), ge(f, 0, t && o(r, t)); + else if (l.f) { + let e = i(); + l.f(f, n ? e : [t ? { ...e, renderBody: o(r, t) } : e]); } }; } -function fe(e, t, n, r, o = 0, l) { +function fe(e, t, n, r, o = 0, i) { return { - n: e, - l: t && te(t), - m: n, - f: ue, + r: e, + p: t && te(t), + q: n, + l: ue, c: new Set(r), - r: o, - o: void 0, - d: l, - j: void 0, + D: o, + t: void 0, + f: i, + n: void 0, }; } function ue() { - let e = this.o; + let e = this.t; if (!e) { - let t = this.l, + let t = this.p, n = t && t.length < 4 && 32 !== t.charCodeAt(t.length - 1); - this.o = e = (function (e, t) { + this.t = e = (function (e, t) { let n; ce.innerHTML = e; let r = ce.content; @@ -468,7 +469,7 @@ function ue() { : n || (n = ae.createTextNode("")), n ); - })(this.n, n); + })(this.r, n); } return e.cloneNode(!0); } @@ -476,433 +477,462 @@ var ae = document, ce = ae.createElement("template"); var se = function (e, t, r) { let o = e + "(", - l = e + "!"; - return (i, f) => { + i = e + "!"; + return (l, f) => { if (f === q) return; - let c = i[o], + let c = l[o], s = f; - if (f !== I && f !== O) { + if (f !== j && f !== O) { let r = f ? f._ || f.renderBody || f : void 0; r !== c - ? ((c = i[o] = r), + ? ((c = l[o] = r), (function (e, t, r) { let o, - l = e[t + "!"]; + i = e[t + "!"]; r - ? ((o = e[t + "!"] = oe(r, e.$global, e)), (l = l || n(e[t]))) + ? ((o = e[t + "!"] = oe(r, e.$global, e)), (i = i || n(e[t]))) : ((o = n(e[t])), (e[t + "!"] = void 0)), - a(o, l.a.parentNode, l.a), - u(l); - })(i, e, r), - t?.(i), + a(o, i.a.parentNode, i.a), + u(i); + })(l, e, r), + t?.(l), (s = q)) : (s = O); } - r?.(i, s), K(c, i[l], s); + r?.(l, s), K(c, l[i], s); }; }; function de(e, t) { let n = t + "!", r = t + "("; return (t, o) => { - let l = t[n]; - if (l) { + let i = t[n]; + if (i) { let n = t[r]; - (!n?.c || n.c.has(e)) && e(l, o); + (!n?.c || n.c.has(e)) && e(i, o); } }; } -var ge = function (e, t, n) { +var he = function (e, t, n) { let r = e + "(", o = e + "!"; - return (l, i) => { - if (i === q) return; - let f = l[r], - u = i; - if (i !== I && i !== O) { - let n = i ? i._ || i.renderBody || i : void 0; - n !== f ? ((f = l[r] = n), he(l, e, n), t?.(l), (u = q)) : (u = O); + return (i, l) => { + if (l === q) return; + let f = i[r], + u = l; + if (l !== j && l !== O) { + let n = l ? l._ || l.renderBody || l : void 0; + n !== f ? ((f = i[r] = n), ge(i, e, n), t?.(i), (u = q)) : (u = O); } - n?.(l, u), K(f, l[o], u); + n?.(i, u), K(f, i[o], u); }; }; -function he(e, t, n) { +function ge(e, t, n) { let r = e[t + "!"], o = e[t]; if (((o.textContent = ""), n)) { a((e[t + "!"] = oe(n, e.$global, e)), o, null); } - r && i(r); + r && l(r); } var pe = new Map([[Symbol(), n(void 0)]]), be = [n(void 0)], ve = new Map(), - me = []; -function ye(e, t) { - return Se(e, t, (e, t) => { - let [n, r = xe] = e, + we = []; +function me(e, t) { + return xe(e, t, (e, t) => { + let [n, r = Se] = e, o = 0; for (let e of n) t(r(e, o), [e, o, n]), o++; }); } -function we(e, t) { - return Se(e, t, (e, t) => { - let [n, r = $e] = e; +function ye(e, t) { + return xe(e, t, (e, t) => { + let [n, r = Ne] = e; for (let e in n) { let o = n[e]; t(r(e, o), [e, o, n]); } }); } -function Ne(e, t) { - return Se(e, t, (e, t) => { - let [n, r = 0, o = 1, l = $e] = e, - i = (n - r) / o; - for (let e = 0; e <= i; e++) { +function Ce(e, t) { + return xe(e, t, (e, t) => { + let [n, r = 0, o = 1, i = Ne] = e, + l = (n - r) / o; + for (let e = 0; e <= l; e++) { let n = r + e * o; - t(l(n), [n]); + t(i(n), [n]); } }); } -function Se(e, t, r) { +function xe(e, t, r) { let o = e + "!", - l = t.c, - f = t.d; + i = t.c, + f = t.f; return (s, d) => { if (d === q) return; - if (d === I || d === O) { + if (d === j || d === O) { for (let t of s[o] ?? s[e + "("].values()) { f?.(t, d); - for (let e of l) e(t, d); + for (let e of i) e(t, d); } return; } - let g, - h, + let h, + g, p, b, v = s[e], - m = 8 === v.nodeType || 3 === v.nodeType, - y = s[e + "("] || (m ? pe : ve), - w = s[e + "!"] || Array.from(y.values()), - N = !0; + w = 8 === v.nodeType || 3 === v.nodeType, + m = s[e + "("] || (w ? pe : ve), + y = s[e + "!"] || Array.from(m.values()), + C = !0; if ( (r(d, (e, n) => { - let r = y.get(e), + let r = m.get(e), o = O; - if ((r || ((r = oe(t, s.$global, s)), (o = q)), f && f(r, n), l)) - for (let e of l) e(r, o); - g ? (g.set(e, r), h.push(r)) : ((g = new Map([[e, r]])), (h = [r])); + if ((r || ((r = oe(t, s.$global, s)), (o = q)), f && f(r, n), i)) + for (let e of i) e(r, o); + h ? (h.set(e, r), g.push(r)) : ((h = new Map([[e, r]])), (g = [r])); }), - !g) + !h) ) - if (m) (g = pe), (h = be), n(v); + if (w) (h = pe), (g = be), n(v); else { - if (t.r) for (let e = 0; e < w.length; e++) i(w[e]); - (v.textContent = ""), (g = ve), (h = me), (N = !1); + if (t.D) for (let e = 0; e < y.length; e++) l(y[e]); + (v.textContent = ""), (h = ve), (g = we), (C = !1); } - if (N) { - if (m) { - y === pe && n(v); - let e = w[w.length - 1]; + if (C) { + if (w) { + m === pe && n(v); + let e = y[y.length - 1]; (p = e.b.nextSibling), (b = e.a.parentNode); } else (p = null), (b = v); !(function (e, t, n, r) { let o, - l, i, + l, f, s, d, - g = 0, h = 0, + g = 0, p = t.length - 1, b = n.length - 1, - v = t[g], - m = n[h], - y = t[p], - w = n[b]; + v = t[h], + w = n[g], + m = t[p], + y = n[b]; e: { - for (; v === m; ) { - if ((++g, ++h, g > p || h > b)) break e; - (v = t[g]), (m = n[h]); + for (; v === w; ) { + if ((++h, ++g, h > p || g > b)) break e; + (v = t[h]), (w = n[g]); } - for (; y === w; ) { - if ((--p, --b, g > p || h > b)) break e; - (y = t[p]), (w = n[b]); + for (; m === y; ) { + if ((--p, --b, h > p || g > b)) break e; + (m = t[p]), (y = n[b]); } } - if (g > p) { - if (h <= b) { - (i = b + 1), (f = i < n.length ? n[i].a : r); + if (h > p) { + if (g <= b) { + (l = b + 1), (f = l < n.length ? n[l].a : r); do { - a(n[h++], e, f); - } while (h <= b); + a(n[g++], e, f); + } while (g <= b); } - } else if (h > b) + } else if (g > b) do { - u(t[g++]); - } while (g <= p); + u(t[h++]); + } while (h <= p); else { - let v = p - g + 1, - m = b - h + 1, - y = t, - w = new Array(m); - for (o = 0; o < m; ++o) w[o] = -1; - let N = 0, - S = 0, - C = new Map(); - for (l = h; l <= b; ++l) C.set(n[l], l); - for (o = g; o <= p && S < m; ++o) + let v = p - h + 1, + w = b - g + 1, + m = t, + y = new Array(w); + for (o = 0; o < w; ++o) y[o] = -1; + let C = 0, + x = 0, + $ = new Map(); + for (i = g; i <= b; ++i) $.set(n[i], i); + for (o = h; o <= p && x < w; ++o) (s = t[o]), - (l = C.get(s)), - void 0 !== l && - ((N = N > l ? c : l), - ++S, - (d = n[l]), - (w[l - h] = o), - (y[o] = null)); - if (v === t.length && 0 === S) { - for (; h < m; ++h) a(n[h], e, r); - for (; g < v; ++g) u(t[g]); + (i = $.get(s)), + void 0 !== i && + ((C = C > i ? c : i), + ++x, + (d = n[i]), + (y[i - g] = o), + (m[o] = null)); + if (v === t.length && 0 === x) { + for (; g < w; ++g) a(n[g], e, r); + for (; h < v; ++h) u(t[h]); } else { - for (o = v - S; o > 0; ) (s = y[g++]), null !== s && (u(s), o--); - if (N === c) { + for (o = v - x; o > 0; ) (s = m[h++]), null !== s && (u(s), o--); + if (C === c) { let t = (function (e) { let t, n, r = e.slice(), o = []; o.push(0); - for (let l = 0, i = e.length; l < i; ++l) { - if (-1 === e[l]) continue; - let i = o[o.length - 1]; - if (e[i] < e[l]) (r[l] = i), o.push(l); + for (let i = 0, l = e.length; i < l; ++i) { + if (-1 === e[i]) continue; + let l = o[o.length - 1]; + if (e[l] < e[i]) (r[i] = l), o.push(i); else { for (t = 0, n = o.length - 1; t < n; ) { let r = ((t + n) / 2) | 0; - e[o[r]] < e[l] ? (t = r + 1) : (n = r); + e[o[r]] < e[i] ? (t = r + 1) : (n = r); } - e[l] < e[o[t]] && (t > 0 && (r[l] = o[t - 1]), (o[t] = l)); + e[i] < e[o[t]] && (t > 0 && (r[i] = o[t - 1]), (o[t] = i)); } } for (t = o.length, n = o[t - 1]; t-- > 0; ) (o[t] = n), (n = r[n]); return o; - })(w); - for (l = t.length - 1, i = n.length, o = m - 1; o >= 0; --o) - -1 === w[o] || l < 0 || o !== t[l] - ? ((N = o + h), - (d = n[N++]), - (f = N < i ? n[N].a : r), + })(y); + for (i = t.length - 1, l = n.length, o = w - 1; o >= 0; --o) + -1 === y[o] || i < 0 || o !== t[i] + ? ((C = o + g), + (d = n[C++]), + (f = C < l ? n[C].a : r), a(d, e, f)) - : --l; - } else if (S !== m) - for (i = n.length, o = m - 1; o >= 0; --o) - -1 === w[o] && - ((N = o + h), - (d = n[N++]), - (f = N < i ? n[N].a : r), + : --i; + } else if (x !== w) + for (l = n.length, o = w - 1; o >= 0; --o) + -1 === y[o] && + ((C = o + g), + (d = n[C++]), + (f = C < l ? n[C].a : r), a(d, e, f)); } } - })(b, w, h, p); + })(b, y, g, p); } - (s[e + "("] = g), (s[e + "!"] = h); + (s[e + "("] = h), (s[e + "!"] = g); }; } -function Ce(e, t) { +function $e(e, t) { let n = t + "!"; return (r, o) => { - let l = r[n] ?? r[t + "("]?.values() ?? []; - for (let t of l) e(t, o); + let i = r[n] ?? r[t + "("]?.values() ?? []; + for (let t of i) e(t, o); }; } -function xe(e, t) { +function Se(e, t) { return t; } -function $e(e) { +function Ne(e) { return e; } -var ke = {}, - Me = document; -function Ae(e, t) { - return (ke[e] = t), t; -} -function Te(e, t) { - return (ke[e] = (e) => (n) => t(e, n)), t; -} -function Ee(e, t) { - return (ke[e] = (e) => o(e, t)), t; -} -var Be = {}; -function _e(e = "M") { - let t, - n, - r = e.length, - o = e + "$h", - l = window[o], - i = Me.createTreeWalker(Me, 128), - f = (e) => Be[e] ?? (Be[e] = {}), - u = [], - a = { push: s }, - c = { _: ke }; - if (l) for (let e = 0; e < l.length; e += 2) s(l[e], l[e + 1]); - else window[o] = a; - function s(o, l) { - "loading" !== Me.readyState && (i.currentNode = Me); - let a = o(c); - if (a) { - Be.$global ||= a.$global || {}; - for (let e in a) { - if ("$global" === e) continue; - let t = parseInt(e), - n = a[t], - r = Be[t]; - (n.$global = a.$global), r !== n && (Be[t] = Object.assign(n, r)); - } +var Me = {}, + ke = class { + u = []; + x = {}; + E = { _: Me }; + constructor(e, t, n) { + (this.F = e), (this.G = t), (this.y = n), (this.z = e[n]), this.A(); } - for (; (n = i.nextNode()); ) { - let o = n.nodeValue; - if (o.startsWith(e)) { - let e = o[r], - l = parseInt(o.slice(r + 1)), - i = f(l), - a = o.slice(o.indexOf(" ") + 1); - if ("*" === e) i[a] = n.previousSibling; - else if ("[" === e) u.push(t), (t = l), (i.a = n); - else if ("]" === e) { - if (((i[a] = n), l < t)) { - let e = Be[t], - r = n.parentNode, - o = e.a; - r !== o.parentNode && r.prepend(o), - (e.b = n.previousSibling), - (t = u.pop()); - } - } else if ("|" === e) { - i[parseInt(a)] = n; - let e = JSON.parse("[" + a.slice(a.indexOf(" ") + 1) + "]"); - for (let t = e.length - 1; t >= 0; t--) { - let r = f(e[t]); - for (; 8 === (n = n.previousSibling).nodeType; ); - r.a = r.b = n; + w() { + this.z.w(), this.A(); + } + A() { + let e = this.z, + t = this.E, + n = this.x, + r = e.v; + if (r.length) { + let t = e.i.length; + e.v = []; + for (let e of r) { + let r = e.data, + o = r[t], + i = parseInt(r.slice(t + 1)), + l = (n[i] ??= {}), + f = r.slice(r.indexOf(" ") + 1); + if ("*" === o) l[f] = e.previousSibling; + else if ("[" === o) this.u.push(this.h), (this.h = i), (l.a = e); + else if ("]" === o) { + if (((l[f] = e), i < this.h)) { + let t = n[this.h], + r = e.parentNode, + o = t.a; + r !== o.parentNode && r.prepend(o), + (t.b = e.previousSibling), + (this.h = this.u.pop()); + } + } else if ("|" === o) { + l[parseInt(f)] = e; + let t = JSON.parse("[" + f.slice(f.indexOf(" ") + 1) + "]"), + r = e; + for (let e = t.length - 1; e >= 0; e--) { + let o = (n[t[e]] ??= {}); + for (; 8 === (r = r.previousSibling).nodeType; ); + o.a = o.b = r; + } } } } + let o = e.s; + if (o) { + e.s = []; + for (let e of o) { + let r = e(t), + { $global: o } = n; + o || + ((n.$global = o = r.$ || {}), + (o.runtimeId = this.G), + (o.renderId = this.y)); + for (let e in r) + if ("$" !== e) { + let t = r[e], + i = n[e]; + (t.$global = o), i !== t && (n[e] = Object.assign(t, i)); + } + } + } + let i = e.e; + if (i) { + e.e = []; + for (let e = 0; e < i.length; e += 2) Me[i[e + 1]](n[i[e]]); + } + e.d && delete this.F[this.y]; } - for (let e = 0; e < l.length; e += 2) ke[l[e + 1]](Be[l[e]]); + }; +function Ae(e, t) { + return (Me[e] = t), t; +} +function _e(e, t) { + return (Me[e] = (e) => (n) => t(e, n)), t; +} +function Ee(e, t) { + return (Me[e] = (e) => o(e, t)), t; +} +function Be(e = "M") { + let t, + n = (r) => (n[r] = t[r] = new ke(t, e, r)); + function r(r) { + t = r; + for (let e in r) n(e); + Object.defineProperty(window, e, { configurable: !0, value: n }); } + window[e] + ? r(window[e]) + : Object.defineProperty(window, e, { configurable: !0, set: r }); } -function je(e, t) { - return Ae(e, t.e), t; +function Ie(e, t) { + return Ae(e, t.g), t; } -var Ie, - Oe = (() => { +var Te, + je = (() => { let { port1: e, port2: t } = new MessageChannel(); return ( (e.onmessage = () => { - (Ie = !1), ze(); + (Te = !1), We(); }), t ); })(); +function Oe() { + We(), requestAnimationFrame(qe); +} function qe() { - ze(), requestAnimationFrame(We); + je.postMessage(0); } -function We() { - Oe.postMessage(0); -} -var Le = [], - Re = []; +var Re = [], + ze = []; function De(e, t, n, r) { return n ? (n(r), r) : Fe(e, t, r); } function Fe(e, t, n) { - return Ie || ((Ie = !0), queueMicrotask(qe)), t(e, I), Le.push(e, t, n), n; + return Te || ((Te = !0), queueMicrotask(Oe)), t(e, j), Re.push(e, t, n), n; } -function He(e, t) { - Re.push(e, t); +function Le(e, t) { + ze.push(e, t); } -function ze() { +function We() { try { - Ve(); - } finally { - Le = []; - } - try { - Ue(); + He(); } finally { Re = []; } -} -function Je(e) { - let t = Le, - n = Re, - r = (Re = []); - Le = []; try { - e(), Ve(); + Ge(); } finally { - (Le = t), (Re = n); + ze = []; + } +} +function Pe(e) { + let t = Re, + n = ze, + r = (ze = []); + Re = []; + try { + e(), He(); + } finally { + (Re = t), (ze = n); } return r; } -function Ue(e = Re) { +function Ge(e = ze) { for (let t = 0; t < e.length; t += 2) { let n = e[t]; (0, e[t + 1])(n); } } -function Ve() { - for (let e = 0; e < Le.length; e += 3) { - let t = Le[e + 0]; - (0, Le[e + 1])(t, Le[e + 2]); +function He() { + for (let e = 0; e < Re.length; e += 3) { + let t = Re[e + 0]; + (0, Re[e + 1])(t, Re[e + 2]); } } -var Ze = (e, t) => Ae(t, new Ge(e)), - Ge = class { +var Je = (e, t) => Ae(t, new Ue(e)), + Ue = class { _; constructor(e) { this._ = e; } mount(t = {}, n, r) { let o, - l, - { $global: i = {}, ...f } = t, - a = this._.d, - c = Je(() => { - (o = e(i)), (l = le(this._, o)), a && a(o, [f]); + i, + { $global: l } = t; + l + ? (({ $global: l, ...t } = t), + (l = { runtimeId: "M", renderId: "_", ...l })) + : (l = { runtimeId: "M", renderId: "_" }); + let f = this._.f, + a = Pe(() => { + (o = e(l)), (i = ie(this._, o)), f && f(o, [t]); }); switch (r) { case "afterbegin": - n.insertBefore(l, n.firstChild); + n.insertBefore(i, n.firstChild); break; case "afterend": - n.parentElement.insertBefore(l, n.nextSibling); + n.parentElement.insertBefore(i, n.nextSibling); break; case "beforebegin": - n.parentElement.insertBefore(l, n); + n.parentElement.insertBefore(i, n); break; default: - n.appendChild(l); + n.appendChild(i); } return ( - Ue(c), + Ge(a), { update: (e) => { - a && + f && (function (e) { - let t = Le, - n = Re; - (Le = []), (Re = []); + let t = Re, + n = ze; + (Re = []), (ze = []); try { - e(), Ve(), (Le = t), Ue(); + e(), He(), (Re = t), Ge(); } finally { - (Le = t), (Re = n); + (Re = t), (ze = n); } })(() => { - a(o, I), a(o, [e]); + f(o, j), f(o, [e]); }); }, destroy: () => { @@ -912,108 +942,111 @@ var Ze = (e, t) => Ae(t, new Ge(e)), ); } }, + Ze = new Map(), Ke = { - register: Ae, patchConditionals: function (e) { - (se = e(se)), (ge = e(ge)); + (se = e(se)), (he = e(he)); }, - queueEffect: He, - isOp: (e) => e === I || e === O || e === q, - isRenderer: (e) => void 0 !== e.f, + queueEffect: Le, + init() { + Ae("$C_s", (e) => { + Ze.set(e.m5c, e); + }); + }, + registerRenderer(e) { + Ae("$C_r", e); + }, + isOp: (e) => e === j || e === O || e === q, + isRenderer: (e) => void 0 !== e.l, getStartNode: (e) => e.a, setScopeNodes(e, t, n) { (e.a = t), (e.b = n); }, runComponentEffects() { - Ue(this.effects); - }, - resolveRenderer(e) { - if (e && "object" == typeof e) { - if (Array.isArray(e)) { - let [t, n] = e; - return (function (e, t) { - let n = ke[e]; - return t && n ? (n.n ? o(t, n) : n(t)) : n; - })(t, Be[n]); - } - if (e.f) return e; - } + Ge(this.effects); }, + resolveRegistered: (e, { runtimeId: t, componentIdPrefix: n }) => + Array.isArray(e) && "string" == typeof e[0] + ? (function (e, t) { + let n = Me[e]; + return t && n ? (n.r ? o(t, n) : n(t)) : n; + })(e[0], 2 === e.length && window[t]?.["s" === n ? "_" : n]?.x[e[1]]) + : e, createRenderer(e, t, n) { let r = fe("", void 0, e, void 0, 1, n); - return (r.f = t), r; + return (r.l = t), r; }, - render(e, t, n, r, o) { - let l = r.d || Pe, - i = !1, - f = e ? (n.scope = Be[t.global.componentIdToScopeId[n.id]]) : n.scope; + render(e, t, n, r) { + let o = t.scope; + o || ((o = Ze.get(t.id)), o && ((t.scope = o), Ze.delete(t.id))); + let i = n.f || Qe, + l = !1; if ( - ((n.effects = Je(() => { - if (f) l(f, I), (i = !0); + ((t.effects = Pe(() => { + if (o) i(o, j), (l = !0); else { - f = n.scope = oe(r, t.global); - let e = r.c; - if (e) for (let t of e) t(n.scope, O); + o = t.scope = oe(n, e.global); + let r = n.c; + if (r) for (let e of r) e(t.scope, O); } - l(f, o); + i(o, r); })), - !i) + !l) ) - return f.a === f.b ? f.a : f.a.parentNode; + return o.a === o.b ? o.a : o.a.parentNode; }, }; -function Pe() {} +function Qe() {} export { - C as attr, + $ as attr, A as attrs, - T as attrsEvents, - l as bindFunction, + _ as attrsEvents, + i as bindFunction, o as bindRenderer, - L as changeHandler, - U as childClosures, - $ as classAttr, - z as closure, + z as changeHandler, + H as childClosures, + N as classAttr, + P as closure, Ke as compat, se as conditional, - ge as conditionalOnlyChild, + he as conditionalOnlyChild, fe as createRenderer, e as createScope, oe as createScopeWithRenderer, - Ze as createTemplate, - M as data, - J as dynamicClosure, - V as dynamicSubscribers, - ie as dynamicTagAttrs, + Je as createTemplate, + k as data, + G as dynamicClosure, + J as dynamicSubscribers, + le as dynamicTagAttrs, b as getAbortSignal, B as html, X as inChild, de as inConditionalScope, - Ce as inLoopScope, - _e as init, - W as initValue, - F as intersection, + $e as inLoopScope, + Be as init, + R as initValue, + L as intersection, Y as intersections, - j as lifecycle, - we as loopIn, - ye as loopOf, - Ne as loopTo, - Q as nextTagId, - w as on, - Je as prepare, - _ as props, + T as lifecycle, + ye as loopIn, + me as loopOf, + Ce as loopTo, + V as nextTagId, + y as on, + Pe as prepare, + I as props, De as queueControllableSource, - He as queueEffect, + Le as queueEffect, Fe as queueSource, Ae as register, - Te as registerBoundSignal, + _e as registerBoundSignal, Ee as registerRenderer, - je as registerSubscriber, + Ie as registerSubscriber, p as resetAbortSignal, - ze as run, - Ue as runEffects, - Be as scopeLookup, - Z as setTagVar, - k as styleAttr, - G as tagVarSignal, - R as value, + We as run, + Ge as runEffects, + U as setTagVar, + M as styleAttr, + Z as tagVarSignal, + D as value, }; diff --git a/packages/marko/src/node_modules/@internal/components-entry/index.js b/packages/marko/src/node_modules/@internal/components-entry/index.js index c570743e9..92088521c 100644 --- a/packages/marko/src/node_modules/@internal/components-entry/index.js +++ b/packages/marko/src/node_modules/@internal/components-entry/index.js @@ -1,7 +1,7 @@ "use strict"; var warp10 = require("warp10"); -var w10NOOP = require("warp10/constants").NOOP; +var w10ToJSON = require("../../../runtime/helpers/serialize-noop").___toJSON; var safeJSONRegExp = /<\/|\u2028|\u2029/g; var IGNORE_GLOBAL_TYPES = new Set(["undefined", "function", "symbol"]); var DEFAULT_RUNTIME_ID = "M"; @@ -136,7 +136,7 @@ function addComponentsFromContext(componentsContext, componentsToHydrate) { } } - if (typeof renderBody === "function" && renderBody.toJSON && renderBody.toJSON() === w10NOOP) { + if (typeof renderBody === "function" && renderBody.toJSON === w10ToJSON) { flags |= FLAG_HAS_RENDER_BODY; renderBody = input.renderBody = undefined; } diff --git a/packages/marko/src/node_modules/@internal/components-registry/index-browser.js b/packages/marko/src/node_modules/@internal/components-registry/index-browser.js index 38b455df6..5dcc9659d 100644 --- a/packages/marko/src/node_modules/@internal/components-registry/index-browser.js +++ b/packages/marko/src/node_modules/@internal/components-registry/index-browser.js @@ -449,7 +449,7 @@ function initServerRendered(renderedComponents, host) { } } - var prefix = renderedComponents.p || ""; + var prefix = renderedComponents.p || "s"; var meta = serverRenderedMeta[prefix]; var isLast = renderedComponents.l; @@ -470,8 +470,11 @@ function initServerRendered(renderedComponents, host) { indexServerComponentBoundaries(host, runtimeId); eventDelegation.___init(host); - if (renderedComponents.g) { - meta.___globals = renderedComponents.g; + if (!meta.___globals) { + meta.___globals = Object.assign({ + runtimeId: runtimeId, + componentIdPrefix: prefix, + }, renderedComponents.g); } if (renderedComponents.t) { diff --git a/packages/marko/src/runtime/components/ComponentDef.js b/packages/marko/src/runtime/components/ComponentDef.js index 53b22e608..10dc06073 100644 --- a/packages/marko/src/runtime/components/ComponentDef.js +++ b/packages/marko/src/runtime/components/ComponentDef.js @@ -1,8 +1,8 @@ "use strict"; var complain = "MARKO_DEBUG" && require("complain"); var extend = require("raptor-util/extend"); -var w10Noop = require("warp10/constants").NOOP; var componentUtil = require("@internal/components-util"); +var w10NOOP = require("../helpers/serialize-noop").___noop; var attachBubblingEvent = componentUtil.___attachBubblingEvent; var addDelegatedEventHandler = require("./event-delegation").___addDelegatedEventHandler; @@ -98,7 +98,7 @@ ComponentDef.___deserialize = function (o, types, global, registry) { var componentProps = extra.w || EMPTY_OBJECT; var flags = extra.f; var isLegacy = flags & FLAG_IS_LEGACY; - var renderBody = flags & FLAG_HAS_RENDER_BODY ? w10Noop : extra.r; + var renderBody = flags & FLAG_HAS_RENDER_BODY ? w10NOOP : extra.r; var component = typeName /* legacy */ && @@ -107,6 +107,7 @@ ComponentDef.___deserialize = function (o, types, global, registry) { // Prevent newly created component from being queued for update since we area // just building it from the server info component.___updateQueued = true; + component.___global = global; if (isLegacy) { component.widgetConfig = componentProps; @@ -156,8 +157,6 @@ ComponentDef.___deserialize = function (o, types, global, registry) { component.___setCustomEvents(customEvents, scope); } - component.___global = global; - return { id: id, ___component: component, diff --git a/packages/marko/src/runtime/helpers/dynamic-tag.js b/packages/marko/src/runtime/helpers/dynamic-tag.js index cce2a480a..78ac15a07 100644 --- a/packages/marko/src/runtime/helpers/dynamic-tag.js +++ b/packages/marko/src/runtime/helpers/dynamic-tag.js @@ -1,14 +1,13 @@ "use strict"; var complain = "MARKO_DEBUG" && require("complain"); -var w10NOOP = require("warp10/constants").NOOP; var ComponentDef = require("../components/ComponentDef"); var ComponentsContext = require("../components/ComponentsContext"); +var serializeNOOP = require("../helpers/serialize-noop"); +var w10NOOP = serializeNOOP.___noop; +var w10ToJSON = serializeNOOP.___toJSON; var changeCase = require("./_change-case"); var getComponentsContext = ComponentsContext.___getComponentsContext; -var RENDER_BODY_TO_JSON = function () { - return w10NOOP; -}; var FLAG_WILL_RERENDER_IN_BROWSER = 1; // var FLAG_HAS_RENDER_BODY = 2; @@ -80,7 +79,12 @@ module.exports = function dynamicTag( } if (dynamicTag.___runtimeCompat) { - renderer = dynamicTag.___runtimeCompat(renderer, render, args); + renderer = dynamicTag.___runtimeCompat( + renderer, + render, + args, + out.global, + ); } if (renderer) { @@ -113,7 +117,7 @@ module.exports = function dynamicTag( parentComponentDef.id + "-" + parentComponentDef.___nextKey(key), globalContext, ); - render.toJSON = RENDER_BODY_TO_JSON; + render.toJSON = w10ToJSON; if (args) { render.apply(null, [out].concat(args, attrs)); diff --git a/packages/marko/src/runtime/helpers/serialize-noop.js b/packages/marko/src/runtime/helpers/serialize-noop.js new file mode 100644 index 000000000..038ae4c9c --- /dev/null +++ b/packages/marko/src/runtime/helpers/serialize-noop.js @@ -0,0 +1,5 @@ +var w10NOOP = require("warp10/constants").NOOP; +exports.___noop = w10NOOP; +exports.___toJSON = function () { + return w10NOOP; +}; diff --git a/packages/marko/src/runtime/helpers/tags-compat/html-debug.js b/packages/marko/src/runtime/helpers/tags-compat/html-debug.js index 4eebcfdd4..d1a258f1e 100644 --- a/packages/marko/src/runtime/helpers/tags-compat/html-debug.js +++ b/packages/marko/src/runtime/helpers/tags-compat/html-debug.js @@ -1,3 +1,3 @@ exports.s = require("./runtime-html.js").p( - require("@marko/runtime-tags/debug/html"), + require("@marko/runtime-tags/debug/html").compat, ); diff --git a/packages/marko/src/runtime/helpers/tags-compat/html-debug.mjs b/packages/marko/src/runtime/helpers/tags-compat/html-debug.mjs index 3ccf53eea..45e7094a1 100644 --- a/packages/marko/src/runtime/helpers/tags-compat/html-debug.mjs +++ b/packages/marko/src/runtime/helpers/tags-compat/html-debug.mjs @@ -1,3 +1,3 @@ -import * as api from "@marko/runtime-tags/debug/html"; +import { compat } from "@marko/runtime-tags/debug/html"; import { p } from "./runtime-html.js"; -export const s = p(api); +export const s = p(compat); diff --git a/packages/marko/src/runtime/helpers/tags-compat/html.js b/packages/marko/src/runtime/helpers/tags-compat/html.js index eb9e70286..408749b04 100644 --- a/packages/marko/src/runtime/helpers/tags-compat/html.js +++ b/packages/marko/src/runtime/helpers/tags-compat/html.js @@ -1 +1,3 @@ -exports.s = require("./runtime-html.js").p(require("@marko/runtime-tags/html")); +exports.s = require("./runtime-html.js").p( + require("@marko/runtime-tags/html").compat, +); diff --git a/packages/marko/src/runtime/helpers/tags-compat/html.mjs b/packages/marko/src/runtime/helpers/tags-compat/html.mjs index d7f537e97..5a1bd3ccf 100644 --- a/packages/marko/src/runtime/helpers/tags-compat/html.mjs +++ b/packages/marko/src/runtime/helpers/tags-compat/html.mjs @@ -1,3 +1,3 @@ -import * as api from "@marko/runtime-tags/html"; +import { compat } from "@marko/runtime-tags/html"; import { p } from "./runtime-html.js"; -export const s = p(api); +export const s = p(compat); diff --git a/packages/marko/src/runtime/helpers/tags-compat/runtime-dom.js b/packages/marko/src/runtime/helpers/tags-compat/runtime-dom.js index a39d6d4cc..6d99da883 100644 --- a/packages/marko/src/runtime/helpers/tags-compat/runtime-dom.js +++ b/packages/marko/src/runtime/helpers/tags-compat/runtime-dom.js @@ -15,12 +15,17 @@ exports.p = function (domCompat) { renderer, renderBody, args, + global, ) { - const tagsRenderer = domCompat.resolveRenderer(renderer || renderBody); + const tagsRenderer = domCompat.resolveRegistered( + renderer || renderBody, + global, + ); - if (tagsRenderer) { - return (input, out) => - TagsCompat({ i: args ? args : input, r: tagsRenderer }, out); + if (tagsRenderer && domCompat.isRenderer(tagsRenderer)) { + return (input, out) => { + return TagsCompat({ i: args ? args : input, r: tagsRenderer }, out); + }; } return renderer; @@ -29,17 +34,9 @@ exports.p = function (domCompat) { const TagsCompatId = "tags-compat"; const TagsCompat = createRenderer( function (_, out, componentDef, component) { - const isHydrate = - ___getComponentsContext(out).___globalContext.___isHydrate; const input = Array.isArray(_.i) ? _.i : [_.i]; - const tagsRenderer = domCompat.resolveRenderer(_.r); - const newNode = domCompat.render( - isHydrate, - out, - component, - tagsRenderer, - input, - ); + const tagsRenderer = domCompat.resolveRegistered(_.r, global); + const newNode = domCompat.render(out, component, tagsRenderer, input); out.bf(out.___assignedKey, component, !newNode); if (newNode) { @@ -111,8 +108,12 @@ exports.p = function (domCompat) { customEvents, scopeId, ) { + const global = this.___global; for (const customEvent of customEvents) { - customEvent[1] = domCompat.resolveRenderer(customEvent[1]); + customEvent[1] = domCompat.resolveRegistered( + customEvent[1], + global, + ); } setCustomEvents.call(this, customEvents, scopeId); @@ -141,19 +142,21 @@ exports.p = function (domCompat) { return newRenderer; } - domCompat.register("@marko/tags-compat-5-to-6", create5to6Renderer); + domCompat.registerRenderer(create5to6Renderer); + domCompat.init(); function renderAndMorph(scope, renderer, renderBody, input) { const out = defaultCreateOut(); let host = domCompat.getStartNode(scope); let rootNode = host.fragment; if (!rootNode) { - const component = (scope.marko5Component = ___componentLookup[scope.m5c]); + const component = (scope.___marko5Component = + ___componentLookup[scope.m5c]); rootNode = component.___rootNode; host = rootNode.startNode; domCompat.setScopeNodes(host, rootNode.endNode); } - const existingComponent = scope.marko5Component; + const existingComponent = scope.___marko5Component; const componentsContext = ___getComponentsContext(out); const globalComponentsContext = componentsContext.___globalContext; let customEvents; @@ -191,7 +194,7 @@ exports.p = function (domCompat) { component.___rootNode = rootNode; component.___input = input[0]; component.___customEvents = customEvents; - scope.marko5Component = component; + scope.___marko5Component = component; }); } diff --git a/packages/marko/src/runtime/helpers/tags-compat/runtime-html.js b/packages/marko/src/runtime/helpers/tags-compat/runtime-html.js index 7b131c3ef..171669ec6 100644 --- a/packages/marko/src/runtime/helpers/tags-compat/runtime-html.js +++ b/packages/marko/src/runtime/helpers/tags-compat/runtime-html.js @@ -6,37 +6,28 @@ const createRenderer = require("../../components/renderer"); const defaultCreateOut = require("../../createOut"); const dynamicTag5 = require("../dynamic-tag"); -exports.p = function (tagsAPI) { - const { - patchDynamicTag, - createRenderFn, - fork, - write, - serializerRegister, - writeScope, - nextScopeId, - getRegistryInfo, - } = tagsAPI; - const FN_TO_JSON = function () { - // TODO: this should instead return an object that contains getRegistryInfo - // then in the dom-compat, handle that object to lookup the function in the registry - // (we also need to do this for events) - return getRegistryInfo(this); - }; - +exports.p = function (htmlCompat) { const isMarko6 = (fn) => !!fn.___isTagsAPI; const isMarko5 = (fn) => !fn.___isTagsAPI; + const writeHTML = (result) => { + const state = result.out._state; + const writer = state.writer; + state.events.emit("___toString", writer); + htmlCompat.writeScript(writer._scripts); + htmlCompat.write(writer._content); + }; dynamicTag5.___runtimeCompat = function tagsToVdom( tagsRenderer, renderBody, args, ) { - if (tagsRenderer ? isMarko5(tagsRenderer) : isMarko5(renderBody)) + if (tagsRenderer ? isMarko5(tagsRenderer) : isMarko5(renderBody)) { return tagsRenderer; + } if (!tagsRenderer && renderBody) { - renderBody.toJSON = FN_TO_JSON; + renderBody.toJSON = htmlCompat.toJSON; } return (input, out) => @@ -53,29 +44,9 @@ exports.p = function (tagsAPI) { function (_, out, componentDef, component) { const input = _.i; const tagsRenderer = _.r; - const renderFn = createRenderFn(tagsRenderer); const willRerender = componentDef._wrr; - const $global = out.global; - const streamData = ($global.streamData = $global.streamData || {}); - - if (willRerender) { - $global.serializedGlobals = $global.serializedGlobals || {}; - $global.serializedGlobals.componentIdToScopeId = true; - $global.componentIdToScopeId = $global.componentIdToScopeId || {}; - $global.componentIdToScopeId[component.id] = streamData.scopeId || 0; - } - out.bf(out.___assignedKey, component, willRerender); - renderFn( - out.beginAsync(), - input, - { - ...$global, - componentIdToScopeId: undefined, - streamData: undefined, - }, - streamData, - ); + htmlCompat.render(tagsRenderer, willRerender, out, component, input); out.ef(); }, // eslint-disable-next-line no-constant-condition @@ -92,7 +63,7 @@ exports.p = function (tagsAPI) { {}, ); - patchDynamicTag( + htmlCompat.patchDynamicTag( function getRenderer(tag) { const renderer = tag._ || tag.renderBody || tag; if (isMarko6(renderer)) return renderer; @@ -108,8 +79,6 @@ exports.p = function (tagsAPI) { const out = defaultCreateOut(); let customEvents; - out.global.streamData = tagsAPI.getStreamData(); - if (renderer5) { const normalizedInput = {}; @@ -122,7 +91,7 @@ exports.p = function (tagsAPI) { (c === "-" ? "" : c.toLowerCase()) + key.slice(3), value, ]); - value.toJSON = FN_TO_JSON; + value.toJSON = htmlCompat.toJSON; } else { normalizedInput[key] = input[key]; } @@ -136,9 +105,7 @@ exports.p = function (tagsAPI) { const component = componentsContext.___components[0]; if (component) { component.___component.___customEvents = customEvents; - writeScope(nextScopeId(), { - m5c: component.id, - }); + htmlCompat.writeSetScopeForComponent(component.id); } initComponentsTag({}, out); @@ -147,7 +114,7 @@ exports.p = function (tagsAPI) { out.once("finish", (result) => { if (!async) { async = false; - write(result.toString()); + writeHTML(result); } }); @@ -155,9 +122,7 @@ exports.p = function (tagsAPI) { if (async !== false) { async = true; - fork(out, (result) => { - write(result.toString()); - }); + htmlCompat.fork(out, writeHTML); } }; }, @@ -167,11 +132,5 @@ exports.p = function (tagsAPI) { }, ); - return function serialized5to6(renderer, id) { - return serializerRegister( - "@marko/tags-compat-5-to-6", - renderer, - serializerRegister(id, () => {}), - ); - }; + return htmlCompat.registerRenderer; }; diff --git a/packages/runtime-tags/src/__tests__/serializer.test.ts b/packages/runtime-tags/src/__tests__/serializer.test.ts index 517f595b1..dac0661d8 100644 --- a/packages/runtime-tags/src/__tests__/serializer.test.ts +++ b/packages/runtime-tags/src/__tests__/serializer.test.ts @@ -1,1171 +1,1190 @@ import assert from "node:assert/strict"; import { inspect } from "node:util"; import { Serializer, register, stringify } from "../html/serializer"; +import type { Boundary } from "../html/writer"; -it("example", () => { - const data = { - strings: "hello\nworld", - numbers: [1, NaN, Infinity], - booleans: [true, false], - void: [null, undefined], - regexps: /abc/g, - maps: new Map([[1, 2]]), - sets: new Set([1, 2]), - nested: { - object: { - "special-keys": 1, - }, - }, - }; - - (data.nested.object as any).cyclical = data; - - assertStringify( - data, - `{strings:"hello\\nworld",numbers:[1,NaN,Infinity],booleans:[!0,!1],void:[null,],regexps:/abc/g,maps:new Map(_.a=[[1,2]]),sets:new Set(_.b=[1,2]),nested:{object:_.d={"special-keys":1}}},_.d.cyclical=_.c`, - ); -}); - -describe("primitives", () => { - describe("undefined", () => { - it("literal", () => assertStringify(undefined, ``)); - it("in object", () => assertStringify({ x: undefined }, `{}`)); - }); - - it("null", () => { - assertStringify(null, `null`); - }); - - describe("booleans", () => { - it("true", () => assertStringify(true, `!0`)); - it("false", () => assertStringify(false, `!1`)); - }); - - describe("string", () => { - it("empty", () => assertStringify("", `""`)); - it("normal", () => assertStringify("test", `"test"`)); - it("special characters", () => - assertStringify( - '"\b\t\n\f\r\v\0 { - it("zero", () => assertStringify(0, `0`)); - it("positive", () => assertStringify(1, `1`)); - it("negative", () => assertStringify(-1, `-1`)); - it("decimal", () => assertStringify(0.1, `0.1`)); - it("negative decimal", () => assertStringify(-0.1, `-0.1`)); - it("NaN", () => assertStringify(NaN, `NaN`)); - it("Infinity", () => assertStringify(Infinity, `Infinity`)); - it("negative Infinity", () => assertStringify(-Infinity, `-Infinity`)); - }); - - describe("bigint", () => { - it("zero", () => assertStringify(BigInt(0), `0n`)); - it("positive", () => assertStringify(BigInt(1), `1n`)); - it("negative", () => assertStringify(BigInt(-1), `-1n`)); - it("max safe integer", () => - assertStringify( - BigInt(Number.MAX_SAFE_INTEGER), - `${Number.MAX_SAFE_INTEGER}n`, - )); - }); -}); - -describe("symbol", () => { - it("unknown", () => assertStringify({ s: Symbol() }, `{s:Symbol()}`)); - it("unknown duplicated", () => { - const a = Symbol(); - const b = Symbol(); - assertStringify( - { a: [a, a], b: [b, b] }, - `{a:[_.a=Symbol(),_.a],b:[_.b=Symbol(),_.b]}`, - ); - }); - it("for", () => assertStringify(Symbol.for("test"), `Symbol.for("test")`)); - it("iterator", () => assertStringify(Symbol.iterator, `Symbol.iterator`)); - it("asyncIterator", () => - assertStringify(Symbol.asyncIterator, `Symbol.asyncIterator`)); - it("hasInstance", () => - assertStringify(Symbol.hasInstance, `Symbol.hasInstance`)); - it("isConcatSpreadable", () => - assertStringify(Symbol.isConcatSpreadable, `Symbol.isConcatSpreadable`)); - it("match", () => assertStringify(Symbol.match, `Symbol.match`)); - it("matchAll", () => assertStringify(Symbol.matchAll, `Symbol.matchAll`)); - it("replace", () => assertStringify(Symbol.replace, `Symbol.replace`)); - it("search", () => assertStringify(Symbol.search, `Symbol.search`)); - it("species", () => assertStringify(Symbol.species, `Symbol.species`)); - it("split", () => assertStringify(Symbol.split, `Symbol.split`)); - it("toPrimitive", () => - assertStringify(Symbol.toPrimitive, `Symbol.toPrimitive`)); - it("toStringTag", () => - assertStringify(Symbol.toStringTag, `Symbol.toStringTag`)); - it("unscopables", () => - assertStringify(Symbol.unscopables, `Symbol.unscopables`)); -}); - -describe("weakmap", () => { - it("empty", () => assertStringify(new WeakMap(), `new WeakMap`)); - it("values ignored", () => - assertStringify(new WeakMap([[{}, 1]]), `new WeakMap`)); -}); - -describe("weakset", () => { - it("empty", () => assertStringify(new WeakSet(), `new WeakSet`)); - it("values ignored", () => assertStringify(new WeakSet([{}]), `new WeakSet`)); -}); - -describe("date", () => { - it("epoch", () => - assertStringify(new Date(0), `new Date("1970-01-01T00:00:00.000Z")`)); - it("now", () => - assertStringify(new Date(), `new Date("${new Date().toISOString()}")`)); -}); - -describe("map", () => { - it("empty", () => assertStringify(new Map(), `new Map`)); - it("nested", () => - assertStringify(new Map([[1, new Map()]]), `new Map(_.a=[[1,new Map]])`)); - it("circular key", () => { - const map = new Map(); - map.set(map, 1); - assertStringify( - map, - `((m,i)=>(i[0][0]=m,i.forEach(i=>m.set(i[0],i[1])),m))(new Map,_.a=[[,1]])`, - ); - }); - it("circular value", () => { - const map = new Map(); - map.set(1, map); - assertStringify( - map, - `((m,i)=>(i[0][1]=m,i.forEach(i=>m.set(i[0],i[1])),m))(new Map,_.a=[[1]])`, - ); - }); - it("circular key and value", () => { - const map = new Map(); - map.set(map, map); - assertStringify( - map, - `((m,i)=>(i[0][0]=i[0][1]=m,i.forEach(i=>m.set(i[0],i[1])),m))(new Map,_.a=[[]])`, - ); - }); - it("circular mixed", () => { - const map = new Map([[1, 2]]); - map.set(map, map); - map.set(3, 4); - assertStringify( - map, - `((m,i)=>(i[1][0]=i[1][1]=m,i.forEach(i=>m.set(i[0],i[1])),m))(new Map,_.a=[[1,2],[],[3,4]])`, - ); - }); - it("circular nested", () => { - const map = new Map([[1, 2]]); - map.set(3, { nested: map }); - - assertStringify(map, `new Map(_.a=[[1,2],[3,_.c={}]]),_.c.nested=_.b`); - }); - it("dedupe value and keys across flushes", () => { - const serializer = assertSerializer(); - const objA = { a: 1 }; - const objB = { b: 2 }; - const map = new Map([[objA, objB]]); - - serializer.assertStringify(map, `new Map(_.a=[[{a:1},{b:2}]])`); - serializer.assertStringify({ c: objA }, `{c:_.c=_.a[0][0]}`); - serializer.assertStringify({ d: objB }, `{d:_.e=_.a[0][1]}`); - serializer.assertStringify( - { e: map, f: objA, g: objB }, - `{e:_.b,f:_.c,g:_.e}`, - ); - }); -}); - -describe("set", () => { - it("empty", () => assertStringify(new Set(), `new Set`)); - it("nested", () => - assertStringify(new Set([new Set(), 1]), `new Set(_.a=[new Set,1])`)); - it("circular", () => { - const set = new Set(); - set.add(set); - assertStringify( - set, - `((s,i)=>(i[0]=s,i.forEach(i=>s.add(i)),s))(new Set,_.a=[])`, - ); - }); - it("circular nested", () => { - const set = new Set([1]); - set.add({ nested: set }); - - assertStringify(set, `new Set(_.a=[1,_.c={}]),_.c.nested=_.b`); - }); - it("dedupe values across flushes", () => { - const serializer = assertSerializer(); - const objA = { a: 1 }; - const objB = { b: 2 }; - const set = new Set([objA, objB]); - serializer.assertStringify(set, `new Set(_.a=[{a:1},{b:2}])`); - serializer.assertStringify({ c: objA }, `{c:_.c=_.a[0]}`); - serializer.assertStringify({ d: objB }, `{d:_.e=_.a[1]}`); - serializer.assertStringify( - { e: set, f: objA, g: objB }, - `{e:_.b,f:_.c,g:_.e}`, - ); - }); -}); - -describe("object", () => { - it("empty", () => assertStringify({}, `{}`)); - it("nested", () => assertStringify({ a: { b: 1 } }, `{a:{b:1}}`)); - it("dashed-keys", () => assertStringify({ "a-b": 1 }, `{"a-b":1}`)); - it("invalid-keys", () => - assertStringify({ "0": 1, "a:": 2, "[": 3 }, `{0:1,"a:":2,"[":3}`)); - it("circular", () => { - const obj: any = { a: 1 }; - obj.obj = obj; - assertStringify(obj, `{a:1},_.a.obj=_.a`); - }); - it("circular nested", () => { - const obj: any = { a: 1 }; - obj.b = { nested: obj }; - assertStringify(obj, `{a:1,b:_.b={}},_.b.nested=_.a`); - }); - it("circular object", () => { - const parent = { - name: "parent", - } as any; - - const child = { - parent, - }; - - parent.firstChild = child; - parent.children = [child]; - - assertStringify( - { parent }, - `{parent:_.a={name:"parent",firstChild:_.b={},children:[_.b]}},_.b.parent=_.a`, - ); - }); - it("circular object combined assignments", () => { - const parent = { - name: "parent", - } as any; - - const child = { - parentA: parent, - parentB: parent, - "parent-c": parent, - }; - - parent.children = [child]; - - assertStringify( - { parent }, - `{parent:_.a={name:"parent",children:[_.b={}]}},_.b.parentA=_.b.parentB=_.b["parent-c"]=_.a`, - ); - }); - - it("known objects", () => { - assertStringify( - [console, Math, JSON, globalThis], - `[console,Math,JSON,globalThis]`, - ); - }); -}); - -describe("array", () => { - it("empty", () => assertStringify([], `[]`)); - it("nested", () => assertStringify([1, [2]], `[1,[2]]`)); - // eslint-disable-next-line no-sparse-arrays - it("sparse", () => assertStringify([, 1, 2], `[,1,2]`)); - it("undefined", () => assertStringify([undefined, 1, 2], `[,1,2]`)); - it("circular", () => { - const arr: any = [1]; - arr.push(arr); - assertStringify(arr, `[1,],_.a[1]=_.a`); - }); - it("circular nested", () => { - const arr: any = [1]; - arr.push({ nested: arr }); - assertStringify(arr, `[1,_.b={}],_.b.nested=_.a`); - }); - it("circular combined assignments", () => { - const a: any = []; - const b: any = [a, 1, a]; - a.push(b); - a.push(2); - a.push(b); - - assertStringify(a, `[_.b=[,1,],2,_.b],_.b[0]=_.b[2]=_.a`); - }); - - it("circular with empty", () => { - const a: any = []; - const b: any = [a, 1, a]; - a.push(b); - a.push(2); - a.push(undefined); - - assertStringify(a, `[_.b=[,1,],2,],_.b[0]=_.b[2]=_.a`); - }); -}); - -describe("null prototype", () => { - it("empty", () => { - const obj = Object.create(null); - assertStringify(obj, `{__proto__:null}`); - }); - - it("nested", () => { - const obj = Object.create(null); - obj.a = Object.create(null); - obj.a.b = 1; - assertStringify(obj, `{a:{b:1,__proto__:null},__proto__:null}`); - }); -}); - -describe("misc", () => { - it("nested", () => - assertStringify( - { - array: [ - { - a: 1, - b: ["c"], - }, - 2, - ], - }, - `{array:[{a:1,b:["c"]},2]}`, - )); - - it("shared", () => { - const registered = new Date(0); - const pattern = /test/; - const child = { name: "Henry" }; - const children = [child]; - - const mother = { - name: "Jane", - registered, - pattern, - firstChild: child, - children, - }; - - const father = { - name: "Frank", - registered, - pattern, - firstChild: child, - children, - }; - - assertStringify( - { - mother, - father, - }, - `{mother:{name:"Jane",registered:_.b=new Date("1970-01-01T00:00:00.000Z"),pattern:_.c=/test/,firstChild:_.a={name:"Henry"},children:_.d=[_.a]},father:{name:"Frank",registered:_.b,pattern:_.c,firstChild:_.a,children:_.d}}`, - ); - }); - - it("unsupported constructor", () => { - class Thing {} - assertStringify({ thing: new Thing() }, `{}`); - }); - - it("unsupported prototype", () => { - const obj = Object.create({ x: 1 }); - obj.y = 2; - assertStringify(obj, `{y:2}`); - }); - - it("unsupported prototype with nested", () => { - const obj = Object.create({ x: 1 }); - obj.y = { z: 2 }; - assertStringify(obj, `{y:{z:2}}`); - }); - - it("Symbol.iterator inline", () => { - const obj = { - x: 1, - *[Symbol.iterator]() { - yield 1; - yield 2; - yield 3; +describe("serializer", () => { + it("example", () => { + const data = { + strings: "hello\nworld", + numbers: [1, NaN, Infinity], + booleans: [true, false], + void: [null, undefined], + regexps: /abc/g, + maps: new Map([[1, 2]]), + sets: new Set([1, 2]), + nested: { + object: { + "special-keys": 1, + }, }, }; + (data.nested.object as any).cyclical = data; + assertStringify( - obj, - `{x:1,[Symbol.iterator]:(a=>()=>a.values())(_.a=[1,2,3])}`, + data, + `{strings:"hello\\nworld",numbers:[1,NaN,Infinity],booleans:[!0,!1],void:[null,],regexps:/abc/g,maps:new Map(_.a=[[1,2]]),sets:new Set(_.b=[1,2]),nested:{object:_.d={"special-keys":1}}},_.d.cyclical=_.c`, ); }); - it("Symbol.iterator registered", () => { - const obj = { - y: 2, - [Symbol.iterator]: iterate, - }; + describe("primitives", () => { + describe("undefined", () => { + it("literal", () => assertStringify(undefined, ``)); + it("in object", () => assertStringify({ x: undefined }, `{}`)); + }); - function* iterate() { - yield 1; - yield 2; - yield 3; - } + it("null", () => { + assertStringify(null, `null`); + }); - register("iterate", iterate); + describe("booleans", () => { + it("true", () => assertStringify(true, `!0`)); + it("false", () => assertStringify(false, `!1`)); + }); - assertStringify(obj, `{y:2,[Symbol.iterator]:_._.iterate}`, { - _: { iterate }, + describe("string", () => { + it("empty", () => assertStringify("", `""`)); + it("normal", () => assertStringify("test", `"test"`)); + it("special characters", () => + assertStringify( + '"\b\t\n\f\r\v\0 { + it("zero", () => assertStringify(0, `0`)); + it("positive", () => assertStringify(1, `1`)); + it("negative", () => assertStringify(-1, `-1`)); + it("decimal", () => assertStringify(0.1, `0.1`)); + it("negative decimal", () => assertStringify(-0.1, `-0.1`)); + it("NaN", () => assertStringify(NaN, `NaN`)); + it("Infinity", () => assertStringify(Infinity, `Infinity`)); + it("negative Infinity", () => assertStringify(-Infinity, `-Infinity`)); + }); + + describe("bigint", () => { + it("zero", () => assertStringify(BigInt(0), `0n`)); + it("positive", () => assertStringify(BigInt(1), `1n`)); + it("negative", () => assertStringify(BigInt(-1), `-1n`)); + it("max safe integer", () => + assertStringify( + BigInt(Number.MAX_SAFE_INTEGER), + `${Number.MAX_SAFE_INTEGER}n`, + )); }); }); -}); -describe("typed arrays", () => { - it("ArrayBuffer", () => - assertStringify(new ArrayBuffer(32), `new ArrayBuffer(32)`)); - it("Empty ArrayBuffer", () => - assertStringify(new ArrayBuffer(0), `new ArrayBuffer`)); - it("Uint8Array empty", () => - assertStringify(new Uint8Array(), `new Uint8Array`)); - it("Uint8Array", () => - assertStringify(new Uint8Array([1, 2, 3]), `new Uint8Array([1,2,3])`)); - it("Uint8ClampedArray", () => - assertStringify( - new Uint8ClampedArray([1, 2, 3]), - `new Uint8ClampedArray([1,2,3])`, - )); - it("Uint16Array", () => - assertStringify(new Uint16Array([1, 2, 3]), `new Uint16Array([1,2,3])`)); - it("Uint32Array", () => - assertStringify(new Uint32Array([1, 2, 3]), `new Uint32Array([1,2,3])`)); - it("Int8Array", () => - assertStringify(new Int8Array([1, 2, 3]), `new Int8Array([1,2,3])`)); - it("Int16Array", () => - assertStringify(new Int16Array([1, 2, 3]), `new Int16Array([1,2,3])`)); - it("Int32Array", () => - assertStringify(new Int32Array([1, 2, 3]), `new Int32Array([1,2,3])`)); - it("Float32Array", () => - assertStringify(new Float32Array([1, 2, 3]), `new Float32Array([1,2,3])`)); - it("Float64Array", () => - assertStringify(new Float64Array([1, 2, 3]), `new Float64Array([1,2,3])`)); - - it("shared buffer, multiple views", () => { - const buffer = new ArrayBuffer(32); - const view1 = new Uint8Array(buffer); - const view2 = new Uint16Array(buffer); - const view3 = new Uint32Array(buffer); - - assertStringify( - { view1, view2, view3 }, - `{view1:_.b=new Uint8Array(32),view2:new Uint16Array(_.a=_.b.buffer),view3:new Uint32Array(_.a)}`, - ); + describe("symbol", () => { + it("unknown", () => assertStringify({ s: Symbol() }, `{s:Symbol()}`)); + it("unknown duplicated", () => { + const a = Symbol(); + const b = Symbol(); + assertStringify( + { a: [a, a], b: [b, b] }, + `{a:[_.a=Symbol(),_.a],b:[_.b=Symbol(),_.b]}`, + ); + }); + it("for", () => assertStringify(Symbol.for("test"), `Symbol.for("test")`)); + it("iterator", () => assertStringify(Symbol.iterator, `Symbol.iterator`)); + it("asyncIterator", () => + assertStringify(Symbol.asyncIterator, `Symbol.asyncIterator`)); + it("hasInstance", () => + assertStringify(Symbol.hasInstance, `Symbol.hasInstance`)); + it("isConcatSpreadable", () => + assertStringify(Symbol.isConcatSpreadable, `Symbol.isConcatSpreadable`)); + it("match", () => assertStringify(Symbol.match, `Symbol.match`)); + it("matchAll", () => assertStringify(Symbol.matchAll, `Symbol.matchAll`)); + it("replace", () => assertStringify(Symbol.replace, `Symbol.replace`)); + it("search", () => assertStringify(Symbol.search, `Symbol.search`)); + it("species", () => assertStringify(Symbol.species, `Symbol.species`)); + it("split", () => assertStringify(Symbol.split, `Symbol.split`)); + it("toPrimitive", () => + assertStringify(Symbol.toPrimitive, `Symbol.toPrimitive`)); + it("toStringTag", () => + assertStringify(Symbol.toStringTag, `Symbol.toStringTag`)); + it("unscopables", () => + assertStringify(Symbol.unscopables, `Symbol.unscopables`)); }); - it("shared buffer with content, multiple views", () => { - const buffer = new ArrayBuffer(32); - const view1 = new Uint8Array(buffer); - const view2 = new Uint16Array(buffer); - const view3 = new Uint32Array(buffer); - - view1[0] = 1; - view2[1] = 2; - view3[2] = 3; - - assertStringify( - { view1, view2, view3 }, - `{view1:_.b=new Uint8Array([1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),view2:new Uint16Array(_.a=_.b.buffer),view3:new Uint32Array(_.a)}`, - ); + describe("weakmap", () => { + it("empty", () => assertStringify(new WeakMap(), `new WeakMap`)); + it("values ignored", () => + assertStringify(new WeakMap([[{}, 1]]), `new WeakMap`)); }); - it("shared buffer with content, multiple views, buffer first", () => { - const buffer = new ArrayBuffer(32); - const view1 = new Uint8Array(buffer); - const view2 = new Uint16Array(buffer); - const view3 = new Uint32Array(buffer); - - view1[0] = 1; - view2[1] = 2; - view3[2] = 3; - - assertStringify( - { buffer, view1, view2, view3 }, - `{buffer:_.a=new Int8Array([1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,view1:new Uint8Array(_.a),view2:new Uint16Array(_.a),view3:new Uint32Array(_.a)}`, - ); + describe("weakset", () => { + it("empty", () => assertStringify(new WeakSet(), `new WeakSet`)); + it("values ignored", () => + assertStringify(new WeakSet([{}]), `new WeakSet`)); }); - it("shared buffer with content, multiple views, buffer last", () => { - const buffer = new ArrayBuffer(32); - const view1 = new Uint8Array(buffer); - const view2 = new Uint16Array(buffer); - const view3 = new Uint32Array(buffer); - - view1[0] = 1; - view2[1] = 2; - view3[2] = 3; - - assertStringify( - { view1, view2, view3, buffer }, - `{view1:_.b=new Uint8Array([1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),view2:new Uint16Array(_.a=_.b.buffer),view3:new Uint32Array(_.a),buffer:_.a}`, - ); + describe("date", () => { + it("epoch", () => + assertStringify(new Date(0), `new Date("1970-01-01T00:00:00.000Z")`)); + it("now", () => + assertStringify(new Date(), `new Date("${new Date().toISOString()}")`)); }); - it("shared empty array buffer, multiple views", () => { - const buffer = new ArrayBuffer(0); - const view1 = new Uint8Array(buffer); - const view2 = new Uint16Array(buffer); - const view3 = new Uint32Array(buffer); + describe("map", () => { + it("empty", () => assertStringify(new Map(), `new Map`)); + it("nested", () => + assertStringify(new Map([[1, new Map()]]), `new Map(_.a=[[1,new Map]])`)); + it("circular key", () => { + const map = new Map(); + map.set(map, 1); + assertStringify( + map, + `((m,i)=>(i[0][0]=m,i.forEach(i=>m.set(i[0],i[1])),m))(new Map,_.a=[[,1]])`, + ); + }); + it("circular value", () => { + const map = new Map(); + map.set(1, map); + assertStringify( + map, + `((m,i)=>(i[0][1]=m,i.forEach(i=>m.set(i[0],i[1])),m))(new Map,_.a=[[1]])`, + ); + }); + it("circular key and value", () => { + const map = new Map(); + map.set(map, map); + assertStringify( + map, + `((m,i)=>(i[0][0]=i[0][1]=m,i.forEach(i=>m.set(i[0],i[1])),m))(new Map,_.a=[[]])`, + ); + }); + it("circular mixed", () => { + const map = new Map([[1, 2]]); + map.set(map, map); + map.set(3, 4); + assertStringify( + map, + `((m,i)=>(i[1][0]=i[1][1]=m,i.forEach(i=>m.set(i[0],i[1])),m))(new Map,_.a=[[1,2],[],[3,4]])`, + ); + }); + it("circular nested", () => { + const map = new Map([[1, 2]]); + map.set(3, { nested: map }); - assertStringify( - { view1, view2, view3 }, - `{view1:_.b=new Uint8Array,view2:new Uint16Array(_.a=_.b.buffer),view3:new Uint32Array(_.a)}`, - ); + assertStringify(map, `new Map(_.a=[[1,2],[3,_.c={}]]),_.c.nested=_.b`); + }); + it("dedupe value and keys across flushes", () => { + const serializer = assertSerializer(); + const objA = { a: 1 }; + const objB = { b: 2 }; + const map = new Map([[objA, objB]]); + + serializer.assertStringify(map, `new Map(_.a=[[{a:1},{b:2}]])`); + serializer.assertStringify({ c: objA }, `{c:_.c=_.a[0][0]}`); + serializer.assertStringify({ d: objB }, `{d:_.e=_.a[0][1]}`); + serializer.assertStringify( + { e: map, f: objA, g: objB }, + `{e:_.b,f:_.c,g:_.e}`, + ); + }); }); - it("with byte offset", () => { - const buffer = new ArrayBuffer(32); - const view1 = new Uint8Array(buffer, 8); - const view2 = new Uint16Array(buffer, 8); - const view3 = new Uint32Array(buffer, 8); + describe("set", () => { + it("empty", () => assertStringify(new Set(), `new Set`)); + it("nested", () => + assertStringify(new Set([new Set(), 1]), `new Set(_.a=[new Set,1])`)); + it("circular", () => { + const set = new Set(); + set.add(set); + assertStringify( + set, + `((s,i)=>(i[0]=s,i.forEach(i=>s.add(i)),s))(new Set,_.a=[])`, + ); + }); + it("circular nested", () => { + const set = new Set([1]); + set.add({ nested: set }); - assertStringify( - { view1, view2, view3 }, - `{view1:new Uint8Array(_.a=new ArrayBuffer(32),8),view2:new Uint16Array(_.a,8),view3:new Uint32Array(_.a,8)}`, - ); + assertStringify(set, `new Set(_.a=[1,_.c={}]),_.c.nested=_.b`); + }); + it("dedupe values across flushes", () => { + const serializer = assertSerializer(); + const objA = { a: 1 }; + const objB = { b: 2 }; + const set = new Set([objA, objB]); + serializer.assertStringify(set, `new Set(_.a=[{a:1},{b:2}])`); + serializer.assertStringify({ c: objA }, `{c:_.c=_.a[0]}`); + serializer.assertStringify({ d: objB }, `{d:_.e=_.a[1]}`); + serializer.assertStringify( + { e: set, f: objA, g: objB }, + `{e:_.b,f:_.c,g:_.e}`, + ); + }); }); - it("with byte offset and data", () => { - const buffer = new ArrayBuffer(32); - const view1 = new Uint8Array(buffer, 8); - const view2 = new Uint16Array(buffer, 8); - const view3 = new Uint32Array(buffer, 8); + describe("object", () => { + it("empty", () => assertStringify({}, `{}`)); + it("nested", () => assertStringify({ a: { b: 1 } }, `{a:{b:1}}`)); + it("dashed-keys", () => assertStringify({ "a-b": 1 }, `{"a-b":1}`)); + it("invalid-keys", () => + assertStringify({ "0": 1, "a:": 2, "[": 3 }, `{0:1,"a:":2,"[":3}`)); + it("circular", () => { + const obj: any = { a: 1 }; + obj.obj = obj; + assertStringify(obj, `{a:1},_.a.obj=_.a`); + }); + it("circular nested", () => { + const obj: any = { a: 1 }; + obj.b = { nested: obj }; + assertStringify(obj, `{a:1,b:_.b={}},_.b.nested=_.a`); + }); + it("circular object", () => { + const parent = { + name: "parent", + } as any; - view1[0] = 1; - view2[1] = 2; - view3[2] = 3; + const child = { + parent, + }; - assertStringify( - { view1, view2, view3 }, - `{view1:new Uint8Array(_.a=new Int8Array([0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,8),view2:new Uint16Array(_.a,8),view3:new Uint32Array(_.a,8)}`, - ); + parent.firstChild = child; + parent.children = [child]; + + assertStringify( + { parent }, + `{parent:_.a={name:"parent",firstChild:_.b={},children:[_.b]}},_.b.parent=_.a`, + ); + }); + it("circular object combined assignments", () => { + const parent = { + name: "parent", + } as any; + + const child = { + parentA: parent, + parentB: parent, + "parent-c": parent, + }; + + parent.children = [child]; + + assertStringify( + { parent }, + `{parent:_.a={name:"parent",children:[_.b={}]}},_.b.parentA=_.b.parentB=_.b["parent-c"]=_.a`, + ); + }); + + it("known objects", () => { + assertStringify( + [console, Math, JSON, globalThis], + `[console,Math,JSON,globalThis]`, + ); + }); }); - // it("BigInt64Array", () => - // assertStringify(new BigInt64Array([1n, 2n, 3n]), `new BigInt64Array([1n,2n,3n])`)); - // it("BigUint64Array", () => - // assertStringify(new BigUint64Array([1n, 2n, 3n]), `new BigUint64Array([1n,2n,3n])`)); -}); + describe("array", () => { + it("empty", () => assertStringify([], `[]`)); + it("nested", () => assertStringify([1, [2]], `[1,[2]]`)); + // eslint-disable-next-line no-sparse-arrays + it("sparse", () => assertStringify([, 1, 2], `[,1,2]`)); + it("undefined", () => assertStringify([undefined, 1, 2], `[,1,2]`)); + it("circular", () => { + const arr: any = [1]; + arr.push(arr); + assertStringify(arr, `[1,],_.a[1]=_.a`); + }); + it("circular nested", () => { + const arr: any = [1]; + arr.push({ nested: arr }); + assertStringify(arr, `[1,_.b={}],_.b.nested=_.a`); + }); + it("circular combined assignments", () => { + const a: any = []; + const b: any = [a, 1, a]; + a.push(b); + a.push(2); + a.push(b); -describe("URL", () => { - it("value", () => - assertStringify( - new URL("https://example.com/?a=1&b=2"), - `new URL("https://example.com/?a=1&b=2")`, - )); - it("duplicated", () => { - const url = new URL("https://example.com"); - assertStringify(url, `new URL("https://example.com/")`); - assertStringify([url, url], `[_.a=new URL("https://example.com/"),_.a]`); - }); -}); + assertStringify(a, `[_.b=[,1,],2,_.b],_.b[0]=_.b[2]=_.a`); + }); -describe("URLSearchParams", () => { - it("empty", () => - assertStringify(new URLSearchParams(), `new URLSearchParams`)); - it("value", () => - assertStringify( - new URLSearchParams("a=1&b=2"), - `new URLSearchParams("a=1&b=2")`, - )); - it("duplicated", () => { - const url = new URLSearchParams("a=1&b=2"); - assertStringify(url, `new URLSearchParams("a=1&b=2")`); - assertStringify([url, url], `[_.a=new URLSearchParams("a=1&b=2"),_.a]`); - }); -}); + it("circular with empty", () => { + const a: any = []; + const b: any = [a, 1, a]; + a.push(b); + a.push(2); + a.push(undefined); -describe("Headers", () => { - it("empty", () => assertStringify(new Headers(), `new Headers`)); - it("value", () => - assertStringify( - new Headers({ a: "1", b: "2" }), - `new Headers({a:"1",b:"2"})`, - )); - it("duplicated", () => { - const headers = new Headers({ a: "1", b: "2" }); - assertStringify(headers, `new Headers({a:"1",b:"2"})`); - assertStringify([headers, headers], `[_.a=new Headers({a:"1",b:"2"}),_.a]`); + assertStringify(a, `[_.b=[,1,],2,],_.b[0]=_.b[2]=_.a`); + }); }); -}); -describe("FormData", () => { - it("empty", () => assertStringify(new FormData(), `new FormData`)); - it("value", () => { - const formData = new FormData(); - formData.append("a", "1"); - formData.append("b", "2"); - assertStringify( - formData, - `((f,i)=>(f,i.forEach(i=>f.append(i[0],i[1])),f))(new FormData,[["a","1"],["b","2"]])`, - ); - }); - it("duplicated", () => { - const formData = new FormData(); - formData.append("a", "1"); - formData.append("b", "2"); - assertStringify( - formData, - `((f,i)=>(f,i.forEach(i=>f.append(i[0],i[1])),f))(new FormData,[["a","1"],["b","2"]])`, - ); - assertStringify( - [formData, formData], - `[_.a=((f,i)=>(f,i.forEach(i=>f.append(i[0],i[1])),f))(new FormData,[["a","1"],["b","2"]]),_.a]`, - ); - }); -}); + describe("null prototype", () => { + it("empty", () => { + const obj = Object.create(null); + assertStringify(obj, `{__proto__:null}`); + }); -describe("generator", () => { - it("empty", () => assertStringify((function* () {})(), `(function*(){})()`)); - it("single", () => - assertStringify( - (function* () { - yield 1; - })(), - `(function*(){yield 1})()`, - )); - it("multiple", () => - assertStringify( - (function* () { + it("nested", () => { + const obj = Object.create(null); + obj.a = Object.create(null); + obj.a.b = 1; + assertStringify(obj, `{a:{b:1,__proto__:null},__proto__:null}`); + }); + }); + + describe("misc", () => { + it("nested", () => + assertStringify( + { + array: [ + { + a: 1, + b: ["c"], + }, + 2, + ], + }, + `{array:[{a:1,b:["c"]},2]}`, + )); + + it("shared", () => { + const registered = new Date(0); + const pattern = /test/; + const child = { name: "Henry" }; + const children = [child]; + + const mother = { + name: "Jane", + registered, + pattern, + firstChild: child, + children, + }; + + const father = { + name: "Frank", + registered, + pattern, + firstChild: child, + children, + }; + + assertStringify( + { + mother, + father, + }, + `{mother:{name:"Jane",registered:_.b=new Date("1970-01-01T00:00:00.000Z"),pattern:_.c=/test/,firstChild:_.a={name:"Henry"},children:_.d=[_.a]},father:{name:"Frank",registered:_.b,pattern:_.c,firstChild:_.a,children:_.d}}`, + ); + }); + + it("unsupported constructor", () => { + class Thing {} + assertStringify({ thing: new Thing() }, `{}`); + }); + + it("unsupported prototype", () => { + const obj = Object.create({ x: 1 }); + obj.y = 2; + assertStringify(obj, `{y:2}`); + }); + + it("unsupported prototype with nested", () => { + const obj = Object.create({ x: 1 }); + obj.y = { z: 2 }; + assertStringify(obj, `{y:{z:2}}`); + }); + + it("Symbol.iterator inline", () => { + const obj = { + x: 1, + *[Symbol.iterator]() { + yield 1; + yield 2; + yield 3; + }, + }; + + assertStringify( + obj, + `{x:1,[Symbol.iterator]:(a=>()=>a.values())(_.a=[1,2,3])}`, + ); + }); + + it("Symbol.iterator registered", () => { + const obj = { + y: 2, + [Symbol.iterator]: iterate, + }; + + function* iterate() { yield 1; yield 2; yield 3; - })(), - `(function*(){yield 1;yield 2;yield 3})()`, - )); - it("nested", () => - assertStringify( - (function* () { - yield* (function* () { - yield 1; - })(); - })(), - `(function*(){yield 1})()`, - )); + } - it("yield undefined", () => { - const gen = (function* () { - yield 1; - yield undefined; - yield 2; - yield undefined; - })(); - assertStringify(gen, `(function*(){yield 1;yield;yield 2;yield})()`); + register("iterate", iterate); + + assertStringify(obj, `{y:2,[Symbol.iterator]:_._.iterate}`, { + _: { iterate }, + }); + }); }); -}); -describe("errors", () => { - it("Error", () => assertStringify(new Error("test"), `new Error("test")`)); - it("EvalError", () => - assertStringify(new EvalError("test"), `new EvalError("test")`)); - it("RangeError", () => - assertStringify(new RangeError("test"), `new RangeError("test")`)); - it("ReferenceError", () => - assertStringify(new ReferenceError("test"), `new ReferenceError("test")`)); - it("SyntaxError", () => - assertStringify(new SyntaxError("test"), `new SyntaxError("test")`)); - it("TypeError", () => - assertStringify(new TypeError("test"), `new TypeError("test")`)); - it("URIError", () => - assertStringify(new URIError("test"), `new URIError("test")`)); + describe("typed arrays", () => { + it("ArrayBuffer", () => + assertStringify(new ArrayBuffer(32), `new ArrayBuffer(32)`)); + it("Empty ArrayBuffer", () => + assertStringify(new ArrayBuffer(0), `new ArrayBuffer`)); + it("Uint8Array empty", () => + assertStringify(new Uint8Array(), `new Uint8Array`)); + it("Uint8Array", () => + assertStringify(new Uint8Array([1, 2, 3]), `new Uint8Array([1,2,3])`)); + it("Uint8ClampedArray", () => + assertStringify( + new Uint8ClampedArray([1, 2, 3]), + `new Uint8ClampedArray([1,2,3])`, + )); + it("Uint16Array", () => + assertStringify(new Uint16Array([1, 2, 3]), `new Uint16Array([1,2,3])`)); + it("Uint32Array", () => + assertStringify(new Uint32Array([1, 2, 3]), `new Uint32Array([1,2,3])`)); + it("Int8Array", () => + assertStringify(new Int8Array([1, 2, 3]), `new Int8Array([1,2,3])`)); + it("Int16Array", () => + assertStringify(new Int16Array([1, 2, 3]), `new Int16Array([1,2,3])`)); + it("Int32Array", () => + assertStringify(new Int32Array([1, 2, 3]), `new Int32Array([1,2,3])`)); + it("Float32Array", () => + assertStringify( + new Float32Array([1, 2, 3]), + `new Float32Array([1,2,3])`, + )); + it("Float64Array", () => + assertStringify( + new Float64Array([1, 2, 3]), + `new Float64Array([1,2,3])`, + )); - describe("AggregateError", () => { + it("shared buffer, multiple views", () => { + const buffer = new ArrayBuffer(32); + const view1 = new Uint8Array(buffer); + const view2 = new Uint16Array(buffer); + const view3 = new Uint32Array(buffer); + + assertStringify( + { view1, view2, view3 }, + `{view1:_.b=new Uint8Array(32),view2:new Uint16Array(_.a=_.b.buffer),view3:new Uint32Array(_.a)}`, + ); + }); + + it("shared buffer with content, multiple views", () => { + const buffer = new ArrayBuffer(32); + const view1 = new Uint8Array(buffer); + const view2 = new Uint16Array(buffer); + const view3 = new Uint32Array(buffer); + + view1[0] = 1; + view2[1] = 2; + view3[2] = 3; + + assertStringify( + { view1, view2, view3 }, + `{view1:_.b=new Uint8Array([1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),view2:new Uint16Array(_.a=_.b.buffer),view3:new Uint32Array(_.a)}`, + ); + }); + + it("shared buffer with content, multiple views, buffer first", () => { + const buffer = new ArrayBuffer(32); + const view1 = new Uint8Array(buffer); + const view2 = new Uint16Array(buffer); + const view3 = new Uint32Array(buffer); + + view1[0] = 1; + view2[1] = 2; + view3[2] = 3; + + assertStringify( + { buffer, view1, view2, view3 }, + `{buffer:_.a=new Int8Array([1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,view1:new Uint8Array(_.a),view2:new Uint16Array(_.a),view3:new Uint32Array(_.a)}`, + ); + }); + + it("shared buffer with content, multiple views, buffer last", () => { + const buffer = new ArrayBuffer(32); + const view1 = new Uint8Array(buffer); + const view2 = new Uint16Array(buffer); + const view3 = new Uint32Array(buffer); + + view1[0] = 1; + view2[1] = 2; + view3[2] = 3; + + assertStringify( + { view1, view2, view3, buffer }, + `{view1:_.b=new Uint8Array([1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),view2:new Uint16Array(_.a=_.b.buffer),view3:new Uint32Array(_.a),buffer:_.a}`, + ); + }); + + it("shared empty array buffer, multiple views", () => { + const buffer = new ArrayBuffer(0); + const view1 = new Uint8Array(buffer); + const view2 = new Uint16Array(buffer); + const view3 = new Uint32Array(buffer); + + assertStringify( + { view1, view2, view3 }, + `{view1:_.b=new Uint8Array,view2:new Uint16Array(_.a=_.b.buffer),view3:new Uint32Array(_.a)}`, + ); + }); + + it("with byte offset", () => { + const buffer = new ArrayBuffer(32); + const view1 = new Uint8Array(buffer, 8); + const view2 = new Uint16Array(buffer, 8); + const view3 = new Uint32Array(buffer, 8); + + assertStringify( + { view1, view2, view3 }, + `{view1:new Uint8Array(_.a=new ArrayBuffer(32),8),view2:new Uint16Array(_.a,8),view3:new Uint32Array(_.a,8)}`, + ); + }); + + it("with byte offset and data", () => { + const buffer = new ArrayBuffer(32); + const view1 = new Uint8Array(buffer, 8); + const view2 = new Uint16Array(buffer, 8); + const view3 = new Uint32Array(buffer, 8); + + view1[0] = 1; + view2[1] = 2; + view3[2] = 3; + + assertStringify( + { view1, view2, view3 }, + `{view1:new Uint8Array(_.a=new Int8Array([0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,8),view2:new Uint16Array(_.a,8),view3:new Uint32Array(_.a,8)}`, + ); + }); + + // it("BigInt64Array", () => + // assertStringify(new BigInt64Array([1n, 2n, 3n]), `new BigInt64Array([1n,2n,3n])`)); + // it("BigUint64Array", () => + // assertStringify(new BigUint64Array([1n, 2n, 3n]), `new BigUint64Array([1n,2n,3n])`)); + }); + + describe("URL", () => { + it("value", () => + assertStringify( + new URL("https://example.com/?a=1&b=2"), + `new URL("https://example.com/?a=1&b=2")`, + )); + it("duplicated", () => { + const url = new URL("https://example.com"); + assertStringify(url, `new URL("https://example.com/")`); + assertStringify([url, url], `[_.a=new URL("https://example.com/"),_.a]`); + }); + }); + + describe("URLSearchParams", () => { it("empty", () => - assertStringify(new AggregateError([]), `new AggregateError([])`)); + assertStringify(new URLSearchParams(), `new URLSearchParams`)); + it("value", () => + assertStringify( + new URLSearchParams("a=1&b=2"), + `new URLSearchParams("a=1&b=2")`, + )); + it("duplicated", () => { + const url = new URLSearchParams("a=1&b=2"); + assertStringify(url, `new URLSearchParams("a=1&b=2")`); + assertStringify([url, url], `[_.a=new URLSearchParams("a=1&b=2"),_.a]`); + }); + }); + + describe("Headers", () => { + it("empty", () => assertStringify(new Headers(), `new Headers`)); + it("value", () => + assertStringify( + new Headers({ a: "1", b: "2" }), + `new Headers({a:"1",b:"2"})`, + )); + it("duplicated", () => { + const headers = new Headers({ a: "1", b: "2" }); + assertStringify(headers, `new Headers({a:"1",b:"2"})`); + assertStringify( + [headers, headers], + `[_.a=new Headers({a:"1",b:"2"}),_.a]`, + ); + }); + }); + + describe("FormData", () => { + it("empty", () => assertStringify(new FormData(), `new FormData`)); + it("value", () => { + const formData = new FormData(); + formData.append("a", "1"); + formData.append("b", "2"); + assertStringify( + formData, + `((f,i)=>(f,i.forEach(i=>f.append(i[0],i[1])),f))(new FormData,[["a","1"],["b","2"]])`, + ); + }); + it("duplicated", () => { + const formData = new FormData(); + formData.append("a", "1"); + formData.append("b", "2"); + assertStringify( + formData, + `((f,i)=>(f,i.forEach(i=>f.append(i[0],i[1])),f))(new FormData,[["a","1"],["b","2"]])`, + ); + assertStringify( + [formData, formData], + `[_.a=((f,i)=>(f,i.forEach(i=>f.append(i[0],i[1])),f))(new FormData,[["a","1"],["b","2"]]),_.a]`, + ); + }); + }); + + describe("generator", () => { + it("empty", () => + assertStringify((function* () {})(), `(function*(){})()`)); it("single", () => assertStringify( - new AggregateError(["test"]), - `new AggregateError(["test"])`, + (function* () { + yield 1; + })(), + `(function*(){yield 1})()`, )); it("multiple", () => assertStringify( - new AggregateError(["test", "test2"]), - `new AggregateError(["test","test2"])`, + (function* () { + yield 1; + yield 2; + yield 3; + })(), + `(function*(){yield 1;yield 2;yield 3})()`, )); - it("duplicate", () => { - const error = new Error("test"); + it("nested", () => assertStringify( - new AggregateError([error, error], "test"), - `new AggregateError([_.a=new Error("test"),_.a],"test")`, + (function* () { + yield* (function* () { + yield 1; + })(); + })(), + `(function*(){yield 1})()`, + )); + + it("yield undefined", () => { + const gen = (function* () { + yield 1; + yield undefined; + yield 2; + yield undefined; + })(); + assertStringify(gen, `(function*(){yield 1;yield;yield 2;yield})()`); + }); + }); + + describe("errors", () => { + it("Error", () => assertStringify(new Error("test"), `new Error("test")`)); + it("EvalError", () => + assertStringify(new EvalError("test"), `new EvalError("test")`)); + it("RangeError", () => + assertStringify(new RangeError("test"), `new RangeError("test")`)); + it("ReferenceError", () => + assertStringify( + new ReferenceError("test"), + `new ReferenceError("test")`, + )); + it("SyntaxError", () => + assertStringify(new SyntaxError("test"), `new SyntaxError("test")`)); + it("TypeError", () => + assertStringify(new TypeError("test"), `new TypeError("test")`)); + it("URIError", () => + assertStringify(new URIError("test"), `new URIError("test")`)); + + describe("AggregateError", () => { + it("empty", () => + assertStringify(new AggregateError([]), `new AggregateError([])`)); + it("single", () => + assertStringify( + new AggregateError(["test"]), + `new AggregateError(["test"])`, + )); + it("multiple", () => + assertStringify( + new AggregateError(["test", "test2"]), + `new AggregateError(["test","test2"])`, + )); + it("duplicate", () => { + const error = new Error("test"); + assertStringify( + new AggregateError([error, error], "test"), + `new AggregateError([_.a=new Error("test"),_.a],"test")`, + ); + }); + it("errors array referenced", () => { + const agg = new AggregateError([new Error("test")], "test"); + assertStringify( + { errors: agg.errors, agg }, + `{errors:_.a=[new Error("test")],agg:new AggregateError(_.a,"test")}`, + ); + }); + }); + }); + + describe("function", () => { + it("known functions", () => { + assertStringify( + [console.log, Object, Math.pow, JSON.stringify], + `[console.log,Object,Math.pow,JSON.stringify]`, ); }); - it("errors array referenced", () => { - const agg = new AggregateError([new Error("test")], "test"); - assertStringify( - { errors: agg.errors, agg }, - `{errors:_.a=[new Error("test")],agg:new AggregateError(_.a,"test")}`, - ); - }); - }); -}); -describe("function", () => { - it("known functions", () => { - assertStringify( - [console.log, Object, Math.pow, JSON.stringify], - `[console.log,Object,Math.pow,JSON.stringify]`, - ); - }); - - it("unknown functions", () => { - const fn = () => 1; - assertStringify([fn, "a"], `[,"a"]`); - }); -}); - -describe("registry", () => { - it("reference object", () => { - const obj = { a: 1 }; - register("obj", obj); - assertStringify(obj, `_._.obj`, { _: { obj } }); - }); - - it("reference function", () => { - const fn = () => 1; - register("fn", fn); - assertStringify(fn, `_._.fn`, { _: { fn } }); - }); - - it("reference non object key id", () => { - const obj = { a: 1 }; - register("a-b-c", obj); - assertStringify(obj, `_._["a-b-c"]`, { _: { "a-b-c": obj } }); - }); - - it("scoped reference", () => { - const builder = (s: typeof scope) => () => s.value; - const scope = { value: 1 }; - const obj = { fn: builder(scope) }; - register("fn", obj.fn, scope); - assertStringify(obj, `{fn:_._.fn(_.a={value:1})}`, { _: { fn: builder } }); - }); - - it("circular scoped reference", () => { - const scope = { value: 1 } as any; - const builder = - ({ value }: typeof scope) => - () => - value; - scope.fn = builder(scope); - register("fn", scope.fn, scope); - assertStringify(scope, `{value:1},_.a.fn=_._.fn(_.a)`, { - _: { fn: builder }, + it("unknown functions", () => { + const fn = () => 1; + assertStringify([fn, "a"], `[,"a"]`); }); }); - it("read after circular scoped reference", () => { - const scope = { value: 1 } as any; - const builder = - ({ value }: typeof scope) => - () => - value; - scope.fn = builder(scope); - register("fn", scope.fn, scope); - assertStringify( - { - scope, - fn: scope.fn, - }, - `{scope:_.a={value:1}},_.a.fn=_.b.fn=_._.fn(_.a)`, - { + describe("registry", () => { + it("reference object", () => { + const obj = { a: 1 }; + register("obj", obj); + assertStringify(obj, `_._.obj`, { _: { obj } }); + }); + + it("reference function", () => { + const fn = () => 1; + register("fn", fn); + assertStringify(fn, `_._.fn`, { _: { fn } }); + }); + + it("reference non object key id", () => { + const obj = { a: 1 }; + register("a-b-c", obj); + assertStringify(obj, `_._["a-b-c"]`, { _: { "a-b-c": obj } }); + }); + + it("scoped reference", () => { + const builder = (s: typeof scope) => () => s.value; + const scope = { value: 1 }; + const obj = { fn: builder(scope) }; + register("fn", obj.fn, scope); + assertStringify(obj, `{fn:_._.fn(_.a={value:1})}`, { _: { fn: builder }, - }, - ); - }); -}); + }); + }); -describe("serializer", () => { - it("multiple flushes", () => { - const serializer = assertSerializer(); - serializer.assertStringify({ a: 1 }, `{a:1}`); - serializer.assertStringify({ a: 2 }, `{a:2}`); - }); + it("circular scoped reference", () => { + const scope = { value: 1 } as any; + const builder = + ({ value }: typeof scope) => + () => + value; + scope.fn = builder(scope); + register("fn", scope.fn, scope); + assertStringify(scope, `{value:1},_.a.fn=_._.fn(_.a)`, { + _: { fn: builder }, + }); + }); - it("multiple flushes with shared references", () => { - const serializer = assertSerializer(); - const obj = { a: 1 }; - serializer.assertStringify(obj, `{a:1}`); - serializer.assertStringify(obj, `_.a`); - }); - - it("multiple flushes with shared references and nested", () => { - const serializer = assertSerializer(); - const nested = { b: 1 }; - const obj = { a: nested }; - serializer.assertStringify(obj, `{a:{b:1}}`); - serializer.assertStringify({ c: nested }, `{c:_.b=_.a.a}`); - serializer.assertStringify({ d: nested }, `{d:_.b}`); - }); -}); - -describe("promise", () => { - it("resolves", async () => { - const serializer = assertSerializer(); - const obj = { x: 1 }; - const promise = Promise.resolve(obj); - const [result] = await serializer.assertStringify( - promise, - `new Promise((f,r)=>_.a={f,r})`, - `_.a.f(_.a={x:1})`, - ); - assert.deepEqual(serializer.get("a"), obj); - assert.deepEqual(await result, obj); - }); - - it("rejects", async () => { - const serializer = assertSerializer(); - const error = new Error("test"); - const promise = Promise.reject(error); - const [result] = await serializer.assertStringify( - promise, - `new Promise((f,r)=>_.a={f,r})`, - `_.a.r(_.a=new Error("test"))`, - ); - assert.deepEqual(serializer.get("a"), error); - await assert.rejects(result, error); - }); -}); - -describe("async generator", () => { - it("resolves", async () => { - const serializer = assertSerializer(); - const yielded = [{ x: 1 }, { y: 2 }]; - const returned = { z: 3 }; - const [result] = await serializer.assertStringify( - (async function* () { - yield* yielded; - return returned; - })(), - `(async function*(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()])){for(i of a)v=await i,i!=l&&(yield v);return v})(_.a={})`, - `_.a.f(_.c={x:1})`, - `_.a.f(_.d={y:2})`, - `_.a.r(_.e={z:3})`, - ); - - assert.deepEqual(await consumeIterator(result), { - yielded, - returned, - errored: undefined, + it("read after circular scoped reference", () => { + const scope = { value: 1 } as any; + const builder = + ({ value }: typeof scope) => + () => + value; + scope.fn = builder(scope); + register("fn", scope.fn, scope); + assertStringify( + { + scope, + fn: scope.fn, + }, + `{scope:_.a={value:1}},_.a.fn=_.b.fn=_._.fn(_.a)`, + { + _: { fn: builder }, + }, + ); }); }); - it("rejects", async () => { - const serializer = assertSerializer(); - const yielded = [{ x: 1 }, { y: 2 }]; - const errored = new Error("boom"); - const [result] = await serializer.assertStringify( - (async function* () { - yield* yielded; - throw errored; - })(), - `(async function*(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()])){for(i of a)v=await i,i!=l&&(yield v);return v})(_.a={})`, - `_.a.f(_.c={x:1})`, - `_.a.f(_.d={y:2})`, - `_.a.j(_.e=new Error("boom"))`, - ); - - assert.deepEqual(await consumeIterator(result), { - yielded, - errored, - returned: undefined, + describe("serializer", () => { + it("multiple flushes", () => { + const serializer = assertSerializer(); + serializer.assertStringify({ a: 1 }, `{a:1}`); + serializer.assertStringify({ a: 2 }, `{a:2}`); }); - }); -}); -describe("readable stream", () => { - it("resolves with sync flushes", async () => { - const serializer = assertSerializer(); - const yielded = [{ x: 1 }, { y: 2 }]; - const stream = new ReadableStream({ - start(ctrl) { - for (const value of yielded) { - ctrl.enqueue(value); - } - ctrl.close(); - }, + it("multiple flushes with shared references", () => { + const serializer = assertSerializer(); + const obj = { a: 1 }; + serializer.assertStringify(obj, `{a:1}`); + serializer.assertStringify(obj, `_.a`); }); - const [result] = await serializer.assertStringify( - stream, - `new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}})`, - `_.a.f(_.c={x:1});_.a.f(_.d={y:2})`, - `_.a.r()`, - ); - assert.deepEqual(await consumeReader(result.getReader()), { - yielded, - returned: undefined, - errored: undefined, + it("multiple flushes with shared references and nested", () => { + const serializer = assertSerializer(); + const nested = { b: 1 }; + const obj = { a: nested }; + serializer.assertStringify(obj, `{a:{b:1}}`); + serializer.assertStringify({ c: nested }, `{c:_.b=_.a.a}`); + serializer.assertStringify({ d: nested }, `{d:_.b}`); }); }); - it("resolves with async flushes", async () => { - const serializer = assertSerializer(); - const yielded = [{ x: 1 }, { y: 2 }]; - const stream = new ReadableStream({ - async start(ctrl) { - for (const value of yielded) { - ctrl.enqueue(value); - await new Promise((r) => setTimeout(r, 0)); - } - ctrl.close(); - }, + describe("promise", () => { + it("resolves", async () => { + const serializer = assertSerializer(); + const obj = { x: 1 }; + const promise = Promise.resolve(obj); + const [result] = await serializer.assertStringify( + promise, + `new Promise((f,r)=>_.a={f,r})`, + `_.a.f(_.a={x:1})`, + ); + assert.deepEqual(serializer.get("a"), obj); + assert.deepEqual(await result, obj); }); - const [result] = await serializer.assertStringify( - stream, - `new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}})`, - `_.a.f(_.c={x:1})`, - `_.a.f(_.d={y:2})`, - `_.a.r()`, - ); - assert.deepEqual(await consumeReader(result.getReader()), { - yielded, - returned: undefined, - errored: undefined, + it("rejects", async () => { + const serializer = assertSerializer(); + const error = new Error("test"); + const promise = Promise.reject(error); + const [result] = await serializer.assertStringify( + promise, + `new Promise((f,r)=>_.a={f,r})`, + `_.a.r(_.a=new Error("test"))`, + ); + assert.deepEqual(serializer.get("a"), error); + await assert.rejects(result, error); }); }); - it("rejects sync", async () => { - const serializer = assertSerializer(); - const yielded = [{ x: 1 }, { y: 2 }]; - const errored = new Error("boom"); - const stream = new ReadableStream({ - start(ctrl) { - for (const value of yielded) { - ctrl.enqueue(value); - } - ctrl.error(errored); - }, - }); - const [result] = await serializer.assertStringify( - stream, - `new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}})`, - `_.a.j(_.c=new Error("boom"))`, - ); + describe("async generator", () => { + it("resolves", async () => { + const serializer = assertSerializer(); + const yielded = [{ x: 1 }, { y: 2 }]; + const returned = { z: 3 }; + const [result] = await serializer.assertStringify( + (async function* () { + yield* yielded; + return returned; + })(), + `(async function*(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()])){for(i of a)v=await i,i!=l&&(yield v);return v})(_.a={})`, + `_.a.f(_.c={x:1})`, + `_.a.f(_.d={y:2})`, + `_.a.r(_.e={z:3})`, + ); - assert.deepEqual(await consumeReader(result.getReader()), { - yielded: [], - returned: undefined, - errored, + assert.deepEqual(await consumeIterator(result), { + yielded, + returned, + errored: undefined, + }); + }); + + it("rejects", async () => { + const serializer = assertSerializer(); + const yielded = [{ x: 1 }, { y: 2 }]; + const errored = new Error("boom"); + const [result] = await serializer.assertStringify( + (async function* () { + yield* yielded; + throw errored; + })(), + `(async function*(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()])){for(i of a)v=await i,i!=l&&(yield v);return v})(_.a={})`, + `_.a.f(_.c={x:1})`, + `_.a.f(_.d={y:2})`, + `_.a.j(_.e=new Error("boom"))`, + ); + + assert.deepEqual(await consumeIterator(result), { + yielded, + errored, + returned: undefined, + }); }); }); - it("rejects async", async () => { - const serializer = assertSerializer(); - const yielded = [{ x: 1 }]; - const errored = new Error("boom"); - const stream = new ReadableStream({ - async start(ctrl) { - for (const value of yielded) { - ctrl.enqueue(value); - await new Promise((r) => setTimeout(r, 0)); - } - ctrl.error(errored); - }, - }); - const [result] = await serializer.assertStringify( - stream, - `new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}})`, - `_.a.f(_.c={x:1})`, - `_.a.j(_.d=new Error("boom"))`, - ); - - assert.deepEqual(await consumeReader(result.getReader()), { - yielded, - returned: undefined, - errored, - }); - }); -}); - -describe("request", () => { - it("url only", () => - assertStringify( - new Request("https://ebay.com/"), - `new Request("https://ebay.com/")`, - )); - it("method", () => - assertStringify( - new Request("https://ebay.com/", { method: "POST" }), - `new Request("https://ebay.com/",{method:"POST"})`, - )); - - it("headers", () => { - const req = new Request("https://ebay.com/", { - headers: { "content-type": "text/plain" }, - method: "POST", - }); - assertStringify( - req, - `new Request("https://ebay.com/",{headers:{"content-type":"text/plain"},method:"POST"})`, - ); - - assertStringify( - { req: req, headers: req.headers }, - `{req:_.b=new Request("https://ebay.com/",{headers:{"content-type":"text/plain"},method:"POST"}),headers:_.a=_.b.headers}`, - ); - }); - - it("cache", () => - assertStringify( - new Request("https://ebay.com/", { cache: "no-store" }), - `new Request("https://ebay.com/",{cache:"no-store"})`, - )); - - it("credentials", () => - assertStringify( - new Request("https://ebay.com/", { credentials: "omit" }), - `new Request("https://ebay.com/",{credentials:"omit"})`, - )); - - it("integrity", () => - assertStringify( - new Request("https://ebay.com/", { integrity: "sha-256" }), - `new Request("https://ebay.com/",{integrity:"sha-256"})`, - )); - - it("keepalive", () => - assertStringify( - new Request("https://ebay.com/", { keepalive: true }), - `new Request("https://ebay.com/",{keepalive:true})`, - )); - - it("mode", () => - assertStringify( - new Request("https://ebay.com/", { mode: "no-cors" }), - `new Request("https://ebay.com/",{mode:"no-cors"})`, - )); - - it("redirect", () => - assertStringify( - new Request("https://ebay.com/", { redirect: "manual" }), - `new Request("https://ebay.com/",{redirect:"manual"})`, - )); - - it("referrer", () => - assertStringify( - new Request("https://ebay.com/", { referrer: "https://google.com/" }), - `new Request("https://ebay.com/",{referrer:"https://google.com/"})`, - )); - - it("referrerPolicy", () => - assertStringify( - new Request("https://ebay.com/", { referrerPolicy: "no-referrer" }), - `new Request("https://ebay.com/",{referrerPolicy:"no-referrer"})`, - )); - - it("body", async () => { - const serializer = assertSerializer(); - const obj = { a: 1 }; - const request = new Request("https://ebay.com/", { - method: "POST", - duplex: "half", - body: JSON.stringify(obj), - } as any); - const [result] = await serializer.assertStringify( - request, - `new Request("https://ebay.com/",{body:new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}}),duplex:"half",headers:{"content-type":"text/plain;charset=UTF-8"},method:"POST"})`, - `_.a.f(_.c=new Uint8Array([123,34,97,34,58,49,125]))`, - `_.a.r()`, - ); - - assert.deepEqual(await result.json(), obj); - }); -}); - -describe("response", () => { - it("empty", () => assertStringify(new Response(), `new Response`)); - it("status", () => - assertStringify( - new Response(null, { status: 301 }), - `new Response(null,{status:301})`, - )); - it("statusText", () => - assertStringify( - new Response(null, { statusText: "Moved Permanently" }), - `new Response(null,{statusText:"Moved Permanently"})`, - )); - it("headers", () => { - const res = new Response(null, { headers: { a: "1", b: "2" } }); - assertStringify(res, `new Response(null,{headers:{a:"1",b:"2"}})`); - - assertStringify( - { res: res, headers: res.headers }, - `{res:_.b=new Response(null,{headers:{a:"1",b:"2"}}),headers:_.a=_.b.headers}`, - ); - }); - - it("buffer", async () => { - const serializer = assertSerializer(); - const response = new Response(new Int8Array([116, 101, 115, 116])); - const [result] = await serializer.assertStringify( - response, - `new Response(new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}}))`, - `_.a.f(_.c=new Uint8Array([116,101,115,116]))`, - `_.a.r()`, - ); - - assert.deepEqual(await consumeReader(result.body!.getReader()), { - yielded: [new Uint8Array([116, 101, 115, 116])], - errored: undefined, - returned: undefined, - }); - }); - - it("ReadableStream string encoded", async () => { - const serializer = assertSerializer(); - const encoder = new TextEncoder(); - const response = new Response( - new ReadableStream({ - async start(ctrl) { - ctrl.enqueue(encoder.encode("first")); - await new Promise((r) => setTimeout(r, 0)); - ctrl.enqueue(encoder.encode("second")); - await new Promise((r) => setTimeout(r, 0)); - ctrl.enqueue(encoder.encode("third")); + describe("readable stream", () => { + it("resolves with sync flushes", async () => { + const serializer = assertSerializer(); + const yielded = [{ x: 1 }, { y: 2 }]; + const stream = new ReadableStream({ + start(ctrl) { + for (const value of yielded) { + ctrl.enqueue(value); + } ctrl.close(); }, - }), - ); + }); + const [result] = await serializer.assertStringify( + stream, + `new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}})`, + `_.a.f(_.c={x:1}),_.a.f(_.d={y:2})`, + `_.a.r()`, + ); - const [result] = await serializer.assertStringify( - response, - `new Response(new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}}))`, - `_.a.f(_.c=new Uint8Array([102,105,114,115,116]))`, - `_.a.f(_.d=new Uint8Array([115,101,99,111,110,100]))`, - `_.a.f(_.e=new Uint8Array([116,104,105,114,100]));_.a.r()`, - ); + assert.deepEqual(await consumeReader(result.getReader()), { + yielded, + returned: undefined, + errored: undefined, + }); + }); - assert.equal(await result.text(), "firstsecondthird"); + it("resolves with async flushes", async () => { + const serializer = assertSerializer(); + const yielded = [{ x: 1 }, { y: 2 }]; + const stream = new ReadableStream({ + async start(ctrl) { + for (const value of yielded) { + ctrl.enqueue(value); + await new Promise((r) => setTimeout(r, 0)); + } + ctrl.close(); + }, + }); + const [result] = await serializer.assertStringify( + stream, + `new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}})`, + `_.a.f(_.c={x:1})`, + `_.a.f(_.d={y:2})`, + `_.a.r()`, + ); + + assert.deepEqual(await consumeReader(result.getReader()), { + yielded, + returned: undefined, + errored: undefined, + }); + }); + + it("rejects sync", async () => { + const serializer = assertSerializer(); + const yielded = [{ x: 1 }, { y: 2 }]; + const errored = new Error("boom"); + const stream = new ReadableStream({ + start(ctrl) { + for (const value of yielded) { + ctrl.enqueue(value); + } + ctrl.error(errored); + }, + }); + const [result] = await serializer.assertStringify( + stream, + `new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}})`, + `_.a.j(_.c=new Error("boom"))`, + ); + + assert.deepEqual(await consumeReader(result.getReader()), { + yielded: [], + returned: undefined, + errored, + }); + }); + + it("rejects async", async () => { + const serializer = assertSerializer(); + const yielded = [{ x: 1 }]; + const errored = new Error("boom"); + const stream = new ReadableStream({ + async start(ctrl) { + for (const value of yielded) { + ctrl.enqueue(value); + await new Promise((r) => setTimeout(r, 0)); + } + ctrl.error(errored); + }, + }); + const [result] = await serializer.assertStringify( + stream, + `new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}})`, + `_.a.f(_.c={x:1})`, + `_.a.j(_.d=new Error("boom"))`, + ); + + assert.deepEqual(await consumeReader(result.getReader()), { + yielded, + returned: undefined, + errored, + }); + }); }); - it("json", async () => { - const serializer = assertSerializer(); - const response = new Response(JSON.stringify({ a: 1 }), { - headers: { "content-type": "application/json" }, - }); - const [result] = await serializer.assertStringify( - response, - `new Response(new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}}),{headers:{"content-type":"application/json"}})`, - `_.a.f(_.c=new Uint8Array([123,34,97,34,58,49,125]))`, - `_.a.r()`, - ); + describe("request", () => { + it("url only", () => + assertStringify( + new Request("https://ebay.com/"), + `new Request("https://ebay.com/")`, + )); + it("method", () => + assertStringify( + new Request("https://ebay.com/", { method: "POST" }), + `new Request("https://ebay.com/",{method:"POST"})`, + )); - assert.deepEqual(await result.json(), { a: 1 }); + it("headers", () => { + const req = new Request("https://ebay.com/", { + headers: { "content-type": "text/plain" }, + method: "POST", + }); + assertStringify( + req, + `new Request("https://ebay.com/",{headers:{"content-type":"text/plain"},method:"POST"})`, + ); + + assertStringify( + { req: req, headers: req.headers }, + `{req:_.b=new Request("https://ebay.com/",{headers:{"content-type":"text/plain"},method:"POST"}),headers:_.a=_.b.headers}`, + ); + }); + + it("cache", () => + assertStringify( + new Request("https://ebay.com/", { cache: "no-store" }), + `new Request("https://ebay.com/",{cache:"no-store"})`, + )); + + it("credentials", () => + assertStringify( + new Request("https://ebay.com/", { credentials: "omit" }), + `new Request("https://ebay.com/",{credentials:"omit"})`, + )); + + it("integrity", () => + assertStringify( + new Request("https://ebay.com/", { integrity: "sha-256" }), + `new Request("https://ebay.com/",{integrity:"sha-256"})`, + )); + + it("keepalive", () => + assertStringify( + new Request("https://ebay.com/", { keepalive: true }), + `new Request("https://ebay.com/",{keepalive:true})`, + )); + + it("mode", () => + assertStringify( + new Request("https://ebay.com/", { mode: "no-cors" }), + `new Request("https://ebay.com/",{mode:"no-cors"})`, + )); + + it("redirect", () => + assertStringify( + new Request("https://ebay.com/", { redirect: "manual" }), + `new Request("https://ebay.com/",{redirect:"manual"})`, + )); + + it("referrer", () => + assertStringify( + new Request("https://ebay.com/", { referrer: "https://google.com/" }), + `new Request("https://ebay.com/",{referrer:"https://google.com/"})`, + )); + + it("referrerPolicy", () => + assertStringify( + new Request("https://ebay.com/", { referrerPolicy: "no-referrer" }), + `new Request("https://ebay.com/",{referrerPolicy:"no-referrer"})`, + )); + + it("body", async () => { + const serializer = assertSerializer(); + const obj = { a: 1 }; + const request = new Request("https://ebay.com/", { + method: "POST", + duplex: "half", + body: JSON.stringify(obj), + } as any); + const [result] = await serializer.assertStringify( + request, + `new Request("https://ebay.com/",{body:new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}}),duplex:"half",headers:{"content-type":"text/plain;charset=UTF-8"},method:"POST"})`, + `_.a.f(_.c=new Uint8Array([123,34,97,34,58,49,125]))`, + `_.a.r()`, + ); + + assert.deepEqual(await result.json(), obj); + }); + }); + + describe("response", () => { + it("empty", () => assertStringify(new Response(), `new Response`)); + it("status", () => + assertStringify( + new Response(null, { status: 301 }), + `new Response(null,{status:301})`, + )); + it("statusText", () => + assertStringify( + new Response(null, { statusText: "Moved Permanently" }), + `new Response(null,{statusText:"Moved Permanently"})`, + )); + it("headers", () => { + const res = new Response(null, { headers: { a: "1", b: "2" } }); + assertStringify(res, `new Response(null,{headers:{a:"1",b:"2"}})`); + + assertStringify( + { res: res, headers: res.headers }, + `{res:_.b=new Response(null,{headers:{a:"1",b:"2"}}),headers:_.a=_.b.headers}`, + ); + }); + + it("buffer", async () => { + const serializer = assertSerializer(); + const response = new Response(new Int8Array([116, 101, 115, 116])); + const [result] = await serializer.assertStringify( + response, + `new Response(new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}}))`, + `_.a.f(_.c=new Uint8Array([116,101,115,116]))`, + `_.a.r()`, + ); + + assert.deepEqual(await consumeReader(result.body!.getReader()), { + yielded: [new Uint8Array([116, 101, 115, 116])], + errored: undefined, + returned: undefined, + }); + }); + + it("ReadableStream string encoded", async () => { + const serializer = assertSerializer(); + const encoder = new TextEncoder(); + const response = new Response( + new ReadableStream({ + async start(ctrl) { + ctrl.enqueue(encoder.encode("first")); + await new Promise((r) => setTimeout(r, 0)); + ctrl.enqueue(encoder.encode("second")); + await new Promise((r) => setTimeout(r, 0)); + ctrl.enqueue(encoder.encode("third")); + ctrl.close(); + }, + }), + ); + + const [result] = await serializer.assertStringify( + response, + `new Response(new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}}))`, + `_.a.f(_.c=new Uint8Array([102,105,114,115,116]))`, + `_.a.f(_.d=new Uint8Array([115,101,99,111,110,100]))`, + `_.a.f(_.e=new Uint8Array([116,104,105,114,100])),_.a.r()`, + ); + + assert.equal(await result.text(), "firstsecondthird"); + }); + + it("json", async () => { + const serializer = assertSerializer(); + const response = new Response(JSON.stringify({ a: 1 }), { + headers: { "content-type": "application/json" }, + }); + const [result] = await serializer.assertStringify( + response, + `new Response(new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(_.a={}).catch(e=>c.error(e))}}),{headers:{"content-type":"application/json"}})`, + `_.a.f(_.c=new Uint8Array([123,34,97,34,58,49,125]))`, + `_.a.r()`, + ); + + assert.deepEqual(await result.json(), { a: 1 }); + }); }); }); @@ -1180,22 +1199,46 @@ function assertSerializer(ctx: Record = {}) { first: string, ...flushes: string[] ): [T] | Promise<[T]> { + const createDeferred = () => { + let resolve!: () => void; + let reject!: (err: unknown) => void; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return Object.assign(promise, { resolve, reject }); + }; + + let promiseIndex = 0; + const promises: ReturnType[] = []; + const boundary = { + signal: { + aborted: false, + }, + startAsync() { + promises.push(createDeferred()); + }, + endAsync() { + promises[promiseIndex++].resolve(); + }, + } as any as Boundary; const result = assertSerializedIsActual( val, - serializer.stringify(val), + serializer.stringify(val, boundary), first, ctx, ); if (flushes.length) { return (async () => { + let promiseIndex = 0; for (const flush of flushes) { - const actual = await serializer.pending; + await promises[promiseIndex++]; + const actual = serializer.stringify(undefined, boundary); assert.equal(actual?.replace(/^_=>[({](.*?)[})]$/, "$1"), flush); (0, eval)(actual)(ctx); } - assert.equal(serializer.pending, undefined); return [result]; })(); } else { diff --git a/packages/runtime-tags/src/common/compat-meta.ts b/packages/runtime-tags/src/common/compat-meta.ts new file mode 100644 index 000000000..a30e35ff5 --- /dev/null +++ b/packages/runtime-tags/src/common/compat-meta.ts @@ -0,0 +1,3 @@ +const prefix = MARKO_DEBUG ? "$compat_" : "$C_"; +export const RENDERER_REGISTER_ID = prefix + (MARKO_DEBUG ? "renderer" : "r"); +export const SET_SCOPE_REGISTER_ID = prefix + (MARKO_DEBUG ? "setScope" : "s"); diff --git a/packages/runtime-tags/src/common/meta.ts b/packages/runtime-tags/src/common/meta.ts new file mode 100644 index 000000000..a210c32ab --- /dev/null +++ b/packages/runtime-tags/src/common/meta.ts @@ -0,0 +1,2 @@ +export const DEFAULT_RUNTIME_ID = "M"; +export const DEFAULT_RENDER_ID = "_"; diff --git a/packages/runtime-tags/src/common/types.ts b/packages/runtime-tags/src/common/types.ts index ed8388e50..c7d663905 100644 --- a/packages/runtime-tags/src/common/types.ts +++ b/packages/runtime-tags/src/common/types.ts @@ -33,7 +33,6 @@ export enum ResumeSymbol { PlaceholderStart = "", PlaceholderEnd = "", ReplacementId = "", - VarResume = "$h", VarReorderRuntime = "$r", } @@ -97,8 +96,19 @@ export enum WalkRangeSize { } export type Accessor = string | number; -export type Input = Record; -export type Context = Record; +export interface $Global { + [x: PropertyKey]: unknown; + signal?: AbortSignal; + cspNonce?: string; + renderId?: string; + runtimeId?: string; +} +export interface Input { + [x: PropertyKey]: unknown; +} +export interface TemplateInput extends Input { + $global?: $Global; +} export interface Template { _: unknown; @@ -115,7 +125,7 @@ export interface TemplateInstance { destroy(): void; } -export type RenderResult = Promise & +export type RenderResult = PromiseLike & AsyncIterable & { toReadable(): ReadableStream; }; diff --git a/packages/runtime-tags/src/dom.ts b/packages/runtime-tags/src/dom.ts index b0c2da595..95094aee5 100644 --- a/packages/runtime-tags/src/dom.ts +++ b/packages/runtime-tags/src/dom.ts @@ -30,7 +30,6 @@ export { registerRenderer, registerBoundSignal, registerSubscriber, - scopeLookup, } from "./dom/resume"; export { diff --git a/packages/runtime-tags/src/dom/compat.ts b/packages/runtime-tags/src/dom/compat.ts index ee1b8e963..32b753bd1 100644 --- a/packages/runtime-tags/src/dom/compat.ts +++ b/packages/runtime-tags/src/dom/compat.ts @@ -1,3 +1,8 @@ +import { + RENDERER_REGISTER_ID, + SET_SCOPE_REGISTER_ID, +} from "../common/compat-meta"; +import type { Scope } from "../dom"; import { patchConditionals } from "./control-flow"; import { prepare, queueEffect, runEffects } from "./queue"; import { @@ -5,13 +10,21 @@ import { createScopeWithRenderer, type Renderer, } from "./renderer"; -import { getRegisteredWithScope, register, scopeLookup } from "./resume"; +import { getRegisteredWithScope, register } from "./resume"; import { CLEAN, DIRTY, MARK } from "./signals"; +const classIdToScope = new Map(); export const compat = { - register, patchConditionals, queueEffect, + init() { + register(SET_SCOPE_REGISTER_ID, (scope: Scope & { m5c: string }) => { + classIdToScope.set(scope.m5c, scope); + }); + }, + registerRenderer(fn: any) { + register(RENDERER_REGISTER_ID, fn); + }, isOp(value: any) { return value === MARK || value === CLEAN || value === DIRTY; }, @@ -28,18 +41,24 @@ export const compat = { runComponentEffects(this: any) { runEffects(this.effects); }, - resolveRenderer(renderer: any) { - if (renderer && typeof renderer === "object") { - if (Array.isArray(renderer)) { - const [registerId, scopeId] = renderer; - const scope = scopeLookup[scopeId]; - return getRegisteredWithScope(registerId, scope); - } - - if (renderer.___clone) { - return renderer; - } + resolveRegistered( + value: any, + { + runtimeId, + componentIdPrefix, + }: { runtimeId: string; componentIdPrefix: string }, + ) { + if (Array.isArray(value) && typeof value[0] === "string") { + return getRegisteredWithScope( + value[0], + value.length === 2 && + (window as any)[runtimeId]?.[ + componentIdPrefix === "s" ? "_" : componentIdPrefix + ]?.___scopeLookup[value[1]], + ); } + + return value; }, createRenderer( setup: Renderer["___setup"], @@ -50,19 +69,19 @@ export const compat = { renderer.___clone = clone; return renderer; }, - render( - isHydrate: boolean, - out: any, - component: any, - renderer: Renderer, - input: any, - ) { + render(out: any, component: any, renderer: Renderer, input: any) { + let scope: Scope = component.scope; + + if (!scope) { + scope = classIdToScope.get(component.id)!; + if (scope) { + component.scope = scope; + classIdToScope.delete(component.id); + } + } + const args = renderer.___args || noop; let existing = false; - let scope: any = isHydrate - ? (component.scope = - scopeLookup[(out.global.componentIdToScopeId as any)[component.id]]) - : component.scope; component.effects = prepare(() => { if (!scope) { diff --git a/packages/runtime-tags/src/dom/resume.ts b/packages/runtime-tags/src/dom/resume.ts index 7bad316c9..933f83675 100644 --- a/packages/runtime-tags/src/dom/resume.ts +++ b/packages/runtime-tags/src/dom/resume.ts @@ -3,10 +3,156 @@ import type { Renderer } from "./renderer"; import { bindRenderer } from "./scope"; import type { IntersectionSignal, SignalOp, ValueSignal } from "./signals"; +interface Renders { + (renderId: string): Render | RenderData; + [renderId: string]: Render | RenderData; +} +interface RenderData { + // RuntimeID + ResumeID + i: string; + // Marked nodes to visit + v: Comment[]; + // Effect calls. + e?: (string | number)[]; + // Scopes + s?: ((ctx: object) => Record)[]; + // Indicates that the render is done. + d?: 1; + w(): void; +} type RegisteredFn = (scope: S) => void; const registeredValues: Record = {}; -const doc = document; + +class Render implements RenderData { + declare i: string; + declare v: Comment[]; + declare e?: (string | number)[]; + declare s?: ((ctx: object) => Record)[]; + private declare ___currentScopeId: number; + private declare ___data: RenderData; + private declare ___renders: Renders; + private declare ___runtimeId: string; + private declare ___renderId: string; + private ___scopeStack: number[] = []; + private ___scopeLookup: Record = {}; + private ___serializeContext: Record = { + _: registeredValues, + }; + constructor(renders: Renders, runtimeId: string, renderId: string) { + this.___renders = renders; + this.___runtimeId = runtimeId; + this.___renderId = renderId; + this.___data = renders[renderId] as RenderData; + this.___resume(); + } + w() { + this.___data.w(); + this.___resume(); + } + ___resume() { + const data = this.___data; + const serializeContext = this.___serializeContext; + const scopeLookup = this.___scopeLookup; + const visits = data.v; + + if (visits.length) { + const commentPrefix = data.i; + const commentPrefixLen = commentPrefix.length; + data.v = []; + + for (const visit of visits) { + const commentText = visit.data!; + const token = commentText[commentPrefixLen]; + const scopeId = parseInt(commentText.slice(commentPrefixLen + 1)); + const scope = (scopeLookup[scopeId] ??= {} as Scope); + const data = commentText.slice(commentText.indexOf(" ") + 1); + + if (token === ResumeSymbol.Node) { + scope[data] = visit.previousSibling; + } else if (token === ResumeSymbol.SectionStart) { + this.___scopeStack.push(this.___currentScopeId); + this.___currentScopeId = scopeId; + scope.___startNode = visit; + } else if (token === ResumeSymbol.SectionEnd) { + scope[data] = visit; + if (scopeId < this.___currentScopeId) { + const currScope = scopeLookup[this.___currentScopeId]; + const currParent = visit.parentNode!; + const startNode = currScope.___startNode as Node; + if (currParent !== startNode.parentNode) { + currParent.prepend(startNode); + } + currScope.___endNode = visit.previousSibling!; + this.___currentScopeId = this.___scopeStack.pop()!; + } + } else if (token === ResumeSymbol.SectionSingleNodesEnd) { + scope[ + MARKO_DEBUG ? data.slice(0, data.indexOf(" ")) : parseInt(data) + ] = visit; + // https://jsben.ch/dR7uk + const childScopeIds = JSON.parse( + "[" + data.slice(data.indexOf(" ") + 1) + "]", + ); + let curNode: ChildNode = visit; + for (let i = childScopeIds.length - 1; i >= 0; i--) { + const childScope = (scopeLookup[childScopeIds[i]] ??= {} as Scope); + // TODO: consider whether the single node optimization + // should only apply to elements which means could + // use previousElementSibling instead of a while loop + while ( + (curNode = curNode.previousSibling!).nodeType === + 8 /* Node.COMMENT_NODE */ + ); + // TODO: consider only setting ___startNode? + childScope.___startNode = childScope.___endNode = curNode; + } + } + } + } + + const serializedScopes = data.s; + if (serializedScopes) { + data.s = []; + + for (const deserializeScopes of serializedScopes) { + const scopes = deserializeScopes(serializeContext); + let { $global } = scopeLookup; + + if (!$global) { + scopeLookup.$global = $global = scopes.$ || {}; + $global.runtimeId = this.___runtimeId; + $global.renderId = this.___renderId; + } + + for (const scopeId in scopes) { + if (scopeId !== "$") { + const scope = scopes[scopeId]; + const prevScope = scopeLookup[scopeId]; + scope.$global = $global; + if (prevScope !== scope) { + scopeLookup[scopeId] = Object.assign(scope, prevScope) as Scope; + } + } + } + } + } + + const effects = data.e; + if (effects) { + data.e = []; + for (let i = 0; i < effects.length; i += 2) { + (registeredValues[effects[i + 1] as string] as RegisteredFn)( + scopeLookup[effects[i] as number], + ); + } + } + + if (data.d) { + delete this.___renders[this.___renderId]; + } + } +} export function register(id: string, obj: T): T { registeredValues[id] = obj; @@ -42,133 +188,47 @@ export function getRegisteredWithScope(id: string, scope?: Scope) { return val; } -export const scopeLookup = {} as Record; - export function init(runtimeId = ResumeSymbol.DefaultRuntimeId) { - const runtimeLength = runtimeId.length; - const resumeVar = runtimeId + ResumeSymbol.VarResume; - const initialHydration = (window as any)[resumeVar]; - if (MARKO_DEBUG) { if (!runtimeId.match(/^[_$a-z][_$a-z0-9]*$/i)) { throw new Error( `Invalid runtimeId: "${runtimeId}". The runtimeId must be a valid JavaScript identifier.`, ); } - - if (initialHydration && !Array.isArray(initialHydration)) { - throw new Error( - "Marko tried to initialize multiple times. It could be that there are multiple instances of Marko running on the page.", - ); - } } - const walker = doc.createTreeWalker(doc, 128 /** NodeFilter.SHOW_COMMENT */); - let currentScopeId: number; - let currentNode: Node & ChildNode; - // const scopeLookup: Record = {}; - const getScope = (id: number) => - scopeLookup[id] ?? (scopeLookup[id] = {} as Scope); - const stack: number[] = []; - const fakeArray = { push: resume }; - const serializeContext: Record = { _: registeredValues }; + const resumeRender = ((renderId: string) => + (resumeRender[renderId] = renders![renderId] = + new Render(renders!, runtimeId, renderId))) as Renders; + let renders: Renders | undefined; - if (initialHydration) { - for (let i = 0; i < initialHydration.length; i += 2) { - resume(initialHydration[i], initialHydration[i + 1]); - } + if ((window as any)[runtimeId] as Renders | undefined) { + setRenders((window as any)[runtimeId] as Renders); } else { - (window as any)[resumeVar] = fakeArray; + Object.defineProperty(window, runtimeId, { + configurable: true, + set: setRenders, + }); } - function resume( - scopesFn: (ctx: typeof serializeContext) => Record | null, - calls: Array, - ) { - // TODO: Can be refactored/removed when adding runtimeId and componentIdPrefix - /** - * Necessary for injecting content into an existing document (e.g. microframe) - */ - if (doc.readyState !== "loading") { - walker.currentNode = doc; - } - - const scopes = scopesFn(serializeContext); - if (scopes) { - scopeLookup.$global ||= scopes.$global || {}; - - /** - * Loop over all the new hydration scopes and see if a previous walk - * had to create a dummy scope to store Nodes of interest. - * If so merge them and set/replace the scope in the scopeLookup. - */ - for (const scopeIdAsString in scopes) { - if (scopeIdAsString === "$global") continue; - const scopeId = parseInt(scopeIdAsString); - const scope = scopes[scopeId]; - const storedScope = scopeLookup[scopeId]; - scope.$global = scopes.$global; - if (storedScope !== scope) { - scopeLookup[scopeId] = Object.assign(scope, storedScope) as Scope; - } + function setRenders(v: Renders) { + if (MARKO_DEBUG) { + if (renders) { + throw new Error( + "Marko tried to initialize multiple times. It could be that there are multiple instances of Marko running on the page.", + ); } } - while ((currentNode = walker.nextNode() as ChildNode)) { - const nodeValue = currentNode.nodeValue!; - if (nodeValue.startsWith(runtimeId)) { - const token = nodeValue[runtimeLength]; - const scopeId = parseInt(nodeValue.slice(runtimeLength + 1)); - const scope = getScope(scopeId); - const data = nodeValue.slice(nodeValue.indexOf(" ") + 1); - - if (token === ResumeSymbol.Node) { - scope[data] = currentNode.previousSibling; - } else if (token === ResumeSymbol.SectionStart) { - stack.push(currentScopeId); - currentScopeId = scopeId; - scope.___startNode = currentNode; - } else if (token === ResumeSymbol.SectionEnd) { - scope[data] = currentNode; - if (scopeId < currentScopeId) { - const currScope = scopeLookup[currentScopeId]; - const currParent = currentNode.parentNode!; - const startNode = currScope.___startNode as Node; - if (currParent !== startNode.parentNode) { - currParent.prepend(startNode); - } - currScope.___endNode = currentNode.previousSibling!; - currentScopeId = stack.pop()!; - } - } else if (token === ResumeSymbol.SectionSingleNodesEnd) { - scope[ - MARKO_DEBUG ? data.slice(0, data.indexOf(" ")) : parseInt(data) - ] = currentNode; - // https://jsben.ch/dR7uk - const childScopeIds = JSON.parse( - "[" + data.slice(data.indexOf(" ") + 1) + "]", - ); - for (let i = childScopeIds.length - 1; i >= 0; i--) { - const childScope = getScope(childScopeIds[i]); - // TODO: consider whether the single node optimization - // should only apply to elements which means could - // use previousElementSibling instead of a while loop - while ( - (currentNode = currentNode.previousSibling!).nodeType === - 8 /* Node.COMMENT_NODE */ - ); - // TODO: consider only setting ___startNode? - childScope.___startNode = childScope.___endNode = currentNode; - } - } - } + renders = v; + for (const renderId in v) { + resumeRender(renderId); } - for (let i = 0; i < calls.length; i += 2) { - (registeredValues[calls[i + 1] as string] as RegisteredFn)( - scopeLookup[calls[i] as number]!, - ); - } + Object.defineProperty(window, runtimeId, { + configurable: true, + value: resumeRender, + }); } } diff --git a/packages/runtime-tags/src/dom/signals.ts b/packages/runtime-tags/src/dom/signals.ts index e85246654..69c548ba8 100644 --- a/packages/runtime-tags/src/dom/signals.ts +++ b/packages/runtime-tags/src/dom/signals.ts @@ -129,7 +129,7 @@ export function intersection( }; } -const defaultGetOwnerScope = (scope: Scope) => scope._!; +const defaultGetOwnerScope = (scope: Scope) => scope._ as Scope; export function closure( ownerValueAccessor: Accessor | ((scope: Scope) => Accessor), @@ -289,9 +289,11 @@ export const inMany = ( } }; -let tagId = 0; -export function nextTagId() { - return "c" + tagId++; +const tagIdsByGlobal = new WeakMap(); +export function nextTagId({ $global }: Scope) { + const id = tagIdsByGlobal.get($global) || 0; + tagIdsByGlobal.set($global, id + 1); + return "c" + $global.runtimeId + $global.renderId + id.toString(36); } export function inChild(childAccessor: Accessor, signal: ValueSignal) { diff --git a/packages/runtime-tags/src/dom/template.ts b/packages/runtime-tags/src/dom/template.ts index 9b51b1d63..ca5f19178 100644 --- a/packages/runtime-tags/src/dom/template.ts +++ b/packages/runtime-tags/src/dom/template.ts @@ -1,3 +1,4 @@ +import { DEFAULT_RUNTIME_ID, DEFAULT_RENDER_ID } from "../common/meta"; import type { Template, Input, TemplateInstance, Scope } from "../common/types"; import { prepare, runEffects, runSync } from "./queue"; import { type Renderer, initRenderer } from "./renderer"; @@ -16,12 +17,26 @@ export class ClientTemplate implements Template { } mount( - templateInput: Input & { $global?: Record } = {}, + input: Input & { $global?: Record } = {}, reference: ParentNode & Node, position?: InsertPosition, ): TemplateInstance { let scope!: Scope, dom!: Node; - const { $global = {}, ...input } = templateInput; + let { $global } = input; + if ($global) { + ({ $global, ...input } = input); + $global = { + runtimeId: DEFAULT_RUNTIME_ID, + renderId: DEFAULT_RENDER_ID, + ...$global, + }; + } else { + $global = { + runtimeId: DEFAULT_RUNTIME_ID, + renderId: DEFAULT_RENDER_ID, + }; + } + const args = this._.___args; const effects = prepare(() => { scope = createScope($global); diff --git a/packages/runtime-tags/src/html.ts b/packages/runtime-tags/src/html.ts index f74d2fec3..be9f267e1 100644 --- a/packages/runtime-tags/src/html.ts +++ b/packages/runtime-tags/src/html.ts @@ -6,12 +6,10 @@ export { dynamicTagInput, dynamicTagArgs, createRenderer, - patchDynamicTag, } from "./html/dynamic-tag"; export { write, - maybeFlush, fork, tryPlaceholder, tryCatch, @@ -23,14 +21,13 @@ export { markResumeScopeStart, markResumeControlEnd, markResumeControlSingleNodeEnd, - createRenderFn, peekNextScope, ensureScopeWithId, getScopeById, getStreamData, register, - serializerRegister, - getRegistryInfo, } from "./html/writer"; export { createTemplate } from "./html/template"; + +export { compat } from "./html/compat"; diff --git a/packages/runtime-tags/src/html/attrs.ts b/packages/runtime-tags/src/html/attrs.ts index bb99bee6c..5ff45dc51 100644 --- a/packages/runtime-tags/src/html/attrs.ts +++ b/packages/runtime-tags/src/html/attrs.ts @@ -85,7 +85,7 @@ function attrAssignment(val: string) { } const unsafeAttrChars = /["'>\s]/g; -function escapeAttrValue(str: string) { +export function escapeAttrValue(str: string) { if (unsafeAttrChars.test(str)) { const c = str[unsafeAttrChars.lastIndex - 1]; unsafeAttrChars.lastIndex = 0; diff --git a/packages/runtime-tags/src/html/compat.ts b/packages/runtime-tags/src/html/compat.ts new file mode 100644 index 000000000..af4e8f0d2 --- /dev/null +++ b/packages/runtime-tags/src/html/compat.ts @@ -0,0 +1,112 @@ +import { + RENDERER_REGISTER_ID, + SET_SCOPE_REGISTER_ID, +} from "../common/compat-meta"; +import { DEFAULT_RUNTIME_ID, DEFAULT_RENDER_ID } from "../common/meta"; +import type { Renderer, Scope } from "../common/types"; +import { patchDynamicTag } from "./dynamic-tag"; +import { getRegistered, register } from "./serializer"; +import { + Chunk, + Boundary, + State, + prepareChunk, + fork, + getChunk, + getScopeId, + nextScopeId, + peekNextScopeId, + write, + writeEffect, + writeScope, + writeScript, +} from "./writer"; + +const K_TAGS_API_STATE = Symbol(); +const COMPAT_REGISTRY = new WeakMap< + WeakKey, + [registryId: string, scopeId: unknown] +>(); + +export const compat = { + fork, + write, + writeScript, + nextScopeId, + patchDynamicTag, + writeSetScopeForComponent(m5c: string) { + const scopeId = nextScopeId(); + writeScope(scopeId, { m5c }); + writeEffect(scopeId, SET_SCOPE_REGISTER_ID); + }, + toJSON(this: WeakKey) { + let compatRegistered = COMPAT_REGISTRY.get(this); + if (!compatRegistered) { + const registered = getRegistered(this); + if (registered) { + const scopeId = getScopeId(registered.scope as Scope); + if (scopeId !== undefined) { + writeScope(scopeId, {}); + } + COMPAT_REGISTRY.set( + this, + (compatRegistered = [registered.id, scopeId]), + ); + } + } + + return compatRegistered; + }, + render( + renderer: Renderer, + willRerender: boolean, + classAPIOut: any, + component: any, + input: any, + ) { + const $global = classAPIOut.global; + let state: State | undefined = ($global[K_TAGS_API_STATE] ||= + getChunk()?.boundary.state); + if (!state) { + $global.runtimeId ||= DEFAULT_RUNTIME_ID; + $global.renderId ||= $global.componentIdPrefix || DEFAULT_RENDER_ID; + $global[K_TAGS_API_STATE] = state = new State($global); + } + + const boundary = new Boundary(state); + let head = new Chunk(boundary, null); + head.render(() => { + if (willRerender) { + const scopeId = peekNextScopeId(); + writeScope(scopeId, { m5c: component.id }); + writeEffect(scopeId, SET_SCOPE_REGISTER_ID); + } + + renderer(input); + }); + + const asyncOut = classAPIOut.beginAsync(); + (boundary.onNext = () => { + if (boundary.done) { + if (boundary.signal.aborted) { + asyncOut.error(boundary.signal.reason); + } else { + queueMicrotask(() => { + const { scripts, html } = (head = prepareChunk(head)); + asyncOut.script(scripts); + asyncOut.write(html); + asyncOut.end(); + head.html = head.scripts = ""; + }); + } + } + })(); + }, + registerRenderer(renderer: any, id: string) { + return register( + RENDERER_REGISTER_ID, + renderer, + register(id, () => {}), + ); + }, +}; diff --git a/packages/runtime-tags/src/html/dynamic-tag.ts b/packages/runtime-tags/src/html/dynamic-tag.ts index bec5205ee..86e35936b 100644 --- a/packages/runtime-tags/src/html/dynamic-tag.ts +++ b/packages/runtime-tags/src/html/dynamic-tag.ts @@ -99,7 +99,10 @@ export function dynamicTagArgs( let getDynamicRenderer = ( tag: unknown | string | Renderer | RenderBodyObject | Template, -) => (tag as Template)._ || (tag as RenderBodyObject).renderBody || tag; +) => + (tag as { _?: Renderer })._ || + (tag as { renderBody?: Renderer }).renderBody || + (tag as Renderer); export let createRenderer = (fn: Renderer) => fn; export function patchDynamicTag( diff --git a/packages/runtime-tags/src/html/inlined-runtimes.ts b/packages/runtime-tags/src/html/inlined-runtimes.ts new file mode 100644 index 000000000..6ffeab6eb --- /dev/null +++ b/packages/runtime-tags/src/html/inlined-runtimes.ts @@ -0,0 +1,106 @@ +export const WALKER_RUNTIME_CODE = MARKO_DEBUG + ? `((runtimeId) => +(self[runtimeId] = + self[runtimeId] || + ((renderId) => { + let id, + markers = {}, + visits = [], + doc = document, + walker = doc.createTreeWalker( + doc, + 129, + ) /* NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT */, + op = (self[runtimeId][renderId] = { + i: (renderId = runtimeId + renderId), + d: doc, + l: markers, + v: visits, + x() {}, + w(node) { + while ((node = walker.nextNode())) { + this.x( + (op = + (op = node.data) && + !op.indexOf(renderId) && + ((markers[(id = op.slice(prefix + 1))] = node), op[prefix])), + id, + node, + ); + + if (op > "#") { + visits.push(node); + } + } + }, + }), + prefix = renderId.length; + })))` + : `(e=>self[e]=self[e]||(l=>{let t,d={},f=[],s=document,a=s.createTreeWalker(s,129),r=self[e][l]={i:l=e+l,d:s,l:d,v:f,x(){},w(e){for(;e=a.nextNode();)this.x(r=(r=e.data)&&!r.indexOf(l)&&(d[t=r.slice(x+1)]=e,r[x]),t,e),r>"#"&&f.push(e)}},x=l.length}))`; +export const REORDER_RUNTIME_CODE = MARKO_DEBUG + ? `((runtime) => { +let insertOne, + placeholder, + nextSibling, + previousSibling, + placeholders = {}, + replace = (marker, container) => { + marker.replaceWith(...container.childNodes); + container.remove(); + }; +runtime.d.head.append( + runtime.d.querySelector("style[" + runtime.i + "]") || "", +); +runtime.j = {}; +runtime.x = (op, id, node, start, placeholderCallback) => { + // "node" and "end" are all closed over and can't be repurposed. "start" is too but only in the new placeholder case + + if (op == "#") { + (placeholders[id] = placeholder).i++; + } else if (node == nextSibling) { + insertOne(); + } + + if (node.tagName == "T" && (id = node.getAttribute(runtime.i))) { + start = runtime.l["^" + id]; + + if (start) { + placeholder = placeholders[id] = { + i: 0, + c(end = runtime.l[id] || previousSibling || node) { + while (end.parentNode !== start.parentNode) { + end = end.parentNode; + } + + for ( + ; + end != nextSibling; + (nextSibling = start.nextSibling).remove() + ); + replace(start, node); + }, + }; + } else { + insertOne = () => { + previousSibling = node.previousSibling; + replace(runtime.l[id], node); + if (!--start.i) { + start.c(); + } + }; + + // repurpose "start" to hold this placeholder + start = placeholder = placeholders[id]; + nextSibling = node.nextElementSibling || insertOne(); + } + + // repurpose "op" for callbacks ...carefully + placeholderCallback = placeholder.c; + (op = runtime.j[id]) && + (placeholder.c = () => placeholderCallback() + op()); + + if (node.attributes.c) placeholder.c(); + } +}; +})` + : `(e=>{let t,i,r,l,o={},a=(e,t)=>{e.replaceWith(...t.childNodes),t.remove()};e.d.head.append(e.d.querySelector("style["+e.i+"]")||""),e.j={},e.x=(d,n,c,p,b)=>{"#"==d?(o[n]=i).i++:c==r&&t(),"T"==c.tagName&&(n=c.getAttribute(e.i))&&((p=e.l["^"+n])?i=o[n]={i:0,c(t=e.l[n]||l||c){for(;t.parentNode!==p.parentNode;)t=t.parentNode;for(;t!=r;(r=p.nextSibling).remove());a(p,c)}}:(t=()=>{l=c.previousSibling,a(e.l[n],c),--p.i||p.c()},p=i=o[n],r=c.nextElementSibling||t()),b=i.c,(d=e.j[n])&&(i.c=()=>b()+d()),c.attributes.c&&i.c())}})`; diff --git a/packages/runtime-tags/src/html/reorder-runtime.ts b/packages/runtime-tags/src/html/reorder-runtime.ts deleted file mode 100644 index 172667333..000000000 --- a/packages/runtime-tags/src/html/reorder-runtime.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* tslint:disable */ - -import type { CommentWalker } from "../common/types"; - -export default function ( - id: string, - doc: Document, - walker: TreeWalker, - node: Comment, - replacementNode: Node, - targetParent: ParentNode & Node, - targetNode: Node | null | undefined, - refNode: Node | null | undefined, - nextNode: Node | null | undefined, - runtimePrefix: string, -) { - runtimePrefix = "RUNTIME_ID$"; - id = runtimePrefix + id; - doc = document; - walker = - (doc as any)[runtimePrefix + "w"] || - ((doc as any)[runtimePrefix + "w"] = doc.createTreeWalker( - doc, - 128 /** NodeFilter.SHOW_COMMENT */, - ) as CommentWalker); - while ((node = walker.nextNode() as Comment)) { - if (node.data.indexOf(runtimePrefix) === 0) { - (walker as any)[node.data] = node; - } - } - - replacementNode = doc.getElementById(id)!; - targetNode = (walker as any)[id]; - targetParent = targetNode!.parentNode!; - - while ((refNode = replacementNode.firstChild)) { - targetParent.insertBefore(refNode, targetNode!); - } - - nextNode = replacementNode.parentNode!; - nextNode.removeChild(replacementNode.nextSibling!); - nextNode.removeChild(replacementNode); - - refNode = (walker as any)[id + "/"]; - - while ( - targetNode && - ((nextNode = targetNode!.nextSibling), - targetParent.removeChild(targetNode!) !== refNode) - ) { - targetNode = nextNode; - } -} diff --git a/packages/runtime-tags/src/html/serializer.ts b/packages/runtime-tags/src/html/serializer.ts index df3608947..f65996ca0 100644 --- a/packages/runtime-tags/src/html/serializer.ts +++ b/packages/runtime-tags/src/html/serializer.ts @@ -1,3 +1,5 @@ +import type { Boundary } from "./writer"; + const { hasOwnProperty } = {}; const Generator = (function* () {})().constructor; const AsyncGenerator = (async function* () {})().constructor; @@ -15,11 +17,6 @@ type TypedArray = | Float64Array; const REGISTRY = new WeakMap(); -const REF_START_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$"; // Avoids chars that cannot start a property name and reserves _ for user refs. -const REF_START_CHARS_LEN = REF_START_CHARS.length; -const REF_CHARS = - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$_"; -const REF_CHARS_LEN = REF_CHARS.length; const KNOWN_SYMBOLS = (() => { const KNOWN_SYMBOLS = new Map(); for (const name of Object.getOwnPropertyNames(Symbol)) { @@ -267,34 +264,11 @@ const KNOWN_OBJECTS = new Map([ class State { ids = 0; flush = 0; + flushed = false; buf = [] as string[]; refs = new WeakMap(); assigned = new Set(); - promises: Promises | null = null; -} - -class Promises { - public remaining = 0; - public next: Promise | null = null; - #resolve: (() => void) | null = null; - start() { - if (++this.remaining === 1) { - this.#next(); - } - } - end() { - this.#resolve?.(); - - if (--this.remaining > 0) { - this.#next(); - } else { - this.#resolve = null; - this.next = null; - } - } - #next() { - this.next = new Promise((resolve) => (this.#resolve = resolve)); - } + boundary: Boundary | undefined = undefined; } class Reference { @@ -302,7 +276,7 @@ class Reference { public assigns = ""; constructor( public parent: Reference | null, - public accessor: string | number | null, + public accessor: string | null, public flush: number, public pos: number | null = null, public id: string | null = null, @@ -317,36 +291,18 @@ class Reference { export class Serializer { #state = new State(); - get pending() { - return this.#state.buf.length - ? this.#consumePending() - : this.#state.promises?.next?.then(() => this.#consumePending()); - } - stringify(val: unknown) { + stringify(val: unknown, boundary: Boundary) { try { + this.#state.flushed = false; + this.#state.boundary = boundary; return writeRoot(this.#state, val); } finally { this.#flush(); } } - #consumePending() { - const state = this.#state; - let result = state.buf[0]; - - for (let i = 1; i < state.buf.length; i++) { - result += state.buf[i]; - } - - if (state.assigned.size) { - for (const valueRef of state.assigned) { - result += ";" + valueRef.assigns + (valueRef.init || valueRef.id); - valueRef.init = ""; - } - } - - this.#flush(); - return "_=>{" + result + "}"; + get flushed() { + return this.#state.flushed; } #flush() { @@ -380,41 +336,60 @@ export function stringify(val: unknown) { } function writeRoot(state: State, root: unknown) { + const { buf, assigned } = state; + const hadBuf = buf.length !== 0; + let result = ""; + if (hadBuf) { + buf.push(","); + } + if (writeProp(state, root, null, "")) { const rootRef = state.refs.get(root as object); - const { buf, assigned } = state; - if (rootRef) ensureId(state, rootRef); - let returnsRoot = true; - let result = buf[0]; - - for (let i = 1; i < buf.length; i++) { - result += buf[i]; + if (rootRef) { + ensureId(state, rootRef); } if (assigned.size) { if (assigned.delete(rootRef!)) { assigned.add(rootRef!); + writeAssigned(state); } else { - returnsRoot = false; - } - - for (const valueRef of assigned) { - result += "," + valueRef.assigns + (valueRef.init || valueRef.id); - valueRef.init = ""; + writeAssigned(state); + buf.push("," + rootRef!.id!); } } - return "_=>(" + (returnsRoot ? result : result + "," + rootRef!.id!) + ")"; + result = "("; + buf.push(")"); + } else { + if (hadBuf) { + buf.pop(); + writeAssigned(state); + } + + result = "{"; + buf.push("}"); } - return "_=>{}"; + for (const chunk of buf) { + result += chunk; + } + + return "_=>" + result; +} + +function writeAssigned(state: State) { + for (const valueRef of state.assigned) { + state.buf.push("," + valueRef.assigns + (valueRef.init || valueRef.id)); + valueRef.init = ""; + } } function writeProp( state: State, val: unknown, parent: Reference | null, - accessor: string | number, + accessor: string, ): boolean { switch (typeof val) { case "string": @@ -448,7 +423,7 @@ function writeReferenceOr( write: (state: State, val: any, ref: Reference) => boolean, val: WeakKey, parent: Reference | null, - accessor: string | number, + accessor: string, ) { let ref = state.refs.get(val); if (ref) { @@ -488,7 +463,7 @@ function writeRegistered( state: State, val: WeakKey, parent: Reference | null, - accessor: string | number, + accessor: string, { access, scope }: Registered, ) { if (scope) { @@ -549,7 +524,7 @@ function writeFunction( // eslint-disable-next-line @typescript-eslint/ban-types val: Function, parent: Reference | null, - accessor: string | number, + accessor: string, ) { const wellKnownFunction = KNOWN_FUNCTIONS.get(val); if (wellKnownFunction) { @@ -564,7 +539,7 @@ function writeSymbol( state: State, val: symbol, parent: Reference | null, - accessor: string | number, + accessor: string, ) { const wellKnownSymbol = KNOWN_SYMBOLS.get(val); if (wellKnownSymbol) { @@ -599,7 +574,7 @@ function writeObject( state: State, val: object | null, parent: Reference | null, - accessor: string | number, + accessor: string, ) { if (val === null) return writeNull(state); @@ -689,11 +664,11 @@ function writePlainObject(state: State, val: object, ref: Reference) { function writeArray(state: State, val: unknown[], ref: Reference) { state.buf.push("["); - writeProp(state, val[0], ref, 0); + writeProp(state, val[0], ref, "0"); for (let i = 1; i < val.length; i++) { state.buf.push(","); - writeProp(state, val[i], ref, i); + writeProp(state, val[i], ref, "" + i); } state.buf.push("]"); @@ -711,14 +686,17 @@ function writeRegExp(state: State, val: RegExp) { } function writePromise(state: State, val: Promise, ref: Reference) { + const { boundary } = state; + if (!boundary) return false; + const pId = nextRefAccess(state); const pRef = new Reference(ref, null, state.flush, null, pId); state.buf.push("new Promise((f,r)=>" + pId + "={f,r})"); val.then( - (v) => writeAsyncCall(state, pRef, "f", v, pId), - (v) => writeAsyncCall(state, pRef, "r", v, pId), + (v) => writeAsyncCall(state, boundary, pRef, "f", v, pId), + (v) => writeAsyncCall(state, boundary, pRef, "r", v, pId), ); - (state.promises ||= new Promises()).start(); + boundary.startAsync(); return true; } @@ -1041,33 +1019,33 @@ function writeReadableStream( val: ReadableStream, ref: Reference, ) { - if (val.locked) return false; + const { boundary } = state; + if (!boundary || val.locked) return false; + const reader = val.getReader(); const iterId = nextRefAccess(state); const iterRef = new Reference(ref, null, state.flush, null, iterId); + const onFulfilled = ({ value, done }: ReadableStreamReadResult) => { + if (done) { + writeAsyncCall(state, boundary, iterRef, "r", value); + } else if (!boundary.signal.aborted) { + reader.read().then(onFulfilled, onRejected); + boundary.startAsync(); + writeAsyncCall(state, boundary, iterRef, "f", value); + } + }; + const onRejected = (reason: unknown) => { + writeAsyncCall(state, boundary, iterRef, "j", reason); + }; + state.buf.push( "new ReadableStream({start(c){(async(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()]))=>{for(i of a)v=await i,i==l?c.close():c.enqueue(v)})(" + iterId + "={}).catch(e=>c.error(e))}})", ); - const reader = val.getReader(); - const promises = (state.promises ||= new Promises()); - promises.start(); + reader.read().then(onFulfilled, onRejected); - - function onFulfilled({ value, done }: ReadableStreamReadResult) { - if (done) { - writeAsyncCall(state, iterRef, "r", value); - } else { - promises.start(); - reader.read().then(onFulfilled, onRejected); - writeAsyncCall(state, iterRef, "f", value); - } - } - - function onRejected(reason: unknown) { - writeAsyncCall(state, iterRef, "j", reason); - } + boundary.startAsync(); return true; } @@ -1104,30 +1082,31 @@ function writeAsyncGenerator( iter: AsyncGenerator, ref: Reference, ) { + const { boundary } = state; + if (!boundary) return false; + const iterId = nextRefAccess(state); const iterRef = new Reference(ref, null, state.flush, null, iterId); + const onFulfilled = ({ value, done }: IteratorResult) => { + if (done) { + writeAsyncCall(state, boundary, iterRef, "r", value); + } else if (!boundary.signal.aborted) { + iter.next().then(onFulfilled, onRejected); + boundary.startAsync(); + writeAsyncCall(state, boundary, iterRef, "f", value); + } + }; + const onRejected = (reason: unknown) => { + writeAsyncCall(state, boundary, iterRef, "j", reason); + }; + state.buf.push( "(async function*(_,f,v,l,i,p=a=>l=new Promise((r,j)=>{f=_.r=r;_.j=j}),a=((_.f=v=>{f(v);a.push(p())}),[p()])){for(i of a)v=await i,i!=l&&(yield v);return v})(" + iterId + "={})", ); - const promises = (state.promises ||= new Promises()); - promises.start(); iter.next().then(onFulfilled, onRejected); - - function onFulfilled({ value, done }: IteratorResult) { - if (done) { - writeAsyncCall(state, iterRef, "r", value); - } else { - promises.start(); - iter.next().then(onFulfilled, onRejected); - writeAsyncCall(state, iterRef, "f", value); - } - } - - function onRejected(reason: unknown) { - writeAsyncCall(state, iterRef, "j", reason); - } + boundary.startAsync(); return true; } @@ -1189,14 +1168,17 @@ function writeObjectProps(state: State, val: object, ref: Reference) { function writeAsyncCall( state: State, + boundary: Boundary, ref: Reference, method: string, value: unknown, preferredValueId: string | null = null, ) { - state.promises!.end(); + if (boundary.signal.aborted) return; + + state.flushed = true; const valueStartIndex = state.buf.push( - (state.buf.length === 0 ? "" : ";") + ref.id + "." + method + "(", + (state.buf.length === 0 ? "" : ",") + ref.id + "." + method + "(", ); if (writeProp(state, value, ref, "")) { const valueRef = state.refs.get(value as object); @@ -1207,6 +1189,7 @@ function writeAsyncCall( } } state.buf.push(")"); + boundary.endAsync(); } function isCircular( @@ -1223,33 +1206,41 @@ function isCircular( } function toObjectKey(name: string) { - const invalidKeyStart = getInvalidObjectKeyPos(name); - return invalidKeyStart === -1 ? name : quote(name, invalidKeyStart); -} - -function toAccess(accessor: string | number) { - return typeof accessor === "number" || accessor[0] === '"' - ? "[" + accessor + "]" - : "." + accessor; -} - -function getInvalidObjectKeyPos(name: string) { - for (let i = 0; i < name.length; i++) { - const char = name[i]; - if ( - !( - (char >= "a" && char <= "z") || - (char >= "A" && char <= "Z") || - (char >= "0" && char <= "9") || - char === "$" || - char === "_" - ) - ) { - return i; - } + if (name === "") { + return '""'; } - return -1; + const startChar = name[0]; + if (isDigit(startChar)) { + if (startChar === "0") { + if (name !== "0") { + return quote(name, 1); + } + } else { + for (let i = 1; i < name.length; i++) { + if (!isDigit(name[i])) { + return quote(name, i); + } + } + } + } else if (isWord(startChar)) { + for (let i = 1; i < name.length; i++) { + if (!isWordOrDigit(name[i])) { + return quote(name, i); + } + } + } else { + return quote(name, 0); + } + + return name; +} + +function toAccess(accessor: string) { + const start = accessor[0]; + return start === '"' || (start >= "0" && start <= "9") + ? "[" + accessor + "]" + : "." + accessor; } // Creates a JavaScript double quoted string and escapes all characters not listed as DoubleStringCharacters on @@ -1336,15 +1327,19 @@ function assignId(state: State, ref: Reference) { } function nextRefAccess(state: State) { + const encodeChars = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789"; + const encodeLen = encodeChars.length; + const encodeStartLen = encodeLen - 11; // Avoids chars that cannot start a property name and _ (reserved). let index = state.ids++; - let mod = index % REF_START_CHARS_LEN; - let id = "_." + REF_START_CHARS[mod]; - index = (index - mod) / REF_START_CHARS_LEN; + let mod = index % encodeStartLen; + let id = "_." + encodeChars[mod]; + index = (index - mod) / encodeStartLen; while (index > 0) { - mod = index % REF_CHARS_LEN; - id += REF_CHARS[mod]; - index = (index - mod) / REF_CHARS_LEN; + mod = index % encodeLen; + id += encodeChars[mod]; + index = (index - mod) / encodeLen; } return id; @@ -1386,3 +1381,20 @@ function hasOnlyZeros(typedArray: TypedArray) { return true; } + +function isWordOrDigit(char: string) { + return isWord(char) || isDigit(char); +} + +function isDigit(char: string) { + return char >= "0" && char <= "9"; +} + +function isWord(char: string) { + return ( + (char >= "a" && char <= "z") || + (char >= "A" && char <= "Z") || + char === "_" || + char === "$" + ); +} diff --git a/packages/runtime-tags/src/html/template.ts b/packages/runtime-tags/src/html/template.ts index eb3331ef4..fb11ed66c 100644 --- a/packages/runtime-tags/src/html/template.ts +++ b/packages/runtime-tags/src/html/template.ts @@ -1,55 +1,168 @@ +import { DEFAULT_RUNTIME_ID, DEFAULT_RENDER_ID } from "../common/meta"; import type { - Context, Template, Input, + TemplateInput, TemplateInstance, Renderer, RenderResult, } from "../common/types"; -import { type Writable, createRenderFn, register } from "./writer"; +import { + register, + queueTick, + offTick, + prepareChunk, + Boundary, + Chunk, + State, + flushChunk, +} from "./writer"; export const createTemplate = (renderer: Renderer, id = "") => register(new ServerTemplate(renderer), id); -interface Deferred { - promise: Promise; - resolve(value: T): void; - reject(reason?: any): void; -} - -function deferred(): Deferred { - let resolve!: (value: T) => void; - let reject!: (reason?: any) => void; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - return { promise, resolve, reject }; -} - -async function stringFromAsync( - iterable: AsyncIterable, -): Promise { - let str = ""; - for await (const part of iterable) { - str += part; +export class ServerTemplate implements Template { + public _: (input: Input) => void; + constructor(renderer: (input: Input) => void) { + this._ = renderer; + } + + render(input: TemplateInput = {}) { + let { $global } = input; + if ($global) { + ({ $global, ...input } = input); + $global = { + runtimeId: DEFAULT_RUNTIME_ID, + renderId: DEFAULT_RENDER_ID, + ...$global, + }; + } else { + $global = { + runtimeId: DEFAULT_RUNTIME_ID, + renderId: DEFAULT_RENDER_ID, + }; + } + + const head = new Chunk( + new Boundary(new State($global as State["$global"]), $global.signal), + null, + ); + head.render(this._, input); + return new ServerRenderResult(head); + } + + mount(): TemplateInstance { + throw new Error( + `mount() is not implemented for the HTML compilation of a Marko template`, + ); } - return str; } class ServerRenderResult implements RenderResult { - #iterable: AsyncIterableIterator; - #promise: Promise | undefined; - - constructor(iterable: AsyncIterableIterator) { - this.#iterable = iterable; + #head: Chunk | null; + #cachedPromise: Promise | null = null; + constructor(head: Chunk) { + this.#head = head; } [Symbol.asyncIterator]() { - return this.#iterable; + type Iter = { value: string; done: boolean }; + let resolve: (value: Iter) => void; + let reject: (reason: unknown) => void; + let value = ""; + let done = false; + let aborted = false; + let reason: unknown; + this.#read( + (html) => { + value += html; + if (resolve) { + resolve({ value, done }); + value = ""; + } + }, + (err) => { + aborted = true; + reason = err; + + if (reject) { + reject(err); + } + }, + () => { + done = true; + if (resolve) { + resolve({ value, done: !value }); + } + }, + ); + + return { + next() { + if (value) { + const result = { value, done: false }; + value = ""; + return Promise.resolve(result); + } + + return done + ? Promise.resolve({ value, done }) + : aborted + ? Promise.reject(reason) + : new Promise(exec); + }, + }; + + function exec(_resolve: typeof resolve, _reject: typeof reject) { + resolve = _resolve; + reject = _reject; + } } - [Symbol.toStringTag] = "RenderResult"; + pipe(stream: { + write: (chunk: string) => void; + end: () => void; + flush?: () => void; + emit?: (eventName: string, ...args: any[]) => any; + }) { + this.#read( + (html) => { + stream.write(html); + }, + (err) => { + const socket = ("socket" in stream && stream.socket) as Record< + PropertyKey, + unknown + >; + if (typeof socket.destroySoon === "function") { + socket.destroySoon(); + } + + stream.emit?.("error", err); + }, + () => { + stream.end(); + }, + ); + } + + toReadable() { + return new ReadableStream({ + start: (ctrl) => { + this.#read( + (html) => { + ctrl.enqueue(html); + }, + (err) => { + ctrl.error(err); + }, + () => { + ctrl.close(); + }, + ); + }, + }); + } then( onfulfilled?: @@ -61,107 +174,94 @@ class ServerRenderResult implements RenderResult { | undefined | null, ): Promise { - return (this.#promise ||= stringFromAsync(this.#iterable)).then( - onfulfilled, - onrejected, - ); + return this.#promise().then(onfulfilled, onrejected); } catch( onrejected?: - | ((reason: any) => TResult | PromiseLike) + | ((reason: unknown) => TResult | PromiseLike) | undefined | null, ): Promise { - return this.then(undefined, onrejected); + return this.#promise().catch(onrejected); } finally(onfinally?: (() => void) | undefined | null): Promise { - return this.then(undefined, undefined).finally(onfinally); + return this.#promise().finally(onfinally); } - toReadable() { - return new ReadableStream({ - start: async (controller) => { - try { - for await (const chunk of this.#iterable) { - if (chunk) { - controller.enqueue(chunk); - } + #promise() { + return (this.#cachedPromise ||= new Promise((resolve, reject) => { + let head = this.#head!; + this.#head = null; + + if (!head) { + return reject(new Error("Cannot read from a consumed render result")); + } + + const { boundary } = head; + (boundary.onNext = () => { + if (boundary.done) { + if (boundary.signal.aborted) { + reject(boundary.signal.reason); + } else { + head = prepareChunk(head); + if (boundary.done) resolve(flushChunk(head)); } - controller.close(); - } catch (err) { - controller.error(err); } - }, - }); - } -} - -export class ServerTemplate implements Template { - #writeTo: (writable: Writable, input?: Input, context?: Context) => void; - - public _: Renderer; - - constructor(renderer: Renderer) { - this._ = renderer; - this.#writeTo = createRenderFn(renderer); - } - - mount(): TemplateInstance { - throw new Error( - `mount() is not implemented for the HTML compilation of a Marko template`, - ); - } - - render(templateInput: Input = {}): RenderResult { - const { $global, ...input } = templateInput; - let buffer = ""; - let done = false; - let pending = deferred>(); - - this.#writeTo( - { - write(data: string) { - buffer += data; - }, - flush() { - pending.resolve({ - value: buffer, - done: false, - }); - buffer = ""; - pending = deferred(); - }, - emit(name, error: Error) { - if (name === "error") { - pending.reject(error); - } - }, - end() { - done = true; - pending.resolve({ - value: "", - done, - }); - }, - }, - input, - $global as Context, - ); - - return new ServerRenderResult({ - [Symbol.asyncIterator]() { - return this; - }, - async next() { - if (buffer || done) { - const value = buffer; - buffer = ""; - return { value, done }; - } - return pending.promise; - }, + })(); + })); + } + + #read( + onWrite: (html: string) => void, + onAbort: (err: unknown) => void, + onClose: () => void, + ) { + let tick = true; + let head = this.#head!; + this.#head = null; + + if (!head) { + onAbort(new Error("Cannot read from a consumed render result")); + return; + } + + const { boundary } = head; + const onNext = (boundary.onNext = (write?: boolean) => { + if (write || boundary.done) { + if (boundary.signal.aborted) { + if (!tick) offTick(onNext); + onAbort(boundary.signal.reason); + return; + } + + head = prepareChunk(head); + } + + if (write || boundary.done) { + const html = flushChunk(head); + if (html) onWrite(html); + if (boundary.done) { + if (!tick) offTick(onNext); + onClose(); + } else { + tick = true; + } + } else if (tick) { + tick = false; + queueTick(onNext); + } }); + + onNext(); + } + + toString() { + const head = this.#head; + if (!head) throw new Error("Cannot read from a consumed render result"); + if (head.next) throw new Error("Cannot fork in sync mode"); + this.#head = null; + return flushChunk(prepareChunk(head)); } } diff --git a/packages/runtime-tags/src/html/writer.ts b/packages/runtime-tags/src/html/writer.ts index c429d9358..b7e4454d7 100644 --- a/packages/runtime-tags/src/html/writer.ts +++ b/packages/runtime-tags/src/html/writer.ts @@ -1,488 +1,55 @@ -import { type Accessor, type Renderer, ResumeSymbol } from "../common/types"; -import reorderRuntime from "./reorder-runtime"; -import { - Serializer, - getRegistered, - register as serializerRegister, -} from "./serializer"; +/* eslint-disable @typescript-eslint/no-this-alias */ +import { type Accessor } from "../common/types"; +import { escapeAttrValue } from "./attrs"; +import { REORDER_RUNTIME_CODE, WALKER_RUNTIME_CODE } from "./inlined-runtimes"; +import { Serializer, register as serializerRegister } from "./serializer"; -export { serializerRegister }; +type PartialScope = Record; +type ScopeInternals = PartialScope & { + [K_SCOPE_ID]?: number; +}; -const kScopeId = Symbol("scopeId"); -const runtimeId = ResumeSymbol.DefaultRuntimeId; -const reorderRuntimeString = String(reorderRuntime).replace( - "RUNTIME_ID", - runtimeId, -); +let $chunk: Chunk; +const NOOP = () => {}; +const K_SCOPE_ID = Symbol("Scope ID"); -type PartialScope = Record | unknown[]; - -export interface Writable { - write(data: string): void; - end(): void; - flush?(): void; - emit(name: string, data: unknown): void; +enum Mark { + Placeholder = "!^", + PlaceholderEnd = "!", + ReorderMarker = "#", + SectionStart = "[", + SectionEnd = "]", + SectionSingleNodesEnd = "|", + Node = "*", } -interface Buffer { - stream?: Writable; - pending: boolean; - flushed: boolean; - disabled: boolean; - next: Buffer | null; - prev: Buffer | null; - content: string; - calls: string; - scopes: Record | null; - onAsync?: (complete: boolean, isPlaceholder?: boolean) => void; - onReject?: (err: Error) => void; +enum RuntimeKey { + Walk = ".w", + Scopes = ".s", + Effects = ".e", + Scripts = ".j", + Done = ".d", } -interface StreamData { - scopeId: number; - tagId: number; - placeholderId: number; - scopeLookup: Map; - runtimeFlushed: boolean; - global: Record; - serializer?: Serializer; +export function getChunk(): Chunk | undefined { + return $chunk; } -let $_buffer: Buffer | null = null; -let $_streamData: StreamData | null = null; - -export function getStreamData() { - return $_streamData; +export function getScopeId(scope: unknown): number | undefined { + return (scope as ScopeInternals)[K_SCOPE_ID]; } -export function createRenderFn(renderer: Renderer) { - type Input = Parameters[0]; - return ( - stream: Writable, - input: Input = {}, - $global?: Record, - streamState: Partial = {}, - ) => { - let remainingChildren = 1; - - const originalBuffer = $_buffer; - const originalStreamState = $_streamData; - const reject = (err: Error) => { - stream.emit("error", err); - }; - const async = (complete: boolean) => { - remainingChildren += complete ? -1 : 1; - if (!remainingChildren) { - setImmediate(() => stream.end()); - } - }; - - $_buffer = createInitialBuffer(stream); - streamState.global = $global; - $_streamData = createStreamState(streamState); - - $_buffer.onReject = reject; - $_buffer.onAsync = async; - - try { - scheduleFlush(); - renderer(input); - async(true); - } catch (err) { - reject(err as Error); - } finally { - $_buffer = originalBuffer; - $_streamData = originalStreamState; - } - }; +export function write(html: string) { + $chunk.writeHTML(html); } -export function write(data: string) { - $_buffer!.content += data; +export function writeScript(script: string) { + $chunk.writeScript(script); } -const TARGET_BUFFER_SIZE = 64000; -export function maybeFlush() { - if (!$_buffer!.prev && $_buffer!.content.length > TARGET_BUFFER_SIZE) { - // TODO: figure out if we can do this - // The idea is to flush in a `` if the buffer gets too large. - // - // However, a synchronous flush will break the owner scope reference - // as things are currently implemented: the owner scope object will - // not have been created if you flush in a scope that closes over it - // However, a scheduled flush will be too late: - // the entire contents of the `` will have been written - // by the time the flush occurs defeating the purpose - // Additionally, because we aren't eagerly merging buffers, - // buffer.content.length isn't necessarily 100% accurate - } -} - -export function scheduleFlush() { - const buffer = $_buffer!; - const streamState = $_streamData!; - if (!buffer.prev) { - setImmediate(() => flushToStream(buffer, streamState)); - } -} - -function flushToStream(buffer: Buffer, streamState: StreamData) { - while (buffer.prev) buffer = buffer.prev; - if (buffer.disabled) return; - - const stream = buffer.stream!; - - let { content, calls, scopes } = buffer; - buffer.flushed = true; - while (!buffer.pending && buffer.next) { - // TODO: we shouldn't need to clear here - clearBuffer(buffer); - buffer = buffer.next; - buffer.prev = null; - buffer.flushed = true; - content += buffer.content; - calls += buffer.calls; - if (buffer.scopes) { - if (scopes) { - Object.assign(scopes, buffer.scopes); - } else { - scopes = buffer.scopes; - } - } - } - const data = content + getResumeScript(calls, scopes, streamState); - - if (data) { - stream.write(data); - stream.flush?.(); - } - - // TODO: we should only have to call clearBuffer if the buffer is pending - // (which means it will flush again in the future). Otherwise, it can just - // be garbage collected. - clearBuffer(buffer); -} - -function createStreamState(state: Partial): StreamData { - state.scopeId ??= 0; - state.tagId ??= 0; - state.placeholderId ??= 0; - state.scopeLookup ??= new Map(); - state.runtimeFlushed ??= false; - return state as StreamData; -} - -function createNextBuffer(prevBuffer: Buffer): Buffer { - const newBuffer = { - stream: prevBuffer.stream, - pending: false, - flushed: false, - disabled: false, - prev: prevBuffer, - next: prevBuffer?.next ?? null, - content: "", - calls: "", - scopes: null, - onReject: prevBuffer.onReject, - onAsync: prevBuffer.onAsync, - }; - if (prevBuffer.next) { - prevBuffer.next.prev = prevBuffer; - } - prevBuffer.next = newBuffer; - return newBuffer; -} - -function createDetatchedBuffer(parentBuffer: Buffer): Buffer { - return { - stream: parentBuffer.stream, - pending: false, - flushed: false, - disabled: true, - prev: null, - next: null, - content: "", - calls: "", - scopes: null, - onReject: parentBuffer.onReject, - onAsync: parentBuffer.onAsync, - }; -} - -function createInitialBuffer(stream: Writable): Buffer { - return { - stream, - pending: false, - flushed: false, - disabled: false, - prev: null, - next: null, - content: "", - calls: "", - scopes: null, - onReject: undefined, - onAsync: undefined, - }; -} - -export async function fork( - promise: Promise, - renderResult: (result: T) => void, -) { - const originalBuffer = $_buffer!; - const originalStreamState = $_streamData!; - - scheduleFlush(); - $_buffer!.pending = true; - $_buffer!.onAsync?.(false); - $_buffer = createNextBuffer($_buffer!); - - try { - let result; - try { - result = await promise; - originalBuffer!.pending = false; - } finally { - $_buffer = originalBuffer; - $_streamData = originalStreamState; - scheduleFlush(); - } - renderResult(result); - } catch (err) { - $_buffer!.onReject?.(err as Error); - } finally { - $_buffer!.onAsync?.(true); - clearScope(); - } -} - -export function tryCatch( - renderBody: () => void, - renderError: (err: Error) => void, -) { - const id = nextPlaceholderId(); - let err: Error | null = null; - - const originalBuffer = $_buffer!; - const tryBuffer = createDetatchedBuffer(originalBuffer); - let finalTryBuffer: Buffer; - - tryBuffer.onReject = (asyncErr) => { - const errorBuffer = createDetatchedBuffer(originalBuffer); - $_buffer = errorBuffer; - renderError(asyncErr); - const finalErrorBuffer = $_buffer; - replaceBuffers( - id, - tryBuffer, - finalTryBuffer, - errorBuffer, - finalErrorBuffer, - ); - }; - - try { - $_buffer = tryBuffer; - renderBody(); - } catch (_err) { - err = _err as Error; - } finally { - if (err) { - $_buffer = originalBuffer; - renderError(err); - } else { - tryBuffer.disabled = false; - originalBuffer.next = tryBuffer; - tryBuffer.prev = originalBuffer; - if ($_buffer !== tryBuffer) { - tryBuffer.content = `` + tryBuffer.content; - markReplaceEnd(id); - finalTryBuffer = $_buffer!; - $_buffer = createNextBuffer(finalTryBuffer); - } - $_buffer.onReject = originalBuffer.onReject; - } - } -} - -export function tryPlaceholder( - renderBody: () => void, - renderPlaceholder: () => void, -) { - const originalBuffer = $_buffer!; - const asyncBuffer = createDetatchedBuffer(originalBuffer); - let id: number, - placeholderBuffer: Buffer, - finalPlaceholderBuffer: Buffer, - finalAsyncBuffer: Buffer; - let remainingChildren = 0; - let remainingPlaceholders = 0; - - asyncBuffer.onAsync = (complete: boolean, isPlaceholder?: boolean) => { - const delta = complete ? -1 : 1; - if (isPlaceholder) { - remainingPlaceholders += delta; - } else { - remainingChildren += delta; - } - if (!remainingChildren) { - if (!isPlaceholder) { - // last child has finished, replace the placeholder - // however, the replacement content may contain its own placeholder(s) - replaceBuffers( - id, - placeholderBuffer, - finalPlaceholderBuffer, - asyncBuffer, - finalAsyncBuffer, - ); - } - if (!remainingPlaceholders) { - // all async content under this placeholder is complete - originalBuffer.onAsync?.(true, true); - } - } - }; - - $_buffer = asyncBuffer; - renderBody(); - - if ($_buffer === asyncBuffer) { - originalBuffer.next = asyncBuffer; - asyncBuffer.prev = originalBuffer; - asyncBuffer.disabled = false; - asyncBuffer.onAsync = originalBuffer.onAsync; - } else { - id = nextPlaceholderId(); - placeholderBuffer = createNextBuffer(originalBuffer); - finalAsyncBuffer = $_buffer; - $_buffer = placeholderBuffer; - markReplaceStart(id); - renderPlaceholder(); - markReplaceEnd(id); - finalPlaceholderBuffer = $_buffer; - $_buffer = createNextBuffer(finalPlaceholderBuffer); - originalBuffer.onAsync?.(false, true); - } -} - -function clearBuffer(buffer: Buffer) { - buffer.content = ""; - buffer.calls = ""; - buffer.scopes = null; -} - -function clearScope() { - $_buffer = $_streamData = null; -} - -/* Async */ - -export function markReplaceStart(id: number) { - return ($_buffer!.content += ``); -} - -export function markReplaceEnd(id: number) { - return ($_buffer!.content += ``); -} - -function replaceBuffers( - id: number, - placeholderStart: Buffer, - placeholderEnd: Buffer, - replacementStart: Buffer, - replacementEnd: Buffer, -) { - if (placeholderStart.flushed) { - addReplacementWrapper(id, replacementStart, replacementEnd); - - let next: Buffer | null = placeholderEnd.next; - if (placeholderEnd.flushed) { - while (next && !next.pending && next.flushed) { - next = next.next; - } - } else { - // TODO: ensure the remaining original content cannot flush - } - - if (next) { - replacementStart.next = next; - next.prev = replacementEnd; - } - - $_buffer = replacementStart; - scheduleFlush(); - } else { - const prev = placeholderStart.prev; - const next = placeholderEnd.next; - if (prev) { - prev.next = replacementStart; - replacementStart.prev = prev; - } - if (next) { - next.prev = replacementEnd; - replacementEnd.next = next; - } - } - - replacementStart.disabled = false; -} - -function addReplacementWrapper( - id: number, - replacementStart: Buffer, - replacementEnd: Buffer, -) { - let runtimeCall = runtimeId + ResumeSymbol.VarReorderRuntime; - if (!$_streamData!.runtimeFlushed) { - runtimeCall = `(${runtimeCall}=${reorderRuntimeString})`; - $_streamData!.runtimeFlushed = true; - } - replacementStart.content = - `` + replacementStart.content; - replacementEnd.content += ``; -} - -function marker(id: number) { - return `${runtimeId}$${id}`; -} - -/* Hydration */ - -export function nextTagId() { - return "s" + $_streamData!.tagId++; -} - -export function nextPlaceholderId() { - return $_streamData!.placeholderId++; -} - -export function nextScopeId() { - return $_streamData!.scopeId++; -} - -export function peekNextScopeId() { - return $_streamData!.scopeId; -} - -export function peekNextScope() { - return ensureScopeWithId(peekNextScopeId()); -} - -export function getScopeById(scopeId: number | undefined) { - if (scopeId !== undefined) { - return $_streamData!.scopeLookup.get(scopeId); - } -} - -export function ensureScopeWithId(scopeId: number) { - const scopeLookup = $_streamData!.scopeLookup; - let scope = scopeLookup.get(scopeId); - if (!scope) { - scopeLookup.set(scopeId, (scope = { [kScopeId]: scopeId })); - } - - return scope; +export function writeEffect(scopeId: number, registryId: string) { + $chunk.boundary.state.needsMainRuntime = true; + $chunk.writeEffect(scopeId, registryId); } export function register( @@ -495,86 +62,659 @@ export function register( : serializerRegister(id, val, ensureScopeWithId(scopeId)); } -export function getRegistryInfo(val: WeakKey) { - const registered = getRegistered(val); - if (registered) { - return registered.scope - ? [registered.id, (registered.scope as any)[kScopeId]] - : [registered.id]; +export function nextTagId() { + const state = $chunk.boundary.state; + const { $global } = state; + return ( + "s" + $global.runtimeId + $global.renderId + (state.tagIndex++).toString(36) + ); +} + +export function nextScopeId() { + return $chunk.boundary.state.scopeIndex++; +} + +export function peekNextScopeId() { + return $chunk.boundary.state.scopeIndex; +} + +export function peekNextScope() { + return ensureScopeWithId(peekNextScopeId()); +} + +export function getScopeById(scopeId: number | undefined) { + if (scopeId !== undefined) { + return $chunk.boundary.state.scopes.get(scopeId); } } -export function writeEffect(scopeId: number, fnId: string) { - $_buffer!.calls += `${scopeId},"${fnId}",`; +export function markResumeNode(scopeId: number, accessor: Accessor) { + const { state } = $chunk.boundary; + state.needsMainRuntime = true; + return state.mark(Mark.Node, scopeId + " " + accessor); } -export function writeScope( - scopeId: number, - scope: PartialScope, - assignTo: - | PartialScope - | PartialScope[] - | undefined = $_streamData!.scopeLookup.get(scopeId), -) { - if (assignTo === undefined) { - (scope as any)[kScopeId] = scopeId; - $_streamData!.scopeLookup.set(scopeId, scope); - } else if (assignTo !== scope) { - if (Array.isArray(assignTo)) { - assignTo.push(scope); - } else { - scope = Object.assign(assignTo, scope); - } - } - $_buffer!.scopes ??= { - $global: getFilteredGlobals($_streamData!.global) as any, - }; - $_buffer!.scopes[scopeId] = scope; +export function markResumeScopeStart(scopeId: number, accessor?: Accessor) { + return $chunk.boundary.state.mark( + Mark.SectionStart, + scopeId + (accessor ? " " + accessor : ""), + ); } -export function markResumeNode(scopeId: number, index: Accessor) { - // TODO: can we only include the scope id when it differs from the prvious node marker? - return ``; -} - -export function markResumeScopeStart(scopeId: number, key?: string) { - return ``; -} - -export function markResumeControlEnd(scopeId: number, index: Accessor) { - return ``; +export function markResumeControlEnd(scopeId: number, accessor: Accessor) { + return $chunk.boundary.state.mark(Mark.SectionEnd, scopeId + " " + accessor); } export function markResumeControlSingleNodeEnd( scopeId: number, - index: Accessor, + accessor: Accessor, childScopeIds?: number | number[], ) { - return ``; + return $chunk.boundary.state.mark( + Mark.SectionSingleNodesEnd, + scopeId + " " + accessor + " " + (childScopeIds ?? ""), + ); } -function getResumeScript( - calls: string, - scopes: Buffer["scopes"], - streamState: StreamData, -) { - if (calls || scopes) { - let isFirstFlush; - let serializer = streamState.serializer; - if ((isFirstFlush = !serializer)) { - serializer = streamState.serializer = new Serializer(); - } - return ``; +export function writeScope(scopeId: number, partialScope: PartialScope) { + const { state } = $chunk.boundary; + const { scopes } = state; + let scope: ScopeInternals | undefined = scopes.get(scopeId); + state.needsMainRuntime = true; + + if (scope) { + Object.assign(scope, partialScope); + } else { + scope = partialScope; + state.scopes.set(scopeId, partialScope); } - return ""; + + if (state.writeScopes) { + state.writeScopes[scopeId] = scope; + } else if (state.hasGlobals) { + state.writeScopes = { [scopeId]: scope }; + } else { + state.hasGlobals = true; + state.writeScopes = { + $: getFilteredGlobals(state.$global), + [scopeId]: scope, + }; + } +} + +export function ensureScopeWithId(scopeId: number) { + const { state } = $chunk.boundary; + let scope = state.scopes.get(scopeId); + if (!scope) { + scope = { [K_SCOPE_ID]: scopeId }; + state.scopes.set(scopeId, scope); + } + + return scope; +} + +export function getStreamData() { + return $chunk.boundary.state; +} + +export function fork( + promise: Promise | T, + renderBody: (value: T) => void, +) { + if (!isPromise(promise)) { + renderBody(promise); + return; + } + + const chunk = $chunk; + const { boundary } = chunk; + chunk.next = $chunk = new Chunk(boundary, chunk.next); + chunk.async = true; + boundary.startAsync(); + promise.then( + (value) => { + if (chunk.async) { + chunk.async = false; + + if (!boundary.signal.aborted) { + chunk.render(renderBody, value); + boundary.endAsync(chunk); + } + } + }, + (err) => { + chunk.async = false; + boundary.abort(err); + }, + ); +} + +export function tryPlaceholder( + renderBody: () => void, + renderPlaceholder: () => void, +) { + const chunk = $chunk; + const { boundary } = chunk; + const body = new Chunk(boundary, null); + + if (body === body.render(renderBody)) { + chunk.append(body); + return; + } + + chunk.next = $chunk = new Chunk(boundary, chunk.next); + chunk.placeholderBody = body; + chunk.placeholderRender = renderPlaceholder; +} + +export function tryCatch( + renderBody: () => void, + renderCatch: (err: unknown) => void, +) { + const chunk = $chunk; + const { boundary } = chunk; + const { state } = boundary; + const catchBoundary = new Boundary(state); + const body = new Chunk(catchBoundary, null); + const bodyEnd = body.render(renderBody); + + if (catchBoundary.signal.aborted) { + // Sync error + renderCatch(catchBoundary.signal.reason); + return; + } + + if (body === bodyEnd) { + // Sync success + chunk.append(body); + return; + } + + const reorderId = state.nextReorderId(); + const endMarker = state.mark(Mark.PlaceholderEnd, reorderId); + const bodyNext = (bodyEnd.next = $chunk = new Chunk(boundary, chunk.next)); + chunk.next = body; + chunk.writeHTML(state.mark(Mark.Placeholder, reorderId)); + bodyEnd.writeHTML(endMarker); + boundary.startAsync(); + catchBoundary.onNext = () => { + if (boundary.signal.aborted) return; + if (catchBoundary.signal.aborted) { + if (!bodyEnd.consumed) { + let cur: Chunk = body; + let writeMarker = true; + + do { + const next = cur.next!; + + if (cur.boundary !== catchBoundary) { + cur.boundary.abort(catchBoundary.signal.reason); + } + + if (writeMarker && !cur.consumed) { + writeMarker = false; + cur.async = false; + cur.next = bodyNext; + cur.html = endMarker; + cur.scripts = cur.effects = ""; + cur.placeholderBody = cur.placeholderRender = cur.reorderId = null; + } + + cur = next; + } while (cur !== bodyNext); + } + + const catchChunk = new Chunk(boundary, null); + catchChunk.reorderId = reorderId; + catchChunk.render(renderCatch, catchBoundary.signal.reason); + state.reorder(catchChunk); + boundary.endAsync(); + } else if (catchBoundary.done) { + boundary.endAsync(); + } else { + boundary.onNext(); + } + }; +} + +export class State { + public tagIndex = 0; + public scopeIndex = 0; + public reorderIndex = 0; + public hasGlobals = false; + public needsMainRuntime = false; + public hasMainRuntime = false; + public hasReorderRuntime = false; + public hasWrittenScopes = false; + public hasWrittenEffects = false; + public serializer = new Serializer(); + public writeReorders: Chunk[] | null = null; + public scopes = new Map(); + public writeScopes: null | (Record & { $?: unknown }) = + null; + constructor( + public $global: Record & { + renderId: string; + runtimeId: string; + }, + ) { + this.$global = $global; + } + + get runtimePrefix() { + const { $global } = this; + return $global.runtimeId + "." + $global.renderId; + } + + get commentPrefix() { + const { $global } = this; + return $global.runtimeId + $global.renderId; + } + + reorder(chunk: Chunk) { + if (this.writeReorders) { + this.writeReorders.push(chunk); + } else { + this.needsMainRuntime = true; + this.writeReorders = [chunk]; + } + } + + nextReorderId() { + const encodeChars = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789"; + const encodeLen = encodeChars.length; + const encodeStartLen = encodeLen - 10; // Avoids chars that cannot start a property name. + let index = this.reorderIndex++; + let mod = index % encodeStartLen; + let id = encodeChars[mod]; + index = (index - mod) / encodeStartLen; + + while (index > 0) { + mod = index % encodeLen; + id += encodeChars[mod]; + index = (index - mod) / encodeLen; + } + + return id; + } + + mark(code: Mark, str: string) { + return ""; + } +} + +export class Boundary extends AbortController { + public onNext = NOOP; + private count = 0; + constructor( + public state: State, + parent?: AbortSignal, + ) { + super(); + this.state = state; + this.signal.addEventListener("abort", () => { + this.count = 0; + this.state = new State(this.state.$global); + this.onNext(); + }); + + if (parent) { + if (parent.aborted) { + this.abort(parent.reason); + } else { + parent.addEventListener("abort", () => { + this.abort(parent.reason); + }); + } + } + } + + get done() { + return this.count === 0; + } + + startAsync() { + if (!this.signal.aborted) { + this.count++; + } + } + + endAsync(chunk?: Chunk) { + if (!this.signal.aborted && this.count) { + this.count--; + + if (chunk?.reorderId) { + this.state.reorder(chunk); + } + + this.onNext(); + } + } +} + +export class Chunk { + public html = ""; + public scripts = ""; + public effects = ""; + public async = false; + public consumed = false; + public reorderId: string | null = null; + public placeholderBody: Chunk | null = null; + public placeholderRender: (() => void) | null = null; + constructor( + public boundary: Boundary, + public next: Chunk | null, + ) { + this.boundary = boundary; + this.next = next; + } + + writeHTML(html: string) { + this.html += html; + } + + writeEffect(scopeId: number, registryId: string) { + this.effects = concatEffects( + this.effects, + scopeId + ',"' + registryId + '"', + ); + } + + writeScript(script: string) { + this.scripts = concatScripts(this.scripts, script); + } + + append(chunk: Chunk) { + this.html += chunk.html; + this.effects = concatEffects(this.effects, chunk.effects); + this.scripts = concatScripts(this.scripts, chunk.scripts); + } + flushPlaceholder() { + if (this.placeholderBody) { + const body = this.placeholderBody.consume(); + + if (body.async) { + const { state } = this.boundary; + const reorderId = (body.reorderId = state.nextReorderId()); + this.writeHTML(state.mark(Mark.Placeholder, reorderId)); + const after = this.render(this.placeholderRender!); + if (after !== this) { + // TODO: eventually this should be allowed. + // Once it's allowed we'll need check if placeholder needs to be disposed once body complete. + this.boundary.abort( + new Error("An @placeholder cannot contain async content."), + ); + } + after.writeHTML(state.mark(Mark.PlaceholderEnd, reorderId)); + state.reorder(body); + } else { + body.next = this.next; + this.next = body; + } + + this.placeholderRender = this.placeholderBody = null; + } + } + + consume() { + let cur: Chunk = this; + + if (cur.next && !cur.async) { + let html = ""; + let effects = ""; + let scripts = ""; + do { + cur.flushPlaceholder(); + html += cur.html; + effects += cur.effects; + scripts = concatScripts(scripts, cur.scripts); + cur.consumed = true; + cur = cur.next; + } while (cur.next && !cur.async); + + cur.html = html + cur.html; + cur.effects = concatEffects(effects, cur.effects); + cur.scripts = concatScripts(scripts, cur.scripts); + } + + return cur; + } + + render(renderBody: () => void): Chunk; + render(renderBody: (val: T) => void, val: T): Chunk; + render(renderBody: (val?: T) => void, val?: T): Chunk { + const prev = $chunk; + $chunk = this; + try { + renderBody(val); + return $chunk; + } catch (err) { + this.boundary.abort(err); + return this; + } finally { + $chunk = prev; + } + } +} + +export function prepareChunk(chunk: Chunk) { + const head = chunk.consume(); + const { boundary, effects } = head; + const { state } = boundary; + const { $global, runtimePrefix, serializer } = state; + const nonceAttr = $global.cspNonce + ? " nonce=" + escapeAttrValue($global.cspNonce + "") + : ""; + let { html, scripts } = head; + let hasWalk = false; + head.effects = ""; + + if (state.needsMainRuntime && !state.hasMainRuntime) { + state.hasMainRuntime = true; + scripts = concatScripts( + scripts, + WALKER_RUNTIME_CODE + + '("' + + $global.runtimeId + + '")("' + + $global.renderId + + '")', + ); + } + + if (state.writeScopes || serializer.flushed) { + const serialized = state.serializer.stringify( + state.writeScopes || {}, + boundary, + ); + let script = runtimePrefix + RuntimeKey.Scopes; + state.writeScopes = null; + if (state.hasWrittenScopes) { + script += ".push(" + serialized + ")"; + } else { + state.hasWrittenScopes = true; + script += "=[" + serialized + "]"; + } + + scripts = concatScripts(scripts, script); + } + + if (effects) { + let script = runtimePrefix + RuntimeKey.Effects; + hasWalk = true; + + if (state.hasWrittenEffects) { + script += ".push(" + effects + ")"; + } else { + state.hasWrittenEffects = true; + script += "=[" + effects + "]"; + } + + scripts = concatScripts(scripts, script); + } + + if (state.writeReorders) { + hasWalk = true; + + if (!state.hasReorderRuntime) { + state.hasReorderRuntime = true; + html += + ""; + scripts = concatScripts( + scripts, + REORDER_RUNTIME_CODE + "(" + runtimePrefix + ")", + ); + } + + for (const reorderedChunk of state.writeReorders) { + const { reorderId } = reorderedChunk; + let isSync = true; + let reorderHTML = ""; + let reorderEffects = ""; + let reorderScripts = ""; + let cur = reorderedChunk; + reorderedChunk.reorderId = null; + + for (;;) { + cur.flushPlaceholder(); + reorderHTML += cur.html; + reorderEffects = concatEffects(reorderEffects, cur.effects); + reorderScripts = concatScripts(reorderScripts, cur.scripts); + + if (cur.async) { + reorderHTML += state.mark( + Mark.ReorderMarker, + (cur.reorderId = state.nextReorderId()), + ); + cur.html = cur.effects = cur.scripts = ""; + isSync = false; + } + + if (cur.next) { + cur = cur.next; + } else { + break; + } + } + + if (reorderEffects) { + if (!state.hasWrittenEffects) { + state.hasWrittenEffects = true; + scripts = concatScripts( + scripts, + runtimePrefix + RuntimeKey.Effects + "=[]", + ); + } + + reorderScripts = concatScripts( + reorderScripts, + runtimePrefix + RuntimeKey.Effects + ".push(" + reorderEffects + ")", + ); + } + + scripts = concatScripts( + scripts, + reorderScripts && + runtimePrefix + + RuntimeKey.Scripts + + "." + + reorderId + + "=()=>{" + + reorderScripts + + "}", + ); + + html += + "" + + reorderHTML + + ""; + } + + state.writeReorders = null; + } + + if (state.needsMainRuntime && boundary.done) { + scripts = concatScripts(scripts, runtimePrefix + RuntimeKey.Done + "=1"); + } + + if (hasWalk) { + scripts = concatScripts(scripts, runtimePrefix + RuntimeKey.Walk + "()"); + } + + head.html = html; + head.scripts = scripts; + return head; +} + +export function flushChunk(head: Chunk) { + const { html, scripts } = head; + head.html = head.scripts = ""; + return ( + html + + (scripts + ? "" + + scripts + + "" + : "") + ); +} + +function concatEffects(a: string, b: string) { + return a ? (b ? a + "," + b : a) : b; +} + +function concatScripts(a: string, b: string) { + return a ? (b ? a + ";" + b : a) : b; +} + +type QueueCallback = (ticked: true) => void; +const tick = + globalThis.setImmediate || + globalThis.setTimeout || + globalThis.queueMicrotask || + ((cb: () => void) => Promise.resolve().then(cb)); +let tickQueue: Set | undefined; + +export function queueTick(cb: QueueCallback) { + if (tickQueue) { + tickQueue.add(cb); + } else { + tickQueue = new Set([cb]); + tick(flushTickQueue); + } +} + +export function offTick(cb: QueueCallback) { + tickQueue?.delete(cb); +} + +function flushTickQueue() { + const queue = tickQueue!; + tickQueue = undefined; + + for (const cb of queue) { + cb(true); + } +} + +function isPromise(value: unknown): value is Promise { + return ( + value != null && typeof (value as Promise).then === "function" + ); } function getFilteredGlobals($global: Record) { diff --git a/packages/translator-interop/src/__tests__/fixtures/custom-tag-parameters-from-args/__snapshots__/ssr.expected.md b/packages/translator-interop/src/__tests__/fixtures/custom-tag-parameters-from-args/__snapshots__/ssr.expected.md index 63ba9a76c..4a7055c1d 100644 --- a/packages/translator-interop/src/__tests__/fixtures/custom-tag-parameters-from-args/__snapshots__/ssr.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/custom-tag-parameters-from-args/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
Counts: 1,10
+
Counts: 1,10
# Render "End" @@ -11,20 +11,20 @@ class="inc" > 1 - + , 10 - + - - + +
Counts: 1,10
- + diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-basic-class-to-tags/__snapshots__/resume.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-basic-class-to-tags/__snapshots__/resume.expected.md index f5a8b1166..ae739bd14 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-basic-class-to-tags/__snapshots__/resume.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-basic-class-to-tags/__snapshots__/resume.expected.md @@ -13,14 +13,11 @@ id="tags" > 0 - + - + - @@ -29,18 +26,18 @@ # Mutations ``` inserted #document/html0/body1/#text0 -inserted #document/html0/body1/#text9 +inserted #document/html0/body1/#text8 removed #comment before #document/html0/body1/#text0 -removed #comment after #document/html0/body1/#text9 +removed #comment after #document/html0/body1/#text8 #document/html0/body1/button4: attr(data-parent) "0" => "0" inserted #document/html0/body1/#text2 -inserted #document/html0/body1/#text8 -inserted #document/html0/body1/#text3 inserted #document/html0/body1/#text7 +inserted #document/html0/body1/#text3 +inserted #document/html0/body1/#text6 removed #comment after #document/html0/body1/#text3 -removed #comment after #document/html0/body1/script6 -removed #document/html0/body1/#text8 after #document/html0/body1/#text7 -inserted #document/html0/body1/#text8 +removed #comment after #document/html0/body1/#comment5 +removed #document/html0/body1/#text7 after #document/html0/body1/#text6 +inserted #document/html0/body1/#text7 ``` @@ -61,14 +58,11 @@ container.querySelector("#tags").click() id="tags" > 1 - + - + - @@ -97,14 +91,11 @@ container.querySelector("#class").click() id="tags" > 1 - + - + - @@ -134,14 +125,11 @@ container.querySelector("#tags").click() id="tags" > 2 - + - + - @@ -170,14 +158,11 @@ container.querySelector("#class").click() id="tags" > 2 - + - + - @@ -207,14 +192,11 @@ container.querySelector("#tags").click() id="tags" > 3 - + - + - diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-basic-class-to-tags/__snapshots__/ssr.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-basic-class-to-tags/__snapshots__/ssr.expected.md index 356f114cd..1082d9f60 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-basic-class-to-tags/__snapshots__/ssr.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-basic-class-to-tags/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -19,16 +19,13 @@ id="tags" > 0 - + - - + @@ -47,10 +44,8 @@ inserted #document/html0/body1/button3 inserted #document/html0/body1/button3/#text0 inserted #document/html0/body1/button3/#comment1 inserted #document/html0/body1/#comment4 -inserted #document/html0/body1/script5 -inserted #document/html0/body1/script5/#text0 +inserted #document/html0/body1/#comment5 inserted #document/html0/body1/#comment6 -inserted #document/html0/body1/#comment7 -inserted #document/html0/body1/script8 -inserted #document/html0/body1/script8/#text0 +inserted #document/html0/body1/script7 +inserted #document/html0/body1/script7/#text0 ``` \ No newline at end of file diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-basic-tags-to-class/__snapshots__/resume.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-basic-tags-to-class/__snapshots__/resume.expected.md index 0d1b8196d..412afa888 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-basic-tags-to-class/__snapshots__/resume.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-basic-tags-to-class/__snapshots__/resume.expected.md @@ -7,22 +7,19 @@ id="tags" > 0 - + - - + + + - - @@ -48,22 +45,19 @@ container.querySelector("#tags").click() id="tags" > 1 - + - - + + + - - @@ -87,22 +81,19 @@ container.querySelector("#class").click() id="tags" > 1 - + - - + + + - - @@ -125,22 +116,19 @@ container.querySelector("#tags").click() id="tags" > 2 - + - - + + + - - @@ -164,22 +152,19 @@ container.querySelector("#class").click() id="tags" > 2 - + - - + + + - - @@ -202,22 +187,19 @@ container.querySelector("#tags").click() id="tags" > 3 - + - - + + + - - diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-basic-tags-to-class/__snapshots__/ssr.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-basic-tags-to-class/__snapshots__/ssr.expected.md index 3d05f1b01..ec9ead61e 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-basic-tags-to-class/__snapshots__/ssr.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-basic-tags-to-class/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -11,10 +11,10 @@ id="tags" > 0 - + - - + + - - +
0 - +
@@ -42,24 +39,21 @@ container.querySelector("#class-api").click() - + - - +
1 - +
@@ -67,7 +61,7 @@ container.querySelector("#class-api").click() # Mutations ``` -#document/html0/body1/div6/#text0: "0" => "1" +#document/html0/body1/div5/#text0: "0" => "1" #document/html0/body1/button2/#text0: "0" => "1" ``` @@ -79,24 +73,21 @@ container.querySelector("#class-api").click() - + - - +
2 - +
@@ -104,6 +95,6 @@ container.querySelector("#class-api").click() # Mutations ``` -#document/html0/body1/div6/#text0: "1" => "2" +#document/html0/body1/div5/#text0: "1" => "2" #document/html0/body1/button2/#text0: "1" => "2" ``` \ No newline at end of file diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-events-tags-to-class/__snapshots__/ssr.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-events-tags-to-class/__snapshots__/ssr.expected.md index f4b50f7bb..2dd27da4c 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-events-tags-to-class/__snapshots__/ssr.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-events-tags-to-class/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
0
+
0
# Render "End" @@ -7,7 +7,7 @@ - + - +
- +
- @@ -31,21 +28,21 @@ # Mutations ``` inserted #document/html0/body1/#text0 -inserted #document/html0/body1/#text9 +inserted #document/html0/body1/#text8 removed #comment before #document/html0/body1/#text0 -removed #comment after #document/html0/body1/#text9 +removed #comment after #document/html0/body1/#text8 inserted #document/html0/body1/div5/#text0 inserted #document/html0/body1/div5/#text4 removed #comment after #document/html0/body1/div5/#text4 removed button after #document/html0/body1/div5/#text4 inserted #document/html0/body1/#text1 -inserted #document/html0/body1/#text8 -inserted #document/html0/body1/#text2 inserted #document/html0/body1/#text7 +inserted #document/html0/body1/#text2 +inserted #document/html0/body1/#text6 removed #comment after #document/html0/body1/#text2 -removed #comment after #document/html0/body1/script6 -removed #document/html0/body1/#text8 after #document/html0/body1/#text7 -inserted #document/html0/body1/#text8 +removed #comment after #document/html0/body1/div5 +removed #document/html0/body1/#text7 after #document/html0/body1/#text6 +inserted #document/html0/body1/#text7 inserted #document/html0/body1/div5/#text1 inserted #document/html0/body1/div5/#text3 inserted #document/html0/body1/div5/button2 @@ -64,22 +61,19 @@ container.querySelector("#tags").click() id="tags" > 1 - + - +
- +
- @@ -102,22 +96,19 @@ container.querySelector("#class").click() id="tags" > 1 - + - +
- +
- @@ -150,22 +141,19 @@ container.querySelector("#tags").click() id="tags" > 2 - + - +
- +
- @@ -188,22 +176,19 @@ container.querySelector("#class").click() id="tags" > 2 - + - +
- +
- @@ -236,22 +221,19 @@ container.querySelector("#tags").click() id="tags" > 3 - + - +
- +
- diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-nested-class-to-tags/__snapshots__/ssr.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-nested-class-to-tags/__snapshots__/ssr.expected.md index 0b70dd260..67723003b 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-nested-class-to-tags/__snapshots__/ssr.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-nested-class-to-tags/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
+
# Render "End" @@ -13,25 +13,22 @@ id="tags" > 0 - + - +
- + - +
- @@ -53,10 +50,8 @@ inserted #document/html0/body1/div4/#comment0 inserted #document/html0/body1/div4/button1 inserted #document/html0/body1/div4/button1/#text0 inserted #document/html0/body1/div4/#comment2 -inserted #document/html0/body1/script5 -inserted #document/html0/body1/script5/#text0 +inserted #document/html0/body1/#comment5 inserted #document/html0/body1/#comment6 -inserted #document/html0/body1/#comment7 -inserted #document/html0/body1/script8 -inserted #document/html0/body1/script8/#text0 +inserted #document/html0/body1/script7 +inserted #document/html0/body1/script7/#text0 ``` \ No newline at end of file diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-nested-tags-to-class/__snapshots__/resume.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-nested-tags-to-class/__snapshots__/resume.expected.md index a030094e9..df2ebb602 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-nested-tags-to-class/__snapshots__/resume.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-nested-tags-to-class/__snapshots__/resume.expected.md @@ -3,10 +3,7 @@ - - + - - + + - - @@ -37,18 +28,18 @@ # Mutations ``` -inserted #document/html0/body1/#text2 -inserted #document/html0/body1/#text5 -removed #comment after #document/html0/body1/script1 -removed #comment after #document/html0/body1/#text5 -inserted #document/html0/body1/div4/#text0 -inserted #document/html0/body1/div4/#text6 -inserted #document/html0/body1/div4/#text1 -inserted #document/html0/body1/div4/#text5 -removed #comment after #document/html0/body1/div4/#text1 -removed #comment after #document/html0/body1/div4/script4 -removed #document/html0/body1/div4/#text6 after #document/html0/body1/div4/#text5 -inserted #document/html0/body1/div4/#text6 +inserted #document/html0/body1/#text1 +inserted #document/html0/body1/#text4 +removed #comment after #document/html0/body1/#comment0 +removed #comment after #document/html0/body1/#text4 +inserted #document/html0/body1/div3/#text0 +inserted #document/html0/body1/div3/#text5 +inserted #document/html0/body1/div3/#text1 +inserted #document/html0/body1/div3/#text4 +removed #comment after #document/html0/body1/div3/#text1 +removed #comment after #document/html0/body1/div3/#comment3 +removed #document/html0/body1/div3/#text5 after #document/html0/body1/div3/#text4 +inserted #document/html0/body1/div3/#text5 ``` @@ -59,10 +50,7 @@ container.querySelector("#tags").click() - - + - - + + - - @@ -93,7 +75,7 @@ container.querySelector("#tags").click() # Mutations ``` -#document/html0/body1/div4/button2/#text0: "0" => "1" +#document/html0/body1/div3/button2/#text0: "0" => "1" ``` @@ -104,10 +86,7 @@ container.querySelector("#class").click() - - + - - + + - - @@ -138,7 +111,7 @@ container.querySelector("#class").click() # Mutations ``` -#document/html0/body1/button3/#text0: "0" => "1" +#document/html0/body1/button2/#text0: "0" => "1" ``` @@ -149,10 +122,7 @@ container.querySelector("#tags").click() - - + - - + + - - @@ -183,7 +147,7 @@ container.querySelector("#tags").click() # Mutations ``` -#document/html0/body1/div4/button2/#text0: "1" => "2" +#document/html0/body1/div3/button2/#text0: "1" => "2" ``` @@ -194,10 +158,7 @@ container.querySelector("#class").click() - - + - - + + - - @@ -228,7 +183,7 @@ container.querySelector("#class").click() # Mutations ``` -#document/html0/body1/button3/#text0: "1" => "2" +#document/html0/body1/button2/#text0: "1" => "2" ``` @@ -239,10 +194,7 @@ container.querySelector("#tags").click() - - + - - + + - - @@ -273,5 +219,5 @@ container.querySelector("#tags").click() # Mutations ``` -#document/html0/body1/div4/button2/#text0: "2" => "3" +#document/html0/body1/div3/button2/#text0: "2" => "3" ``` \ No newline at end of file diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-nested-tags-to-class/__snapshots__/ssr.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-nested-tags-to-class/__snapshots__/ssr.expected.md index 65ced8509..4dfad9774 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-nested-tags-to-class/__snapshots__/ssr.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-nested-tags-to-class/__snapshots__/ssr.expected.md @@ -1,9 +1,5 @@ # Write - - - -# Write -
+
# Render "End" @@ -11,10 +7,7 @@ - - + - - + + - - @@ -53,24 +40,18 @@ inserted #document/html0 inserted #document/html0/head0 inserted #document/html0/body1 inserted #document/html0/body1/#comment0 -inserted #document/html0/body1/script1 -inserted #document/html0/body1/script1/#text0 -inserted #document/html0/body1/#comment2 -inserted #document/html0/body1/button3 -inserted #document/html0/body1/button3/#text0 -inserted #document/html0/body1/div4 -inserted #document/html0/body1/div4/#comment0 -inserted #document/html0/body1/div4/button1 -inserted #document/html0/body1/div4/button1/#text0 -inserted #document/html0/body1/div4/button1/#comment1 -inserted #document/html0/body1/div4/#comment2 -inserted #document/html0/body1/div4/script3 -inserted #document/html0/body1/div4/script3/#text0 -inserted #document/html0/body1/div4/#comment4 +inserted #document/html0/body1/#comment1 +inserted #document/html0/body1/button2 +inserted #document/html0/body1/button2/#text0 +inserted #document/html0/body1/div3 +inserted #document/html0/body1/div3/#comment0 +inserted #document/html0/body1/div3/button1 +inserted #document/html0/body1/div3/button1/#text0 +inserted #document/html0/body1/div3/button1/#comment1 +inserted #document/html0/body1/div3/#comment2 +inserted #document/html0/body1/div3/#comment3 +inserted #document/html0/body1/#comment4 inserted #document/html0/body1/#comment5 inserted #document/html0/body1/script6 inserted #document/html0/body1/script6/#text0 -inserted #document/html0/body1/#comment7 -inserted #document/html0/body1/script8 -inserted #document/html0/body1/script8/#text0 ``` \ No newline at end of file diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-class-to-tags/__snapshots__/resume.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-class-to-tags/__snapshots__/resume.expected.md index 13c3522f2..ef6887d62 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-class-to-tags/__snapshots__/resume.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-class-to-tags/__snapshots__/resume.expected.md @@ -7,9 +7,9 @@ id="tags" > 0 - + - +

hello @@ -19,13 +19,10 @@ > 1 * 0 = 0 - +

- @@ -34,22 +31,22 @@ # Mutations ``` inserted #document/html0/body1/#text0 -inserted #document/html0/body1/#text9 +inserted #document/html0/body1/#text8 removed #comment before #document/html0/body1/#text0 -removed #comment after #document/html0/body1/#text9 +removed #comment after #document/html0/body1/#text8 inserted #document/html0/body1/div5/#text0 inserted #document/html0/body1/div5/#text5 removed #comment after #document/html0/body1/div5/#text5 removed h1 after #document/html0/body1/div5/#text5 removed button after #document/html0/body1/div5/#text5 inserted #document/html0/body1/#text1 -inserted #document/html0/body1/#text8 -inserted #document/html0/body1/#text2 inserted #document/html0/body1/#text7 +inserted #document/html0/body1/#text2 +inserted #document/html0/body1/#text6 removed #comment after #document/html0/body1/#text2 -removed #comment after #document/html0/body1/script6 -removed #document/html0/body1/#text8 after #document/html0/body1/#text7 -inserted #document/html0/body1/#text8 +removed #comment after #document/html0/body1/div5 +removed #document/html0/body1/#text7 after #document/html0/body1/#text6 +inserted #document/html0/body1/#text7 inserted #document/html0/body1/div5/#text1 inserted #document/html0/body1/div5/#text4 inserted #document/html0/body1/div5/h12 @@ -74,9 +71,9 @@ container.querySelector("#tags").click() id="tags" > 1 - + - +

hello @@ -86,13 +83,10 @@ container.querySelector("#tags").click() > 1 * 1 = 1 - +

- @@ -117,9 +111,9 @@ container.querySelector("#class").click() id="tags" > 1 - + - +

hello @@ -129,13 +123,10 @@ container.querySelector("#class").click() > 2 * 1 = 2 - +

- @@ -175,9 +166,9 @@ container.querySelector("#tags").click() id="tags" > 2 - + - +

hello @@ -187,13 +178,10 @@ container.querySelector("#tags").click() > 2 * 2 = 4 - +

- @@ -218,9 +206,9 @@ container.querySelector("#class").click() id="tags" > 2 - + - +

hello @@ -230,13 +218,10 @@ container.querySelector("#class").click() > 3 * 2 = 6 - +

- @@ -276,9 +261,9 @@ container.querySelector("#tags").click() id="tags" > 3 - + - +

hello @@ -288,13 +273,10 @@ container.querySelector("#tags").click() > 3 * 3 = 9 - +

- diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-class-to-tags/__snapshots__/ssr.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-class-to-tags/__snapshots__/ssr.expected.md index ab50bceb0..217195da2 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-class-to-tags/__snapshots__/ssr.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-class-to-tags/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -

hello

+

hello

# Render "End" @@ -13,11 +13,11 @@ id="tags" > 0 - + - +
- +

hello

@@ -26,15 +26,12 @@ > 1 * 0 = 0 - +
- @@ -58,10 +55,8 @@ inserted #document/html0/body1/div4/h11/#text0 inserted #document/html0/body1/div4/button2 inserted #document/html0/body1/div4/button2/#text0 inserted #document/html0/body1/div4/#comment3 -inserted #document/html0/body1/script5 -inserted #document/html0/body1/script5/#text0 +inserted #document/html0/body1/#comment5 inserted #document/html0/body1/#comment6 -inserted #document/html0/body1/#comment7 -inserted #document/html0/body1/script8 -inserted #document/html0/body1/script8/#text0 +inserted #document/html0/body1/script7 +inserted #document/html0/body1/script7/#text0 ``` \ No newline at end of file diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-tags-to-class/__snapshots__/resume.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-tags-to-class/__snapshots__/resume.expected.md index 4aa74dbc2..2241b161e 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-tags-to-class/__snapshots__/resume.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-tags-to-class/__snapshots__/resume.expected.md @@ -3,10 +3,7 @@ - - + - - + + - - @@ -49,18 +40,18 @@ # Mutations ``` -inserted #document/html0/body1/#text2 -inserted #document/html0/body1/#text5 -removed #comment after #document/html0/body1/script1 -removed #comment after #document/html0/body1/#text5 -inserted #document/html0/body1/div4/#text0 -inserted #document/html0/body1/div4/#text7 -inserted #document/html0/body1/div4/#text1 -inserted #document/html0/body1/div4/#text6 -removed #comment after #document/html0/body1/div4/#text1 -removed #comment after #document/html0/body1/div4/script5 -removed #document/html0/body1/div4/#text7 after #document/html0/body1/div4/#text6 -inserted #document/html0/body1/div4/#text7 +inserted #document/html0/body1/#text1 +inserted #document/html0/body1/#text4 +removed #comment after #document/html0/body1/#comment0 +removed #comment after #document/html0/body1/#text4 +inserted #document/html0/body1/div3/#text0 +inserted #document/html0/body1/div3/#text6 +inserted #document/html0/body1/div3/#text1 +inserted #document/html0/body1/div3/#text5 +removed #comment after #document/html0/body1/div3/#text1 +removed #comment after #document/html0/body1/div3/#comment4 +removed #document/html0/body1/div3/#text6 after #document/html0/body1/div3/#text5 +inserted #document/html0/body1/div3/#text6 ``` @@ -71,10 +62,7 @@ container.querySelector("#tags").click() - - + - - + + - - @@ -117,7 +99,7 @@ container.querySelector("#tags").click() # Mutations ``` -#document/html0/body1/div4/button3/#text0: "1" => "2" +#document/html0/body1/div3/button3/#text0: "1" => "2" ``` @@ -128,10 +110,7 @@ container.querySelector("#class").click() - - + - - + + - - @@ -174,9 +147,9 @@ container.querySelector("#class").click() # Mutations ``` -#document/html0/body1/div4/button3/#text4: "0" => "1" -#document/html0/body1/div4/button3/#text8: "0" => "2" -#document/html0/body1/button3/#text0: "0" => "1" +#document/html0/body1/div3/button3/#text4: "0" => "1" +#document/html0/body1/div3/button3/#text8: "0" => "2" +#document/html0/body1/button2/#text0: "0" => "1" ``` @@ -187,10 +160,7 @@ container.querySelector("#tags").click() - - + - - + + - - @@ -233,8 +197,8 @@ container.querySelector("#tags").click() # Mutations ``` -#document/html0/body1/div4/button3/#text0: "2" => "3" -#document/html0/body1/div4/button3/#text8: "2" => "3" +#document/html0/body1/div3/button3/#text0: "2" => "3" +#document/html0/body1/div3/button3/#text8: "2" => "3" ``` @@ -245,10 +209,7 @@ container.querySelector("#class").click() - - + - - + + - - @@ -291,9 +246,9 @@ container.querySelector("#class").click() # Mutations ``` -#document/html0/body1/div4/button3/#text4: "1" => "2" -#document/html0/body1/div4/button3/#text8: "3" => "6" -#document/html0/body1/button3/#text0: "1" => "2" +#document/html0/body1/div3/button3/#text4: "1" => "2" +#document/html0/body1/div3/button3/#text8: "3" => "6" +#document/html0/body1/button2/#text0: "1" => "2" ``` @@ -304,10 +259,7 @@ container.querySelector("#tags").click() - - + - - + + - - @@ -350,6 +296,6 @@ container.querySelector("#tags").click() # Mutations ``` -#document/html0/body1/div4/button3/#text0: "3" => "4" -#document/html0/body1/div4/button3/#text8: "6" => "8" +#document/html0/body1/div3/button3/#text0: "3" => "4" +#document/html0/body1/div3/button3/#text8: "6" => "8" ``` \ No newline at end of file diff --git a/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-tags-to-class/__snapshots__/ssr.expected.md b/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-tags-to-class/__snapshots__/ssr.expected.md index 55b0d7f78..aaf4b9132 100644 --- a/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-tags-to-class/__snapshots__/ssr.expected.md +++ b/packages/translator-interop/src/__tests__/fixtures/interop-tag-params-tags-to-class/__snapshots__/ssr.expected.md @@ -1,9 +1,5 @@ # Write - - - -# Write -

hello

+

hello

# Render "End" @@ -11,10 +7,7 @@ - - + - - + + - - @@ -65,35 +52,29 @@ inserted #document/html0 inserted #document/html0/head0 inserted #document/html0/body1 inserted #document/html0/body1/#comment0 -inserted #document/html0/body1/script1 -inserted #document/html0/body1/script1/#text0 -inserted #document/html0/body1/#comment2 -inserted #document/html0/body1/button3 -inserted #document/html0/body1/button3/#text0 -inserted #document/html0/body1/div4 -inserted #document/html0/body1/div4/#comment0 -inserted #document/html0/body1/div4/h11 -inserted #document/html0/body1/div4/h11/#text0 -inserted #document/html0/body1/div4/h11/#comment1 -inserted #document/html0/body1/div4/button2 -inserted #document/html0/body1/div4/button2/#text0 -inserted #document/html0/body1/div4/button2/#comment1 -inserted #document/html0/body1/div4/button2/#text2 -inserted #document/html0/body1/div4/button2/#comment3 -inserted #document/html0/body1/div4/button2/#text4 -inserted #document/html0/body1/div4/button2/#comment5 -inserted #document/html0/body1/div4/button2/#text6 -inserted #document/html0/body1/div4/button2/#comment7 -inserted #document/html0/body1/div4/button2/#text8 -inserted #document/html0/body1/div4/button2/#comment9 -inserted #document/html0/body1/div4/#comment3 -inserted #document/html0/body1/div4/script4 -inserted #document/html0/body1/div4/script4/#text0 -inserted #document/html0/body1/div4/#comment5 +inserted #document/html0/body1/#comment1 +inserted #document/html0/body1/button2 +inserted #document/html0/body1/button2/#text0 +inserted #document/html0/body1/div3 +inserted #document/html0/body1/div3/#comment0 +inserted #document/html0/body1/div3/h11 +inserted #document/html0/body1/div3/h11/#text0 +inserted #document/html0/body1/div3/h11/#comment1 +inserted #document/html0/body1/div3/button2 +inserted #document/html0/body1/div3/button2/#text0 +inserted #document/html0/body1/div3/button2/#comment1 +inserted #document/html0/body1/div3/button2/#text2 +inserted #document/html0/body1/div3/button2/#comment3 +inserted #document/html0/body1/div3/button2/#text4 +inserted #document/html0/body1/div3/button2/#comment5 +inserted #document/html0/body1/div3/button2/#text6 +inserted #document/html0/body1/div3/button2/#comment7 +inserted #document/html0/body1/div3/button2/#text8 +inserted #document/html0/body1/div3/button2/#comment9 +inserted #document/html0/body1/div3/#comment3 +inserted #document/html0/body1/div3/#comment4 +inserted #document/html0/body1/#comment4 inserted #document/html0/body1/#comment5 inserted #document/html0/body1/script6 inserted #document/html0/body1/script6/#text0 -inserted #document/html0/body1/#comment7 -inserted #document/html0/body1/script8 -inserted #document/html0/body1/script8/#text0 ``` \ No newline at end of file diff --git a/packages/translator-interop/src/__tests__/main.test.ts b/packages/translator-interop/src/__tests__/main.test.ts index 79814ece3..7984dff67 100644 --- a/packages/translator-interop/src/__tests__/main.test.ts +++ b/packages/translator-interop/src/__tests__/main.test.ts @@ -3,7 +3,7 @@ import path from "path"; import * as compiler from "@marko/compiler"; import register from "@marko/compiler/register"; import type { Input, Template } from "@marko/runtime-tags/common/types"; -import reorderRuntime from "@marko/runtime-tags/html/reorder-runtime"; +import { stripInlineRuntime } from "@marko/translator-tags/src/__tests__/utils/strip-inline-runtime"; import type { DOMWindow } from "jsdom"; import snap from "mocha-snap"; import glob from "tiny-glob"; @@ -11,12 +11,6 @@ import createBrowser from "../../../translator-tags/src/__tests__/utils/create-b import { isWait } from "../../../translator-tags/src/__tests__/utils/resolve"; import createMutationTracker from "../../../translator-tags/src/__tests__/utils/track-mutations"; -const runtimeId = "X"; -const reorderRuntimeString = String(reorderRuntime).replace( - "RUNTIME_ID", - runtimeId, -); - const baseConfig: compiler.Config = { translator: require.resolve(".."), babelConfig: { @@ -58,7 +52,7 @@ describe("translator-interop", () => { after(() => { // TODO: remove this once we have a better way to patch dynamic tags delete require("marko/src/runtime/helpers/dynamic-tag").___runtimeCompat; - require("@marko/runtime-tags/html").patchDynamicTag( + require("@marko/runtime-tags/html").compat.patchDynamicTag( (tag: any) => tag._ || tag.renderBody || tag, (v: any) => v, ); @@ -180,14 +174,9 @@ describe("translator-interop", () => { const tracker = createMutationTracker(browser.window, document); try { - const iteratable = serverTemplate.render(input); - for await (const data of iteratable) { - buffer += data; - tracker.log( - `# Write\n${indent( - data.replace(reorderRuntimeString, "REORDER_RUNTIME"), - )}`, - ); + for await (const chunk of serverTemplate.render(input)) { + buffer += chunk; + tracker.log(`# Write\n${indent(stripInlineRuntime(chunk))}`); } document.write(`${buffer}`); document.close(); diff --git a/packages/translator-tags/src/__tests__/fixtures/at-tags-dynamic-and-static/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/at-tags-dynamic-and-static/__snapshots__/html.expected/template.js index 8cb3f7779..84be19e26 100644 --- a/packages/translator-tags/src/__tests__/fixtures/at-tags-dynamic-and-static/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/at-tags-dynamic-and-static/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { nextScopeId as _nextScopeId, maybeFlush as _maybeFlush, peekNextScope as _peekNextScope, writeScope as _writeScope, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { nextScopeId as _nextScopeId, peekNextScope as _peekNextScope, writeScope as _writeScope, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; import _hello from "./components/hello/index.marko"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); @@ -10,7 +10,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { }) { const _scope2_id = _nextScopeId(); _item.push({}); - _maybeFlush(); } const _childScope = _peekNextScope(); _hello._({ diff --git a/packages/translator-tags/src/__tests__/fixtures/at-tags-dynamic/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/at-tags-dynamic/__snapshots__/html.expected/template.js index 1861f0ae5..46fcfcaba 100644 --- a/packages/translator-tags/src/__tests__/fixtures/at-tags-dynamic/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/at-tags-dynamic/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { write as _write, createRenderer as _createRenderer, register as _register, ensureScopeWithId as _ensureScopeWithId, writeScope as _writeScope, nextScopeId as _nextScopeId, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, getScopeById as _getScopeById, maybeFlush as _maybeFlush, escapeXML as _escapeXML, markResumeNode as _markResumeNode, peekNextScope as _peekNextScope, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, createRenderer as _createRenderer, register as _register, ensureScopeWithId as _ensureScopeWithId, writeScope as _writeScope, nextScopeId as _nextScopeId, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, getScopeById as _getScopeById, escapeXML as _escapeXML, markResumeNode as _markResumeNode, peekNextScope as _peekNextScope, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; import _hello from "./components/hello/index.marko"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); @@ -45,7 +45,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { "#text/0(": _ifRenderer, "#text/0!": _getScopeById(_ifScopeId) }); - _maybeFlush(); } let _i3 = 0; for (const col of [["a", "b"], ["c", "d"]]) { @@ -66,7 +65,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { "row": row }); _scope10_.set(_i, _getScopeById(_scope10_id)); - _maybeFlush(); } _col.push({ x: i, @@ -75,7 +73,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _writeScope(_scope8_id, { "col": col }); - _maybeFlush(); } _col.push({ outside: true, diff --git a/packages/translator-tags/src/__tests__/fixtures/attr-boolean-dynamic/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/attr-boolean-dynamic/__snapshots__/resume.expected.md index c8a9ee354..eca222728 100644 --- a/packages/translator-tags/src/__tests__/fixtures/attr-boolean-dynamic/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/attr-boolean-dynamic/__snapshots__/resume.expected.md @@ -6,14 +6,14 @@ - + - + @@ -33,14 +33,14 @@ container.querySelector("button").click() - + - + @@ -63,14 +63,14 @@ container.querySelector("button").click() - + - + @@ -91,14 +91,14 @@ container.querySelector("button").click() - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/attr-boolean-dynamic/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/attr-boolean-dynamic/__snapshots__/ssr.expected.md index 91038b5eb..680374fed 100644 --- a/packages/translator-tags/src/__tests__/fixtures/attr-boolean-dynamic/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/attr-boolean-dynamic/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -10,14 +10,14 @@ - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/attr-escape/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/attr-escape/__snapshots__/resume.expected.md index 3ae375d4d..c1389d178 100644 --- a/packages/translator-tags/src/__tests__/fixtures/attr-escape/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/attr-escape/__snapshots__/resume.expected.md @@ -9,7 +9,10 @@ foo="acb" nested="a c nested d b" /> - + + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/attr-escape/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/attr-escape/__snapshots__/ssr.expected.md index a6ef33598..fd445f0c0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/attr-escape/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/attr-escape/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
+
# Render "End" @@ -13,7 +13,10 @@ foo="acb" nested="a c nested d b" /> - + + ``` @@ -25,4 +28,6 @@ inserted #document/html0/head0 inserted #document/html0/body1 inserted #document/html0/body1/div0 inserted #document/html0/body1/#comment1 +inserted #document/html0/body1/script2 +inserted #document/html0/body1/script2/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/attr-template-literal-escape/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/attr-template-literal-escape/__snapshots__/resume.expected.md index 0ab0fdfef..e3863bc64 100644 --- a/packages/translator-tags/src/__tests__/fixtures/attr-template-literal-escape/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/attr-template-literal-escape/__snapshots__/resume.expected.md @@ -6,7 +6,10 @@
- + + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/attr-template-literal-escape/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/attr-template-literal-escape/__snapshots__/ssr.expected.md index bc76b2e30..c607d7e00 100644 --- a/packages/translator-tags/src/__tests__/fixtures/attr-template-literal-escape/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/attr-template-literal-escape/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
+
# Render "End" @@ -10,7 +10,10 @@
- + + ``` @@ -22,4 +25,6 @@ inserted #document/html0/head0 inserted #document/html0/body1 inserted #document/html0/body1/div0 inserted #document/html0/body1/#comment1 +inserted #document/html0/body1/script2 +inserted #document/html0/body1/script2/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-chain/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-chain/__snapshots__/resume.expected.md index 4779a6d3e..d95db3d88 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-chain/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-chain/__snapshots__/resume.expected.md @@ -5,8 +5,11 @@
6 - +
+ ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-chain/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-chain/__snapshots__/ssr.expected.md index 41237cca4..31e796ea2 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-chain/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-chain/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
6
+
6
# Render "End" @@ -9,8 +9,11 @@
6 - +
+ ``` @@ -23,4 +26,6 @@ inserted #document/html0/body1 inserted #document/html0/body1/div0 inserted #document/html0/body1/div0/#text0 inserted #document/html0/body1/div0/#comment1 +inserted #document/html0/body1/script1 +inserted #document/html0/body1/script1/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-attrs/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-attrs/__snapshots__/resume.expected.md index b35ffd5aa..26fdae6ac 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-attrs/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-attrs/__snapshots__/resume.expected.md @@ -5,11 +5,11 @@ - + @@ -30,11 +30,11 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-attrs/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-attrs/__snapshots__/ssr.expected.md index 57d3806e5..7bf4c8c6a 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-attrs/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-attrs/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-alias/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-alias/__snapshots__/resume.expected.md index 3e0ed1fde..3968f4993 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-alias/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-alias/__snapshots__/resume.expected.md @@ -5,11 +5,11 @@ - + @@ -30,11 +30,11 @@ container.querySelector("button").click() - + @@ -55,11 +55,11 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-alias/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-alias/__snapshots__/ssr.expected.md index cb075cab3..b169142c6 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-alias/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-alias/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias-within-pattern/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias-within-pattern/__snapshots__/resume.expected.md index 53608a651..96263c293 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias-within-pattern/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias-within-pattern/__snapshots__/resume.expected.md @@ -5,15 +5,15 @@ - + @@ -34,15 +34,15 @@ container.querySelector("button").click() - + @@ -64,15 +64,15 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias-within-pattern/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias-within-pattern/__snapshots__/ssr.expected.md index 4263c2401..13913721e 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias-within-pattern/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias-within-pattern/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,15 +9,15 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias/__snapshots__/resume.expected.md index 218e2bc45..d0bb266c6 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias/__snapshots__/resume.expected.md @@ -5,15 +5,15 @@ - + @@ -34,15 +34,15 @@ container.querySelector("button").click() - + @@ -64,15 +64,15 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias/__snapshots__/ssr.expected.md index 0d77c02e7..d459ebff9 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-input-same-source-alias/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,15 +9,15 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-input/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-input/__snapshots__/resume.expected.md index a716cbf59..bf7378d23 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-input/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-input/__snapshots__/resume.expected.md @@ -5,11 +5,11 @@ - + @@ -30,11 +30,11 @@ container.querySelector("button").click() - + @@ -55,11 +55,11 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-input/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-input/__snapshots__/ssr.expected.md index d1d972047..ee4567a7e 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-input/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-input/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-renderBody/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-renderBody/__snapshots__/resume.expected.md index d8a5bac1b..0c100aaa2 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-renderBody/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-renderBody/__snapshots__/resume.expected.md @@ -4,14 +4,14 @@ - + @@ -31,14 +31,14 @@ container.querySelector("button").click() - + @@ -58,14 +58,14 @@ container.querySelector("button").click() - + @@ -85,14 +85,14 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component-renderBody/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component-renderBody/__snapshots__/ssr.expected.md index b9f2955a2..cf05e4ca1 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component-renderBody/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component-renderBody/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -8,14 +8,14 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component/__snapshots__/resume.expected.md index c4a4d57da..ccfe29f66 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component/__snapshots__/resume.expected.md @@ -6,12 +6,12 @@
- +
@@ -33,12 +33,12 @@ container.querySelector("button").click()
- +
diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-component/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-component/__snapshots__/ssr.expected.md index 9b6c890fd..68a52ecfd 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-component/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-component/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
+
# Render "End" @@ -10,12 +10,12 @@
- +
diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-conditional-counter-multiple-nodes/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-conditional-counter-multiple-nodes/__snapshots__/resume.expected.md index db53d3368..dde876005 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-conditional-counter-multiple-nodes/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-conditional-counter-multiple-nodes/__snapshots__/resume.expected.md @@ -6,19 +6,19 @@ The count is 0 + The count is 0 # Render "End" @@ -10,19 +10,19 @@ 0 + 0 # Render "End" @@ -10,18 +10,18 @@ - + - +
0 - +
@@ -49,22 +49,22 @@ container.querySelector("button#count").click() increase multiplier ( 1 - + ) - + - +
1 - +
@@ -89,22 +89,22 @@ container.querySelector("button#count").click() increase multiplier ( 1 - + ) - + - +
2 - +
@@ -129,22 +129,22 @@ container.querySelector("button#multiplier").click() increase multiplier ( 2 - + ) - + - +
4 - +
diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-counter-multiplier/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-counter-multiplier/__snapshots__/ssr.expected.md index 36e90a55d..99b172e26 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-counter-multiplier/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-counter-multiplier/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
0
+
0
# Render "End" @@ -13,22 +13,22 @@ increase multiplier ( 1 - + ) - + - +
0 - +
diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-counter/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-counter/__snapshots__/resume.expected.md index 00f42253c..44fe17d1f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-counter/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-counter/__snapshots__/resume.expected.md @@ -6,12 +6,12 @@
- +
@@ -33,12 +33,12 @@ container.querySelector("button").click()
- +
@@ -60,12 +60,12 @@ container.querySelector("button").click()
- +
@@ -87,12 +87,12 @@ container.querySelector("button").click()
- +
diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-counter/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-counter/__snapshots__/ssr.expected.md index 7d3e031ab..d4fbb7d68 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-counter/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-counter/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
+
# Render "End" @@ -10,12 +10,12 @@
- +
diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-dynamic-native-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-dynamic-native-tag/__snapshots__/resume.expected.md index 9a3cd64aa..5e25c29ca 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-dynamic-native-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-dynamic-native-tag/__snapshots__/resume.expected.md @@ -1,17 +1,17 @@ # Render {"tagName":"h1"} ```html + -

Hello World

- + @@ -19,6 +19,5 @@ # Mutations ``` -removed #document/html0/body1/#comment0 before #document/html0 -inserted #document/html0/body1/#comment0 + ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-dynamic-native-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-dynamic-native-tag/__snapshots__/ssr.expected.md index 0518cdf1d..e6aad03e6 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-dynamic-native-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-dynamic-native-tag/__snapshots__/ssr.expected.md @@ -1,10 +1,10 @@ # Write -

Hello World

+

Hello World

# Render "End" ```html - + @@ -13,9 +13,9 @@ > Hello World - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-effect-no-deps/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-effect-no-deps/__snapshots__/resume.expected.md index 92ee879c6..abb2216d5 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-effect-no-deps/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-effect-no-deps/__snapshots__/resume.expected.md @@ -3,7 +3,7 @@ (M$h=[]).push(_=>(null),[0,"packages/translator-tags/src/__tests__/fixtures/basic-effect-no-deps/template.marko_0",]) + # Render "End" @@ -7,7 +7,7 @@ diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-execution-order/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-execution-order/__snapshots__/resume.expected.md index 07efa28e8..7eec44f22 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-execution-order/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-execution-order/__snapshots__/resume.expected.md @@ -6,12 +6,12 @@ - + hi - - + + @@ -33,11 +33,11 @@ container.querySelector("button").click() - - - + + + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-execution-order/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-execution-order/__snapshots__/ssr.expected.md index ca13dc57e..4063b745e 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-execution-order/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-execution-order/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - hi + hi # Render "End" @@ -10,12 +10,12 @@ - + hi - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-export/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-export/__snapshots__/resume.expected.md index 2801c210b..4e32bf58b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-export/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-export/__snapshots__/resume.expected.md @@ -5,8 +5,11 @@
123 - +
+ ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-export/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-export/__snapshots__/ssr.expected.md index af67670d9..51b95eb8b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-export/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-export/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
123
+
123
# Render "End" @@ -9,8 +9,11 @@
123 - +
+ ``` @@ -23,4 +26,6 @@ inserted #document/html0/body1 inserted #document/html0/body1/div0 inserted #document/html0/body1/div0/#text0 inserted #document/html0/body1/div0/#comment1 +inserted #document/html0/body1/script1 +inserted #document/html0/body1/script1/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-fn-with-block/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-fn-with-block/__snapshots__/resume.expected.md index 6553dc066..17b9a4bde 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-fn-with-block/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-fn-with-block/__snapshots__/resume.expected.md @@ -5,11 +5,11 @@ - + @@ -30,11 +30,11 @@ container.querySelector("button").click() - + @@ -55,11 +55,11 @@ container.querySelector("button").click() - + @@ -80,11 +80,11 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-fn-with-block/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-fn-with-block/__snapshots__/ssr.expected.md index a6ecb51a5..72d1ebc2c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-fn-with-block/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-fn-with-block/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-handler-multi-ref-nested/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-handler-multi-ref-nested/__snapshots__/resume.expected.md index ef1fe366a..436997b3b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-handler-multi-ref-nested/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-handler-multi-ref-nested/__snapshots__/resume.expected.md @@ -5,11 +5,11 @@ - + @@ -30,11 +30,11 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-handler-multi-ref-nested/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-handler-multi-ref-nested/__snapshots__/ssr.expected.md index db46c23bf..187784bf4 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-handler-multi-ref-nested/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-handler-multi-ref-nested/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-handler-refless/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-handler-refless/__snapshots__/resume.expected.md index 2f4194f7d..10778f6fd 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-handler-refless/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-handler-refless/__snapshots__/resume.expected.md @@ -5,11 +5,11 @@ - + @@ -30,11 +30,11 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-handler-refless/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-handler-refless/__snapshots__/ssr.expected.md index c48e83417..69e22dff6 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-handler-refless/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-handler-refless/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/__snapshots__/html.expected/components/comments.js b/packages/translator-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/__snapshots__/html.expected/components/comments.js index 9d1692476..c4c03bce0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/__snapshots__/html.expected/components/comments.js +++ b/packages/translator-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/__snapshots__/html.expected/components/comments.js @@ -1,4 +1,4 @@ -import { write as _write, markResumeScopeStart as _markResumeScopeStart, attr as _attr, escapeXML as _escapeXML, markResumeNode as _markResumeNode, peekNextScope as _peekNextScope, ensureScopeWithId as _ensureScopeWithId, writeScope as _writeScope, nextScopeId as _nextScopeId, createRenderer as _createRenderer, register as _register, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, getScopeById as _getScopeById, markResumeControlEnd as _markResumeControlEnd, writeEffect as _writeEffect, maybeFlush as _maybeFlush, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, markResumeScopeStart as _markResumeScopeStart, attr as _attr, escapeXML as _escapeXML, markResumeNode as _markResumeNode, peekNextScope as _peekNextScope, ensureScopeWithId as _ensureScopeWithId, writeScope as _writeScope, nextScopeId as _nextScopeId, createRenderer as _createRenderer, register as _register, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, getScopeById as _getScopeById, markResumeControlEnd as _markResumeControlEnd, writeEffect as _writeEffect, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; import _comments from "./comments.marko"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); @@ -37,7 +37,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { "_": _ensureScopeWithId(_scope0_id) }); _scope1_.set(i, _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlEnd(_scope0_id, "#ul/0")}${_markResumeNode(_scope0_id, "#ul/0")}`); _writeScope(_scope0_id, { diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/__snapshots__/ssr.expected.md index be83668ed..b28fcb405 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-inert-collapsible-tree/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
  • Hello World
    • testing 123
  • Goodbye World
+
  • Hello World
    • testing 123
  • Goodbye World
# Render "End" @@ -8,63 +8,63 @@
    - +
  • Hello World - + - +
      - +
    • testing 123 - + - - + +
    • - - + +
    - - + +
  • - - + +
  • Goodbye World - + - - + +
  • - - + +
- + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-layout/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-layout/__snapshots__/resume.expected.md index 00443fda7..abb9e8277 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-layout/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-layout/__snapshots__/resume.expected.md @@ -3,16 +3,16 @@ - +

Hello World - +

- + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-layout/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-layout/__snapshots__/ssr.expected.md index 739cf878f..f017613a3 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-layout/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-layout/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -

Hello World

+

Hello World

# Render "End" @@ -7,16 +7,16 @@ - +

Hello World - +

- + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-custom-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-custom-tag/__snapshots__/resume.expected.md index 572c8154b..b8a240005 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-custom-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-custom-tag/__snapshots__/resume.expected.md @@ -3,15 +3,15 @@ - + - - + + @@ -31,15 +31,15 @@ container.querySelector("button").click() - + - - + + @@ -58,15 +58,15 @@ container.querySelector("button").click() - + - - + + @@ -85,15 +85,15 @@ container.querySelector("button").click() - + - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-custom-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-custom-tag/__snapshots__/ssr.expected.md index 166321d14..57d60c9c7 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-custom-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-custom-tag/__snapshots__/ssr.expected.md @@ -1,21 +1,21 @@ # Write - + # Render "End" ```html - + - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-dynamic-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-dynamic-tag/__snapshots__/resume.expected.md index 710f4cc71..4942ccc35 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-dynamic-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-dynamic-tag/__snapshots__/resume.expected.md @@ -3,17 +3,17 @@ - - + + - - - + + + @@ -35,17 +35,17 @@ container.querySelector("button").click() - - + + - - - + + + @@ -64,17 +64,17 @@ container.querySelector("button").click() - - + + - - - + + + @@ -93,17 +93,17 @@ container.querySelector("button").click() - - + + - - - + + + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-dynamic-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-dynamic-tag/__snapshots__/ssr.expected.md index 134ec71fb..117022d95 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-dynamic-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-dynamic-tag/__snapshots__/ssr.expected.md @@ -1,23 +1,23 @@ # Write - + # Render "End" ```html - - + + - - - + + + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/html.expected/template.js index 1aaa38a72..86e43acd4 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { attr as _attr, escapeXML as _escapeXML, markResumeNode as _markResumeNode, write as _write, ensureScopeWithId as _ensureScopeWithId, writeEffect as _writeEffect, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { attr as _attr, escapeXML as _escapeXML, markResumeNode as _markResumeNode, write as _write, ensureScopeWithId as _ensureScopeWithId, writeEffect as _writeEffect, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const selected = 0; @@ -14,7 +14,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { "_": _ensureScopeWithId(_scope0_id) }); _scope1_.set(_i, _getScopeById(_scope1_id)); - _maybeFlush(); } _writeScope(_scope0_id, { "#text/0(": _scope1_.size ? _scope1_ : undefined diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/resume.expected.md index 017e95125..f5816da08 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/resume.expected.md @@ -5,66 +5,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -85,79 +85,79 @@ c => click(c, 2) - + - + - + - + - + - + - + - + - + - + - + - + @@ -184,75 +184,75 @@ c => click(c, 3) - + - + - + - + - + - + - + - + - + - + - + - + @@ -282,71 +282,71 @@ c => click(c, 5) - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/ssr.expected.md index 87738febf..8c0f6b2ac 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-for/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,66 +9,66 @@ - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-if/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-if/__snapshots__/resume.expected.md index d6521af1b..4198df741 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-if/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-if/__snapshots__/resume.expected.md @@ -6,13 +6,13 @@
- - + +
@@ -35,11 +35,11 @@ container.querySelector("button").click() - - + +
@@ -64,11 +64,11 @@ container.querySelector("button").click() - - + +
@@ -91,11 +91,11 @@ container.querySelector("button").click() The button was clicked 3 times. - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-if/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-if/__snapshots__/ssr.expected.md index 9ba79edd8..359071f7c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-if/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-nested-scope-if/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
+
# Render "End" @@ -10,13 +10,13 @@
- - + +
diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/html.expected/template.js index 75e38e2ae..aef58e4e3 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, writeEffect as _writeEffect, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, writeEffect as _writeEffect, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const id = 0; @@ -14,7 +14,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`${_escapeXML(item)}${_markResumeNode(_scope1_id, "#text/0")}`); _writeScope(_scope1_id, {}); _scope1_.set(_i, _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#text/0", _forScopeIds)}${_markResumeNode(_scope0_id, "#button/1")}${_markResumeNode(_scope0_id, "#button/2")}`); _writeEffect(_scope0_id, "packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/template.marko_0_items"); diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/resume.expected.md index 9bcd9f931..2d6c66e34 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/resume.expected.md @@ -4,22 +4,22 @@
- + - + - +
@@ -45,16 +45,16 @@ container.querySelector("#add").click() > Add - + - + @@ -81,16 +81,16 @@ container.querySelector("#add").click() > Add - + - + @@ -116,16 +116,16 @@ container.querySelector("#remove").click() > Add - + - + @@ -151,16 +151,16 @@ container.querySelector("#add").click() > Add - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/ssr.expected.md index 3afc81cdc..9492bbc80 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-push-pop-list/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
+
# Render "End" @@ -8,22 +8,22 @@
- + - + - +
diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/html.expected/template.js index db22594c0..2b1af9ea5 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { attr as _attr, write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, writeEffect as _writeEffect, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { attr as _attr, write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, writeEffect as _writeEffect, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const open = true; @@ -17,7 +17,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`
  • ${_escapeXML(x)}${_markResumeNode(_scope1_id, "#text/0")}
  • `); _writeScope(_scope1_id, {}); _scope1_.set(_by(x, _i), _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#ul/0", _forScopeIds)}${_markResumeNode(_scope0_id, "#ul/0")}${_markResumeNode(_scope0_id, "#button/1")}${_markResumeNode(_scope0_id, "#button/2")}`); _writeEffect(_scope0_id, "packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/template.marko_0_list"); diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/resume.expected.md index 7a642ed96..87aee98f7 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/resume.expected.md @@ -6,33 +6,33 @@
    • 1 - +
    • 2 - +
    • 3 - +
    • - +
    - + - + - + @@ -56,33 +56,33 @@ container.querySelector("#toggle").click() >
  • 1 - +
  • 2 - +
  • 3 - +
  • - + - + - + - + @@ -104,33 +104,33 @@ container.querySelector("#toggle").click()
    • 1 - +
    • 2 - +
    • 3 - +
    • - +
    - + - + - + @@ -152,33 +152,33 @@ container.querySelector("#reverse").click()
    • 3 - +
    • 2 - +
    • 1 - +
    • - +
    - + - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/ssr.expected.md index 93ecc09b3..dc6767e67 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-shared-node-ref/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    • 1
    • 2
    • 3
    +
    • 1
    • 2
    • 3
    # Render "End" @@ -10,33 +10,33 @@
    • 1 - +
    • 2 - +
    • 3 - +
    • - +
    - + - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-toggle-show/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-toggle-show/__snapshots__/resume.expected.md index b5311d3ef..9fe1a023c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-toggle-show/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-toggle-show/__snapshots__/resume.expected.md @@ -5,14 +5,14 @@
    Hello! - + - +
    @@ -32,14 +32,14 @@ container.querySelector("button").click()
    - + - +
    @@ -65,10 +65,10 @@ container.querySelector("button").click() - + @@ -89,14 +89,14 @@ container.querySelector("button").click()
    - + - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-toggle-show/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-toggle-show/__snapshots__/ssr.expected.md index c7ccb6ea4..e750fdd70 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-toggle-show/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-toggle-show/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    Hello!
    +
    Hello!
    # Render "End" @@ -9,14 +9,14 @@
    Hello! - + - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-unused-ref/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-unused-ref/__snapshots__/resume.expected.md index f7d2a529e..796bb356d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-unused-ref/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-unused-ref/__snapshots__/resume.expected.md @@ -6,12 +6,12 @@
    - +
    @@ -33,12 +33,12 @@ container.querySelector("button").click()
    - +
    @@ -60,12 +60,12 @@ container.querySelector("button").click()
    - +
    @@ -87,12 +87,12 @@ container.querySelector("button").click()
    - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/basic-unused-ref/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/basic-unused-ref/__snapshots__/ssr.expected.md index 8c101ea8b..b73f8150c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/basic-unused-ref/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/basic-unused-ref/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -10,12 +10,12 @@
    - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/batched-updates-cleanup/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/batched-updates-cleanup/__snapshots__/resume.expected.md index dd0bad0dc..70f3838c2 100644 --- a/packages/translator-tags/src/__tests__/fixtures/batched-updates-cleanup/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/batched-updates-cleanup/__snapshots__/resume.expected.md @@ -4,14 +4,14 @@ hi + hi # Render "End" @@ -8,14 +8,14 @@ - + @@ -30,11 +30,11 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/batched-updates/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/batched-updates/__snapshots__/ssr.expected.md index 415bb5783..55fa197b6 100644 --- a/packages/translator-tags/src/__tests__/fixtures/batched-updates/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/batched-updates/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/body-content/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/body-content/__snapshots__/resume.expected.md index 08b3f1958..ff1e3d834 100644 --- a/packages/translator-tags/src/__tests__/fixtures/body-content/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/body-content/__snapshots__/resume.expected.md @@ -4,14 +4,14 @@ - + @@ -31,14 +31,14 @@ container.querySelector("button").click() - + @@ -58,14 +58,14 @@ container.querySelector("button").click() - + @@ -85,14 +85,14 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/body-content/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/body-content/__snapshots__/ssr.expected.md index 80a703f32..d68b9afb3 100644 --- a/packages/translator-tags/src/__tests__/fixtures/body-content/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/body-content/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -8,14 +8,14 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/catch-single-reject-async/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/catch-single-reject-async/__snapshots__/ssr.expected.md index a73951d00..7858cac59 100644 --- a/packages/translator-tags/src/__tests__/fixtures/catch-single-reject-async/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/catch-single-reject-async/__snapshots__/ssr.expected.md @@ -1,17 +1,26 @@ # Write - ab + ab # Write - ERROR!efg + efgERROR! # Render "End" ```html - + + + aERROR!efg + ``` @@ -24,15 +33,20 @@ inserted #document/html0/body1 inserted #document/html0/body1/#text0 inserted #comment inserted #text +inserted #comment +inserted #document/html0/body1/#text2 +inserted #document/html0/head0/style0 +inserted #document/html0/head0/style0/#text0 inserted t inserted #document/html0/body1/#text1 -inserted script -inserted script/#text0 +inserted #document/html0/body1/script3 +inserted #document/html0/body1/script3/#text0 +removed #document/html0/head0/style0 after #document/html0/body1/#text2 +inserted #document/html0/head0/style0 +removed #text after #comment +removed #comment after #comment removed #document/html0/body1/#text1 in t +removed #comment after #document/html0/body1/#text0 inserted #document/html0/body1/#text1 -removed script after t -removed t after #text -removed #comment after #document/html0/body1/#text1 -removed #text after #document/html0/body1/#text1 -#document/html0/body1/#text1: "ERROR!" => "ERROR!efg" +removed t after #document/html0/body1/#text2 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/catch-single-reject-async/server.ts b/packages/translator-tags/src/__tests__/fixtures/catch-single-reject-async/server.ts index 762d80e1f..e3829a8d4 100644 --- a/packages/translator-tags/src/__tests__/fixtures/catch-single-reject-async/server.ts +++ b/packages/translator-tags/src/__tests__/fixtures/catch-single-reject-async/server.ts @@ -15,7 +15,7 @@ const renderer = () => { write("d"); }, (err) => { - write(err.message); + write((err as Error).message); }, ); write("e"); diff --git a/packages/translator-tags/src/__tests__/fixtures/catch-single-success-async/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/catch-single-success-async/__snapshots__/ssr.expected.md index f94c1b7d8..4282a72f2 100644 --- a/packages/translator-tags/src/__tests__/fixtures/catch-single-success-async/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/catch-single-success-async/__snapshots__/ssr.expected.md @@ -1,9 +1,9 @@ # Write - ab + ab # Write - cdfgh + cdfgh # Render "End" @@ -12,9 +12,9 @@ a - + bcd - + fgh diff --git a/packages/translator-tags/src/__tests__/fixtures/catch-single-throw-sync/server.ts b/packages/translator-tags/src/__tests__/fixtures/catch-single-throw-sync/server.ts index 1e77377b4..01411845f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/catch-single-throw-sync/server.ts +++ b/packages/translator-tags/src/__tests__/fixtures/catch-single-throw-sync/server.ts @@ -8,7 +8,7 @@ const renderer = () => { throw new Error("ERROR!"); }, (err) => { - write(err.message); + write((err as Error).message); }, ); write("d"); diff --git a/packages/translator-tags/src/__tests__/fixtures/component-attrs-import-value/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/component-attrs-import-value/__snapshots__/ssr.expected.md index 931841784..aa913fd76 100644 --- a/packages/translator-tags/src/__tests__/fixtures/component-attrs-import-value/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/component-attrs-import-value/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/component-attrs-intersection/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/component-attrs-intersection/__snapshots__/resume.expected.md index 4d79725c7..61c0a3220 100644 --- a/packages/translator-tags/src/__tests__/fixtures/component-attrs-intersection/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/component-attrs-intersection/__snapshots__/resume.expected.md @@ -5,12 +5,12 @@
    0 - +
    +
    0
    # Render "End" @@ -9,12 +9,12 @@
    0 - +
    + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/const-tag-destructure/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/const-tag-destructure/__snapshots__/resume.expected.md index 3c76055b9..cdc8d265a 100644 --- a/packages/translator-tags/src/__tests__/fixtures/const-tag-destructure/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/const-tag-destructure/__snapshots__/resume.expected.md @@ -5,10 +5,13 @@
    1 - +
    2 - + + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/const-tag-destructure/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/const-tag-destructure/__snapshots__/ssr.expected.md index 55cad9b1c..92fc78e0b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/const-tag-destructure/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/const-tag-destructure/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    1
    2 +
    1
    2 # Render "End" @@ -9,10 +9,13 @@
    1 - +
    2 - + + ``` @@ -27,4 +30,6 @@ inserted #document/html0/body1/div0/#text0 inserted #document/html0/body1/div0/#comment1 inserted #document/html0/body1/#text1 inserted #document/html0/body1/#comment2 +inserted #document/html0/body1/script3 +inserted #document/html0/body1/script3/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/counter-intersection/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/counter-intersection/__snapshots__/resume.expected.md index 759d97f1d..638e5acf0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/counter-intersection/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/counter-intersection/__snapshots__/resume.expected.md @@ -8,24 +8,24 @@ class="a" > 0 - + - + + - + = 0 - + @@ -49,24 +49,24 @@ container.querySelector("button.a").click() class="a" > 10 - + - + + - + = 10 - + @@ -91,24 +91,24 @@ container.querySelector("button.b").click() class="a" > 10 - + - + + - + = 15 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/counter-intersection/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/counter-intersection/__snapshots__/ssr.expected.md index bb6119b82..68d955236 100644 --- a/packages/translator-tags/src/__tests__/fixtures/counter-intersection/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/counter-intersection/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    + = 0
    +
    + = 0
    # Render "End" @@ -12,24 +12,24 @@ class="a" > 0 - + - + + - + = 0 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/html.expected/template.js index 420ada1ab..af7547b4e 100644 --- a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { write as _write, markResumeScopeStart as _markResumeScopeStart, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlEnd as _markResumeControlEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, markResumeScopeStart as _markResumeScopeStart, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlEnd as _markResumeControlEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); _write("
    "); @@ -9,7 +9,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`${_markResumeScopeStart(_scope1_id)}${_escapeXML(n)}${_markResumeNode(_scope1_id, "#text/0")}, `); _writeScope(_scope1_id, {}); _scope1_.set(n, _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlEnd(_scope0_id, "#div/0")}
    ${_markResumeNode(_scope0_id, "#div/0")}`); _writeScope(_scope0_id, { diff --git a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/resume.expected.md index 631dacc74..549f6355c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/resume.expected.md @@ -4,27 +4,27 @@
    - + 0 - + , - + 1 - + , - + 2 - + , - + 3 - + , - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/ssr.expected.md index c2762ee2f..b9ec697f8 100644 --- a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-from/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    0, 1, 2, 3,
    +
    0, 1, 2, 3,
    # Render "End" @@ -8,27 +8,27 @@
    - + 0 - + , - + 1 - + , - + 2 - + , - + 3 - + , - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/html.expected/template.js index 065a2d5f9..7446ce81c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); _write("
    "); @@ -11,7 +11,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`

    ${_escapeXML(key)}${_markResumeNode(_scope1_id, "#text/0")}: ${_escapeXML(text)}${_markResumeNode(_scope1_id, "#text/1")}

    `); _writeScope(_scope1_id, {}); _scope1_.set(key, _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#text/0", _forScopeIds)}`); const _forScopeIds2 = [], @@ -22,7 +21,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`

    ${_escapeXML(key)}${_markResumeNode(_scope2_id, "#text/0")}

    `); _writeScope(_scope2_id, {}); _scope2_.set(key, _getScopeById(_scope2_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#text/1", _forScopeIds2)}
    `); _writeScope(_scope0_id, { diff --git a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/resume.expected.md index e31b3b3b8..9bcee0b48 100644 --- a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/resume.expected.md @@ -6,45 +6,45 @@

    1 - + : a - +

    2 - + : b - +

    3 - + : c - +

    - +

    1 - +

    2 - +

    3 - +

    - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/ssr.expected.md index 5bb195f3f..12f591a7b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/create-and-clear-rows-loop-in/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -

    1: a

    2: b

    3: c

    1

    2

    3

    +

    1: a

    2: b

    3: c

    1

    2

    3

    # Render "End" @@ -10,45 +10,45 @@

    1 - + : a - +

    2 - + : b - +

    3 - + : c - +

    - +

    1 - +

    2 - +

    3 - +

    - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-default-value/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-default-value/__snapshots__/resume.expected.md index a66396b5e..0f632d7b9 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-default-value/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-default-value/__snapshots__/resume.expected.md @@ -5,14 +5,14 @@ 3 - + y - + diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-default-value/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-default-value/__snapshots__/ssr.expected.md index 8049668f5..d3e87dbc5 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-default-value/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-default-value/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - 3 y + 3 y # Render "End" @@ -9,14 +9,14 @@ 3 - + y - + diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-args/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-args/__snapshots__/ssr.expected.md index ea1356a0e..61cc17d8b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-args/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-args/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    Counts: 1,10
    +
    Counts: 1,10
    # Render "End" @@ -11,27 +11,27 @@ class="inc" > 1 - + , 10 - + - - + +
    Counts: 1 - + , 10 - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-attributes/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-attributes/__snapshots__/ssr.expected.md index 6d10234e9..690f2af3f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-attributes/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-attributes/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    Count (hello): 1
    +
    Count (hello): 1
    # Render "End" @@ -11,23 +11,23 @@ class="inc" > 1 - + - - + +
    Count ( hello - + ): 1 - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-single-arg/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-single-arg/__snapshots__/ssr.expected.md index 0899b4154..72725b996 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-single-arg/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-parameters-from-single-arg/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    Count: 1
    +
    Count: 1
    # Render "End" @@ -11,19 +11,19 @@ class="inc" > 1 - + - - + +
    Count: 1 - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-render-body/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-render-body/__snapshots__/resume.expected.md index da5d5fd21..cb3b759a5 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-render-body/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-render-body/__snapshots__/resume.expected.md @@ -1,13 +1,13 @@ # Render undefined ```html + - This is the body content - + @@ -15,6 +15,5 @@ # Mutations ``` -removed #document/html0/body1/#comment0 before #document/html0 -inserted #document/html0/body1/#comment0 + ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-render-body/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-render-body/__snapshots__/ssr.expected.md index 8097f2a6c..848c96743 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-render-body/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-render-body/__snapshots__/ssr.expected.md @@ -1,17 +1,17 @@ # Write - This is the body content + This is the body content # Render "End" ```html - + This is the body content - + diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-template/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-template/__snapshots__/resume.expected.md index cb5fade03..03fc641ea 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-template/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-template/__snapshots__/resume.expected.md @@ -6,10 +6,10 @@ Hello Frank - + ! diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-template/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-template/__snapshots__/ssr.expected.md index 1465fa076..2debf094e 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-template/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-template/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - Hello Frank! + Hello Frank! # Render "End" @@ -10,10 +10,10 @@ Hello Frank - + ! diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-expression/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-expression/__snapshots__/resume.expected.md index 92c510d98..4d0ed337d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-expression/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-expression/__snapshots__/resume.expected.md @@ -8,10 +8,10 @@
    4 - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-expression/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-expression/__snapshots__/ssr.expected.md index 7fbe43c4a..484096447 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-expression/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-expression/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - child
    4
    + child
    4
    # Render "End" @@ -12,10 +12,10 @@
    4 - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-multiple/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-multiple/__snapshots__/resume.expected.md index 6f53896cf..e8a06fbaa 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-multiple/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-multiple/__snapshots__/resume.expected.md @@ -8,10 +8,10 @@
    3 - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-multiple/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-multiple/__snapshots__/ssr.expected.md index 545dcd545..a46b43cbb 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-multiple/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var-multiple/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - child
    3
    + child
    3
    # Render "End" @@ -12,10 +12,10 @@
    3 - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var/__snapshots__/resume.expected.md index 811375b12..947d63e05 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var/__snapshots__/resume.expected.md @@ -7,15 +7,15 @@ class="inc" > 1 - + - +
    1 - +
    @@ -38,15 +38,15 @@ container.querySelector("button.inc").click() class="inc" > 2 - + - +
    2 - +
    @@ -70,15 +70,15 @@ container.querySelector("button.inc").click() class="inc" > 3 - + - +
    3 - +
    @@ -102,15 +102,15 @@ container.querySelector("button.inc").click() class="inc" > 4 - + - +
    4 - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var/__snapshots__/ssr.expected.md index 8a81d9437..6bd6e960c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/custom-tag-var/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/custom-tag-var/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    1
    +
    1
    # Render "End" @@ -11,15 +11,15 @@ class="inc" > 1 - + - +
    1 - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/define-tag-for-attribute-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/define-tag-for-attribute-tag/__snapshots__/ssr.expected.md index 38815332f..293cea4cc 100644 --- a/packages/translator-tags/src/__tests__/fixtures/define-tag-for-attribute-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/define-tag-for-attribute-tag/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    The thing
    +
    The thing
    # Render "End" @@ -8,19 +8,19 @@
    - + The thing - +
    - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/define-tag-object/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/define-tag-object/__snapshots__/resume.expected.md index 459256c9a..64e499a99 100644 --- a/packages/translator-tags/src/__tests__/fixtures/define-tag-object/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/define-tag-object/__snapshots__/resume.expected.md @@ -5,15 +5,15 @@
    {"foo":1,"bar":2} - +
    - + @@ -34,15 +34,15 @@ container.querySelector("button").click()
    {"foo":1,"bar":3} - +
    - + @@ -64,15 +64,15 @@ container.querySelector("button").click()
    {"foo":1,"bar":4} - +
    - + @@ -94,15 +94,15 @@ container.querySelector("button").click()
    {"foo":1,"bar":5} - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/define-tag-object/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/define-tag-object/__snapshots__/ssr.expected.md index b1879b0c1..a572336bb 100644 --- a/packages/translator-tags/src/__tests__/fixtures/define-tag-object/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/define-tag-object/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    {"foo":1,"bar":2}
    +
    {"foo":1,"bar":2}
    # Render "End" @@ -9,15 +9,15 @@
    {"foo":1,"bar":2} - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/define-tag-render-args/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/define-tag-render-args/__snapshots__/ssr.expected.md index 71d8f366a..9c7a89f27 100644 --- a/packages/translator-tags/src/__tests__/fixtures/define-tag-render-args/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/define-tag-render-args/__snapshots__/ssr.expected.md @@ -1,33 +1,33 @@ # Write -
    1|Hello|1
    +
    1|Hello|1
    # Render "End" ```html - +
    1 - + | Hello - + | 1 - +
    - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/define-tag-render-attr-signal/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/define-tag-render-attr-signal/__snapshots__/ssr.expected.md index 106626b7e..8e206aa57 100644 --- a/packages/translator-tags/src/__tests__/fixtures/define-tag-render-attr-signal/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/define-tag-render-attr-signal/__snapshots__/ssr.expected.md @@ -1,25 +1,25 @@ # Write -
    1
    +
    1
    # Render "End" ```html - +
    1 - +
    - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/define-tag-render-closure/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/define-tag-render-closure/__snapshots__/ssr.expected.md index fd4133f67..8676e8331 100644 --- a/packages/translator-tags/src/__tests__/fixtures/define-tag-render-closure/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/define-tag-render-closure/__snapshots__/ssr.expected.md @@ -1,25 +1,25 @@ # Write -
    1
    +
    1
    # Render "End" ```html - +
    1 - +
    - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/define-tag-render/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/define-tag-render/__snapshots__/resume.expected.md index 067b96120..77293151d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/define-tag-render/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/define-tag-render/__snapshots__/resume.expected.md @@ -3,25 +3,25 @@ - +
    Hello Ryan - + 1 - +
    - - + + @@ -41,25 +41,25 @@ container.querySelector("button").click() - +
    Hello Ryan - + 2 - +
    - - + + @@ -79,25 +79,25 @@ container.querySelector("button").click() - +
    Hello Ryan - + 3 - +
    - - + + @@ -117,25 +117,25 @@ container.querySelector("button").click() - +
    Hello Ryan - + 4 - +
    - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/define-tag-render/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/define-tag-render/__snapshots__/ssr.expected.md index 643ff2ac1..385c1ff8a 100644 --- a/packages/translator-tags/src/__tests__/fixtures/define-tag-render/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/define-tag-render/__snapshots__/ssr.expected.md @@ -1,10 +1,10 @@ # Write -
    Hello Ryan 1
    +
    Hello Ryan 1
    # Render "End" ```html - + @@ -12,20 +12,20 @@ Hello Ryan - + 1 - + - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/do-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/do-tag/__snapshots__/resume.expected.md index dab681ae7..4f8489ff5 100644 --- a/packages/translator-tags/src/__tests__/fixtures/do-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/do-tag/__snapshots__/resume.expected.md @@ -5,9 +5,9 @@ {"let":"rendered","const":"rendered","static":"rendered","block":"rendered"} - + diff --git a/packages/translator-tags/src/__tests__/fixtures/do-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/do-tag/__snapshots__/ssr.expected.md index 8ee9b0103..0c3b631a0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/do-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/do-tag/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - {"let":"rendered","const":"rendered","static":"rendered","block":"rendered"} + {"let":"rendered","const":"rendered","static":"rendered","block":"rendered"} # Render "End" @@ -9,9 +9,9 @@ {"let":"rendered","const":"rendered","static":"rendered","block":"rendered"} - + diff --git a/packages/translator-tags/src/__tests__/fixtures/dollar-global-client/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/dollar-global-client/__snapshots__/resume.expected.md index 3b690aab8..9218af4fb 100644 --- a/packages/translator-tags/src/__tests__/fixtures/dollar-global-client/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/dollar-global-client/__snapshots__/resume.expected.md @@ -4,14 +4,14 @@
    - + - +
    @@ -37,10 +37,10 @@ container.querySelector("button").click() - + @@ -61,14 +61,14 @@ container.querySelector("button").click()
    - + - +
    @@ -95,10 +95,10 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/dollar-global-client/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/dollar-global-client/__snapshots__/ssr.expected.md index 286ec6fe2..7b727e9cd 100644 --- a/packages/translator-tags/src/__tests__/fixtures/dollar-global-client/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/dollar-global-client/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -8,14 +8,14 @@
    - + - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/dynamic-closures/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/dynamic-closures/__snapshots__/resume.expected.md index 61a39f547..4fdc8bcba 100644 --- a/packages/translator-tags/src/__tests__/fixtures/dynamic-closures/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/dynamic-closures/__snapshots__/resume.expected.md @@ -4,23 +4,23 @@
    1 2 3
    1 2 3
    +
    1 2 3
    1 2 3
    # Render "End" @@ -8,23 +8,23 @@ - + @@ -30,11 +30,11 @@ container.querySelector("button").click() - + @@ -55,11 +55,11 @@ container.querySelector("button").click() - + @@ -80,11 +80,11 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/dynamic-event-handlers/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/dynamic-event-handlers/__snapshots__/ssr.expected.md index 1ce63676c..80c6d5891 100644 --- a/packages/translator-tags/src/__tests__/fixtures/dynamic-event-handlers/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/dynamic-event-handlers/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,11 +9,11 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/dynamic-native-dynamic-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/dynamic-native-dynamic-tag/__snapshots__/resume.expected.md index 0f3b440be..6a50fd3f2 100644 --- a/packages/translator-tags/src/__tests__/fixtures/dynamic-native-dynamic-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/dynamic-native-dynamic-tag/__snapshots__/resume.expected.md @@ -3,17 +3,17 @@ - + body content - + + body content # Render "End" ```html - + @@ -13,11 +13,11 @@ > body content - +
    1
    +
    1
    # Render "End" @@ -11,17 +11,17 @@ Count: 1 - + - - + +
    1 - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/dynamic-tag-attr-signal/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/dynamic-tag-attr-signal/__snapshots__/resume.expected.md index 1ecff710a..f3bc6b823 100644 --- a/packages/translator-tags/src/__tests__/fixtures/dynamic-tag-attr-signal/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/dynamic-tag-attr-signal/__snapshots__/resume.expected.md @@ -8,11 +8,11 @@ > paragraph

    - + +

    paragraph

    # Render "End" @@ -12,11 +12,11 @@ > paragraph

    - +
    Id is dynamic
    +
    Id is dynamic
    # Render "End" @@ -8,17 +8,17 @@ +
    Child 1 has 3
    # Render "End" ```html - + @@ -12,13 +12,13 @@ Child 1 has 3 - + - +
    1
    +
    1
    # Render "End" @@ -11,17 +11,17 @@ Count: 1 - + - - + +
    1 - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/dynamic-tag-sometimes-null/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/dynamic-tag-sometimes-null/__snapshots__/resume.expected.md index 31a8cb371..a7a256f8f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/dynamic-tag-sometimes-null/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/dynamic-tag-sometimes-null/__snapshots__/resume.expected.md @@ -3,13 +3,13 @@ - + Body Content - + + Body Content # Render "End" ```html - + Body Content - + - + - + - + - + - + - + +
    # Render "End" ```html - + @@ -13,17 +13,17 @@ id="count" > 0 - + - + - + - + @@ -38,10 +38,10 @@ container.querySelector("button").click() > 1 - + @@ -67,10 +67,10 @@ container.querySelector("button").click() > 2 - + @@ -96,10 +96,10 @@ container.querySelector("button").click() > 3 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-counter/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-counter/__snapshots__/ssr.expected.md index 606ca82a4..1926fbab9 100644 --- a/packages/translator-tags/src/__tests__/fixtures/effect-counter/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/effect-counter/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -13,10 +13,10 @@ > 0 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/csr-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/csr-sanitized.expected.md new file mode 100644 index 000000000..11ab340c5 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/csr-sanitized.expected.md @@ -0,0 +1,18 @@ +# Render {} +```html +
    + 0 +
    +``` + + +# Render "ASYNC" +```html +
    + hello +
    +``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/csr.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/csr.expected.md new file mode 100644 index 000000000..e1e5435c9 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/csr.expected.md @@ -0,0 +1,31 @@ +# Render {} +```html + +
    + 0 +
    +``` + +# Mutations +``` +inserted #comment0, div1 +``` + + +# Render "ASYNC" +```html + +
    + hello +
    +``` + +# Mutations +``` +removed #text in div1 +inserted div1/#text0 +``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/dom.expected/template.hydrate.js b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/dom.expected/template.hydrate.js new file mode 100644 index 000000000..a7252fd86 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/dom.expected/template.hydrate.js @@ -0,0 +1,12 @@ +// size: 174 (min) 110 (brotli) + +import { register as t, init as e } from "@marko/runtime-tags/dom"; +t("a2", (t) => { + ((t) => { + const { 0: e } = t; + return async () => { + document.getElementById("ref").textContent = await e; + }; + })(t)(); +}), + e(); diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/dom.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/dom.expected/template.js new file mode 100644 index 000000000..c463c0717 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/dom.expected/template.js @@ -0,0 +1,24 @@ +import { resolveAfter } from "../../utils/resolve"; +import { register as _register, queueEffect as _queueEffect, value as _value, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/dom"; +const _ = _scope => { + const { + promise + } = _scope; + return async () => { + document.getElementById("ref").textContent = await promise; + }; +}; +const _promise_effect = _register("packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/template.marko_0_promise", _scope => { + const { + promise + } = _scope; + _(_scope)(); +}); +const _promise = /* @__PURE__ */_value("promise", (_scope, promise) => _queueEffect(_scope, _promise_effect)); +const _setup = _scope => { + _promise(_scope, Promise.resolve("hello")); +}; +export const _template_ = "
    0
    "; +export const _walks_ = /* over(1) */"Db"; +export const _setup_ = _setup; +export default /* @__PURE__ */_createTemplate( /* @__PURE__ */_createRenderer(_template_, _walks_, _setup_), "packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/template.marko"); \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/html.expected/template.js new file mode 100644 index 000000000..e66656309 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/html.expected/template.js @@ -0,0 +1,12 @@ +import { resolveAfter } from "../../utils/resolve"; +import { write as _write, writeEffect as _writeEffect, writeScope as _writeScope, nextScopeId as _nextScopeId, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { + const _scope0_id = _nextScopeId(); + const promise = Promise.resolve("hello"); + _write("
    0
    "); + _writeEffect(_scope0_id, "packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/template.marko_0_promise"); + _writeScope(_scope0_id, { + "promise": promise + }); +}); +export default /* @__PURE__ */_createTemplate(_renderer, "packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/template.marko"); \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/resume-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/resume-sanitized.expected.md new file mode 100644 index 000000000..11ab340c5 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/resume-sanitized.expected.md @@ -0,0 +1,18 @@ +# Render {} +```html +
    + 0 +
    +``` + + +# Render "ASYNC" +```html +
    + hello +
    +``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/resume.expected.md new file mode 100644 index 000000000..f7c0eb953 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/resume.expected.md @@ -0,0 +1,45 @@ +# Render {} +```html + + + +
    + 0 +
    + + + +``` + +# Mutations +``` + +``` + + +# Render "ASYNC" +```html + + + +
    + hello +
    + + + +``` + +# Mutations +``` +removed #text in #document/html0/body1/div0 +inserted #document/html0/body1/div0/#text0 +``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/ssr-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/ssr-sanitized.expected.md new file mode 100644 index 000000000..d6de7cbe2 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/ssr-sanitized.expected.md @@ -0,0 +1,8 @@ +# Render "End" +```html +
    + 0 +
    +``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/ssr.expected.md new file mode 100644 index 000000000..2d4a19600 --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/__snapshots__/ssr.expected.md @@ -0,0 +1,31 @@ +# Write +
    0
    + + +# Render "End" +```html + + + +
    + 0 +
    + + + +``` + +# Mutations +``` +inserted #document/html0 +inserted #document/html0/head0 +inserted #document/html0/body1 +inserted #document/html0/body1/div0 +inserted #document/html0/body1/div0/#text0 +inserted #document/html0/body1/script1 +inserted #document/html0/body1/script1/#text0 +``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/template.marko b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/template.marko new file mode 100644 index 000000000..d435f171a --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/template.marko @@ -0,0 +1,9 @@ +import { resolveAfter } from "../../utils/resolve"; + + + { + document.getElementById("ref").textContent = await promise; + })(); +}/> +
    0
    diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/test.ts b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/test.ts new file mode 100644 index 000000000..99f6f09ad --- /dev/null +++ b/packages/translator-tags/src/__tests__/fixtures/effect-serialize-promise/test.ts @@ -0,0 +1,3 @@ +import { wait } from "../../utils/resolve"; + +export const steps = [{}, wait(2)]; diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-tag/__snapshots__/resume.expected.md index ad7b4a824..8f877a7e4 100644 --- a/packages/translator-tags/src/__tests__/fixtures/effect-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/effect-tag/__snapshots__/resume.expected.md @@ -9,7 +9,7 @@ 1 diff --git a/packages/translator-tags/src/__tests__/fixtures/effect-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/effect-tag/__snapshots__/ssr.expected.md index ec9419d49..e7fb34c2a 100644 --- a/packages/translator-tags/src/__tests__/fixtures/effect-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/effect-tag/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    0
    +
    0
    # Render "End" @@ -13,7 +13,7 @@ 0 diff --git a/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/html.expected/template.js index ee0379920..6f625a046 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, writeEffect as _writeEffect, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, writeEffect as _writeEffect, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const id = 0; @@ -20,7 +20,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`
    ${_escapeXML(name)}${_markResumeNode(_scope1_id, "#text/0")}: ${_escapeXML(description)}${_markResumeNode(_scope1_id, "#text/1")}
    `); _writeScope(_scope1_id, {}); _scope1_.set(_i, _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#text/0", _forScopeIds)}${_markResumeNode(_scope0_id, "#button/1")}${_markResumeNode(_scope0_id, "#button/2")}`); _writeEffect(_scope0_id, "packages/translator-tags/src/__tests__/fixtures/for-destructure/template.marko_0_items"); diff --git a/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/resume.expected.md index 131bce978..28327cb65 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/resume.expected.md @@ -6,28 +6,28 @@
    Marko - + : HTML Reimagined - +
    - + - + - +
    @@ -49,31 +49,31 @@ container.querySelector("#add").click()
    Marko - + : HTML Reimagined - +
    JavaScript: Java, but scriptier
    - + - + - +
    @@ -95,28 +95,28 @@ container.querySelector("#remove").click()
    Marko - + : HTML Reimagined - +
    - + - + - +
    @@ -136,22 +136,22 @@ container.querySelector("#remove").click()
    - + - + - +
    @@ -181,16 +181,16 @@ container.querySelector("#add").click() > Add - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/ssr.expected.md index f1ca0e0d4..f29e17dce 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-destructure/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    Marko: HTML Reimagined
    +
    Marko: HTML Reimagined
    # Render "End" @@ -10,28 +10,28 @@
    Marko - + : HTML Reimagined - +
    - + - + - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/html.expected/template.js index 1fea2b19d..f3062289f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, write as _write, ensureScopeWithId as _ensureScopeWithId, writeEffect as _writeEffect, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, write as _write, ensureScopeWithId as _ensureScopeWithId, writeEffect as _writeEffect, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const num = 0; @@ -14,7 +14,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { "_": _ensureScopeWithId(_scope0_id) }); _scope1_.set(i, _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#text/0", _forScopeIds)}`); _writeScope(_scope0_id, { diff --git a/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/resume.expected.md index 354d42438..dcd6fd839 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/resume.expected.md @@ -5,12 +5,12 @@ - - + + @@ -31,15 +31,15 @@ container.querySelector("button").click() - - + + @@ -60,7 +60,7 @@ container.querySelector("button").click() - - + + @@ -92,7 +92,7 @@ container.querySelector("button").click() - - + + @@ -127,7 +127,7 @@ container.querySelector("button").click() - - + + @@ -165,7 +165,7 @@ container.querySelector("button").click() - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/ssr.expected.md index 8ba9d9811..d48ec93ea 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-event-handler/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,12 +9,12 @@ - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/html.expected/template.js index 0485060b9..bd8807b8f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, nextScopeId as _nextScopeId, maybeFlush as _maybeFlush, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, nextScopeId as _nextScopeId, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const arrA = [1, 2, 3]; @@ -6,13 +6,11 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { for (const val of arrA) { const _scope1_id = _nextScopeId(); _write(`
    ${_escapeXML(val)}${_markResumeNode(_scope1_id, "#text/0")}
    `); - _maybeFlush(); } _write("
    "); for (const val of arrA) { const _scope2_id = _nextScopeId(); _write(`
    ${_escapeXML(val)}${_markResumeNode(_scope2_id, "#text/0")}
    `); - _maybeFlush(); } _write("
    "); }); diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/resume.expected.md index a31c75f50..714169946 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/resume.expected.md @@ -6,32 +6,35 @@
    1 - +
    2 - +
    3 - +
    1 - +
    2 - +
    3 - +
    + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/ssr.expected.md index 8693ee54d..8bd3696ab 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag-siblings/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    1
    2
    3
    1
    2
    3
    +
    1
    2
    3
    1
    2
    3
    # Render "End" @@ -10,32 +10,35 @@
    1 - +
    2 - +
    3 - +
    1 - +
    2 - +
    3 - +
    + ``` @@ -66,4 +69,6 @@ inserted #document/html0/body1/div1/div2 inserted #document/html0/body1/div1/div2/#text0 inserted #document/html0/body1/div1/div2/#comment1 inserted #document/html0/body1/div1/div3 +inserted #document/html0/body1/script2 +inserted #document/html0/body1/script2/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/html.expected/template.js index 3b380f4b0..d2daaaae1 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { escapeXML as _escapeXML, markResumeNode as _markResumeNode, write as _write, nextScopeId as _nextScopeId, maybeFlush as _maybeFlush, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { escapeXML as _escapeXML, markResumeNode as _markResumeNode, write as _write, nextScopeId as _nextScopeId, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const arrA = [1, 2, 3]; @@ -7,7 +7,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope1_id = _nextScopeId(); let i = _i++; _write(`
    ${_escapeXML(i)}${_markResumeNode(_scope1_id, "#text/0")}: ${_escapeXML(val)}${_markResumeNode(_scope1_id, "#text/1")}
    `); - _maybeFlush(); } const arrB = [1, 2, 3]; const _forScopeIds = [], @@ -20,7 +19,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`
    ${_escapeXML(i)}${_markResumeNode(_scope2_id, "#text/0")}: ${_escapeXML(val)}${_markResumeNode(_scope2_id, "#text/1")}
    `); _writeScope(_scope2_id, {}); _scope2_.set(i, _getScopeById(_scope2_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#text/1", _forScopeIds)}`); _writeScope(_scope0_id, { diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/resume.expected.md index 240713eae..4c244d4e3 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/resume.expected.md @@ -5,55 +5,55 @@
    0 - + : 1 - +
    1 - + : 2 - +
    2 - + : 3 - +
    0 - + : 1 - +
    1 - + : 2 - +
    2 - + : 3 - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/ssr.expected.md index 585d8136b..29c4c78da 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag-with-state/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    0: 1
    1: 2
    2: 3
    0: 1
    1: 2
    2: 3
    +
    0: 1
    1: 2
    2: 3
    0: 1
    1: 2
    2: 3
    # Render "End" @@ -9,55 +9,55 @@
    0 - + : 1 - +
    1 - + : 2 - +
    2 - + : 3 - +
    0 - + : 1 - +
    1 - + : 2 - +
    2 - + : 3 - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/html.expected/template.js index 84c926259..b1e821f8c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { escapeXML as _escapeXML, markResumeNode as _markResumeNode, write as _write, nextScopeId as _nextScopeId, maybeFlush as _maybeFlush, attr as _attr, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { escapeXML as _escapeXML, markResumeNode as _markResumeNode, write as _write, nextScopeId as _nextScopeId, attr as _attr, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const arr = [1, 2, 3]; @@ -12,26 +12,22 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope1_id = _nextScopeId(); let i = _i++; _write(`
    ${_escapeXML(i)}${_markResumeNode(_scope1_id, "#text/0")}: ${_escapeXML(val)}${_markResumeNode(_scope1_id, "#text/1")}
    `); - _maybeFlush(); } for (const key in obj) { const _scope2_id = _nextScopeId(); const val = obj[key]; _write(`
    ${_escapeXML(key)}${_markResumeNode(_scope2_id, "#text/0")}: ${_escapeXML(val)}${_markResumeNode(_scope2_id, "#text/1")}
    `); - _maybeFlush(); } for (let _from = 0 ?? 0, _step = 2 ?? 1, _steps = (10 - _from) / _step, _i2 = 0; _i2 <= _steps; _i2++) { const _scope3_id = _nextScopeId(); const i = _from + _i2 * _step; _write(`
    ${_escapeXML(i)}${_markResumeNode(_scope3_id, "#text/0")}
    `); - _maybeFlush(); } let _i3 = 0; for (const val of arr) { const _scope4_id = _nextScopeId(); let i = _i3++; _write(`${_escapeXML(i)}${_markResumeNode(_scope4_id, "#text/1")}: ${_escapeXML(val)}${_markResumeNode(_scope4_id, "#text/2")}
    ${_markResumeNode(_scope4_id, "#div/0")}
    ${_markResumeNode(_scope4_id, "#div/3")}`); - _maybeFlush(); } let _i4 = 0; const list = arr; @@ -39,13 +35,11 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope5_id = _nextScopeId(); let i = _i4++; _write(`${_escapeXML(list.length)}${_markResumeNode(_scope5_id, "#text/1")}: ${_escapeXML(val)}${_markResumeNode(_scope5_id, "#text/2")}${_markResumeNode(_scope5_id, "#div/0")}`); - _maybeFlush(); } for (const key in obj) { const _scope6_id = _nextScopeId(); const val = obj[key]; _write(`${_escapeXML(key)}${_markResumeNode(_scope6_id, "#text/1")}: ${_escapeXML(val)}${_markResumeNode(_scope6_id, "#text/2")}${_markResumeNode(_scope6_id, "#div/0")}
    ${_markResumeNode(_scope6_id, "#div/3")}`); - _maybeFlush(); } for (let _from3 = 0 ?? 0, _step3 = 2 ?? 1, _steps3 = (10 - _from3) / _step3, _i6 = 0; _i6 <= _steps3; _i6++) { const _scope7_id = _nextScopeId(); @@ -55,25 +49,20 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope8_id = _nextScopeId(); const i = _from2 + _i5 * _step2; _write(`${_escapeXML(i)}${_markResumeNode(_scope8_id, "#text/1")}${_markResumeNode(_scope8_id, "#div/0")}
    ${_markResumeNode(_scope8_id, "#div/2")}`); - _maybeFlush(); } - _maybeFlush(); } for (let _from4 = 10 ?? 0, _step4 = -2 ?? 1, _steps4 = (0 - _from4) / _step4, _i7 = 0; _i7 <= _steps4; _i7++) { const _scope9_id = _nextScopeId(); const i = _from4 + _i7 * _step4; _write(`${_escapeXML(i)}${_markResumeNode(_scope9_id, "#text/1")}${_markResumeNode(_scope9_id, "#div/0")}
    ${_markResumeNode(_scope9_id, "#div/2")}`); - _maybeFlush(); } for (let _from5 = 0 ?? 0, _step5 = 1 ?? 1, _steps5 = (10 - _from5) / _step5, _i8 = 0; _i8 <= _steps5; _i8++) { const _scope10_id = _nextScopeId(); _write("Hello"); - _maybeFlush(); } for (let _from6 = 0 ?? 0, _step6 = 1 ?? 1, _steps6 = (10 - _from6) / _step6, _i9 = 0; _i9 <= _steps6; _i9++) { const _scope11_id = _nextScopeId(); _write("Hello"); - _maybeFlush(); } }); export default /* @__PURE__ */_createTemplate(_renderer, "packages/translator-tags/src/__tests__/fixtures/for-tag/template.marko"); \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/resume.expected.md index 1f019261a..e637c8e8a 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/resume.expected.md @@ -5,97 +5,97 @@
    0 - + : 1 - +
    1 - + : 2 - +
    2 - + : 3 - +
    a - + : 1 - +
    b - + : 1 - +
    c - + : 1 - +
    0 - +
    2 - +
    4 - +
    6 - +
    8 - +
    10 - +
    @@ -103,708 +103,711 @@ key="0" > 0 - + : 1 - +
    - +
    - +
    1 - + : 2 - +
    - +
    - +
    2 - + : 3 - +
    - +
    - +
    3 - + : 1 - +
    - +
    3 - + : 2 - +
    - +
    3 - + : 3 - +
    - +
    a - + : 1 - +
    - +
    - +
    b - + : 1 - +
    - +
    - +
    c - + : 1 - +
    - +
    - +
    0 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    2 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    4 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    6 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    8 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    10 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    10 - +
    - +
    - +
    8 - +
    - +
    - +
    6 - +
    - +
    - +
    4 - +
    - +
    - +
    2 - +
    - +
    - +
    0 - +
    - +
    - + HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/ssr.expected.md index c07c67497..a3964b968 100644 --- a/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/for-tag/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    0: 1
    1: 2
    2: 3
    a: 1
    b: 1
    c: 1
    0
    2
    4
    6
    8
    10
    0: 1
    1: 2
    2: 3
    3: 1
    3: 2
    3: 3
    a: 1
    b: 1
    c: 1
    0
    0
    2
    4
    6
    8
    10
    2
    0
    2
    4
    6
    8
    10
    4
    0
    2
    4
    6
    8
    10
    6
    0
    2
    4
    6
    8
    10
    8
    0
    2
    4
    6
    8
    10
    10
    0
    2
    4
    6
    8
    10
    10
    8
    6
    4
    2
    0
    HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello +
    0: 1
    1: 2
    2: 3
    a: 1
    b: 1
    c: 1
    0
    2
    4
    6
    8
    10
    0: 1
    1: 2
    2: 3
    3: 1
    3: 2
    3: 3
    a: 1
    b: 1
    c: 1
    0
    0
    2
    4
    6
    8
    10
    2
    0
    2
    4
    6
    8
    10
    4
    0
    2
    4
    6
    8
    10
    6
    0
    2
    4
    6
    8
    10
    8
    0
    2
    4
    6
    8
    10
    10
    0
    2
    4
    6
    8
    10
    10
    8
    6
    4
    2
    0
    HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello # Render "End" @@ -9,97 +9,97 @@
    0 - + : 1 - +
    1 - + : 2 - +
    2 - + : 3 - +
    a - + : 1 - +
    b - + : 1 - +
    c - + : 1 - +
    0 - +
    2 - +
    4 - +
    6 - +
    8 - +
    10 - +
    @@ -107,708 +107,711 @@ key="0" > 0 - + : 1 - +
    - +
    - +
    1 - + : 2 - +
    - +
    - +
    2 - + : 3 - +
    - +
    - +
    3 - + : 1 - +
    - +
    3 - + : 2 - +
    - +
    3 - + : 3 - +
    - +
    a - + : 1 - +
    - +
    - +
    b - + : 1 - +
    - +
    - +
    c - + : 1 - +
    - +
    - +
    0 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    2 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    4 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    6 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    8 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    10 - +
    - +
    - +
    0 - +
    - +
    - +
    2 - +
    - +
    - +
    4 - +
    - +
    - +
    6 - +
    - +
    - +
    8 - +
    - +
    - +
    10 - +
    - +
    - +
    10 - +
    - +
    - +
    8 - +
    - +
    - +
    6 - +
    - +
    - +
    4 - +
    - +
    - +
    2 - +
    - +
    - +
    0 - +
    - +
    - + HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello + ``` @@ -1329,4 +1332,6 @@ inserted #document/html0/body1/div309 inserted #document/html0/body1/div310 inserted #document/html0/body1/#comment311 inserted #document/html0/body1/#text312 +inserted #document/html0/body1/script313 +inserted #document/html0/body1/script313/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/hello-dynamic/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/hello-dynamic/__snapshots__/resume.expected.md index 6d788bb85..569f888be 100644 --- a/packages/translator-tags/src/__tests__/fixtures/hello-dynamic/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/hello-dynamic/__snapshots__/resume.expected.md @@ -6,15 +6,18 @@ Hello Marko - + ! Hello Marko - + ! Hello - + ! + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/hello-dynamic/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/hello-dynamic/__snapshots__/ssr.expected.md index a3e835171..55248e891 100644 --- a/packages/translator-tags/src/__tests__/fixtures/hello-dynamic/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/hello-dynamic/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - Hello Marko! Hello Marko! Hello ! + Hello Marko! Hello Marko! Hello ! # Render "End" @@ -10,15 +10,18 @@ Hello Marko - + ! Hello Marko - + ! Hello - + ! + ``` @@ -40,4 +43,6 @@ inserted #document/html0/body1/#text8 inserted #document/html0/body1/#comment9 inserted #document/html0/body1/#comment10 inserted #document/html0/body1/#text11 +inserted #document/html0/body1/script12 +inserted #document/html0/body1/script12/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/html-comment-counter/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/html-comment-counter/__snapshots__/resume.expected.md index bb543ffbe..ca6e0a980 100644 --- a/packages/translator-tags/src/__tests__/fixtures/html-comment-counter/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/html-comment-counter/__snapshots__/resume.expected.md @@ -6,14 +6,14 @@
    - + - +
    @@ -35,14 +35,14 @@ container.querySelector("button").click()
    - + - +
    @@ -65,14 +65,14 @@ container.querySelector("button").click()
    - + - +
    @@ -95,14 +95,14 @@ container.querySelector("button").click()
    - + - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/html-comment-counter/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/html-comment-counter/__snapshots__/ssr.expected.md index 22477e134..388c880c9 100644 --- a/packages/translator-tags/src/__tests__/fixtures/html-comment-counter/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/html-comment-counter/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -10,14 +10,14 @@
    - + - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/html-comment-var/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/html-comment-var/__snapshots__/resume.expected.md index 8d4236019..52e3e88b0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/html-comment-var/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/html-comment-var/__snapshots__/resume.expected.md @@ -5,18 +5,18 @@
    - + ‍ - +
    - + ‍ - + @@ -35,18 +35,18 @@
    - + DIV - +
    - + SPAN - + diff --git a/packages/translator-tags/src/__tests__/fixtures/html-comment-var/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/html-comment-var/__snapshots__/ssr.expected.md index 989fb4541..3a78748a3 100644 --- a/packages/translator-tags/src/__tests__/fixtures/html-comment-var/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/html-comment-var/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -9,18 +9,18 @@
    - + ‍ - +
    - + ‍ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/csr-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/csr-sanitized.expected.md index 9e40582d2..fdf357605 100644 --- a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/csr-sanitized.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/csr-sanitized.expected.md @@ -1,7 +1,7 @@ # Render undefined ```html
    - c0 + cM_0
    -c1 +cM_1 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/csr.expected.md b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/csr.expected.md index 0c44d2745..ee2554558 100644 --- a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/csr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/csr.expected.md @@ -1,9 +1,9 @@ # Render undefined ```html
    - c0 + cM_0
    -c1 +cM_1 ``` # Mutations diff --git a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/dom.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/dom.expected/template.js index d832c13b2..ba3479085 100644 --- a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/dom.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/dom.expected/template.js @@ -2,8 +2,8 @@ import { nextTagId as _nextTagId, data as _data, value as _value, createRenderer const _y = /* @__PURE__ */_value("y", (_scope, y) => _data(_scope["#text/1"], y)); const _x = /* @__PURE__ */_value("x", (_scope, x) => _data(_scope["#text/0"], x)); const _setup = _scope => { - _x(_scope, _nextTagId()); - _y(_scope, _nextTagId()); + _x(_scope, _nextTagId(_scope)); + _y(_scope, _nextTagId(_scope)); }; export const _template_ = "
    "; export const _walks_ = /* next(1), get, out(1), replace, over(1) */"D l%b"; diff --git a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/resume-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/resume-sanitized.expected.md index 9ed7d51c1..52e026f80 100644 --- a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/resume-sanitized.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/resume-sanitized.expected.md @@ -1,7 +1,7 @@ # Render undefined ```html
    - s0 + sM_0
    -s1 +sM_1 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/resume.expected.md index 1490db3e8..ab30c7bf0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/resume.expected.md @@ -4,11 +4,14 @@
    - s0 - + sM_0 +
    - s1 - + sM_1 + + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/ssr-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/ssr-sanitized.expected.md index dd0f8c6f9..3a552e419 100644 --- a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/ssr-sanitized.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/ssr-sanitized.expected.md @@ -1,7 +1,7 @@ # Render "End" ```html
    - s0 + sM_0
    -s1 +sM_1 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/ssr.expected.md index ac3ab5a64..a1983d1ae 100644 --- a/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/id-tag/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    s0
    s1 +
    sM_0
    sM_1 # Render "End" @@ -8,11 +8,14 @@
    - s0 - + sM_0 +
    - s1 - + sM_1 + + ``` @@ -27,4 +30,6 @@ inserted #document/html0/body1/div0/#text0 inserted #document/html0/body1/div0/#comment1 inserted #document/html0/body1/#text1 inserted #document/html0/body1/#comment2 +inserted #document/html0/body1/script3 +inserted #document/html0/body1/script3/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/if-default-false/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/if-default-false/__snapshots__/resume.expected.md index 1d9c1263b..afdc6beee 100644 --- a/packages/translator-tags/src/__tests__/fixtures/if-default-false/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/if-default-false/__snapshots__/resume.expected.md @@ -4,10 +4,10 @@ + # Render "End" @@ -8,10 +8,10 @@ source=1 + source=1 # Render "End" @@ -9,19 +9,19 @@ - + source= 1 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-id/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-id/__snapshots__/ssr.expected.md index 6531988b1..7392eef3d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-id/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-id/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,15 +9,15 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-runtime-error/__snapshots__/csr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-runtime-error/__snapshots__/csr.expected.md index b3fc0fc3d..1c116e72d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-runtime-error/__snapshots__/csr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-runtime-error/__snapshots__/csr.expected.md @@ -75,9 +75,9 @@ Error: Change handler '_y_change' cannot change from a function to null at signal (/packages/runtime-tags/src/dom/signals.ts:90:13) at runBatch (/packages/runtime-tags/src/dom/queue.ts:107:5) at run (/packages/runtime-tags/src/dom/queue.ts:52:5) - at csr (/packages/translator-tags/src/__tests__/main.test.ts:293:17) + at csr (/packages/translator-tags/src/__tests__/main.test.ts:282:17) at processTicksAndRejections (node:internal/process/task_queues:95:5) - at /packages/translator-tags/src/__tests__/main.test.ts:380:37 + at /packages/translator-tags/src/__tests__/main.test.ts:369:37 at resolveFixture (/node_modules/mocha-snap/dist/util/resolve-fixture.js:64:16) at snap (/node_modules/mocha-snap/dist/snap.js:46:20) ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-runtime-error/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-runtime-error/__snapshots__/ssr.expected.md index ad119466b..4bec9d96d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-runtime-error/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-runtime-error/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -11,21 +11,21 @@ id="inc" > 1 - + | 1 - + - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-static/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-static/__snapshots__/ssr.expected.md index 6510097f1..e6111908c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-static/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-controllable-static/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,15 +9,15 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-derived/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-derived/__snapshots__/resume.expected.md index 44a48511d..179b46c1f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-derived/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-derived/__snapshots__/resume.expected.md @@ -6,15 +6,15 @@ - + 2 - + 4 - + @@ -36,15 +36,15 @@ container.querySelector("button").click() - + 2 - + 5 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-derived/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-derived/__snapshots__/ssr.expected.md index f3a6942b0..f18b5b2f2 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-derived/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-derived/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - 2 4 + 2 4 # Render "End" @@ -10,15 +10,15 @@ - + 2 - + 4 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-set-in-effect/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-set-in-effect/__snapshots__/resume.expected.md index 67f99475e..21c6be456 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-set-in-effect/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-set-in-effect/__snapshots__/resume.expected.md @@ -5,14 +5,14 @@ 1 - + 0 - + @@ -31,14 +31,14 @@ 2 - + 1 - + @@ -58,14 +58,14 @@ 2 - + 2 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-set-in-effect/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-set-in-effect/__snapshots__/ssr.expected.md index 67679ddf1..05ed209ae 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-set-in-effect/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-set-in-effect/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - 10 + 10 # Render "End" @@ -9,14 +9,14 @@ 1 - + 0 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-with-intersection/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-with-intersection/__snapshots__/resume.expected.md index cba5ec55d..4dbb5c0c1 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-with-intersection/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-with-intersection/__snapshots__/resume.expected.md @@ -5,21 +5,21 @@ - + 2 - + 3 - + 5 - + @@ -40,21 +40,21 @@ container.querySelector("button").click() - + 3 - + 4 - + 7 - + @@ -78,21 +78,21 @@ container.querySelector("button").click() - + 4 - + 5 - + 9 - + @@ -116,21 +116,21 @@ container.querySelector("button").click() - + 5 - + 6 - + 11 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag-with-intersection/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag-with-intersection/__snapshots__/ssr.expected.md index 9b8720adb..8e71fcc17 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag-with-intersection/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag-with-intersection/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - 2 3 5 + 2 3 5 # Render "End" @@ -9,21 +9,21 @@ - + 2 - + 3 - + 5 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag/__snapshots__/resume.expected.md index a89e3b8fd..6ad013423 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag/__snapshots__/resume.expected.md @@ -5,13 +5,13 @@ - + 1 - + @@ -32,13 +32,13 @@ container.querySelector("button").click() - + 2 - + @@ -60,13 +60,13 @@ container.querySelector("button").click() - + 4 - + @@ -88,13 +88,13 @@ container.querySelector("button").click() - + 8 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-tag/__snapshots__/ssr.expected.md index 4ff14a8d3..9c8b2cf3a 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-tag/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - 1 + 1 # Render "End" @@ -9,13 +9,13 @@ - + 1 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/let-undefined-until-dom/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-undefined-until-dom/__snapshots__/resume.expected.md index 4b1f7fc7d..ba04ebab9 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-undefined-until-dom/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-undefined-until-dom/__snapshots__/resume.expected.md @@ -5,10 +5,10 @@
    ‍ - +
    @@ -27,10 +27,10 @@
    Client Only - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/let-undefined-until-dom/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/let-undefined-until-dom/__snapshots__/ssr.expected.md index fec946bc3..ec722b94f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/let-undefined-until-dom/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/let-undefined-until-dom/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -9,10 +9,10 @@
    ‍ - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-assignment/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-assignment/__snapshots__/resume.expected.md index a615c0624..dc05b9fc3 100644 --- a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-assignment/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-assignment/__snapshots__/resume.expected.md @@ -7,21 +7,21 @@ x= 0 - + , was= ‍ - +
    - + @@ -44,21 +44,21 @@ container.querySelector("#increment")?.click() x= 1 - + , was= 0 - +
    - + @@ -82,21 +82,21 @@ container.querySelector("#increment")?.click() x= 2 - + , was= 0 - +
    - + @@ -117,21 +117,21 @@ container.querySelector("#increment")?.click() x= 2 - + , was= 1 - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-assignment/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-assignment/__snapshots__/ssr.expected.md index 60e7a51fa..cd4a19a4d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-assignment/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-assignment/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    x=0, was=
    +
    x=0, was=
    # Render "End" @@ -11,21 +11,21 @@ x= 0 - + , was= ‍ - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-this/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-this/__snapshots__/resume.expected.md index ba6190ddd..fb1f8990d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-this/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-this/__snapshots__/resume.expected.md @@ -13,9 +13,9 @@ > Increment - + @@ -44,9 +44,9 @@ container.querySelector("#increment")?.click() > Increment - + @@ -76,9 +76,9 @@ container.querySelector("#increment")?.click() > Increment - + diff --git a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-this/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-this/__snapshots__/ssr.expected.md index e155105d4..f56fa58c1 100644 --- a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-this/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag-this/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -15,9 +15,9 @@ > Increment - + diff --git a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag/__snapshots__/resume.expected.md index 4e580c03a..4c21cb8f5 100644 --- a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag/__snapshots__/resume.expected.md @@ -13,9 +13,9 @@ > Increment - + @@ -44,9 +44,9 @@ container.querySelector("#increment")?.click() > Increment - + @@ -76,9 +76,9 @@ container.querySelector("#increment")?.click() > Increment - + diff --git a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag/__snapshots__/ssr.expected.md index aa88be997..c893b9ee6 100644 --- a/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/lifecycle-tag/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -15,9 +15,9 @@ > Increment - + diff --git a/packages/translator-tags/src/__tests__/fixtures/log-tag/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/log-tag/__snapshots__/resume.expected.md index 48fc0b030..c6f0a4fc8 100644 --- a/packages/translator-tags/src/__tests__/fixtures/log-tag/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/log-tag/__snapshots__/resume.expected.md @@ -5,9 +5,9 @@ {"identifier":true,"tag var":true,"static var":true} - + diff --git a/packages/translator-tags/src/__tests__/fixtures/log-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/log-tag/__snapshots__/ssr.expected.md index d51d46179..37cb8dcf4 100644 --- a/packages/translator-tags/src/__tests__/fixtures/log-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/log-tag/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - {"identifier":true,"tag var":true,"static var":true} + {"identifier":true,"tag var":true,"static var":true} # Render "End" @@ -9,9 +9,9 @@ {"identifier":true,"tag var":true,"static var":true} - + diff --git a/packages/translator-tags/src/__tests__/fixtures/migrate-input/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/migrate-input/__snapshots__/resume.expected.md index d1235b66b..9470fb0db 100644 --- a/packages/translator-tags/src/__tests__/fixtures/migrate-input/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/migrate-input/__snapshots__/resume.expected.md @@ -6,9 +6,12 @@
    1 - +
    + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/migrate-input/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/migrate-input/__snapshots__/ssr.expected.md index 27f434d3a..1a4034255 100644 --- a/packages/translator-tags/src/__tests__/fixtures/migrate-input/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/migrate-input/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    1
    +
    1
    # Render "End" @@ -10,9 +10,12 @@
    1 - +
    + ``` @@ -26,4 +29,6 @@ inserted #document/html0/body1/div0 inserted #document/html0/body1/div0/span0 inserted #document/html0/body1/div0/span0/#text0 inserted #document/html0/body1/div0/span0/#comment1 +inserted #document/html0/body1/script1 +inserted #document/html0/body1/script1/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/migrate-out-global/__snapshots__/ssr-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/migrate-out-global/__snapshots__/ssr-sanitized.expected.md index 5027b2bac..138a0360f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/migrate-out-global/__snapshots__/ssr-sanitized.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/migrate-out-global/__snapshots__/ssr-sanitized.expected.md @@ -1,8 +1,4 @@ -# Render "End" +# Render "Error" ```html -
    - - 1 - -
    + ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/migrate-out-global/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/migrate-out-global/__snapshots__/ssr.expected.md index e433dacff..4e1ab3c4e 100644 --- a/packages/translator-tags/src/__tests__/fixtures/migrate-out-global/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/migrate-out-global/__snapshots__/ssr.expected.md @@ -1,27 +1,13 @@ -# Write -
    1
    +# Emit error + TypeError: Cannot read properties of undefined (reading 'x') -# Render "End" +# Render "Error" ```html - - - -
    - - 1 - -
    - - + ``` # Mutations ``` -inserted #document/html0 -inserted #document/html0/head0 -inserted #document/html0/body1 -inserted #document/html0/body1/div0 -inserted #document/html0/body1/div0/span0 -inserted #document/html0/body1/div0/span0/#text0 + ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/html.expected/template.js index a63a718bd..e2975035f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const { @@ -18,7 +18,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`${_escapeXML(child.text)}${_markResumeNode(_scope1_id, "#text/0")}`); _writeScope(_scope1_id, {}); _scope1_.set(_by(child, _i), _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#div/0", _forScopeIds)}
    ${_markResumeNode(_scope0_id, "#div/0")}`); _writeScope(_scope0_id, { diff --git a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/resume.expected.md index 0313491cc..826f5faaa 100644 --- a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/resume.expected.md @@ -5,16 +5,16 @@
    a - + b - + c - - + +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/ssr.expected.md index c1d6e6dba..15ac616c6 100644 --- a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-children/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    abc
    +
    abc
    # Render "End" @@ -9,16 +9,16 @@
    a - + b - + c - - + +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/html.expected/template.js index df70ee5ce..3709bb99a 100644 --- a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, write as _write, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, write as _write, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const _forScopeIds = [], @@ -14,7 +14,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`${_escapeXML(child.text)}${_markResumeNode(_scope1_id, "#text/0")}`); _writeScope(_scope1_id, {}); _scope1_.set(_by(child, _i), _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#text/0", _forScopeIds)}`); _writeScope(_scope0_id, { diff --git a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/resume.expected.md index f7f8df55f..80dad845b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/resume.expected.md @@ -4,14 +4,14 @@ a - + b - + c - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/ssr.expected.md index 1a9476932..89c447aa0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/move-and-clear-top-level/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - abc + abc # Render "End" @@ -8,14 +8,14 @@ a - + b - + c - - + + diff --git a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-downstream-effect/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-downstream-effect/__snapshots__/ssr.expected.md index 3fa76ff1c..486ad4f93 100644 --- a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-downstream-effect/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-downstream-effect/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -8,9 +8,9 @@
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect-child/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect-child/__snapshots__/ssr.expected.md index 62b890b85..a231729a1 100644 --- a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect-child/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect-child/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -8,9 +8,9 @@
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect/__snapshots__/resume.expected.md index 07a33abad..311341ab0 100644 --- a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect/__snapshots__/resume.expected.md @@ -6,9 +6,9 @@
    hello
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect/__snapshots__/ssr.expected.md index 797bca72c..efb72c73c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-effect/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -8,9 +8,9 @@
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-hoisting/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-hoisting/__snapshots__/ssr.expected.md index b459e170a..bc4255b56 100644 --- a/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-hoisting/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/native-tag-ref-hoisting/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -8,9 +8,9 @@
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/nested-assignment-expression/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/nested-assignment-expression/__snapshots__/resume.expected.md index 0c7c8003c..04dd15f4f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/nested-assignment-expression/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/nested-assignment-expression/__snapshots__/resume.expected.md @@ -5,21 +5,21 @@ - + used to be 0 - + which should be the same as 0 - + @@ -40,21 +40,21 @@ container.querySelector("button").click() - + used to be 0 - + which should be the same as 0 - + @@ -75,21 +75,21 @@ container.querySelector("button").click() - + used to be 1 - + which should be the same as 1 - + @@ -112,21 +112,21 @@ container.querySelector("button").click() - + used to be 2 - + which should be the same as 2 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/nested-assignment-expression/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/nested-assignment-expression/__snapshots__/ssr.expected.md index 6e023191b..bab2a6fb5 100644 --- a/packages/translator-tags/src/__tests__/fixtures/nested-assignment-expression/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/nested-assignment-expression/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - used to be 0 which should be the same as 0 + used to be 0 which should be the same as 0 # Render "End" @@ -9,21 +9,21 @@ - + used to be 0 - + which should be the same as 0 - + diff --git a/packages/translator-tags/src/__tests__/fixtures/placeholder-single/__snapshots__/ssr-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/placeholder-single/__snapshots__/ssr-sanitized.expected.md index 80252bc41..ed9f2dca3 100644 --- a/packages/translator-tags/src/__tests__/fixtures/placeholder-single/__snapshots__/ssr-sanitized.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/placeholder-single/__snapshots__/ssr-sanitized.expected.md @@ -1,4 +1,10 @@ # Render "End" ```html -abcdfgh +abdfgh + + cd + ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/placeholder-single/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/placeholder-single/__snapshots__/ssr.expected.md index c20c768df..b5e33e78d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/placeholder-single/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/placeholder-single/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - ae...f + ae...fbd # Write @@ -7,15 +7,36 @@ # Write - bcd + cd # Render "End" ```html - + + + - abcdfgh + ab + + df + + gh + + cd + + ``` @@ -29,16 +50,28 @@ inserted #document/html0/body1/#text0 inserted #comment inserted #text inserted #comment -inserted #document/html0/body1/#text2 +inserted #document/html0/body1/#text4 +inserted #document/html0/head0/style0 +inserted #document/html0/head0/style0/#text0 inserted t inserted #document/html0/body1/#text1 -inserted script -inserted script/#text0 -removed #document/html0/body1/#text1 in t -inserted #document/html0/body1/#text1 -removed script after t -removed t after #document/html0/body1/#text2 -removed #comment after #document/html0/body1/#text1 -removed #text after #document/html0/body1/#text1 -removed #comment after #document/html0/body1/#text1 +inserted #document/html0/body1/#comment2 +inserted #document/html0/body1/#text3 +inserted #document/html0/body1/script5 +inserted #document/html0/body1/script5/#text0 +removed #document/html0/head0/style0 after #document/html0/body1/#text4 +inserted #document/html0/head0/style0 +inserted #document/html0/body1/#text6 +inserted #document/html0/body1/t7 +inserted #document/html0/body1/t7/#text0 +inserted #document/html0/body1/script8 +inserted #document/html0/body1/script8/#text0 +removed #text after #comment +removed #comment after #comment +removed #document/html0/body1/#text1 before #document/html0/body1/#comment2 +removed #document/html0/body1/#comment2 before #document/html0/body1/#text3 +removed #document/html0/body1/#text3 in t +removed #comment after #document/html0/body1/#text0 +inserted #document/html0/body1/#text1, #document/html0/body1/#comment2, #document/html0/body1/#text3 +removed t after #document/html0/body1/#text4 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/placeholders-nested/__snapshots__/ssr-sanitized.expected.md b/packages/translator-tags/src/__tests__/fixtures/placeholders-nested/__snapshots__/ssr-sanitized.expected.md index 9a98055a2..12f34ee5b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/placeholders-nested/__snapshots__/ssr-sanitized.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/placeholders-nested/__snapshots__/ssr-sanitized.expected.md @@ -1,4 +1,10 @@ # Render "End" ```html -abcdefgjkl +abdeg + + fg + ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/placeholders-nested/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/placeholders-nested/__snapshots__/ssr.expected.md index 53a05e2f3..dedf74273 100644 --- a/packages/translator-tags/src/__tests__/fixtures/placeholders-nested/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/placeholders-nested/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - ai...j + ai...jbdh...eg # Write @@ -7,19 +7,41 @@ # Write - bcdh... + cdh... # Write - efg + fg # Render "End" ```html - + + + - abcdefgjkl + ab + + de + + g + + + fg + + ``` @@ -33,36 +55,54 @@ inserted #document/html0/body1/#text0 inserted #comment inserted #text inserted #comment -inserted #document/html0/body1/#text3 +inserted #text +inserted #document/html0/head0/style0 +inserted #document/html0/head0/style0/#text0 inserted t inserted #document/html0/body1/#text1 +inserted #document/html0/body1/#comment2 +inserted #document/html0/body1/#text3 inserted #comment inserted #text inserted #comment +inserted t +inserted #document/html0/body1/#text4 +inserted #document/html0/body1/#comment5 +inserted #document/html0/body1/#text6 inserted script inserted script/#text0 -removed #document/html0/body1/#text1 before #comment -inserted #document/html0/body1/#text1 -removed #comment before #text -inserted #comment -removed #text before #comment +removed #document/html0/head0/style0 after #text +inserted #document/html0/head0/style0 inserted #text -removed #comment in t -inserted #comment -removed script after t -removed t after #document/html0/body1/#text3 -removed #comment after #comment +inserted t +inserted t/#text0 +inserted t/#comment1 +inserted t/#text2 +inserted t/#comment3 +inserted #document/html0/body1/script7 +inserted #document/html0/body1/script7/#text0 removed #text after #comment removed #comment after #comment -inserted t -inserted #document/html0/body1/#text2 -inserted script -inserted script/#text0 -removed #document/html0/body1/#text2 in t -inserted #document/html0/body1/#text2 -removed script after t -removed t after #document/html0/body1/#text3 -removed #comment after #document/html0/body1/#text2 -removed #text after #document/html0/body1/#text2 -removed #comment after #document/html0/body1/#text2 +removed #document/html0/body1/#text1 before #document/html0/body1/#comment2 +removed #document/html0/body1/#comment2 before #document/html0/body1/#text3 +removed #document/html0/body1/#text3 before #comment +removed #comment before #text +removed #text before #comment +removed #comment in t +removed #comment after #document/html0/body1/#text0 +inserted #document/html0/body1/#text1, #document/html0/body1/#comment2, #document/html0/body1/#text3, #comment, #text, #comment +removed t after #text +inserted #document/html0/body1/t8 +inserted #document/html0/body1/t8/#text0 +inserted #document/html0/body1/script9 +inserted #document/html0/body1/script9/#text0 +removed #text after #comment +removed #comment after #comment +removed #text after #comment +removed t after #comment +removed script after #comment +removed #text after #comment +removed t after #comment +removed #comment after #document/html0/body1/#text3 +inserted #document/html0/body1/#text4, #document/html0/body1/#comment5, #document/html0/body1/#text6 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/placeholders/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/placeholders/__snapshots__/resume.expected.md index 3406c8cd0..1e7e0786b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/placeholders/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/placeholders/__snapshots__/resume.expected.md @@ -5,10 +5,10 @@ replaced - + replaced - +
    @@ -16,11 +16,11 @@ a
    replaced - + Hello Text <a/> replaced - + Hello HTML
    + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/placeholders/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/placeholders/__snapshots__/ssr.expected.md index ad2f54de2..0517b8a5b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/placeholders/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/placeholders/__snapshots__/ssr.expected.md @@ -1,7 +1,7 @@ # Write - replacedreplaced
    +
    # Render "End" @@ -11,10 +11,10 @@ replaced - + replaced - + + ``` @@ -65,4 +68,6 @@ inserted #document/html1/body1/div3/#text7 inserted #document/html1/body1/div3/a8 inserted #document/html1/body1/div3/a8/script0 inserted #document/html1/body1/div3/a8/script0/#text0 +inserted #document/html1/body1/script4 +inserted #document/html1/body1/script4/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/reassignment-expression-counter/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/reassignment-expression-counter/__snapshots__/resume.expected.md index afd067771..8b6446461 100644 --- a/packages/translator-tags/src/__tests__/fixtures/reassignment-expression-counter/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/reassignment-expression-counter/__snapshots__/resume.expected.md @@ -7,25 +7,25 @@ id="addTwo" > 0 - + - + - + - + @@ -48,25 +48,25 @@ container.querySelector("#addTwo").click() id="addTwo" > 2 - + - + - + - + @@ -91,25 +91,25 @@ container.querySelector("#triple").click() id="addTwo" > 6 - + - + - + - + @@ -134,25 +134,25 @@ container.querySelector("#cube").click() id="addTwo" > 216 - + - + - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/reassignment-expression-counter/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/reassignment-expression-counter/__snapshots__/ssr.expected.md index 742deb36a..48427c256 100644 --- a/packages/translator-tags/src/__tests__/fixtures/reassignment-expression-counter/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/reassignment-expression-counter/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -11,25 +11,25 @@ id="addTwo" > 0 - + - + - + - + diff --git a/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/html.expected/template.js b/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/html.expected/template.js index c24ff92bd..418cfc22f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/html.expected/template.js +++ b/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/html.expected/template.js @@ -1,4 +1,4 @@ -import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, maybeFlush as _maybeFlush, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; +import { write as _write, escapeXML as _escapeXML, markResumeNode as _markResumeNode, markResumeControlSingleNodeEnd as _markResumeControlSingleNodeEnd, writeScope as _writeScope, nextScopeId as _nextScopeId, getScopeById as _getScopeById, createRenderer as _createRenderer, createTemplate as _createTemplate } from "@marko/runtime-tags/debug/html"; const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { const _scope0_id = _nextScopeId(); const { @@ -18,7 +18,6 @@ const _renderer = /* @__PURE__ */_createRenderer((input, _tagVar) => { _write(`${_escapeXML(child.text)}${_markResumeNode(_scope1_id, "#text/0")}`); _writeScope(_scope1_id, {}); _scope1_.set(_by(child, _i), _getScopeById(_scope1_id)); - _maybeFlush(); } _write(`${_markResumeControlSingleNodeEnd(_scope0_id, "#div/0", _forScopeIds)}
    ${_markResumeNode(_scope0_id, "#div/0")}`); _writeScope(_scope0_id, { diff --git a/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/resume.expected.md index 0313491cc..826f5faaa 100644 --- a/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/resume.expected.md @@ -5,16 +5,16 @@
    a - + b - + c - - + +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/ssr.expected.md index c1d6e6dba..15ac616c6 100644 --- a/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/remove-and-add-rows/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    abc
    +
    abc
    # Render "End" @@ -9,16 +9,16 @@
    a - + b - + c - - + +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/return-tag-no-var/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/return-tag-no-var/__snapshots__/resume.expected.md index 1df14a1de..b3c1c8edc 100644 --- a/packages/translator-tags/src/__tests__/fixtures/return-tag-no-var/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/return-tag-no-var/__snapshots__/resume.expected.md @@ -7,7 +7,7 @@ child diff --git a/packages/translator-tags/src/__tests__/fixtures/return-tag-no-var/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/return-tag-no-var/__snapshots__/ssr.expected.md index 90e71fdf7..24a2ca4af 100644 --- a/packages/translator-tags/src/__tests__/fixtures/return-tag-no-var/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/return-tag-no-var/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - child + child # Render "End" @@ -11,7 +11,7 @@ child diff --git a/packages/translator-tags/src/__tests__/fixtures/return-tag/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/return-tag/__snapshots__/ssr.expected.md index 8f717f177..312d39ff7 100644 --- a/packages/translator-tags/src/__tests__/fixtures/return-tag/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/return-tag/__snapshots__/ssr.expected.md @@ -1,14 +1,14 @@ # Write - + # Render "End" ```html - + diff --git a/packages/translator-tags/src/__tests__/fixtures/same-source-alias-pattern-and-identifier/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/same-source-alias-pattern-and-identifier/__snapshots__/resume.expected.md index d2ef316d2..79ba4acac 100644 --- a/packages/translator-tags/src/__tests__/fixtures/same-source-alias-pattern-and-identifier/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/same-source-alias-pattern-and-identifier/__snapshots__/resume.expected.md @@ -5,12 +5,15 @@ + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/same-source-alias-pattern-and-identifier/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/same-source-alias-pattern-and-identifier/__snapshots__/ssr.expected.md index 130311a82..174facb7f 100644 --- a/packages/translator-tags/src/__tests__/fixtures/same-source-alias-pattern-and-identifier/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/same-source-alias-pattern-and-identifier/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,12 +9,15 @@ + ``` @@ -31,4 +34,6 @@ inserted #document/html0/body1/button0/#text2 inserted #document/html0/body1/button0/#comment3 inserted #document/html0/body1/button0/#text4 inserted #document/html0/body1/button0/#comment5 +inserted #document/html0/body1/script1 +inserted #document/html0/body1/script1/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/same-source-non-alias/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/same-source-non-alias/__snapshots__/resume.expected.md index 1b7a405bd..23e4e6faf 100644 --- a/packages/translator-tags/src/__tests__/fixtures/same-source-non-alias/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/same-source-non-alias/__snapshots__/resume.expected.md @@ -5,15 +5,15 @@ - + @@ -34,15 +34,15 @@ container.querySelector("button").click() - + @@ -64,15 +64,15 @@ container.querySelector("button").click() - + diff --git a/packages/translator-tags/src/__tests__/fixtures/same-source-non-alias/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/same-source-non-alias/__snapshots__/ssr.expected.md index ca563c852..bfe663097 100644 --- a/packages/translator-tags/src/__tests__/fixtures/same-source-non-alias/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/same-source-non-alias/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -9,15 +9,15 @@ - + diff --git a/packages/translator-tags/src/__tests__/fixtures/tag-resolution-priority/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/tag-resolution-priority/__snapshots__/resume.expected.md index f8cc9a3bb..b4c4b7234 100644 --- a/packages/translator-tags/src/__tests__/fixtures/tag-resolution-priority/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/tag-resolution-priority/__snapshots__/resume.expected.md @@ -4,11 +4,11 @@
    - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/tag-resolution-priority/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/tag-resolution-priority/__snapshots__/ssr.expected.md index fff03172b..edcc8f854 100644 --- a/packages/translator-tags/src/__tests__/fixtures/tag-resolution-priority/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/tag-resolution-priority/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -8,11 +8,11 @@
    - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/tag-var-destructure/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/tag-var-destructure/__snapshots__/resume.expected.md index ef4f218fb..0a76ea631 100644 --- a/packages/translator-tags/src/__tests__/fixtures/tag-var-destructure/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/tag-var-destructure/__snapshots__/resume.expected.md @@ -8,36 +8,36 @@ a 1 0 - +
             b    2    
             
             0
    -        
    +        
           
             c  {c:4}  
             
             0
    -        
    +        
           
             d    7    
             
             0
    -        
    +        
           
             f   [9]   
             
             []
    -        
    +        
           
    - + @@ -61,36 +61,36 @@ container?.querySelector("button").click() a 1 1 - +
             b    2    
             
             2
    -        
    +        
           
             c  {c:4}  
             
             7
    -        
    +        
           
             d    7    
             
             7
    -        
    +        
           
             f   [9]   
             
             [9]
    -        
    +        
           
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/tag-var-destructure/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/tag-var-destructure/__snapshots__/ssr.expected.md index 779dd09b1..0b2800168 100644 --- a/packages/translator-tags/src/__tests__/fixtures/tag-var-destructure/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/tag-var-destructure/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - + # Render "End" @@ -12,36 +12,36 @@ a 1 0 - +
             b    2    
             
             0
    -        
    +        
           
             c  {c:4}  
             
             0
    -        
    +        
           
             d    7    
             
             0
    -        
    +        
           
             f   [9]   
             
             []
    -        
    +        
           
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/toggle-first-child/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/toggle-first-child/__snapshots__/resume.expected.md index 2fb4cf75e..ef30d85ad 100644 --- a/packages/translator-tags/src/__tests__/fixtures/toggle-first-child/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/toggle-first-child/__snapshots__/resume.expected.md @@ -6,14 +6,14 @@
    Hello - + - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/toggle-first-child/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/toggle-first-child/__snapshots__/ssr.expected.md index 63848bce4..0c8ce4baa 100644 --- a/packages/translator-tags/src/__tests__/fixtures/toggle-first-child/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/toggle-first-child/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    Hello
    +
    Hello
    # Render "End" @@ -10,14 +10,14 @@
    Hello - + - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/toggle-nested-2/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/toggle-nested-2/__snapshots__/resume.expected.md index 7d194916f..b1caf207b 100644 --- a/packages/translator-tags/src/__tests__/fixtures/toggle-nested-2/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/toggle-nested-2/__snapshots__/resume.expected.md @@ -7,24 +7,24 @@ - - - + + +
    @@ -47,24 +47,24 @@ container.querySelector("#count").click() - - - + + +
    @@ -87,24 +87,24 @@ container.querySelector("#count").click() - - - + + +
    @@ -127,18 +127,18 @@ container.querySelector("#inner").click()
    @@ -163,22 +163,22 @@ container.querySelector("#inner").click() - - + +
    @@ -203,22 +203,22 @@ container.querySelector("#count").click() - - + +
    @@ -241,11 +241,11 @@ container.querySelector("#outer").click()
    @@ -274,7 +274,7 @@ container.querySelector("#outer").click()
    @@ -315,7 +315,7 @@ container.querySelector("#count").click()
    diff --git a/packages/translator-tags/src/__tests__/fixtures/toggle-nested-2/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/toggle-nested-2/__snapshots__/ssr.expected.md index 66a51517b..ba0559919 100644 --- a/packages/translator-tags/src/__tests__/fixtures/toggle-nested-2/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/toggle-nested-2/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -11,24 +11,24 @@ - - - + + +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/toggle-nested/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/toggle-nested/__snapshots__/resume.expected.md index c145ba916..01bacb6a3 100644 --- a/packages/translator-tags/src/__tests__/fixtures/toggle-nested/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/toggle-nested/__snapshots__/resume.expected.md @@ -4,10 +4,10 @@
    - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/toggle-nested/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/toggle-nested/__snapshots__/ssr.expected.md index 8c5d2d453..1c3dd8d0d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/toggle-nested/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/toggle-nested/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -8,10 +8,10 @@
    - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/update-attr/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/update-attr/__snapshots__/resume.expected.md index adb6c221b..816c3e3c4 100644 --- a/packages/translator-tags/src/__tests__/fixtures/update-attr/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/update-attr/__snapshots__/resume.expected.md @@ -7,7 +7,10 @@ a="0" b="1" /> - + + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/update-attr/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/update-attr/__snapshots__/ssr.expected.md index ec8f58b58..f244ea93c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/update-attr/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/update-attr/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -11,7 +11,10 @@ a="0" b="1" /> - + + ``` @@ -23,4 +26,6 @@ inserted #document/html0/head0 inserted #document/html0/body1 inserted #document/html0/body1/div0 inserted #document/html0/body1/#comment1 +inserted #document/html0/body1/script2 +inserted #document/html0/body1/script2/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/update-dynamic-attrs/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/update-dynamic-attrs/__snapshots__/resume.expected.md index 11b9fe8a0..536988a1c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/update-dynamic-attrs/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/update-dynamic-attrs/__snapshots__/resume.expected.md @@ -7,19 +7,19 @@ a="1" b="2" /> - +
    - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/update-dynamic-attrs/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/update-dynamic-attrs/__snapshots__/ssr.expected.md index 3286d7217..cf0d9844c 100644 --- a/packages/translator-tags/src/__tests__/fixtures/update-dynamic-attrs/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/update-dynamic-attrs/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    +
    # Render "End" @@ -11,19 +11,19 @@ a="1" b="2" /> - +
    - +
    - + diff --git a/packages/translator-tags/src/__tests__/fixtures/update-html/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/update-html/__snapshots__/resume.expected.md index fb30eef9e..954c9e66e 100644 --- a/packages/translator-tags/src/__tests__/fixtures/update-html/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/update-html/__snapshots__/resume.expected.md @@ -12,7 +12,10 @@ World - + + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/update-html/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/update-html/__snapshots__/ssr.expected.md index 75aa05baf..3f1a6c434 100644 --- a/packages/translator-tags/src/__tests__/fixtures/update-html/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/update-html/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - Testing Hello World + Testing Hello World # Render "End" @@ -16,7 +16,10 @@ World - + + ``` @@ -34,4 +37,6 @@ inserted #document/html0/body1/#text3 inserted #document/html0/body1/strong4 inserted #document/html0/body1/strong4/#text0 inserted #document/html0/body1/#comment5 +inserted #document/html0/body1/script6 +inserted #document/html0/body1/script6/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/update-text/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/update-text/__snapshots__/resume.expected.md index 178c36bd2..24f234ccc 100644 --- a/packages/translator-tags/src/__tests__/fixtures/update-text/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/update-text/__snapshots__/resume.expected.md @@ -6,7 +6,10 @@ Static Dynamic 1 - + + ``` diff --git a/packages/translator-tags/src/__tests__/fixtures/update-text/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/update-text/__snapshots__/ssr.expected.md index 7f67bf7c4..763f31544 100644 --- a/packages/translator-tags/src/__tests__/fixtures/update-text/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/update-text/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write - Static Dynamic 1 + Static Dynamic 1 # Render "End" @@ -10,7 +10,10 @@ Static Dynamic 1 - + + ``` @@ -24,4 +27,6 @@ inserted #document/html0/body1/#text0 inserted #document/html0/body1/#comment1 inserted #document/html0/body1/#text2 inserted #document/html0/body1/#comment3 +inserted #document/html0/body1/script4 +inserted #document/html0/body1/script4/#text0 ``` \ No newline at end of file diff --git a/packages/translator-tags/src/__tests__/fixtures/user-effect-abort-signal/__snapshots__/resume.expected.md b/packages/translator-tags/src/__tests__/fixtures/user-effect-abort-signal/__snapshots__/resume.expected.md index da136e6f8..22713e16d 100644 --- a/packages/translator-tags/src/__tests__/fixtures/user-effect-abort-signal/__snapshots__/resume.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/user-effect-abort-signal/__snapshots__/resume.expected.md @@ -5,14 +5,14 @@
    0 - + 0 - +
    @@ -31,14 +31,14 @@
    1 - + 0 - +
    diff --git a/packages/translator-tags/src/__tests__/fixtures/user-effect-abort-signal/__snapshots__/ssr.expected.md b/packages/translator-tags/src/__tests__/fixtures/user-effect-abort-signal/__snapshots__/ssr.expected.md index 8756e136c..0dd766372 100644 --- a/packages/translator-tags/src/__tests__/fixtures/user-effect-abort-signal/__snapshots__/ssr.expected.md +++ b/packages/translator-tags/src/__tests__/fixtures/user-effect-abort-signal/__snapshots__/ssr.expected.md @@ -1,5 +1,5 @@ # Write -
    0 0
    +
    0 0
    # Render "End" @@ -9,14 +9,14 @@
    0 - + 0 - +
    diff --git a/packages/translator-tags/src/__tests__/main.test.ts b/packages/translator-tags/src/__tests__/main.test.ts index 9a767ec8e..81af1d090 100644 --- a/packages/translator-tags/src/__tests__/main.test.ts +++ b/packages/translator-tags/src/__tests__/main.test.ts @@ -1,11 +1,9 @@ -import "./test-globals"; import assert from "assert"; import fs from "fs"; import path from "path"; import * as compiler from "@marko/compiler"; import register from "@marko/compiler/register"; import type { Template, Input } from "@marko/runtime-tags/common/types"; -import reorderRuntime from "@marko/runtime-tags/html/reorder-runtime"; import type { DOMWindow } from "jsdom"; import snap from "mocha-snap"; import glob from "tiny-glob"; @@ -13,14 +11,9 @@ import * as translator from ".."; import { bundle } from "./utils/bundle"; import createBrowser from "./utils/create-browser"; import { isThrows, isWait } from "./utils/resolve"; +import { stripInlineRuntime } from "./utils/strip-inline-runtime"; import createMutationTracker from "./utils/track-mutations"; -const runtimeId = "M"; -const reorderRuntimeString = String(reorderRuntime).replace( - "RUNTIME_ID", - runtimeId, -); - type TestConfig = { steps?: unknown[] | (() => Promise); skip_dom?: boolean; @@ -212,11 +205,7 @@ describe("translator-tags", () => { try { for await (const data of serverTemplate.render(input)) { buffer += data; - tracker.log( - `# Write\n${indent( - data.replace(reorderRuntimeString, "REORDER_RUNTIME"), - )}`, - ); + tracker.log(`# Write\n${indent(stripInlineRuntime(data))}`); } document.write(buffer); document.close(); @@ -403,8 +392,8 @@ describe("translator-tags", () => { .getRawLogs(true) .slice(0, resumeLogs.length); assert.strictEqual( - csrLogs.join("\n\n").replace(/[cs]\d+/g, "%id"), - resumeLogs.join("\n\n").replace(/[cs]\d+/g, "%id"), + csrLogs.join("\n\n").replace(/[cs]M_[a-z0-9]+/g, "%id"), + resumeLogs.join("\n\n").replace(/[cs]M_[a-z0-9]+/g, "%id"), ); }); }); diff --git a/packages/translator-tags/src/__tests__/test-globals.ts b/packages/translator-tags/src/__tests__/test-globals.ts deleted file mode 100644 index f160a544b..000000000 --- a/packages/translator-tags/src/__tests__/test-globals.ts +++ /dev/null @@ -1,9 +0,0 @@ -function init(globalThis: any) { - Object.assign(globalThis, { - // Forces tests to use the Marko debug runtime. - MARKO_DEBUG: "true", - }); -} - -init(globalThis); -export default init; diff --git a/packages/translator-tags/src/__tests__/utils/create-browser.ts b/packages/translator-tags/src/__tests__/utils/create-browser.ts index 091ffa63c..03792b28f 100644 --- a/packages/translator-tags/src/__tests__/utils/create-browser.ts +++ b/packages/translator-tags/src/__tests__/utils/create-browser.ts @@ -1,11 +1,10 @@ import type { DOMWindow } from "jsdom"; import { createBrowser } from "jsdom-context-require"; -import init from "../test-globals"; export default function (options: Parameters[0]) { const browser = createBrowser(options); const window = browser.window as DOMWindow & { MessageChannel: any }; - init(window); + window.MARKO_DEBUG = true; window.queueMicrotask = queueMicrotask; window.MessageChannel = (window as any).MessageChannel = class MessageChannel { diff --git a/packages/translator-tags/src/__tests__/utils/strip-inline-runtime.ts b/packages/translator-tags/src/__tests__/utils/strip-inline-runtime.ts new file mode 100644 index 000000000..a258e35f1 --- /dev/null +++ b/packages/translator-tags/src/__tests__/utils/strip-inline-runtime.ts @@ -0,0 +1,18 @@ +import { + REORDER_RUNTIME_CODE, + WALKER_RUNTIME_CODE, +} from "@marko/runtime-tags/html/inlined-runtimes"; +const ESCAPED_WALKER_RUNTIME_CODE = escapeHTML(WALKER_RUNTIME_CODE); +const ESCAPED_REORDER_RUNTIME_CODE = escapeHTML(REORDER_RUNTIME_CODE); + +export function stripInlineRuntime(str: string) { + return str + .replace(ESCAPED_WALKER_RUNTIME_CODE, "WALKER_RUNTIME") + .replace(ESCAPED_REORDER_RUNTIME_CODE, "REORDER_RUNTIME") + .replace(WALKER_RUNTIME_CODE, "WALKER_RUNTIME") + .replace(REORDER_RUNTIME_CODE, "REORDER_RUNTIME"); +} + +function escapeHTML(str: string): string { + return str.replaceAll("<", "<").replaceAll(">", ">"); +} diff --git a/packages/translator-tags/src/__tests__/utils/track-mutations.ts b/packages/translator-tags/src/__tests__/utils/track-mutations.ts index 2e8a95144..33f27495e 100644 --- a/packages/translator-tags/src/__tests__/utils/track-mutations.ts +++ b/packages/translator-tags/src/__tests__/utils/track-mutations.ts @@ -1,16 +1,10 @@ -import reorderRuntime from "@marko/runtime-tags/html/reorder-runtime"; import type { JSDOM } from "jsdom"; import format, { plugins } from "pretty-format"; import { getNodePath } from "./get-node-info"; +import { stripInlineRuntime } from "./strip-inline-runtime"; const { DOMElement, DOMCollection } = plugins; -const runtimeId = "M"; -const reorderRuntimeString = String(reorderRuntime).replace( - "RUNTIME_ID", - runtimeId, -); - export default function createMutationTracker( window: JSDOM["window"], container: ParentNode, @@ -141,15 +135,17 @@ function getStatusString( omitMutations?: boolean, ) { const updateString = getUpdateString(update); - const formattedHTML = Array.from(container.childNodes) - .map((child) => - format(child, { - plugins: [DOMElement, DOMCollection], - }).trim(), - ) - .filter(Boolean) - .join("\n") - .trim(); + const formattedHTML = stripInlineRuntime( + Array.from(container.childNodes) + .map((child) => + format(child, { + plugins: [DOMElement, DOMCollection], + }).trim(), + ) + .filter(Boolean) + .join("\n") + .trim(), + ); return `# Render ${updateString}\n\`\`\`html\n${formattedHTML}\n\`\`\`${ omitMutations @@ -204,13 +200,8 @@ function formatMutationRecord(record: MutationRecord) { } return `${getNodePath(target)}: ${JSON.stringify( - (oldValue || "").replace(reorderRuntimeString, "REORDER_RUNTIME"), - )} => ${JSON.stringify( - (target.nodeValue || "").replace( - reorderRuntimeString, - "REORDER_RUNTIME", - ), - )}`; + oldValue || "", + )} => ${JSON.stringify(target.nodeValue || "")}`; } case "childList": { diff --git a/packages/translator-tags/src/core/for.ts b/packages/translator-tags/src/core/for.ts index 432abf873..0d00485a8 100644 --- a/packages/translator-tags/src/core/for.ts +++ b/packages/translator-tags/src/core/for.ts @@ -564,8 +564,6 @@ const translateHTML = { ); } - block.body.push(t.expressionStatement(callRuntime("maybeFlush"))); - tag.replaceWithMultiple(replacement); }, }; diff --git a/packages/translator-tags/src/core/id.ts b/packages/translator-tags/src/core/id.ts index 9effb0797..e734cfbc7 100644 --- a/packages/translator-tags/src/core/id.ts +++ b/packages/translator-tags/src/core/id.ts @@ -10,12 +10,15 @@ import { isOutputHTML } from "../util/marko-config"; import { callRuntime } from "../util/runtime"; import { getSection } from "../util/sections"; import { addValue, initValue } from "../util/signals"; +import { scopeIdentifier } from "../visitors/program"; export default { translate(tag) { const { node } = tag; const { var: tagVar } = node; - const id = callRuntime("nextTagId"); + const id = isOutputHTML() + ? callRuntime("nextTagId") + : callRuntime("nextTagId", scopeIdentifier); assertNoArgs(tag); assertNoAttributes(tag); diff --git a/scripts/babel-register.js b/scripts/babel-register.js index 2229af233..75e92861f 100644 --- a/scripts/babel-register.js +++ b/scripts/babel-register.js @@ -1,3 +1,5 @@ +globalThis.MARKO_DEBUG = true; + // aliased as ~ts via package.json require("@babel/register")({ babelrc: false,