'use strict'; var solidJs = require('solid-js'); var seroval = require('seroval'); const booleans = ["allowfullscreen", "async", "autofocus", "autoplay", "checked", "controls", "default", "disabled", "formnovalidate", "hidden", "indeterminate", "ismap", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "seamless", "selected"]; const BooleanAttributes = /*#__PURE__*/new Set(booleans); const ChildProperties = /*#__PURE__*/new Set(["innerHTML", "textContent", "innerText", "children"]); const Aliases = /*#__PURE__*/Object.assign(Object.create(null), { className: "class", htmlFor: "for" }); const ES2017FLAG = seroval.Feature.AggregateError | seroval.Feature.BigInt | seroval.Feature.BigIntTypedArray; function stringify(data) { return seroval.serialize(data, { disabledFeatures: ES2017FLAG }); } const VOID_ELEMENTS = /^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i; const REPLACE_SCRIPT = `function $df(e,n,t,o,d){if(t=document.getElementById(e),o=document.getElementById("pl-"+e)){for(;o&&8!==o.nodeType&&o.nodeValue!=="pl-"+e;)d=o.nextSibling,o.remove(),o=d;_$HY.done?o.remove():o.replaceWith(t.content)}t.remove(),_$HY.set(e,n),_$HY.fe(e)}`; function renderToString(code, options = {}) { let scripts = ""; solidJs.sharedConfig.context = { id: options.renderId || "", count: 0, suspense: {}, lazy: {}, assets: [], nonce: options.nonce, writeResource(id, p, error) { if (solidJs.sharedConfig.context.noHydrate) return; if (error) return scripts += `_$HY.set("${id}", ${stringify(p)});`; scripts += `_$HY.set("${id}", ${stringify(p)});`; } }; let html = solidJs.createRoot(d => { setTimeout(d); return resolveSSRNode(escape(code())); }); solidJs.sharedConfig.context.noHydrate = true; html = injectAssets(solidJs.sharedConfig.context.assets, html); if (scripts.length) html = injectScripts(html, scripts, options.nonce); return html; } function renderToStringAsync(code, options = {}) { const { timeoutMs = 30000 } = options; let timeoutHandle; const timeout = new Promise((_, reject) => { timeoutHandle = setTimeout(() => reject("renderToString timed out"), timeoutMs); }); return Promise.race([renderToStream(code, options), timeout]).then(html => { clearTimeout(timeoutHandle); return html; }); } function renderToStream(code, options = {}) { let { nonce, onCompleteShell, onCompleteAll, renderId } = options; let dispose; const blockingResources = []; const registry = new Map(); const dedupe = new WeakMap(); const checkEnd = () => { if (!registry.size && !completed) { writeTasks(); onCompleteAll && onCompleteAll({ write(v) { !completed && buffer.write(v); } }); writable && writable.end(); completed = true; setTimeout(dispose); } }; const pushTask = task => { tasks += task + ";"; if (!scheduled && firstFlushed) { Promise.resolve().then(writeTasks); scheduled = true; } }; const writeTasks = () => { if (tasks.length && !completed && firstFlushed) { buffer.write(`${tasks}`); tasks = ""; } scheduled = false; }; let context; let writable; let tmp = ""; let tasks = ""; let firstFlushed = false; let completed = false; let scriptFlushed = false; let scheduled = true; let buffer = { write(payload) { tmp += payload; } }; solidJs.sharedConfig.context = context = { id: renderId || "", count: 0, async: true, resources: {}, lazy: {}, suspense: {}, assets: [], nonce, block(p) { if (!firstFlushed) blockingResources.push(p); }, replace(id, payloadFn) { if (firstFlushed) return; const placeholder = ``; const first = html.indexOf(placeholder); if (first === -1) return; const last = html.indexOf(``, first + placeholder.length); html = html.replace(html.slice(first, last + placeholder.length + 1), resolveSSRNode(payloadFn())); }, writeResource(id, p, error, wait) { const serverOnly = solidJs.sharedConfig.context.noHydrate; if (error) return !serverOnly && pushTask(serializeSet(dedupe, id, p)); if (!p || typeof p !== "object" || !("then" in p)) return !serverOnly && pushTask(serializeSet(dedupe, id, p)); if (!firstFlushed) wait && blockingResources.push(p);else !serverOnly && pushTask(`_$HY.init("${id}")`); if (serverOnly) return; p.then(d => { !completed && pushTask(serializeSet(dedupe, id, d)); }).catch(() => { !completed && pushTask(`_$HY.set("${id}", {})`); }); }, registerFragment(key) { if (!registry.has(key)) { registry.set(key, []); firstFlushed && pushTask(`_$HY.init("${key}")`); } return (value, error) => { if (registry.has(key)) { const keys = registry.get(key); registry.delete(key); if (waitForFragments(registry, key)) return; if ((value !== undefined || error) && !completed) { if (!firstFlushed) { Promise.resolve().then(() => html = replacePlaceholder(html, key, value !== undefined ? value : "")); error && pushTask(serializeSet(dedupe, key, error)); } else { buffer.write(``); pushTask(`${keys.length ? keys.map(k => `_$HY.unset("${k}")`).join(";") + ";" : ""}$df("${key}"${error ? "," + stringify(error) : ""})${!scriptFlushed ? ";" + REPLACE_SCRIPT : ""}`); scriptFlushed = true; } } } if (!registry.size) Promise.resolve().then(checkEnd); return firstFlushed; }; } }; let html = solidJs.createRoot(d => { dispose = d; return resolveSSRNode(escape(code())); }); function doShell() { solidJs.sharedConfig.context = context; context.noHydrate = true; html = injectAssets(context.assets, html); for (const key in context.resources) { if (!("data" in context.resources[key] || context.resources[key].ref[0].error)) pushTask(`_$HY.init("${key}")`); } for (const key of registry.keys()) pushTask(`_$HY.init("${key}")`); if (tasks.length) html = injectScripts(html, tasks, nonce); buffer.write(html); tasks = ""; scheduled = false; onCompleteShell && onCompleteShell({ write(v) { !completed && buffer.write(v); } }); } return { then(fn) { function complete() { doShell(); fn(tmp); } if (onCompleteAll) { ogComplete = onCompleteAll; onCompleteAll = options => { ogComplete(options); complete(); }; } else onCompleteAll = complete; if (!registry.size) Promise.resolve().then(checkEnd); }, pipe(w) { Promise.allSettled(blockingResources).then(() => { doShell(); buffer = writable = w; buffer.write(tmp); firstFlushed = true; if (completed) writable.end();else setTimeout(checkEnd); }); }, pipeTo(w) { Promise.allSettled(blockingResources).then(() => { doShell(); const encoder = new TextEncoder(); const writer = w.getWriter(); writable = { end() { writer.releaseLock(); w.close(); } }; buffer = { write(payload) { writer.write(encoder.encode(payload)); } }; buffer.write(tmp); firstFlushed = true; if (completed) writable.end();else setTimeout(checkEnd); }); } }; } function HydrationScript(props) { const { nonce } = solidJs.sharedConfig.context; return ssr(generateHydrationScript({ nonce, ...props })); } function ssr(t, ...nodes) { if (nodes.length) { let result = ""; for (let i = 0; i < nodes.length; i++) { result += t[i]; const node = nodes[i]; if (node !== undefined) result += resolveSSRNode(node); } t = result + t[nodes.length]; } return { t }; } function ssrClassList(value) { if (!value) return ""; let classKeys = Object.keys(value), result = ""; for (let i = 0, len = classKeys.length; i < len; i++) { const key = classKeys[i], classValue = !!value[key]; if (!key || key === "undefined" || !classValue) continue; i && (result += " "); result += escape(key); } return result; } function ssrStyle(value) { if (!value) return ""; if (typeof value === "string") return value; let result = ""; const k = Object.keys(value); for (let i = 0; i < k.length; i++) { const s = k[i]; const v = value[s]; if (v != undefined) { if (i) result += ";"; result += `${s}:${escape(v, true)}`; } } return result; } function ssrElement(tag, props, children, needsId) { if (props == null) props = {};else if (typeof props === "function") props = props(); const skipChildren = VOID_ELEMENTS.test(tag); const keys = Object.keys(props); let result = `<${tag}${needsId ? ssrHydrationKey() : ""} `; let classResolved; for (let i = 0; i < keys.length; i++) { const prop = keys[i]; if (ChildProperties.has(prop)) { if (children === undefined && !skipChildren) children = prop === "innerHTML" ? props[prop] : escape(props[prop]); continue; } const value = props[prop]; if (prop === "style") { result += `style="${ssrStyle(value)}"`; } else if (prop === "class" || prop === "className" || prop === "classList") { if (classResolved) continue; let n; result += `class="${escape(((n = props.class) ? n + " " : "") + ((n = props.className) ? n + " " : ""), true) + ssrClassList(props.classList)}"`; classResolved = true; } else if (BooleanAttributes.has(prop)) { if (value) result += prop;else continue; } else if (value == undefined || prop === "ref" || prop.slice(0, 2) === "on") { continue; } else { result += `${Aliases[prop] || prop}="${escape(value, true)}"`; } if (i !== keys.length - 1) result += " "; } if (skipChildren) return { t: result + "/>" }; if (typeof children === "function") children = children(); return { t: result + `>${resolveSSRNode(children, true)}` }; } function ssrAttribute(key, value, isBoolean) { return isBoolean ? value ? " " + key : "" : value != null ? ` ${key}="${value}"` : ""; } function ssrHydrationKey() { const hk = getHydrationKey(); return hk ? ` data-hk="${hk}"` : ""; } function escape(s, attr) { const t = typeof s; if (t !== "string") { if (!attr && t === "function") return escape(s()); if (!attr && Array.isArray(s)) { for (let i = 0; i < s.length; i++) s[i] = escape(s[i]); return s; } if (attr && t === "boolean") return String(s); return s; } const delim = attr ? '"' : "<"; const escDelim = attr ? """ : "<"; let iDelim = s.indexOf(delim); let iAmp = s.indexOf("&"); if (iDelim < 0 && iAmp < 0) return s; let left = 0, out = ""; while (iDelim >= 0 && iAmp >= 0) { if (iDelim < iAmp) { if (left < iDelim) out += s.substring(left, iDelim); out += escDelim; left = iDelim + 1; iDelim = s.indexOf(delim, left); } else { if (left < iAmp) out += s.substring(left, iAmp); out += "&"; left = iAmp + 1; iAmp = s.indexOf("&", left); } } if (iDelim >= 0) { do { if (left < iDelim) out += s.substring(left, iDelim); out += escDelim; left = iDelim + 1; iDelim = s.indexOf(delim, left); } while (iDelim >= 0); } else while (iAmp >= 0) { if (left < iAmp) out += s.substring(left, iAmp); out += "&"; left = iAmp + 1; iAmp = s.indexOf("&", left); } return left < s.length ? out + s.substring(left) : out; } function resolveSSRNode(node, top) { const t = typeof node; if (t === "string") return node; if (node == null || t === "boolean") return ""; if (Array.isArray(node)) { let prev = {}; let mapped = ""; for (let i = 0, len = node.length; i < len; i++) { if (!top && typeof prev !== "object" && typeof node[i] !== "object") mapped += ``; mapped += resolveSSRNode(prev = node[i]); } return mapped; } if (t === "object") return node.t; if (t === "function") return resolveSSRNode(node()); return String(node); } function getHydrationKey() { const hydrate = solidJs.sharedConfig.context; return hydrate && !hydrate.noHydrate && `${hydrate.id}${hydrate.count++}`; } function useAssets(fn) { solidJs.sharedConfig.context.assets.push(() => resolveSSRNode(fn())); } function getAssets() { const assets = solidJs.sharedConfig.context.assets; let out = ""; for (let i = 0, len = assets.length; i < len; i++) out += assets[i](); return out; } function generateHydrationScript({ eventNames = ["click", "input"], nonce } = {}) { return `(e=>{let t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host.nodeType?e.host:e.parentNode));["${eventNames.join('", "')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])}))))})(window._$HY||(_$HY={events:[],completed:new WeakSet,r:{},fe(){},init(e,t){_$HY.r[e]=[new Promise((e=>t=e)),t]},set(e,t,o){(o=_$HY.r[e])&&o[1](t),_$HY.r[e]=[t]},unset(e){delete _$HY.r[e]},load:e=>_$HY.r[e]}));`; } function Hydration(props) { if (!solidJs.sharedConfig.context.noHydrate) return props.children; const context = solidJs.sharedConfig.context; solidJs.sharedConfig.context = { ...context, count: 0, id: `${context.id}${context.count++}-`, noHydrate: false }; const res = props.children; solidJs.sharedConfig.context = context; return res; } function NoHydration(props) { solidJs.sharedConfig.context.noHydrate = true; return props.children; } function injectAssets(assets, html) { if (!assets || !assets.length) return html; let out = ""; for (let i = 0, len = assets.length; i < len; i++) out += assets[i](); return html.replace(``, out + ``); } function injectScripts(html, scripts, nonce) { const tag = `${scripts}`; const index = html.indexOf(""); if (index > -1) { return html.slice(0, index) + tag + html.slice(index); } return html + tag; } function waitForFragments(registry, key) { for (const k of [...registry.keys()].reverse()) { if (key.startsWith(k)) { registry.get(k).push(key); return true; } } return false; } function serializeSet(registry, key, value) { const exist = registry.get(value); if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0])`; value !== null && typeof value === "object" && registry.set(value, key); return `_$HY.set("${key}", ${stringify(value)})`; } function replacePlaceholder(html, key, value) { const marker = `