@builder.io/qwik
Version:
An Open-Source sub-framework designed with a focus on server-side-rendering, lazy-loading, and styling/animation.
755 lines (739 loc) • 39.5 kB
JavaScript
/**
* @license
* @builder.io/qwik/server 1.11.0
* Copyright Builder.io, Inc. All Rights Reserved.
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/QwikDev/qwik/blob/main/LICENSE
*/
globalThis.qwikServer = (function (module) {
if (typeof require !== 'function' && typeof location !== 'undefined' && typeof navigator !== 'undefined') {
// shim cjs require() for core.cjs within a browser
globalThis.require = function(path) {
if (path === './core.cjs' || path === '@builder.io/qwik') {
if (!self.qwikCore) {
throw new Error('Qwik Core global, "globalThis.qwikCore", must already be loaded for the Qwik Server to be used within a browser.');
}
return self.qwikCore;
}
if (path === '@builder.io/qwik/build') {
if (!self.qwikBuild) {
throw new Error('Qwik Build global, "globalThis.qwikBuild", must already be loaded for the Qwik Server to be used within a browser.');
}
return self.qwikBuild;
}
throw new Error('Unable to require() path "' + path + '" from a browser environment.');
};
}
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// packages/qwik/src/server/index.ts
var server_exports = {};
__export(server_exports, {
getQwikLoaderScript: () => getQwikLoaderScript,
getQwikPrefetchWorkerScript: () => getQwikPrefetchWorkerScript,
renderToStream: () => renderToStream,
renderToString: () => renderToString,
resolveManifest: () => resolveManifest,
setServerPlatform: () => setServerPlatform2,
versions: () => versions2
});
module.exports = __toCommonJS(server_exports);
var import_qwik4 = require("@builder.io/qwik");
// packages/qwik/src/server/platform.ts
var import_qwik = require("@builder.io/qwik");
var SYNC_QRL = "<sync>";
function createPlatform(opts, resolvedManifest) {
const mapper = resolvedManifest == null ? void 0 : resolvedManifest.mapper;
const mapperFn = opts.symbolMapper ? opts.symbolMapper : (symbolName, _chunk, parent) => {
var _a;
if (mapper) {
const hash2 = getSymbolHash(symbolName);
const result = mapper[hash2];
if (!result) {
if (hash2 === SYNC_QRL) {
return [hash2, ""];
}
const isRegistered = (_a = globalThis.__qwik_reg_symbols) == null ? void 0 : _a.has(hash2);
if (isRegistered) {
return [symbolName, "_"];
}
if (parent) {
return [symbolName, `${parent}?qrl=${symbolName}`];
}
console.error("Cannot resolve symbol", symbolName, "in", mapper, parent);
}
return result;
}
};
const serverPlatform = {
isServer: true,
async importSymbol(_containerEl, url, symbolName) {
var _a;
const hash2 = getSymbolHash(symbolName);
const regSym = (_a = globalThis.__qwik_reg_symbols) == null ? void 0 : _a.get(hash2);
if (regSym) {
return regSym;
}
let modulePath = String(url);
if (!modulePath.endsWith(".js")) {
modulePath += ".js";
}
const module2 = require(modulePath);
if (!(symbolName in module2)) {
throw new Error(`Q-ERROR: missing symbol '${symbolName}' in module '${modulePath}'.`);
}
return module2[symbolName];
},
raf: () => {
console.error("server can not rerender");
return Promise.resolve();
},
nextTick: (fn) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(fn());
});
});
},
chunkForSymbol(symbolName, _chunk, parent) {
return mapperFn(symbolName, mapper, parent);
}
};
return serverPlatform;
}
async function setServerPlatform(opts, manifest) {
const platform = createPlatform(opts, manifest);
(0, import_qwik.setPlatform)(platform);
}
var getSymbolHash = (symbolName) => {
const index = symbolName.lastIndexOf("_");
if (index > -1) {
return symbolName.slice(index + 1);
}
return symbolName;
};
// packages/qwik/src/server/render.ts
var import_qwik3 = require("@builder.io/qwik");
var import_build = require("@builder.io/qwik/build");
// packages/qwik/src/core/util/markers.ts
var QInstance = "q:instance";
// packages/qwik/src/optimizer/src/manifest.ts
function getValidManifest(manifest) {
if (manifest != null && manifest.mapping != null && typeof manifest.mapping === "object" && manifest.symbols != null && typeof manifest.symbols === "object" && manifest.bundles != null && typeof manifest.bundles === "object") {
return manifest;
}
return void 0;
}
// packages/qwik/src/server/prefetch-implementation.ts
var import_qwik2 = require("@builder.io/qwik");
// packages/qwik/src/server/prefetch-utils.ts
function workerFetchScript() {
const fetch2 = `Promise.all(e.data.map(u=>fetch(u))).finally(()=>{setTimeout(postMessage({}),9999)})`;
const workerBody = `onmessage=(e)=>{${fetch2}}`;
const blob = `new Blob(['${workerBody}'],{type:"text/javascript"})`;
const url = `URL.createObjectURL(${blob})`;
let s = `const w=new Worker(${url});`;
s += `w.postMessage(u.map(u=>new URL(u,origin)+''));`;
s += `w.onmessage=()=>{w.terminate()};`;
return s;
}
function prefetchUrlsEventScript(base, prefetchResources) {
const data = {
bundles: flattenPrefetchResources(prefetchResources).map((u) => u.split("/").pop())
};
const args = JSON.stringify(["prefetch", base, ...data.bundles]);
return `(window.qwikPrefetchSW||(window.qwikPrefetchSW=[])).push(${args});`;
}
function flattenPrefetchResources(prefetchResources) {
const urls = [];
const addPrefetchResource = (prefetchResources2) => {
if (Array.isArray(prefetchResources2)) {
for (const prefetchResource of prefetchResources2) {
if (!urls.includes(prefetchResource.url)) {
urls.push(prefetchResource.url);
addPrefetchResource(prefetchResource.imports);
}
}
}
};
addPrefetchResource(prefetchResources);
return urls;
}
function getMostReferenced(prefetchResources) {
const common = /* @__PURE__ */ new Map();
let total = 0;
const addPrefetchResource = (prefetchResources2, visited2) => {
if (Array.isArray(prefetchResources2)) {
for (const prefetchResource of prefetchResources2) {
const count = common.get(prefetchResource.url) || 0;
common.set(prefetchResource.url, count + 1);
total++;
if (!visited2.has(prefetchResource.url)) {
visited2.add(prefetchResource.url);
addPrefetchResource(prefetchResource.imports, visited2);
}
}
}
};
const visited = /* @__PURE__ */ new Set();
for (const resource of prefetchResources) {
visited.clear();
addPrefetchResource(resource.imports, visited);
}
const threshold = total / common.size * 2;
const urls = Array.from(common.entries());
urls.sort((a, b) => b[1] - a[1]);
return urls.slice(0, 5).filter((e) => e[1] > threshold).map((e) => e[0]);
}
// packages/qwik/src/server/prefetch-implementation.ts
function applyPrefetchImplementation(base, prefetchStrategy, prefetchResources, nonce) {
const prefetchImpl = normalizePrefetchImplementation(prefetchStrategy == null ? void 0 : prefetchStrategy.implementation);
const prefetchNodes = [];
if (prefetchImpl.prefetchEvent === "always") {
prefetchUrlsEvent(base, prefetchNodes, prefetchResources, nonce);
}
if (prefetchImpl.linkInsert === "html-append") {
linkHtmlImplementation(prefetchNodes, prefetchResources, prefetchImpl);
}
if (prefetchImpl.linkInsert === "js-append") {
linkJsImplementation(prefetchNodes, prefetchResources, prefetchImpl, nonce);
} else if (prefetchImpl.workerFetchInsert === "always") {
workerFetchImplementation(prefetchNodes, prefetchResources, nonce);
}
if (prefetchNodes.length > 0) {
return (0, import_qwik2.jsx)(import_qwik2.Fragment, { children: prefetchNodes });
}
return null;
}
function prefetchUrlsEvent(base, prefetchNodes, prefetchResources, nonce) {
const mostReferenced = getMostReferenced(prefetchResources);
for (const url of mostReferenced) {
prefetchNodes.push(
(0, import_qwik2.jsx)("link", {
rel: "modulepreload",
href: url,
nonce
})
);
}
prefetchNodes.push(
(0, import_qwik2.jsx)("script", {
"q:type": "prefetch-bundles",
dangerouslySetInnerHTML: prefetchUrlsEventScript(base, prefetchResources) + `document.dispatchEvent(new CustomEvent('qprefetch', {detail:{links: [location.pathname]}}))`,
nonce
})
);
}
function linkHtmlImplementation(prefetchNodes, prefetchResources, prefetchImpl) {
const urls = flattenPrefetchResources(prefetchResources);
const rel = prefetchImpl.linkRel || "prefetch";
const priority = prefetchImpl.linkFetchPriority;
for (const url of urls) {
const attributes = {};
attributes["href"] = url;
attributes["rel"] = rel;
if (priority) {
attributes["fetchpriority"] = priority;
}
if (rel === "prefetch" || rel === "preload") {
if (url.endsWith(".js")) {
attributes["as"] = "script";
}
}
prefetchNodes.push((0, import_qwik2.jsx)("link", attributes, void 0));
}
}
function linkJsImplementation(prefetchNodes, prefetchResources, prefetchImpl, nonce) {
const rel = prefetchImpl.linkRel || "prefetch";
const priority = prefetchImpl.linkFetchPriority;
let s = ``;
if (prefetchImpl.workerFetchInsert === "no-link-support") {
s += `let supportsLinkRel = true;`;
}
s += `const u=${JSON.stringify(flattenPrefetchResources(prefetchResources))};`;
s += `u.map((u,i)=>{`;
s += `const l=document.createElement('link');`;
s += `l.setAttribute("href",u);`;
s += `l.setAttribute("rel","${rel}");`;
if (priority) {
s += `l.setAttribute("fetchpriority","${priority}");`;
}
if (prefetchImpl.workerFetchInsert === "no-link-support") {
s += `if(i===0){`;
s += `try{`;
s += `supportsLinkRel=l.relList.supports("${rel}");`;
s += `}catch(e){}`;
s += `}`;
}
s += `document.body.appendChild(l);`;
s += `});`;
if (prefetchImpl.workerFetchInsert === "no-link-support") {
s += `if(!supportsLinkRel){`;
s += workerFetchScript();
s += `}`;
}
if (prefetchImpl.workerFetchInsert === "always") {
s += workerFetchScript();
}
prefetchNodes.push(
(0, import_qwik2.jsx)("script", {
type: "module",
"q:type": "link-js",
dangerouslySetInnerHTML: s,
nonce
})
);
}
function workerFetchImplementation(prefetchNodes, prefetchResources, nonce) {
let s = `const u=${JSON.stringify(flattenPrefetchResources(prefetchResources))};`;
s += workerFetchScript();
prefetchNodes.push(
(0, import_qwik2.jsx)("script", {
type: "module",
"q:type": "prefetch-worker",
dangerouslySetInnerHTML: s,
nonce
})
);
}
function normalizePrefetchImplementation(input) {
return { ...PrefetchImplementationDefault, ...input };
}
var PrefetchImplementationDefault = {
linkInsert: null,
linkRel: null,
linkFetchPriority: null,
workerFetchInsert: null,
prefetchEvent: "always"
};
// packages/qwik/src/server/utils.ts
var import_meta = {};
function createTimer() {
if (typeof performance === "undefined") {
return () => 0;
}
const start = performance.now();
return () => {
const end = performance.now();
const delta = end - start;
return delta / 1e6;
};
}
function getBuildBase(opts) {
let base = opts.base;
if (typeof opts.base === "function") {
base = opts.base(opts);
}
if (typeof base === "string") {
if (!base.endsWith("/")) {
base += "/";
}
return base;
}
return `${import_meta.env.BASE_URL}build/`;
}
var versions2 = {
qwik: "1.11.0",
qwikDom: "2.1.19"
};
// packages/qwik/src/core/util/qdev.ts
var qDev = globalThis.qDev !== false;
var qInspector = globalThis.qInspector === true;
var qSerialize = globalThis.qSerialize !== false;
var qDynamicPlatform = globalThis.qDynamicPlatform !== false;
var qTest = globalThis.qTest === true;
var qRuntimeQrl = globalThis.qRuntimeQrl === true;
// packages/qwik/src/server/prefetch-strategy.ts
function getPrefetchResources(snapshotResult, opts, resolvedManifest) {
if (!resolvedManifest) {
return [];
}
const prefetchStrategy = opts.prefetchStrategy;
const buildBase = getBuildBase(opts);
if (prefetchStrategy !== null) {
if (!prefetchStrategy || !prefetchStrategy.symbolsToPrefetch || prefetchStrategy.symbolsToPrefetch === "auto") {
return getAutoPrefetch(snapshotResult, resolvedManifest, buildBase);
}
if (typeof prefetchStrategy.symbolsToPrefetch === "function") {
try {
return prefetchStrategy.symbolsToPrefetch({ manifest: resolvedManifest.manifest });
} catch (e) {
console.error("getPrefetchUrls, symbolsToPrefetch()", e);
}
}
}
return [];
}
function getAutoPrefetch(snapshotResult, resolvedManifest, buildBase) {
const prefetchResources = [];
const qrls = snapshotResult == null ? void 0 : snapshotResult.qrls;
const { mapper, manifest } = resolvedManifest;
const urls = /* @__PURE__ */ new Map();
if (Array.isArray(qrls)) {
for (const qrl of qrls) {
const qrlSymbolName = qrl.getHash();
const resolvedSymbol = mapper[qrlSymbolName];
if (resolvedSymbol) {
const bundleFileName = resolvedSymbol[1];
addBundle(manifest, urls, prefetchResources, buildBase, bundleFileName);
}
}
}
return prefetchResources;
}
function addBundle(manifest, urls, prefetchResources, buildBase, bundleFileName) {
const url = qDev ? bundleFileName : buildBase + bundleFileName;
let prefetchResource = urls.get(url);
if (!prefetchResource) {
prefetchResource = {
url,
imports: []
};
urls.set(url, prefetchResource);
const bundle = manifest.bundles[bundleFileName];
if (bundle) {
if (Array.isArray(bundle.imports)) {
for (const importedFilename of bundle.imports) {
addBundle(manifest, urls, prefetchResource.imports, buildBase, importedFilename);
}
}
}
}
prefetchResources.push(prefetchResource);
}
// packages/qwik/src/server/scripts.ts
var QWIK_LOADER_DEFAULT_MINIFIED = '(()=>{var e=Object.defineProperty,t=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable,n=(t,r,o)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[r]=o,s=(e,s)=>{for(var a in s||(s={}))r.call(s,a)&&n(e,a,s[a]);if(t)for(var a of t(s))o.call(s,a)&&n(e,a,s[a]);return e};((e,t)=>{const r="__q_context__",o=window,n=new Set,a=new Set([e]),c="replace",i="forEach",l="target",f="getAttribute",p="isConnected",b="qvisible",u="_qwikjson_",y=(e,t)=>Array.from(e.querySelectorAll(t)),h=e=>{const t=[];return a.forEach((r=>t.push(...y(r,e)))),t},d=e=>{S(e),y(e,"[q\\\\:shadowroot]").forEach((e=>{const t=e.shadowRoot;t&&d(t)}))},m=e=>e&&"function"==typeof e.then,w=(e,t,r=t.type)=>{h("[on"+e+"\\\\:"+r+"]")[i]((o=>E(o,e,t,r)))},q=t=>{if(void 0===t[u]){let r=(t===e.documentElement?e.body:t).lastElementChild;for(;r;){if("SCRIPT"===r.tagName&&"qwik/json"===r[f]("type")){t[u]=JSON.parse(r.textContent[c](/\\\\x3C(\\/?script)/gi,"<$1"));break}r=r.previousElementSibling}}},v=(e,t)=>new CustomEvent(e,{detail:t}),E=async(t,o,n,a=n.type)=>{const i="on"+o+":"+a;t.hasAttribute("preventdefault:"+a)&&n.preventDefault();const l=t._qc_,b=l&&l.li.filter((e=>e[0]===i));if(b&&b.length>0){for(const e of b){const r=e[1].getFn([t,n],(()=>t[p]))(n,t),o=n.cancelBubble;m(r)&&await r,o&&n.stopPropagation()}return}const u=t[f](i);if(u){const o=t.closest("[q\\\\:container]"),a=o[f]("q:base"),i=o[f]("q:version")||"unknown",l=o[f]("q:manifest-hash")||"dev",b=new URL(a,e.baseURI);for(const f of u.split("\\n")){const u=new URL(f,b),y=u.href,h=u.hash[c](/^#?([^?[|]*).*$/,"$1")||"default",d=performance.now();let w,v,E;const _=f.startsWith("#"),A={qBase:a,qManifest:l,qVersion:i,href:y,symbol:h,element:t,reqTime:d};if(_){const t=o.getAttribute("q:instance");w=(e["qFuncs_"+t]||[])[Number.parseInt(h)],w||(v="sync",E=Error("sync handler error for symbol: "+h))}else{const e=u.href.split("#")[0];try{const t=import(e);q(o),w=(await t)[h],w||(v="no-symbol",E=Error(`${h} not in ${e}`))}catch(e){v||(v="async"),E=e}}if(!w){g("qerror",s({importError:v,error:E},A)),console.error(E);break}const k=e[r];if(t[p])try{e[r]=[t,n,u],_||g("qsymbol",s({},A));const o=w(n,t);m(o)&&await o}catch(e){g("qerror",s({error:e},A))}finally{e[r]=k}}}},g=(t,r)=>{e.dispatchEvent(v(t,r))},_=e=>e[c](/([A-Z])/g,(e=>"-"+e.toLowerCase())),A=async e=>{let t=_(e.type),r=e[l];for(w("-document",e,t);r&&r[f];){const o=E(r,"",e,t);let n=e.cancelBubble;m(o)&&await o,n=n||e.cancelBubble||r.hasAttribute("stoppropagation:"+e.type),r=e.bubbles&&!0!==n?r.parentElement:null}},k=e=>{w("-window",e,_(e.type))},C=()=>{var r;const s=e.readyState;if(!t&&("interactive"==s||"complete"==s)&&(a.forEach(d),t=1,g("qinit"),(null!=(r=o.requestIdleCallback)?r:o.setTimeout).bind(o)((()=>g("qidle"))),n.has(b))){const e=h("[on\\\\:"+b+"]"),t=new IntersectionObserver((e=>{for(const r of e)r.isIntersecting&&(t.unobserve(r[l]),E(r[l],"",v(b,r)))}));e[i]((e=>t.observe(e)))}},O=(e,t,r,o=!1)=>e.addEventListener(t,r,{capture:o,passive:!1}),S=(...e)=>{for(const t of e)"string"==typeof t?n.has(t)||(a.forEach((e=>O(e,t,A,!0))),O(o,t,k,!0),n.add(t)):a.has(t)||(n.forEach((e=>O(t,e,A,!0))),a.add(t))};if(!(r in e)){e[r]=0;const t=o.qwikevents;Array.isArray(t)&&S(...t),o.qwikevents={events:n,roots:a,push:S},O(e,"readystatechange",C),C()}})(document)})()';
var QWIK_LOADER_DEFAULT_DEBUG = '(() => {\n var __defProp = Object.defineProperty;\n var __getOwnPropSymbols = Object.getOwnPropertySymbols;\n var __hasOwnProp = Object.prototype.hasOwnProperty;\n var __propIsEnum = Object.prototype.propertyIsEnumerable;\n var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {\n enumerable: !0,\n configurable: !0,\n writable: !0,\n value: value\n }) : obj[key] = value;\n var __spreadValues = (a, b) => {\n for (var prop in b || (b = {})) {\n __hasOwnProp.call(b, prop) && __defNormalProp(a, prop, b[prop]);\n }\n if (__getOwnPropSymbols) {\n for (var prop of __getOwnPropSymbols(b)) {\n __propIsEnum.call(b, prop) && __defNormalProp(a, prop, b[prop]);\n }\n }\n return a;\n };\n ((doc, hasInitialized) => {\n const Q_CONTEXT = "__q_context__";\n const win = window;\n const events = new Set;\n const roots = new Set([ doc ]);\n const nativeQuerySelectorAll = (root, selector) => Array.from(root.querySelectorAll(selector));\n const querySelectorAll = query => {\n const elements = [];\n roots.forEach((root => elements.push(...nativeQuerySelectorAll(root, query))));\n return elements;\n };\n const findShadowRoots = fragment => {\n processEventOrNode(fragment);\n nativeQuerySelectorAll(fragment, "[q\\\\:shadowroot]").forEach((parent => {\n const shadowRoot = parent.shadowRoot;\n shadowRoot && findShadowRoots(shadowRoot);\n }));\n };\n const isPromise = promise => promise && "function" == typeof promise.then;\n const broadcast = (infix, ev, type = ev.type) => {\n querySelectorAll("[on" + infix + "\\\\:" + type + "]").forEach((el => dispatch(el, infix, ev, type)));\n };\n const resolveContainer = containerEl => {\n if (void 0 === containerEl._qwikjson_) {\n let script = (containerEl === doc.documentElement ? doc.body : containerEl).lastElementChild;\n while (script) {\n if ("SCRIPT" === script.tagName && "qwik/json" === script.getAttribute("type")) {\n containerEl._qwikjson_ = JSON.parse(script.textContent.replace(/\\\\x3C(\\/?script)/gi, "<$1"));\n break;\n }\n script = script.previousElementSibling;\n }\n }\n };\n const createEvent = (eventName, detail) => new CustomEvent(eventName, {\n detail: detail\n });\n const dispatch = async (element, onPrefix, ev, eventName = ev.type) => {\n const attrName = "on" + onPrefix + ":" + eventName;\n element.hasAttribute("preventdefault:" + eventName) && ev.preventDefault();\n const ctx = element._qc_;\n const relevantListeners = ctx && ctx.li.filter((li => li[0] === attrName));\n if (relevantListeners && relevantListeners.length > 0) {\n for (const listener of relevantListeners) {\n const results = listener[1].getFn([ element, ev ], (() => element.isConnected))(ev, element);\n const cancelBubble = ev.cancelBubble;\n isPromise(results) && await results;\n cancelBubble && ev.stopPropagation();\n }\n return;\n }\n const attrValue = element.getAttribute(attrName);\n if (attrValue) {\n const container = element.closest("[q\\\\:container]");\n const qBase = container.getAttribute("q:base");\n const qVersion = container.getAttribute("q:version") || "unknown";\n const qManifest = container.getAttribute("q:manifest-hash") || "dev";\n const base = new URL(qBase, doc.baseURI);\n for (const qrl of attrValue.split("\\n")) {\n const url = new URL(qrl, base);\n const href = url.href;\n const symbol = url.hash.replace(/^#?([^?[|]*).*$/, "$1") || "default";\n const reqTime = performance.now();\n let handler;\n let importError;\n let error;\n const isSync = qrl.startsWith("#");\n const eventData = {\n qBase: qBase,\n qManifest: qManifest,\n qVersion: qVersion,\n href: href,\n symbol: symbol,\n element: element,\n reqTime: reqTime\n };\n if (isSync) {\n const hash = container.getAttribute("q:instance");\n handler = (doc["qFuncs_" + hash] || [])[Number.parseInt(symbol)];\n if (!handler) {\n importError = "sync";\n error = new Error("sync handler error for symbol: " + symbol);\n }\n } else {\n const uri = url.href.split("#")[0];\n try {\n const module = import(\n uri);\n resolveContainer(container);\n handler = (await module)[symbol];\n if (!handler) {\n importError = "no-symbol";\n error = new Error(`${symbol} not in ${uri}`);\n }\n } catch (err) {\n importError || (importError = "async");\n error = err;\n }\n }\n if (!handler) {\n emitEvent("qerror", __spreadValues({\n importError: importError,\n error: error\n }, eventData));\n console.error(error);\n break;\n }\n const previousCtx = doc[Q_CONTEXT];\n if (element.isConnected) {\n try {\n doc[Q_CONTEXT] = [ element, ev, url ];\n isSync || emitEvent("qsymbol", __spreadValues({}, eventData));\n const results = handler(ev, element);\n isPromise(results) && await results;\n } catch (error2) {\n emitEvent("qerror", __spreadValues({\n error: error2\n }, eventData));\n } finally {\n doc[Q_CONTEXT] = previousCtx;\n }\n }\n }\n }\n };\n const emitEvent = (eventName, detail) => {\n doc.dispatchEvent(createEvent(eventName, detail));\n };\n const camelToKebab = str => str.replace(/([A-Z])/g, (a => "-" + a.toLowerCase()));\n const processDocumentEvent = async ev => {\n let type = camelToKebab(ev.type);\n let element = ev.target;\n broadcast("-document", ev, type);\n while (element && element.getAttribute) {\n const results = dispatch(element, "", ev, type);\n let cancelBubble = ev.cancelBubble;\n isPromise(results) && await results;\n cancelBubble = cancelBubble || ev.cancelBubble || element.hasAttribute("stoppropagation:" + ev.type);\n element = ev.bubbles && !0 !== cancelBubble ? element.parentElement : null;\n }\n };\n const processWindowEvent = ev => {\n broadcast("-window", ev, camelToKebab(ev.type));\n };\n const processReadyStateChange = () => {\n var _a;\n const readyState = doc.readyState;\n if (!hasInitialized && ("interactive" == readyState || "complete" == readyState)) {\n roots.forEach(findShadowRoots);\n hasInitialized = 1;\n emitEvent("qinit");\n (null != (_a = win.requestIdleCallback) ? _a : win.setTimeout).bind(win)((() => emitEvent("qidle")));\n if (events.has("qvisible")) {\n const results = querySelectorAll("[on\\\\:qvisible]");\n const observer = new IntersectionObserver((entries => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n observer.unobserve(entry.target);\n dispatch(entry.target, "", createEvent("qvisible", entry));\n }\n }\n }));\n results.forEach((el => observer.observe(el)));\n }\n }\n };\n const addEventListener = (el, eventName, handler, capture = !1) => el.addEventListener(eventName, handler, {\n capture: capture,\n passive: !1\n });\n const processEventOrNode = (...eventNames) => {\n for (const eventNameOrNode of eventNames) {\n if ("string" == typeof eventNameOrNode) {\n if (!events.has(eventNameOrNode)) {\n roots.forEach((root => addEventListener(root, eventNameOrNode, processDocumentEvent, !0)));\n addEventListener(win, eventNameOrNode, processWindowEvent, !0);\n events.add(eventNameOrNode);\n }\n } else if (!roots.has(eventNameOrNode)) {\n events.forEach((eventName => addEventListener(eventNameOrNode, eventName, processDocumentEvent, !0)));\n roots.add(eventNameOrNode);\n }\n }\n };\n if (!(Q_CONTEXT in doc)) {\n doc[Q_CONTEXT] = 0;\n const qwikevents = win.qwikevents;\n Array.isArray(qwikevents) && processEventOrNode(...qwikevents);\n win.qwikevents = {\n events: events,\n roots: roots,\n push: processEventOrNode\n };\n addEventListener(doc, "readystatechange", processReadyStateChange);\n processReadyStateChange();\n }\n })(document);\n})()';
function getQwikLoaderScript(opts = {}) {
return opts.debug ? QWIK_LOADER_DEFAULT_DEBUG : QWIK_LOADER_DEFAULT_MINIFIED;
}
var QWIK_PREFETCH_MINIFIED = globalThis.QWIK_PREFETCH_MINIFIED;
var QWIK_PREFETCH_DEBUG = globalThis.QWIK_PREFETCH_DEBUG;
function getQwikPrefetchWorkerScript(opts = {}) {
return opts.debug ? QWIK_PREFETCH_DEBUG : QWIK_PREFETCH_MINIFIED;
}
// packages/qwik/src/server/render.ts
var DOCTYPE = "<!DOCTYPE html>";
async function renderToStream(rootNode, opts) {
var _a, _b, _c;
let stream = opts.stream;
let bufferSize = 0;
let totalSize = 0;
let networkFlushes = 0;
let firstFlushTime = 0;
let buffer = "";
let snapshotResult;
const inOrderStreaming = ((_a = opts.streaming) == null ? void 0 : _a.inOrder) ?? {
strategy: "auto",
maximunInitialChunk: 5e4,
maximunChunk: 3e4
};
const containerTagName = opts.containerTagName ?? "html";
const containerAttributes = opts.containerAttributes ?? {};
const nativeStream = stream;
const firstFlushTimer = createTimer();
const buildBase = getBuildBase(opts);
const resolvedManifest = resolveManifest(opts.manifest);
function flush() {
if (buffer) {
nativeStream.write(buffer);
buffer = "";
bufferSize = 0;
networkFlushes++;
if (networkFlushes === 1) {
firstFlushTime = firstFlushTimer();
}
}
}
function enqueue(chunk) {
const len = chunk.length;
bufferSize += len;
totalSize += len;
buffer += chunk;
}
switch (inOrderStreaming.strategy) {
case "disabled":
stream = {
write: enqueue
};
break;
case "direct":
stream = nativeStream;
break;
case "auto":
let count = 0;
let forceFlush = false;
const minimunChunkSize = inOrderStreaming.maximunChunk ?? 0;
const initialChunkSize = inOrderStreaming.maximunInitialChunk ?? 0;
stream = {
write(chunk) {
if (chunk === "<!--qkssr-f-->") {
forceFlush ||= true;
} else if (chunk === "<!--qkssr-pu-->") {
count++;
} else if (chunk === "<!--qkssr-po-->") {
count--;
} else {
enqueue(chunk);
}
const chunkSize = networkFlushes === 0 ? initialChunkSize : minimunChunkSize;
if (count === 0 && (forceFlush || bufferSize >= chunkSize)) {
forceFlush = false;
flush();
}
}
};
break;
}
if (containerTagName === "html") {
stream.write(DOCTYPE);
} else {
stream.write("<!--cq-->");
if (opts.qwikLoader) {
if (opts.qwikLoader.include === void 0) {
opts.qwikLoader.include = "never";
}
if (opts.qwikLoader.position === void 0) {
opts.qwikLoader.position = "bottom";
}
} else {
opts.qwikLoader = {
include: "never"
};
}
if (!opts.qwikPrefetchServiceWorker) {
opts.qwikPrefetchServiceWorker = {};
}
if (!opts.qwikPrefetchServiceWorker.include) {
opts.qwikPrefetchServiceWorker.include = false;
}
if (!opts.qwikPrefetchServiceWorker.position) {
opts.qwikPrefetchServiceWorker.position = "top";
}
}
if (!opts.manifest) {
console.warn(
`Missing client manifest, loading symbols in the client might 404. Please ensure the client build has run and generated the manifest for the server build.`
);
}
await setServerPlatform(opts, resolvedManifest);
const injections = resolvedManifest == null ? void 0 : resolvedManifest.manifest.injections;
const beforeContent = injections ? injections.map((injection) => (0, import_qwik3.jsx)(injection.tag, injection.attributes ?? {})) : [];
const includeMode = ((_b = opts.qwikLoader) == null ? void 0 : _b.include) ?? "auto";
const positionMode = ((_c = opts.qwikLoader) == null ? void 0 : _c.position) ?? "bottom";
if (positionMode === "top" && includeMode !== "never") {
const qwikLoaderScript = getQwikLoaderScript({
debug: opts.debug
});
beforeContent.push(
(0, import_qwik3.jsx)("script", {
id: "qwikloader",
dangerouslySetInnerHTML: qwikLoaderScript
})
);
beforeContent.push(
(0, import_qwik3.jsx)("script", {
dangerouslySetInnerHTML: `window.qwikevents.push('click')`
})
);
}
const renderTimer = createTimer();
const renderSymbols = [];
let renderTime = 0;
let snapshotTime = 0;
await (0, import_qwik3._renderSSR)(rootNode, {
stream,
containerTagName,
containerAttributes,
serverData: opts.serverData,
base: buildBase,
beforeContent,
beforeClose: async (contexts, containerState, _dynamic, textNodes) => {
var _a2, _b2, _c2, _d, _e;
renderTime = renderTimer();
const snapshotTimer = createTimer();
snapshotResult = await (0, import_qwik3._pauseFromContexts)(contexts, containerState, void 0, textNodes);
const children = [];
if (opts.prefetchStrategy !== null) {
const prefetchResources = getPrefetchResources(snapshotResult, opts, resolvedManifest);
const base = containerAttributes["q:base"];
if (prefetchResources.length > 0) {
const prefetchImpl = applyPrefetchImplementation(
base,
opts.prefetchStrategy,
prefetchResources,
(_a2 = opts.serverData) == null ? void 0 : _a2.nonce
);
if (prefetchImpl) {
children.push(prefetchImpl);
}
}
}
const jsonData = JSON.stringify(snapshotResult.state, void 0, import_build.isDev ? " " : void 0);
children.push(
(0, import_qwik3.jsx)("script", {
type: "qwik/json",
dangerouslySetInnerHTML: escapeText(jsonData),
nonce: (_b2 = opts.serverData) == null ? void 0 : _b2.nonce
})
);
if (snapshotResult.funcs.length > 0) {
const hash2 = containerAttributes[QInstance];
children.push(
(0, import_qwik3.jsx)("script", {
"q:func": "qwik/json",
dangerouslySetInnerHTML: serializeFunctions(hash2, snapshotResult.funcs),
nonce: (_c2 = opts.serverData) == null ? void 0 : _c2.nonce
})
);
}
const needLoader = !snapshotResult || snapshotResult.mode !== "static";
const includeLoader = includeMode === "always" || includeMode === "auto" && needLoader;
if (includeLoader) {
const qwikLoaderScript = getQwikLoaderScript({
debug: opts.debug
});
children.push(
(0, import_qwik3.jsx)("script", {
id: "qwikloader",
dangerouslySetInnerHTML: qwikLoaderScript,
nonce: (_d = opts.serverData) == null ? void 0 : _d.nonce
})
);
}
const extraListeners = Array.from(containerState.$events$, (s) => JSON.stringify(s));
if (extraListeners.length > 0) {
const content = (includeLoader ? `window.qwikevents` : `(window.qwikevents||=[])`) + `.push(${extraListeners.join(", ")})`;
children.push(
(0, import_qwik3.jsx)("script", {
dangerouslySetInnerHTML: content,
nonce: (_e = opts.serverData) == null ? void 0 : _e.nonce
})
);
}
collectRenderSymbols(renderSymbols, contexts);
snapshotTime = snapshotTimer();
return (0, import_qwik3.jsx)(import_qwik3.Fragment, { children });
},
manifestHash: (resolvedManifest == null ? void 0 : resolvedManifest.manifest.manifestHash) || "dev" + hash()
});
if (containerTagName !== "html") {
stream.write("<!--/cq-->");
}
flush();
const isDynamic = snapshotResult.resources.some((r) => r._cache !== Infinity);
const result = {
prefetchResources: void 0,
snapshotResult,
flushes: networkFlushes,
manifest: resolvedManifest == null ? void 0 : resolvedManifest.manifest,
size: totalSize,
isStatic: !isDynamic,
timing: {
render: renderTime,
snapshot: snapshotTime,
firstFlush: firstFlushTime
},
_symbols: renderSymbols
};
return result;
}
function hash() {
return Math.random().toString(36).slice(2);
}
async function renderToString(rootNode, opts = {}) {
const chunks = [];
const stream = {
write(chunk) {
chunks.push(chunk);
}
};
const result = await renderToStream(rootNode, {
base: opts.base,
containerAttributes: opts.containerAttributes,
containerTagName: opts.containerTagName,
locale: opts.locale,
manifest: opts.manifest,
symbolMapper: opts.symbolMapper,
qwikLoader: opts.qwikLoader,
serverData: opts.serverData,
prefetchStrategy: opts.prefetchStrategy,
stream
});
return {
isStatic: result.isStatic,
prefetchResources: result.prefetchResources,
timing: result.timing,
manifest: result.manifest,
snapshotResult: result.snapshotResult,
html: chunks.join("")
};
}
function resolveManifest(manifest) {
if (!manifest) {
return void 0;
}
if ("mapper" in manifest) {
return manifest;
}
manifest = getValidManifest(manifest);
if (manifest) {
const mapper = {};
Object.entries(manifest.mapping).forEach(([symbol, bundleFilename]) => {
mapper[getSymbolHash(symbol)] = [symbol, bundleFilename];
});
return {
mapper,
manifest
};
}
return void 0;
}
var escapeText = (str) => {
return str.replace(/<(\/?script)/gi, "\\x3C$1");
};
function collectRenderSymbols(renderSymbols, elements) {
var _a;
for (const ctx of elements) {
const symbol = (_a = ctx.$componentQrl$) == null ? void 0 : _a.getSymbol();
if (symbol && !renderSymbols.includes(symbol)) {
renderSymbols.push(symbol);
}
}
}
var Q_FUNCS_PREFIX = 'document["qFuncs_HASH"]=';
function serializeFunctions(hash2, funcs) {
return Q_FUNCS_PREFIX.replace("HASH", hash2) + `[${funcs.join(",\n")}]`;
}
// packages/qwik/src/server/index.ts
async function setServerPlatform2(manifest) {
const platform = createPlatform({ manifest }, resolveManifest(manifest));
(0, import_qwik4.setPlatform)(platform);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
getQwikLoaderScript,
getQwikPrefetchWorkerScript,
renderToStream,
renderToString,
resolveManifest,
setServerPlatform,
versions
});
return module.exports; })(typeof module === 'object' && module.exports ? module : { exports: {} });