import { createRenderer, getRequestDependencies, getPreloadLinks, getPrefetchLinks } from 'vue-bundle-renderer/runtime'; import { j as joinRelativeURL, u as useRuntimeConfig, g as getResponseStatusText, c as getResponseStatus, e as defineRenderHandler, f as getQuery, h as createError, i as getRouteRules, b as useNitroApp } from '../_/nitro.mjs'; import { createHead as createHead$1, propsToString, renderSSRHead } from 'unhead/server'; import { walkResolver } from 'unhead/utils'; import { toValue, isRef, hasInjectionContext, inject, ref, watchEffect, getCurrentInstance, onBeforeUnmount, onDeactivated, onActivated } from 'vue'; import { renderToString } from 'vue/server-renderer'; import { stringify, uneval } from 'devalue'; import { DeprecationsPlugin, PromisesPlugin, TemplateParamsPlugin, AliasSortingPlugin } from 'unhead/plugins'; const VueResolver = (_, value) => { return isRef(value) ? toValue(value) : value; }; const headSymbol = "usehead"; function vueInstall(head) { const plugin = { install(app) { app.config.globalProperties.$unhead = head; app.config.globalProperties.$head = head; app.provide(headSymbol, head); } }; return plugin.install; } function injectHead() { if (hasInjectionContext()) { const instance = inject(headSymbol); if (!instance) { throw new Error("useHead() was called without provide context, ensure you call it through the setup() function."); } return instance; } throw new Error("useHead() was called without provide context, ensure you call it through the setup() function."); } function useHead(input, options = {}) { const head = options.head || injectHead(); return head.ssr ? head.push(input || {}, options) : clientUseHead(head, input, options); } function clientUseHead(head, input, options = {}) { const deactivated = ref(false); let entry; watchEffect(() => { const i = deactivated.value ? {} : walkResolver(input, VueResolver); if (entry) { entry.patch(i); } else { entry = head.push(i, options); } }); const vm = getCurrentInstance(); if (vm) { onBeforeUnmount(() => { entry.dispose(); }); onDeactivated(() => { deactivated.value = true; }); onActivated(() => { deactivated.value = false; }); } return entry; } function createHead(options = {}) { const head = createHead$1({ ...options, propResolvers: [VueResolver] }); head.install = vueInstall(head); return head; } const appHead = {"meta":[{"name":"viewport","content":"width=device-width, initial-scale=1"},{"charset":"utf-8"}],"link":[{"rel":"stylesheet","href":"//bbs.gter.net/data/cache/style_2_common.css?Z62"}],"style":[],"script":[{"src":"//bbs.gter.net/static/js/common.js","body":true},{"innerHTML":"\n window.userInfoWin = {}\n STYLEID = \"2\";\n STATICURL = \"static/\";\n IMGDIR = \"https://bbs.gter.net/template/archy_plt8/image\";\n VERHASH = \"Z62\";\n charset = \"gbk\";\n discuz_uid = \"0\";\n cookiepre = \"4B5x_c0ae_\";\n cookiedomain = \"gter.net\";\n cookiepath = \"/\";\n showusercard = \"1\";\n attackevasive = \"0\";\n disallowfloat = \"\";\n creditnotice = \",\";\n defaultstyle = \"\";\n REPORTURL = \"aHR0cDovL2Jicy5ndGVyLm5ldC9mb3J1bS5waHA/dGlkPTI0MDYzNTYmZ290bz1sYXN0cG9zdA==\";\n SITEURL = \"https://ask.gter.net/\";\n JSPATH = \"static/js/\";","type":"text/javascript"}],"noscript":[]}; const appRootTag = "div"; const appRootAttrs = {"id":"__nuxt"}; const appTeleportTag = "div"; const appTeleportAttrs = {"id":"teleports"}; const componentIslands = false; const appId = "nuxt-app"; function buildAssetsDir() { return useRuntimeConfig().app.buildAssetsDir; } function buildAssetsURL(...path) { return joinRelativeURL(publicAssetsURL(), buildAssetsDir(), ...path); } function publicAssetsURL(...path) { const app = useRuntimeConfig().app; const publicBase = app.cdnURL || app.baseURL; return path.length ? joinRelativeURL(publicBase, ...path) : publicBase; } const APP_ROOT_OPEN_TAG = `<${appRootTag}${propsToString(appRootAttrs)}>`; const APP_ROOT_CLOSE_TAG = ``; const getClientManifest = () => import('../build/client.manifest.mjs').then((r) => r.default || r).then((r) => typeof r === "function" ? r() : r); const getEntryIds = () => getClientManifest().then((r) => Object.values(r).filter( (r2) => ( // @ts-expect-error internal key set by CSS inlining configuration r2._globalCSS ) ).map((r2) => r2.src)); const getServerEntry = () => import('../build/server.mjs').then(function (n) { return n.K; }).then((r) => r.default || r); const getSSRStyles = lazyCachedFunction(() => import('../build/styles.mjs').then((r) => r.default || r)); const getSSRRenderer = lazyCachedFunction(async () => { const manifest = await getClientManifest(); if (!manifest) { throw new Error("client.manifest is not available"); } const createSSRApp = await getServerEntry(); if (!createSSRApp) { throw new Error("Server bundle is not available"); } const options = { manifest, renderToString: renderToString$1, buildAssetsURL }; const renderer = createRenderer(createSSRApp, options); async function renderToString$1(input, context) { const html = await renderToString(input, context); return APP_ROOT_OPEN_TAG + html + APP_ROOT_CLOSE_TAG; } return renderer; }); const getSPARenderer = lazyCachedFunction(async () => { const manifest = await getClientManifest(); const spaTemplate = await import('../virtual/_virtual_spa-template.mjs').then((r) => r.template).catch(() => "").then((r) => { { return APP_ROOT_OPEN_TAG + r + APP_ROOT_CLOSE_TAG; } }); const options = { manifest, renderToString: () => spaTemplate, buildAssetsURL }; const renderer = createRenderer(() => () => { }, options); const result = await renderer.renderToString({}); const renderToString = (ssrContext) => { const config = useRuntimeConfig(ssrContext.event); ssrContext.modules ||= /* @__PURE__ */ new Set(); ssrContext.payload.serverRendered = false; ssrContext.config = { public: config.public, app: config.app }; return Promise.resolve(result); }; return { rendererContext: renderer.rendererContext, renderToString }; }); function lazyCachedFunction(fn) { let res = null; return () => { if (res === null) { res = fn().catch((err) => { res = null; throw err; }); } return res; }; } function renderPayloadResponse(ssrContext) { return { body: stringify(splitPayload(ssrContext).payload, ssrContext._payloadReducers) , statusCode: getResponseStatus(ssrContext.event), statusMessage: getResponseStatusText(ssrContext.event), headers: { "content-type": "application/json;charset=utf-8" , "x-powered-by": "Nuxt" } }; } function renderPayloadJsonScript(opts) { const contents = opts.data ? stringify(opts.data, opts.ssrContext._payloadReducers) : ""; const payload = { "type": "application/json", "innerHTML": contents, "data-nuxt-data": appId, "data-ssr": !(opts.ssrContext.noSSR) }; { payload.id = "__NUXT_DATA__"; } if (opts.src) { payload["data-src"] = opts.src; } const config = uneval(opts.ssrContext.config); return [ payload, { innerHTML: `window.__NUXT__={};window.__NUXT__.config=${config}` } ]; } function splitPayload(ssrContext) { const { data, prerenderedAt, ...initial } = ssrContext.payload; return { initial: { ...initial, prerenderedAt }, payload: { data, prerenderedAt } }; } const unheadOptions = { disableDefaults: true, disableCapoSorting: false, plugins: [DeprecationsPlugin, PromisesPlugin, TemplateParamsPlugin, AliasSortingPlugin], }; const renderSSRHeadOptions = {"omitLineBreaks":false}; globalThis.__buildAssetsURL = buildAssetsURL; globalThis.__publicAssetsURL = publicAssetsURL; const HAS_APP_TELEPORTS = !!(appTeleportAttrs.id); const APP_TELEPORT_OPEN_TAG = HAS_APP_TELEPORTS ? `<${appTeleportTag}${propsToString(appTeleportAttrs)}>` : ""; const APP_TELEPORT_CLOSE_TAG = HAS_APP_TELEPORTS ? `` : ""; const PAYLOAD_URL_RE = /^[^?]*\/_payload.json(?:\?.*)?$/ ; const renderer = defineRenderHandler(async (event) => { const nitroApp = useNitroApp(); const ssrError = event.path.startsWith("/__nuxt_error") ? getQuery(event) : null; if (ssrError && ssrError.statusCode) { ssrError.statusCode = Number.parseInt(ssrError.statusCode); } if (ssrError && !("__unenv__" in event.node.req)) { throw createError({ statusCode: 404, statusMessage: "Page Not Found: /__nuxt_error" }); } const isRenderingIsland = componentIslands; const islandContext = void 0; let url = ssrError?.url || islandContext?.url || event.path; const isRenderingPayload = PAYLOAD_URL_RE.test(url); if (isRenderingPayload) { url = url.substring(0, url.lastIndexOf("/")) || "/"; event._path = url; event.node.req.url = url; } const routeOptions = getRouteRules(event); const head = createHead(unheadOptions); const headEntryOptions = { mode: "server" }; { head.push(appHead, headEntryOptions); } const ssrContext = { url, event, runtimeConfig: useRuntimeConfig(event), noSSR: event.context.nuxt?.noSSR || routeOptions.ssr === false && true || (false), head, error: !!ssrError, nuxt: void 0, /* NuxtApp */ payload: ssrError ? { error: ssrError } : {}, _payloadReducers: /* @__PURE__ */ Object.create(null), modules: /* @__PURE__ */ new Set(), islandContext }; const renderer = ssrContext.noSSR ? await getSPARenderer() : await getSSRRenderer(); { for (const id of await getEntryIds()) { ssrContext.modules.add(id); } } const _rendered = await renderer.renderToString(ssrContext).catch(async (error) => { if (ssrContext._renderResponse && error.message === "skipping render") { return {}; } const _err = !ssrError && ssrContext.payload?.error || error; await ssrContext.nuxt?.hooks.callHook("app:error", _err); throw _err; }); await ssrContext.nuxt?.hooks.callHook("app:rendered", { ssrContext, renderResult: _rendered }); if (ssrContext._renderResponse) { return ssrContext._renderResponse; } if (ssrContext.payload?.error && !ssrError) { throw ssrContext.payload.error; } if (isRenderingPayload) { const response2 = renderPayloadResponse(ssrContext); return response2; } const inlinedStyles = await renderInlineStyles(ssrContext.modules ?? []) ; const NO_SCRIPTS = routeOptions.noScripts; const { styles, scripts } = getRequestDependencies(ssrContext, renderer.rendererContext); if (ssrContext._preloadManifest) { head.push({ link: [ { rel: "preload", as: "fetch", fetchpriority: "low", crossorigin: "anonymous", href: buildAssetsURL(`builds/meta/${ssrContext.runtimeConfig.app.buildId}.json`) } ] }, { ...headEntryOptions, tagPriority: "low" }); } if (inlinedStyles.length) { head.push({ style: inlinedStyles }); } { const link = []; for (const resource of Object.values(styles)) { { link.push({ rel: "stylesheet", href: renderer.rendererContext.buildAssetsURL(resource.file), crossorigin: "" }); } } if (link.length) { head.push({ link }, headEntryOptions); } } if (!NO_SCRIPTS) { head.push({ link: getPreloadLinks(ssrContext, renderer.rendererContext) }, headEntryOptions); head.push({ link: getPrefetchLinks(ssrContext, renderer.rendererContext) }, headEntryOptions); head.push({ script: renderPayloadJsonScript({ ssrContext, data: ssrContext.payload }) }, { ...headEntryOptions, // this should come before another end of body scripts tagPosition: "bodyClose", tagPriority: "high" }); } if (!routeOptions.noScripts) { head.push({ script: Object.values(scripts).map((resource) => ({ type: resource.module ? "module" : null, src: renderer.rendererContext.buildAssetsURL(resource.file), defer: resource.module ? null : true, // if we are rendering script tag payloads that import an async payload // we need to ensure this resolves before executing the Nuxt entry tagPosition: "head", crossorigin: "" })) }, headEntryOptions); } const { headTags, bodyTags, bodyTagsOpen, htmlAttrs, bodyAttrs } = await renderSSRHead(head, renderSSRHeadOptions); const htmlContext = { island: isRenderingIsland, htmlAttrs: htmlAttrs ? [htmlAttrs] : [], head: normalizeChunks([headTags]), bodyAttrs: bodyAttrs ? [bodyAttrs] : [], bodyPrepend: normalizeChunks([bodyTagsOpen, ssrContext.teleports?.body]), body: [ _rendered.html, APP_TELEPORT_OPEN_TAG + (HAS_APP_TELEPORTS ? joinTags([ssrContext.teleports?.[`#${appTeleportAttrs.id}`]]) : "") + APP_TELEPORT_CLOSE_TAG ], bodyAppend: [bodyTags] }; await nitroApp.hooks.callHook("render:html", htmlContext, { event }); const response = { body: renderHTMLDocument(htmlContext), statusCode: getResponseStatus(event), statusMessage: getResponseStatusText(event), headers: { "content-type": "text/html;charset=utf-8", "x-powered-by": "Nuxt" } }; return response; }); function normalizeChunks(chunks) { return chunks.filter(Boolean).map((i) => i.trim()); } function joinTags(tags) { return tags.join(""); } function joinAttrs(chunks) { if (chunks.length === 0) { return ""; } return " " + chunks.join(" "); } function renderHTMLDocument(html) { return `${joinTags(html.head)}${joinTags(html.bodyPrepend)}${joinTags(html.body)}${joinTags(html.bodyAppend)}`; } async function renderInlineStyles(usedModules) { const styleMap = await getSSRStyles(); const inlinedStyles = /* @__PURE__ */ new Set(); for (const mod of usedModules) { if (mod in styleMap && styleMap[mod]) { for (const style of await styleMap[mod]()) { inlinedStyles.add(style); } } } return Array.from(inlinedStyles).map((style) => ({ innerHTML: style })); } const renderer$1 = /*#__PURE__*/Object.freeze({ __proto__: null, default: renderer }); export { headSymbol as h, renderer$1 as r, useHead as u }; //# sourceMappingURL=renderer.mjs.map