@7x7cl/qwik
Version:
An Open-Source sub-framework designed with a focus on server-side-rendering, lazy-loading, and styling/animation.
657 lines (643 loc) • 37.8 kB
JavaScript
/**
* @license
* @builder.io/qwik/server 1.1.5-dev20230608174334
* 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/BuilderIO/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,
renderToStream: () => renderToStream,
renderToString: () => renderToString,
resolveManifest: () => resolveManifest,
setServerPlatform: () => setServerPlatform2,
versions: () => versions
});
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");
function createPlatform(opts, resolvedManifest) {
const mapper = resolvedManifest == null ? void 0 : resolvedManifest.mapper;
const mapperFn = opts.symbolMapper ? opts.symbolMapper : (symbolName) => {
var _a;
if (mapper) {
const hash = getSymbolHash(symbolName);
const result = mapper[hash];
if (!result) {
const isRegistered = (_a = globalThis.__qwik_reg_symbols) == null ? void 0 : _a.has(hash);
if (isRegistered) {
return [symbolName, "_"];
}
console.error("Cannot resolve symbol", symbolName, "in", mapper);
}
return result;
}
};
const serverPlatform = {
isServer: true,
async importSymbol(_containerEl, url, symbolName) {
var _a;
const hash = getSymbolHash(symbolName);
const regSym = (_a = globalThis.__qwik_reg_symbols) == null ? void 0 : _a.get(hash);
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) {
return mapperFn(symbolName, mapper);
}
};
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/utils.ts
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 "/build/";
}
var versions = {
qwik: "1.1.5-dev20230608174334",
qwikDom: "2.1.19"
};
// packages/qwik/src/server/render.ts
var import_qwik3 = require("@builder.io/qwik");
var import_build = require("@builder.io/qwik/build");
// packages/qwik/src/server/scripts.ts
var QWIK_LOADER_DEFAULT_MINIFIED = '((e,t)=>{const n="__q_context__",o=window,s=new Set,i=t=>e.querySelectorAll(t),a=(e,t,n=t.type)=>{i("[on"+e+"\\\\:"+n+"]").forEach((o=>f(o,e,t,n)))},r=(e,t)=>e.getAttribute(t),l=t=>{if(void 0===t._qwikjson_){let n=(t===e.documentElement?e.body:t).lastElementChild;for(;n;){if("SCRIPT"===n.tagName&&"qwik/json"===r(n,"type")){t._qwikjson_=JSON.parse(n.textContent.replace(/\\\\x3C(\\/?script)/g,"<$1"));break}n=n.previousElementSibling}}},c=(e,t)=>new CustomEvent(e,{detail:t}),f=async(t,o,s,i=s.type)=>{const a="on"+o+":"+i;t.hasAttribute("preventdefault:"+i)&&s.preventDefault();const c=t._qc_,f=null==c?void 0:c.li.filter((e=>e[0]===a));if(f&&f.length>0){for(const e of f)await e[1].getFn([t,s],(()=>t.isConnected))(s,t);return}const b=r(t,a);if(b){const o=t.closest("[q\\\\:container]"),i=new URL(r(o,"q:base"),e.baseURI);for(const a of b.split("\\n")){const r=new URL(a,i),c=r.hash.replace(/^#?([^?[|]*).*$/,"$1")||"default",f=performance.now(),b=import(r.href.split("#")[0]);l(o);const p=(await b)[c],u=e[n];if(t.isConnected)try{e[n]=[t,s,r],d("qsymbol",{symbol:c,element:t,reqTime:f}),await p(s,t)}finally{e[n]=u}}}},d=(t,n)=>{e.dispatchEvent(c(t,n))},b=e=>e.replace(/([A-Z])/g,(e=>"-"+e.toLowerCase())),p=async e=>{let t=b(e.type),n=e.target;for(a("-document",e,t);n&&n.getAttribute;)await f(n,"",e,t),n=e.bubbles&&!0!==e.cancelBubble?n.parentElement:null},u=e=>{a("-window",e,b(e.type))},w=()=>{var n;const a=e.readyState;if(!t&&("interactive"==a||"complete"==a)&&(t=1,d("qinit"),(null!=(n=o.requestIdleCallback)?n:o.setTimeout).bind(o)((()=>d("qidle"))),s.has("qvisible"))){const e=i("[on\\\\:qvisible]"),t=new IntersectionObserver((e=>{for(const n of e)n.isIntersecting&&(t.unobserve(n.target),f(n.target,"",c("qvisible",n)))}));e.forEach((e=>t.observe(e)))}},q=(e,t,n,o=!1)=>e.addEventListener(t,n,{capture:o,passive:!1}),v=t=>{for(const n of t)s.has(n)||(q(e,n,p,!0),q(o,n,u),s.add(n))};if(!e.qR){const t=o.qwikevents;Array.isArray(t)&&v(t),o.qwikevents={push:(...e)=>v(e)},q(e,"readystatechange",w),w()}})(document);';
var QWIK_LOADER_DEFAULT_DEBUG = '(() => {\n ((doc, hasInitialized) => {\n const win = window;\n const events = new Set;\n const querySelectorAll = query => doc.querySelectorAll(query);\n const broadcast = (infix, ev, type = ev.type) => {\n querySelectorAll("[on" + infix + "\\\\:" + type + "]").forEach((target => dispatch(target, infix, ev, type)));\n };\n const getAttribute = (el, name) => el.getAttribute(name);\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" === getAttribute(script, "type")) {\n containerEl._qwikjson_ = JSON.parse(script.textContent.replace(/\\\\x3C(\\/?script)/g, "<$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 qrls = null == ctx ? void 0 : ctx.li.filter((li => li[0] === attrName));\n if (qrls && qrls.length > 0) {\n for (const q of qrls) {\n await q[1].getFn([ element, ev ], (() => element.isConnected))(ev, element);\n }\n return;\n }\n const attrValue = getAttribute(element, attrName);\n if (attrValue) {\n const container = element.closest("[q\\\\:container]");\n const base = new URL(getAttribute(container, "q:base"), doc.baseURI);\n for (const qrl of attrValue.split("\\n")) {\n const url = new URL(qrl, base);\n const symbolName = url.hash.replace(/^#?([^?[|]*).*$/, "$1") || "default";\n const reqTime = performance.now();\n const module = import(url.href.split("#")[0]);\n resolveContainer(container);\n const handler = (await module)[symbolName];\n const previousCtx = doc.__q_context__;\n if (element.isConnected) {\n try {\n doc.__q_context__ = [ element, ev, url ];\n emitEvent("qsymbol", {\n symbol: symbolName,\n element: element,\n reqTime: reqTime\n });\n await handler(ev, element);\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 await dispatch(element, "", ev, type);\n element = ev.bubbles && !0 !== ev.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 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 push = eventNames => {\n for (const eventName of eventNames) {\n if (!events.has(eventName)) {\n addEventListener(doc, eventName, processDocumentEvent, !0);\n addEventListener(win, eventName, processWindowEvent);\n events.add(eventName);\n }\n }\n };\n if (!doc.qR) {\n const qwikevents = win.qwikevents;\n Array.isArray(qwikevents) && push(qwikevents);\n win.qwikevents = {\n push: (...e) => push(e)\n };\n addEventListener(doc, "readystatechange", processReadyStateChange);\n processReadyStateChange();\n }\n })(document);\n})();';
var QWIK_LOADER_OPTIMIZE_MINIFIED = '((e,t)=>{const n="__q_context__",o=window,s=new Set,i=t=>e.querySelectorAll(t),a=(e,t,n=t.type)=>{i("[on"+e+"\\\\:"+n+"]").forEach((o=>f(o,e,t,n)))},r=(e,t)=>e.getAttribute(t),l=t=>{if(void 0===t._qwikjson_){let n=(t===e.documentElement?e.body:t).lastElementChild;for(;n;){if("SCRIPT"===n.tagName&&"qwik/json"===r(n,"type")){t._qwikjson_=JSON.parse(n.textContent.replace(/\\\\x3C(\\/?script)/g,"<$1"));break}n=n.previousElementSibling}}},c=(e,t)=>new CustomEvent(e,{detail:t}),f=async(t,o,s,i=s.type)=>{const a="on"+o+":"+i;t.hasAttribute("preventdefault:"+i)&&s.preventDefault();const c=t._qc_,f=null==c?void 0:c.li.filter((e=>e[0]===a));if(f&&f.length>0){for(const e of f)await e[1].getFn([t,s],(()=>t.isConnected))(s,t);return}const b=r(t,a);if(b){const o=t.closest("[q\\\\:container]"),i=new URL(r(o,"q:base"),e.baseURI);for(const a of b.split("\\n")){const r=new URL(a,i),c=r.hash.replace(/^#?([^?[|]*).*$/,"$1")||"default",f=performance.now(),b=import(r.href.split("#")[0]);l(o);const p=(await b)[c],u=e[n];if(t.isConnected)try{e[n]=[t,s,r],d("qsymbol",{symbol:c,element:t,reqTime:f}),await p(s,t)}finally{e[n]=u}}}},d=(t,n)=>{e.dispatchEvent(c(t,n))},b=e=>e.replace(/([A-Z])/g,(e=>"-"+e.toLowerCase())),p=async e=>{let t=b(e.type),n=e.target;for(a("-document",e,t);n&&n.getAttribute;)await f(n,"",e,t),n=e.bubbles&&!0!==e.cancelBubble?n.parentElement:null},u=e=>{a("-window",e,b(e.type))},w=()=>{var n;const a=e.readyState;if(!t&&("interactive"==a||"complete"==a)&&(t=1,d("qinit"),(null!=(n=o.requestIdleCallback)?n:o.setTimeout).bind(o)((()=>d("qidle"))),s.has("qvisible"))){const e=i("[on\\\\:qvisible]"),t=new IntersectionObserver((e=>{for(const n of e)n.isIntersecting&&(t.unobserve(n.target),f(n.target,"",c("qvisible",n)))}));e.forEach((e=>t.observe(e)))}},q=(e,t,n,o=!1)=>e.addEventListener(t,n,{capture:o,passive:!1}),v=t=>{for(const n of t)s.has(n)||(q(e,n,p,!0),q(o,n,u),s.add(n))};if(!e.qR){const t=o.qwikevents;Array.isArray(t)&&v(t),o.qwikevents={push:(...e)=>v(e)},q(e,"readystatechange",w),w()}})(document);';
var QWIK_LOADER_OPTIMIZE_DEBUG = '(() => {\n ((doc, hasInitialized) => {\n const win = window;\n const events = new Set;\n const querySelectorAll = query => doc.querySelectorAll(query);\n const broadcast = (infix, ev, type = ev.type) => {\n querySelectorAll("[on" + infix + "\\\\:" + type + "]").forEach((target => dispatch(target, infix, ev, type)));\n };\n const getAttribute = (el, name) => el.getAttribute(name);\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" === getAttribute(script, "type")) {\n containerEl._qwikjson_ = JSON.parse(script.textContent.replace(/\\\\x3C(\\/?script)/g, "<$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 qrls = null == ctx ? void 0 : ctx.li.filter((li => li[0] === attrName));\n if (qrls && qrls.length > 0) {\n for (const q of qrls) {\n await q[1].getFn([ element, ev ], (() => element.isConnected))(ev, element);\n }\n return;\n }\n const attrValue = getAttribute(element, attrName);\n if (attrValue) {\n const container = element.closest("[q\\\\:container]");\n const base = new URL(getAttribute(container, "q:base"), doc.baseURI);\n for (const qrl of attrValue.split("\\n")) {\n const url = new URL(qrl, base);\n const symbolName = url.hash.replace(/^#?([^?[|]*).*$/, "$1") || "default";\n const reqTime = performance.now();\n const module = import(url.href.split("#")[0]);\n resolveContainer(container);\n const handler = (await module)[symbolName];\n const previousCtx = doc.__q_context__;\n if (element.isConnected) {\n try {\n doc.__q_context__ = [ element, ev, url ];\n emitEvent("qsymbol", {\n symbol: symbolName,\n element: element,\n reqTime: reqTime\n });\n await handler(ev, element);\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 await dispatch(element, "", ev, type);\n element = ev.bubbles && !0 !== ev.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 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 push = eventNames => {\n for (const eventName of eventNames) {\n if (!events.has(eventName)) {\n addEventListener(doc, eventName, processDocumentEvent, !0);\n addEventListener(win, eventName, processWindowEvent);\n events.add(eventName);\n }\n }\n };\n if (!doc.qR) {\n const qwikevents = win.qwikevents;\n Array.isArray(qwikevents) && push(qwikevents);\n win.qwikevents = {\n push: (...e) => push(e)\n };\n addEventListener(doc, "readystatechange", processReadyStateChange);\n processReadyStateChange();\n }\n })(document);\n})();';
function getQwikLoaderScript(opts = {}) {
if (Array.isArray(opts.events) && opts.events.length > 0) {
const loader = opts.debug ? QWIK_LOADER_OPTIMIZE_DEBUG : QWIK_LOADER_OPTIMIZE_MINIFIED;
return loader.replace("window.qEvents", JSON.stringify(opts.events));
}
return opts.debug ? QWIK_LOADER_DEFAULT_DEBUG : QWIK_LOADER_DEFAULT_MINIFIED;
}
// 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 Set();
if (Array.isArray(qrls)) {
for (const obj of qrls) {
const qrlSymbolName = obj.getHash();
const resolvedSymbol = mapper[qrlSymbolName];
if (resolvedSymbol) {
addBundle(manifest, urls, prefetchResources, buildBase, resolvedSymbol[1]);
}
}
}
return prefetchResources;
}
function addBundle(manifest, urls, prefetchResources, buildBase, bundleFileName) {
const url = buildBase + bundleFileName;
if (!urls.has(url)) {
urls.add(url);
const bundle = manifest.bundles[bundleFileName];
if (bundle) {
const prefetchResource = {
url,
imports: []
};
prefetchResources.push(prefetchResource);
if (Array.isArray(bundle.imports)) {
for (const importedFilename of bundle.imports) {
addBundle(manifest, urls, prefetchResource.imports, buildBase, importedFilename);
}
}
}
}
}
// 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 fetch = `Promise.all(e.data.map(u=>fetch(u))).finally(()=>{setTimeout(postMessage({}),9999)})`;
const workerBody = `onmessage=(e)=>{${fetch}}`;
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(prefetchResources) {
const data = {
bundles: flattenPrefetchResources(prefetchResources).map((u) => u.split("/").pop())
};
return `document.dispatchEvent(new CustomEvent("qprefetch",{detail:${JSON.stringify(data)}}))`;
}
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;
}
// packages/qwik/src/server/prefetch-implementation.ts
function applyPrefetchImplementation(prefetchStrategy, prefetchResources, nonce) {
const prefetchImpl = normalizePrefetchImplementation(prefetchStrategy == null ? void 0 : prefetchStrategy.implementation);
const prefetchNodes = [];
if (prefetchImpl.prefetchEvent === "always") {
prefetchUrlsEvent(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(prefetchNodes, prefetchResources, nonce) {
prefetchNodes.push(
(0, import_qwik2.jsx)("script", {
type: "module",
dangerouslySetInnerHTML: prefetchUrlsEventScript(prefetchResources),
nonce
})
);
}
function linkHtmlImplementation(prefetchNodes, prefetchResources, prefetchImpl) {
const urls = flattenPrefetchResources(prefetchResources);
const rel = prefetchImpl.linkRel || "prefetch";
for (const url of urls) {
const attributes = {};
attributes["href"] = url;
attributes["rel"] = rel;
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";
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 (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",
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",
dangerouslySetInnerHTML: s,
nonce
})
);
}
function normalizePrefetchImplementation(input) {
if (input && typeof input === "object") {
return input;
}
return PrefetchImplementationDefault;
}
var PrefetchImplementationDefault = {
linkInsert: null,
linkRel: null,
workerFetchInsert: null,
prefetchEvent: "always"
};
// packages/qwik/src/server/render.ts
var DOCTYPE = "<!DOCTYPE html>";
async function renderToStream(rootNode, opts) {
var _a;
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 || (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.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 ?? {})) : void 0;
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, _b, _c, _d, _e, _f, _g;
renderTime = renderTimer();
const snapshotTimer = createTimer();
snapshotResult = await (0, import_qwik3._pauseFromContexts)(contexts, containerState, void 0, textNodes);
const jsonData = JSON.stringify(snapshotResult.state, void 0, import_build.isDev ? " " : void 0);
const children = [
(0, import_qwik3.jsx)("script", {
type: "qwik/json",
dangerouslySetInnerHTML: escapeText(jsonData),
nonce: (_a2 = opts.serverData) == null ? void 0 : _a2.nonce
})
];
if (snapshotResult.funcs.length > 0) {
children.push(
(0, import_qwik3.jsx)("script", {
"q:func": "qwik/json",
dangerouslySetInnerHTML: serializeFunctions(snapshotResult.funcs),
nonce: (_b = opts.serverData) == null ? void 0 : _b.nonce
})
);
}
if (opts.prefetchStrategy !== null) {
const prefetchResources = getPrefetchResources(snapshotResult, opts, resolvedManifest);
if (prefetchResources.length > 0) {
const prefetchImpl = applyPrefetchImplementation(
opts.prefetchStrategy,
prefetchResources,
(_c = opts.serverData) == null ? void 0 : _c.nonce
);
if (prefetchImpl) {
children.push(prefetchImpl);
}
}
}
const needLoader = !snapshotResult || snapshotResult.mode !== "static";
const includeMode = ((_d = opts.qwikLoader) == null ? void 0 : _d.include) ?? "auto";
const includeLoader = includeMode === "always" || includeMode === "auto" && needLoader;
if (includeLoader) {
const qwikLoaderScript = getQwikLoaderScript({
events: (_e = opts.qwikLoader) == null ? void 0 : _e.events,
debug: opts.debug
});
children.push(
(0, import_qwik3.jsx)("script", {
id: "qwikloader",
dangerouslySetInnerHTML: qwikLoaderScript,
nonce: (_f = opts.serverData) == null ? void 0 : _f.nonce
})
);
}
const extraListeners = Array.from(containerState.$events$, (s) => JSON.stringify(s));
if (extraListeners.length > 0) {
let content = `window.qwikevents.push(${extraListeners.join(", ")})`;
if (!includeLoader) {
content = `window.qwikevents||=[];${content}`;
}
children.push(
(0, import_qwik3.jsx)("script", {
dangerouslySetInnerHTML: content,
nonce: (_g = opts.serverData) == null ? void 0 : _g.nonce
})
);
}
collectRenderSymbols(renderSymbols, contexts);
snapshotTime = snapshotTimer();
return (0, import_qwik3.jsx)(import_qwik3.Fragment, { children });
}
});
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;
}
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(([key, value]) => {
mapper[getSymbolHash(key)] = [key, value];
});
return {
mapper,
manifest
};
}
return void 0;
}
var escapeText = (str) => {
return str.replace(/<(\/?script)/g, "\\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);
}
}
}
function serializeFunctions(funcs) {
return `document.currentScript.qFuncs=[${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,
renderToStream,
renderToString,
resolveManifest,
setServerPlatform,
versions
});
return module.exports; })(typeof module === 'object' && module.exports ? module : { exports: {} });