UNPKG

@builder.io/qwik

Version:

An Open-Source sub-framework designed with a focus on server-side-rendering, lazy-loading, and styling/animation.

933 lines (914 loc) 39.7 kB
/** * @license * @builder.io/qwik/server 1.16.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 */ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) { if (typeof require !== "undefined") return require.apply(this, arguments); throw Error('Dynamic require of "' + x + '" is not supported'); }); // packages/qwik/src/server/index.ts import { setPlatform as setPlatform2 } from "@builder.io/qwik"; // packages/qwik/src/server/platform.ts import { setPlatform } from "@builder.io/qwik"; var SYNC_QRL = "<sync>"; function createPlatform(opts, resolvedManifest) { const mapper = resolvedManifest?.mapper; const mapperFn = opts.symbolMapper ? opts.symbolMapper : (symbolName, _chunk, parent) => { if (mapper) { const hash2 = getSymbolHash(symbolName); const result = mapper[hash2]; if (!result) { if (hash2 === SYNC_QRL) { return [hash2, ""]; } const isRegistered = globalThis.__qwik_reg_symbols?.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) { const hash2 = getSymbolHash(symbolName); const regSym = globalThis.__qwik_reg_symbols?.get(hash2); if (regSym) { return regSym; } let modulePath = String(url); if (!modulePath.endsWith(".js")) { modulePath += ".js"; } const module = __require(modulePath); if (!(symbolName in module)) { throw new Error(`Q-ERROR: missing symbol '${symbolName}' in module '${modulePath}'.`); } return module[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); 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 import { _pauseFromContexts, _renderSSR, Fragment as Fragment2, jsx as jsx2 } from "@builder.io/qwik"; import { isDev } from "@builder.io/qwik"; // packages/qwik/src/core/util/markers.ts var QInstance = "q:instance"; // packages/qwik/src/server/preload-impl.ts import { Fragment, jsx } from "@builder.io/qwik"; // packages/qwik/src/core/preloader/queue.ts import { isBrowser as isBrowser3 } from "@builder.io/qwik/build"; // packages/qwik/src/core/preloader/bundle-graph.ts import { isBrowser as isBrowser2 } from "@builder.io/qwik/build"; // packages/qwik/src/core/preloader/constants.ts import { isBrowser } from "@builder.io/qwik/build"; var doc = isBrowser ? document : void 0; var modulePreloadStr = "modulepreload"; var preloadStr = "preload"; var config = { $DEBUG$: false, $maxIdlePreloads$: 25, $invPreloadProbability$: 0.65 }; var rel = isBrowser && doc.createElement("link").relList.supports(modulePreloadStr) ? modulePreloadStr : preloadStr; var loadStart = Date.now(); var isJSRegex = /\.[mc]?js$/; // packages/qwik/src/core/preloader/types.ts var BundleImportState_None = 0; var BundleImportState_Queued = 1; var BundleImportState_Preload = 2; var BundleImportState_Alias = 3; var BundleImportState_Loaded = 4; // packages/qwik/src/core/preloader/bundle-graph.ts var base; var graph; var makeBundle = (name, deps) => { return { $name$: name, $state$: isJSRegex.test(name) ? BundleImportState_None : BundleImportState_Alias, $deps$: shouldResetFactor ? deps?.map((d) => ({ ...d, $factor$: 1 })) : deps, $inverseProbability$: 1, $createdTs$: Date.now(), $waitedMs$: 0, $loadedMs$: 0 }; }; var parseBundleGraph = (serialized) => { const graph2 = /* @__PURE__ */ new Map(); let i = 0; while (i < serialized.length) { const name = serialized[i++]; const deps = []; let idx; let probability = 1; while (idx = serialized[i], typeof idx === "number") { if (idx < 0) { probability = -idx / 10; } else { deps.push({ $name$: serialized[idx], $importProbability$: probability, $factor$: 1 }); } i++; } graph2.set(name, deps); } return graph2; }; var getBundle = (name) => { let bundle = bundles.get(name); if (!bundle) { let deps; if (graph) { deps = graph.get(name); if (!deps) { return; } if (!deps.length) { deps = void 0; } } bundle = makeBundle(name, deps); bundles.set(name, bundle); } return bundle; }; var initPreloader = (serializedBundleGraph, opts) => { if (opts) { if ("debug" in opts) { config.$DEBUG$ = !!opts.debug; } if (typeof opts.preloadProbability === "number") { config.$invPreloadProbability$ = 1 - opts.preloadProbability; } } if (base != null || !serializedBundleGraph) { return; } base = ""; graph = parseBundleGraph(serializedBundleGraph); }; // packages/qwik/src/core/preloader/queue.ts var bundles = /* @__PURE__ */ new Map(); var shouldResetFactor; var queueDirty; var preloadCount = 0; var queue = []; var log = (...args) => { console.log( `Preloader ${Date.now() - loadStart}ms ${preloadCount}/${queue.length} queued>`, ...args ); }; var resetQueue = () => { bundles.clear(); queueDirty = false; shouldResetFactor = true; preloadCount = 0; queue.length = 0; }; var sortQueue = () => { if (queueDirty) { queue.sort((a, b) => a.$inverseProbability$ - b.$inverseProbability$); queueDirty = false; } }; var getQueue = () => { sortQueue(); let probability = 0.4; const result = []; for (const b of queue) { const nextProbability = Math.round((1 - b.$inverseProbability$) * 10); if (nextProbability !== probability) { probability = nextProbability; result.push(probability); } result.push(b.$name$); } return result; }; var trigger = () => { if (!queue.length) { return; } sortQueue(); while (queue.length) { const bundle = queue[0]; const inverseProbability = bundle.$inverseProbability$; const probability = 1 - inverseProbability; const allowedPreloads = graph ? ( // The more likely the bundle, the more simultaneous preloads we want to allow Math.max(1, config.$maxIdlePreloads$ * probability) ) : ( // While the graph is not available, we limit to 2 preloads 2 ); if (probability >= 0.99 || preloadCount < allowedPreloads) { queue.shift(); preloadOne(bundle); } else { break; } } if (config.$DEBUG$ && !queue.length) { const loaded = [...bundles.values()].filter((b) => b.$state$ > BundleImportState_None); const waitTime = loaded.reduce((acc, b) => acc + b.$waitedMs$, 0); const loadTime = loaded.reduce((acc, b) => acc + b.$loadedMs$, 0); log( `>>>> done ${loaded.length}/${bundles.size} total: ${waitTime}ms waited, ${loadTime}ms loaded` ); } }; var preloadOne = (bundle) => { if (bundle.$state$ >= BundleImportState_Preload) { return; } preloadCount++; const start = Date.now(); bundle.$waitedMs$ = start - bundle.$createdTs$; bundle.$state$ = BundleImportState_Preload; config.$DEBUG$ && log( `<< load ${Math.round((1 - bundle.$inverseProbability$) * 100)}% after ${`${bundle.$waitedMs$}ms`}`, bundle.$name$ ); const link = doc.createElement("link"); link.href = new URL(`${base}${bundle.$name$}`, doc.baseURI).toString(); link.rel = rel; link.as = "script"; link.onload = link.onerror = () => { preloadCount--; const end = Date.now(); bundle.$loadedMs$ = end - start; bundle.$state$ = BundleImportState_Loaded; config.$DEBUG$ && log(`>> done after ${bundle.$loadedMs$}ms`, bundle.$name$); link.remove(); trigger(); }; doc.head.appendChild(link); }; var adjustProbabilities = (bundle, newInverseProbability, seen) => { if (seen?.has(bundle)) { return; } const previousInverseProbability = bundle.$inverseProbability$; bundle.$inverseProbability$ = newInverseProbability; if (previousInverseProbability - bundle.$inverseProbability$ < 0.01) { return; } if ( // don't queue until we have initialized the preloader base != null && bundle.$state$ < BundleImportState_Preload && bundle.$inverseProbability$ < config.$invPreloadProbability$ ) { if (bundle.$state$ === BundleImportState_None) { bundle.$state$ = BundleImportState_Queued; queue.push(bundle); config.$DEBUG$ && log(`queued ${Math.round((1 - bundle.$inverseProbability$) * 100)}%`, bundle.$name$); } queueDirty = true; } if (bundle.$deps$) { seen || (seen = /* @__PURE__ */ new Set()); seen.add(bundle); const probability = 1 - bundle.$inverseProbability$; for (const dep of bundle.$deps$) { const depBundle = getBundle(dep.$name$); if (depBundle.$inverseProbability$ === 0) { continue; } let newInverseProbability2; if (dep.$importProbability$ > 0.5 && (probability === 1 || probability >= 0.99 && depsCount < 100)) { depsCount++; newInverseProbability2 = Math.min(0.01, 1 - dep.$importProbability$); } else { const newInverseImportProbability = 1 - dep.$importProbability$ * probability; const prevAdjust = dep.$factor$; const factor = newInverseImportProbability / prevAdjust; newInverseProbability2 = Math.max(0.02, depBundle.$inverseProbability$ * factor); dep.$factor$ = factor; } adjustProbabilities(depBundle, newInverseProbability2, seen); } } }; var handleBundle = (name, inverseProbability) => { const bundle = getBundle(name); if (bundle && bundle.$inverseProbability$ > inverseProbability) { adjustProbabilities(bundle, inverseProbability); } }; var depsCount; var preload = (name, probability) => { if (!name?.length) { return; } depsCount = 0; let inverseProbability = probability ? 1 - probability : 0.4; if (Array.isArray(name)) { for (let i = name.length - 1; i >= 0; i--) { const item = name[i]; if (typeof item === "number") { inverseProbability = 1 - item / 10; } else { handleBundle(item, inverseProbability); } } } else { handleBundle(name, inverseProbability); } if (isBrowser3) { trigger(); } }; if (isBrowser3) { document.addEventListener("qsymbol", (ev) => { const { symbol, href } = ev.detail; if (href) { const hash2 = symbol.slice(symbol.lastIndexOf("_") + 1); preload(hash2, 1); } }); } // packages/qwik/src/server/preload-utils.ts function flattenPrefetchResources(prefetchResources) { const urls = []; const addPrefetchResource = (prefetchResources2) => { if (prefetchResources2) { for (const prefetchResource of prefetchResources2) { if (!urls.includes(prefetchResource.url)) { urls.push(prefetchResource.url); if (prefetchResource.imports) { addPrefetchResource(prefetchResource.imports); } } } } }; addPrefetchResource(prefetchResources); return urls; } // packages/qwik/src/server/preload-strategy.ts import { getPlatform } from "@builder.io/qwik"; var getBundles = (snapshotResult) => { const platform = getPlatform(); return snapshotResult?.qrls?.map((qrl) => { const symbol = qrl.$refSymbol$ || qrl.$symbol$; const chunk = qrl.$chunk$; const result = platform.chunkForSymbol(symbol, chunk, qrl.dev?.file); if (result) { return result[1]; } return chunk; }).filter(Boolean); }; function getPreloadPaths(snapshotResult, opts, resolvedManifest) { const prefetchStrategy = opts.prefetchStrategy; if (prefetchStrategy === null) { return []; } if (!resolvedManifest?.manifest.bundleGraph) { return getBundles(snapshotResult); } if (typeof prefetchStrategy?.symbolsToPrefetch === "function") { try { const prefetchResources = prefetchStrategy.symbolsToPrefetch({ manifest: resolvedManifest.manifest }); return flattenPrefetchResources(prefetchResources); } catch (e) { console.error("getPrefetchUrls, symbolsToPrefetch()", e); } } const symbols = /* @__PURE__ */ new Set(); for (const qrl of snapshotResult?.qrls || []) { const symbol = getSymbolHash(qrl.$refSymbol$ || qrl.$symbol$); if (symbol && symbol.length >= 10) { symbols.add(symbol); } } return [...symbols]; } var expandBundles = (names, resolvedManifest) => { if (!resolvedManifest?.manifest.bundleGraph) { return [...new Set(names)]; } resetQueue(); let probability = 0.99; for (const name of names.slice(0, 15)) { preload(name, probability); probability *= 0.85; } return getQueue(); }; // packages/qwik/src/server/preload-impl.ts var simplifyPath = (base2, path) => { if (path == null) { return null; } const segments = `${base2}${path}`.split("/"); const simplified = []; for (const segment of segments) { if (segment === ".." && simplified.length > 0) { simplified.pop(); } else { simplified.push(segment); } } return simplified.join("/"); }; var preloaderPre = (base2, resolvedManifest, options, beforeContent, nonce) => { const preloaderPath = simplifyPath(base2, resolvedManifest?.manifest?.preloader); const bundleGraphPath = (import.meta.env.BASE_URL || "/") + resolvedManifest?.manifest.bundleGraphAsset; if (preloaderPath && bundleGraphPath && options !== false) { const preloaderOpts = typeof options === "object" ? { debug: options.debug, preloadProbability: options.ssrPreloadProbability } : void 0; initPreloader(resolvedManifest?.manifest.bundleGraph, preloaderOpts); const opts = []; if (options?.debug) { opts.push("d:1"); } if (options?.maxIdlePreloads) { opts.push(`P:${options.maxIdlePreloads}`); } if (options?.preloadProbability) { opts.push(`Q:${options.preloadProbability}`); } const optsStr = opts.length ? `,{${opts.join(",")}}` : ""; const script = `let b=fetch("${bundleGraphPath}");import("${preloaderPath}").then(({l})=>l(${JSON.stringify(base2)},b${optsStr}));`; beforeContent.push( /** * We add modulepreloads even when the script is at the top because they already fire during * html download */ jsx("link", { rel: "modulepreload", href: preloaderPath, nonce }), jsx("link", { rel: "preload", href: bundleGraphPath, as: "fetch", crossorigin: "anonymous", nonce }), jsx("script", { type: "module", async: true, dangerouslySetInnerHTML: script, nonce }) ); } const corePath = simplifyPath(base2, resolvedManifest?.manifest.core); if (corePath) { beforeContent.push(jsx("link", { rel: "modulepreload", href: corePath, nonce })); } }; var includePreloader = (base2, resolvedManifest, options, referencedBundles, nonce) => { if (referencedBundles.length === 0 || options === false) { return null; } const { ssrPreloads, ssrPreloadProbability } = normalizePreLoaderOptions( typeof options === "boolean" ? void 0 : options ); let allowed = ssrPreloads; const nodes = []; if (import.meta.env.DEV) { base2 = import.meta.env.BASE_URL; if (base2.endsWith("/")) { base2 = base2.slice(0, -1); } } const links = []; const manifestHash = resolvedManifest?.manifest.manifestHash; if (allowed) { const preloaderBundle = resolvedManifest?.manifest.preloader; const coreBundle = resolvedManifest?.manifest.core; const expandedBundles = expandBundles(referencedBundles, resolvedManifest); let probability = 4; const tenXMinProbability = ssrPreloadProbability * 10; for (const hrefOrProbability of expandedBundles) { if (typeof hrefOrProbability === "string") { if (probability < tenXMinProbability) { break; } if (hrefOrProbability === preloaderBundle || hrefOrProbability === coreBundle) { continue; } links.push(hrefOrProbability); if (--allowed === 0) { break; } } else { probability = hrefOrProbability; } } } const preloaderPath = simplifyPath(base2, manifestHash && resolvedManifest?.manifest.preloader); const insertLinks = links.length ? ( /** * We only use modulepreload links because they behave best. Older browsers can rely on the * preloader which does feature detection and which will be available soon after inserting these * links. */ `${JSON.stringify(links)}.map((l,e)=>{e=document.createElement('link');e.rel='modulepreload';e.href=${JSON.stringify(base2)}+l;document.head.appendChild(e)});` ) : ""; let script = insertLinks; if (preloaderPath) { script += `window.addEventListener('load',f=>{f=_=>import("${preloaderPath}").then(({p})=>p(${JSON.stringify(referencedBundles)}));try{requestIdleCallback(f,{timeout:2000})}catch(e){setTimeout(f,200)}})`; } if (script) { nodes.push( jsx("script", { type: "module", "q:type": "preload", /** * This async allows the preloader to be executed before the DOM is fully parsed even though * it's at the bottom of the body */ async: true, dangerouslySetInnerHTML: script, nonce }) ); } if (nodes.length > 0) { return jsx(Fragment, { children: nodes }); } return null; }; var preloaderPost = (base2, snapshotResult, opts, resolvedManifest, output) => { if (opts.preloader !== false) { const preloadBundles = getPreloadPaths(snapshotResult, opts, resolvedManifest); if (preloadBundles.length > 0) { const result = includePreloader( base2, resolvedManifest, opts.preloader, preloadBundles, opts.serverData?.nonce ); if (result) { output.push(result); } } } }; function normalizePreLoaderOptions(input) { return { ...PreLoaderOptionsDefault, ...input }; } var PreLoaderOptionsDefault = { ssrPreloads: 7, ssrPreloadProbability: 0.5, debug: false, maxIdlePreloads: 25, preloadProbability: 0.35 }; // packages/qwik/src/server/scripts.ts var QWIK_LOADER_DEFAULT_MINIFIED = 'const t=document,e=window,n=new Set,o=new Set([t]);let r;const s=(t,e)=>Array.from(t.querySelectorAll(e)),a=t=>{const e=[];return o.forEach(n=>e.push(...s(n,t))),e},i=t=>{w(t),s(t,"[q\\\\:shadowroot]").forEach(t=>{const e=t.shadowRoot;e&&i(e)})},c=t=>t&&"function"==typeof t.then,l=(t,e,n=e.type)=>{a("[on"+t+"\\\\:"+n+"]").forEach(o=>{u(o,t,e,n)})},f=e=>{if(void 0===e._qwikjson_){let n=(e===t.documentElement?t.body:e).lastElementChild;for(;n;){if("SCRIPT"===n.tagName&&"qwik/json"===n.getAttribute("type")){e._qwikjson_=JSON.parse(n.textContent.replace(/\\\\x3C(\\/?script)/gi,"<$1"));break}n=n.previousElementSibling}}},p=(t,e)=>new CustomEvent(t,{detail:e}),u=async(e,n,o,r=o.type)=>{const s="on"+n+":"+r;e.hasAttribute("preventdefault:"+r)&&o.preventDefault(),e.hasAttribute("stoppropagation:"+r)&&o.stopPropagation();const a=e._qc_,i=a&&a.li.filter(t=>t[0]===s);if(i&&i.length>0){for(const t of i){const n=t[1].getFn([e,o],()=>e.isConnected)(o,e),r=o.cancelBubble;c(n)&&await n,r&&o.stopPropagation()}return}const l=e.getAttribute(s);if(l){const n=e.closest("[q\\\\:container]"),r=n.getAttribute("q:base"),s=n.getAttribute("q:version")||"unknown",a=n.getAttribute("q:manifest-hash")||"dev",i=new URL(r,t.baseURI);for(const p of l.split("\\n")){const l=new URL(p,i),u=l.href,h=l.hash.replace(/^#?([^?[|]*).*$/,"$1")||"default",q=performance.now();let _,d,y;const w=p.startsWith("#"),g={qBase:r,qManifest:a,qVersion:s,href:u,symbol:h,element:e,reqTime:q};if(w){const e=n.getAttribute("q:instance");_=(t["qFuncs_"+e]||[])[Number.parseInt(h)],_||(d="sync",y=Error("sym:"+h))}else{b("qsymbol",g);const t=l.href.split("#")[0];try{const e=import(t);f(n),_=(await e)[h],_||(d="no-symbol",y=Error(`${h} not in ${t}`))}catch(t){d||(d="async"),y=t}}if(!_){b("qerror",{importError:d,error:y,...g}),console.error(y);break}const m=t.__q_context__;if(e.isConnected)try{t.__q_context__=[e,o,l];const n=_(o,e);c(n)&&await n}catch(t){b("qerror",{error:t,...g})}finally{t.__q_context__=m}}}},b=(e,n)=>{t.dispatchEvent(p(e,n))},h=t=>t.replace(/([A-Z])/g,t=>"-"+t.toLowerCase()),q=async t=>{let e=h(t.type),n=t.target;for(l("-document",t,e);n&&n.getAttribute;){const o=u(n,"",t,e);let r=t.cancelBubble;c(o)&&await o,r||(r=r||t.cancelBubble||n.hasAttribute("stoppropagation:"+t.type)),n=t.bubbles&&!0!==r?n.parentElement:null}},_=t=>{l("-window",t,h(t.type))},d=()=>{var s;const c=t.readyState;if(!r&&("interactive"==c||"complete"==c)&&(o.forEach(i),r=1,b("qinit"),(null!=(s=e.requestIdleCallback)?s:e.setTimeout).bind(e)(()=>b("qidle")),n.has("qvisible"))){const t=a("[on\\\\:qvisible]"),e=new IntersectionObserver(t=>{for(const n of t)n.isIntersecting&&(e.unobserve(n.target),u(n.target,"",p("qvisible",n)))});t.forEach(t=>e.observe(t))}},y=(t,e,n,o=!1)=>{t.addEventListener(e,n,{capture:o,passive:!1})},w=(...t)=>{for(const r of t)"string"==typeof r?n.has(r)||(o.forEach(t=>y(t,r,q,!0)),y(e,r,_,!0),n.add(r)):o.has(r)||(n.forEach(t=>y(r,t,q,!0)),o.add(r))};if(!("__q_context__"in t)){t.__q_context__=0;const r=e.qwikevents;r&&(Array.isArray(r)?w(...r):w("click","input")),e.qwikevents={events:n,roots:o,push:w},y(t,"readystatechange",d),d()}'; var QWIK_LOADER_DEFAULT_DEBUG = 'const doc = document;\nconst win = window;\nconst events = /* @__PURE__ */ new Set();\nconst roots = /* @__PURE__ */ new Set([doc]);\nlet hasInitialized;\nconst nativeQuerySelectorAll = (root, selector) => Array.from(root.querySelectorAll(selector));\nconst querySelectorAll = (query) => {\n const elements = [];\n roots.forEach((root) => elements.push(...nativeQuerySelectorAll(root, query)));\n return elements;\n};\nconst findShadowRoots = (fragment) => {\n processEventOrNode(fragment);\n nativeQuerySelectorAll(fragment, "[q\\\\:shadowroot]").forEach((parent) => {\n const shadowRoot = parent.shadowRoot;\n shadowRoot && findShadowRoots(shadowRoot);\n });\n};\nconst isPromise = (promise) => promise && typeof promise.then === "function";\nconst broadcast = (infix, ev, type = ev.type) => {\n querySelectorAll("[on" + infix + "\\\\:" + type + "]").forEach((el) => {\n dispatch(el, infix, ev, type);\n });\n};\nconst resolveContainer = (containerEl) => {\n if (containerEl._qwikjson_ === void 0) {\n const parentJSON = containerEl === doc.documentElement ? doc.body : containerEl;\n let script = parentJSON.lastElementChild;\n while (script) {\n if (script.tagName === "SCRIPT" && script.getAttribute("type") === "qwik/json") {\n containerEl._qwikjson_ = JSON.parse(\n script.textContent.replace(/\\\\x3C(\\/?script)/gi, "<$1")\n );\n break;\n }\n script = script.previousElementSibling;\n }\n }\n};\nconst createEvent = (eventName, detail) => new CustomEvent(eventName, {\n detail\n});\nconst dispatch = async (element, onPrefix, ev, eventName = ev.type) => {\n const attrName = "on" + onPrefix + ":" + eventName;\n if (element.hasAttribute("preventdefault:" + eventName)) {\n ev.preventDefault();\n }\n if (element.hasAttribute("stoppropagation:" + eventName)) {\n ev.stopPropagation();\n }\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 if (isPromise(results)) {\n await results;\n }\n if (cancelBubble) {\n ev.stopPropagation();\n }\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,\n qManifest,\n qVersion,\n href,\n symbol,\n element,\n 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("sym:" + symbol);\n }\n } else {\n emitEvent("qsymbol", eventData);\n const uri = url.href.split("#")[0];\n try {\n const module = import(\n uri\n );\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", {\n importError,\n error,\n ...eventData\n });\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 const results = handler(ev, element);\n if (isPromise(results)) {\n await results;\n }\n } catch (error2) {\n emitEvent("qerror", { error: error2, ...eventData });\n } finally {\n doc.__q_context__ = previousCtx;\n }\n }\n }\n }\n};\nconst emitEvent = (eventName, detail) => {\n doc.dispatchEvent(createEvent(eventName, detail));\n};\nconst camelToKebab = (str) => str.replace(/([A-Z])/g, (a) => "-" + a.toLowerCase());\nconst 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 if (isPromise(results)) {\n await results;\n }\n cancelBubble || (cancelBubble = cancelBubble || ev.cancelBubble || element.hasAttribute("stoppropagation:" + ev.type));\n element = ev.bubbles && cancelBubble !== true ? element.parentElement : null;\n }\n};\nconst processWindowEvent = (ev) => {\n broadcast("-window", ev, camelToKebab(ev.type));\n};\nconst processReadyStateChange = () => {\n var _a;\n const readyState = doc.readyState;\n if (!hasInitialized && (readyState == "interactive" || readyState == "complete")) {\n roots.forEach(findShadowRoots);\n hasInitialized = 1;\n emitEvent("qinit");\n const riC = (_a = win.requestIdleCallback) != null ? _a : win.setTimeout;\n riC.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};\nconst addEventListener = (el, eventName, handler, capture = false) => {\n el.addEventListener(eventName, handler, { capture, passive: false });\n};\nconst processEventOrNode = (...eventNames) => {\n for (const eventNameOrNode of eventNames) {\n if (typeof eventNameOrNode === "string") {\n if (!events.has(eventNameOrNode)) {\n roots.forEach(\n (root) => addEventListener(root, eventNameOrNode, processDocumentEvent, true)\n );\n addEventListener(win, eventNameOrNode, processWindowEvent, true);\n events.add(eventNameOrNode);\n }\n } else {\n if (!roots.has(eventNameOrNode)) {\n events.forEach(\n (eventName) => addEventListener(eventNameOrNode, eventName, processDocumentEvent, true)\n );\n roots.add(eventNameOrNode);\n }\n }\n }\n};\nif (!("__q_context__" in doc)) {\n doc.__q_context__ = 0;\n const qwikevents = win.qwikevents;\n if (qwikevents) {\n if (Array.isArray(qwikevents)) {\n processEventOrNode(...qwikevents);\n } else {\n processEventOrNode("click", "input");\n }\n }\n win.qwikevents = {\n events,\n roots,\n push: processEventOrNode\n };\n addEventListener(doc, "readystatechange", processReadyStateChange);\n processReadyStateChange();\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/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 base2 = opts.base; if (typeof opts.base === "function") { base2 = opts.base(opts); } if (typeof base2 === "string") { if (!base2.endsWith("/")) { base2 += "/"; } return base2; } return `${import.meta.env.BASE_URL || "/"}build/`; } var versions = { qwik: "1.16.0", qwikDom: "2.1.19" }; // packages/qwik/src/server/render.ts import { manifest as builtManifest } from "@qwik-client-manifest"; var DOCTYPE = "<!DOCTYPE html>"; async function renderToStream(rootNode, opts) { let stream = opts.stream; let bufferSize = 0; let totalSize = 0; let networkFlushes = 0; let firstFlushTime = 0; let buffer = ""; let snapshotResult; const inOrderStreaming = opts.streaming?.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); const nonce = opts.serverData?.nonce; 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 (!resolvedManifest && !isDev) { 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?.manifest.injections; const beforeContent = injections ? injections.map((injection) => jsx2(injection.tag, injection.attributes ?? {})) : []; const includeMode = opts.qwikLoader?.include ?? "auto"; const qwikLoaderChunk = resolvedManifest?.manifest.qwikLoader; let didAddQwikLoader = false; if (includeMode !== "never" && qwikLoaderChunk) { beforeContent.unshift( jsx2("link", { rel: "modulepreload", href: `${buildBase}${qwikLoaderChunk}`, nonce }), jsx2("script", { type: "module", async: true, src: `${buildBase}${qwikLoaderChunk}`, nonce }) ); didAddQwikLoader = true; } preloaderPre(buildBase, resolvedManifest, opts.preloader, beforeContent, nonce); const renderTimer = createTimer(); const renderSymbols = []; let renderTime = 0; let snapshotTime = 0; await _renderSSR(rootNode, { stream, containerTagName, containerAttributes, serverData: opts.serverData, base: buildBase, beforeContent, beforeClose: async (contexts, containerState, _dynamic, textNodes) => { renderTime = renderTimer(); const snapshotTimer = createTimer(); snapshotResult = await _pauseFromContexts(contexts, containerState, void 0, textNodes); const children = []; preloaderPost(buildBase, snapshotResult, opts, resolvedManifest, children); const jsonData = JSON.stringify(snapshotResult.state, void 0, isDev ? " " : void 0); children.push( jsx2("script", { type: "qwik/json", dangerouslySetInnerHTML: escapeText(jsonData), nonce }) ); if (snapshotResult.funcs.length > 0) { const hash2 = containerAttributes[QInstance]; children.push( jsx2("script", { "q:func": "qwik/json", dangerouslySetInnerHTML: serializeFunctions(hash2, snapshotResult.funcs), nonce }) ); } const needLoader = !snapshotResult || snapshotResult.mode !== "static"; const includeLoader = includeMode === "always" || includeMode === "auto" && needLoader; if (!didAddQwikLoader && includeLoader) { const qwikLoaderScript = getQwikLoaderScript({ debug: opts.debug }); children.push( jsx2("script", { id: "qwikloader", // execute even before DOM order async: true, type: "module", dangerouslySetInnerHTML: qwikLoaderScript, nonce }) ); } const extraListeners = Array.from(containerState.$events$, (s) => JSON.stringify(s)); if (extraListeners.length > 0) { const content = `(window.qwikevents||(window.qwikevents=[])).push(${extraListeners.join(",")})`; children.push( jsx2("script", { dangerouslySetInnerHTML: content, nonce }) ); } collectRenderSymbols(renderSymbols, contexts); snapshotTime = snapshotTimer(); return jsx2(Fragment2, { children }); }, manifestHash: 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?.manifest, size: totalSize, isStatic: !isDynamic, timing: { render: renderTime, snapshot: snapshotTime, firstFlush: firstFlushTime } }; 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) { const mergedManifest = manifest ? { ...builtManifest, ...manifest } : builtManifest; if (!mergedManifest || "mapper" in mergedManifest) { return mergedManifest; } if (mergedManifest.mapping) { const mapper = {}; Object.entries(mergedManifest.mapping).forEach(([symbol, bundleFilename]) => { mapper[getSymbolHash(symbol)] = [symbol, bundleFilename]; }); return { mapper, manifest: mergedManifest, injections: mergedManifest.injections || [] }; } return void 0; } var escapeText = (str) => { return str.replace(/<(\/?script)/gi, "\\x3C$1"); }; function collectRenderSymbols(renderSymbols, elements) { for (const ctx of elements) { const symbol = ctx.$componentQrl$?.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)); setPlatform2(platform); } export { getQwikLoaderScript, getQwikPrefetchWorkerScript, renderToStream, renderToString, resolveManifest, setServerPlatform2 as setServerPlatform, versions };