import { existsSync, promises as fsp } from "node:fs"; import { defineNitroPreset } from "nitropack/kit"; import { resolve } from "pathe"; import { joinURL } from "ufo"; const serviceWorker = defineNitroPreset( () => { return { extends: "base-worker", entry: "./runtime/service-worker", output: { serverDir: "{{ output.dir }}/public/server" }, commands: { preview: "npx serve ./public" }, hooks: { "prerender:generate"(route, nitro) { const script = scriptTemplate(nitro.options.baseURL); route.contents = (route.contents || "").replace( "", `${script} ` ); }, async compiled(nitro) { await fsp.writeFile( resolve(nitro.options.output.publicDir, "sw.js"), `self.importScripts('${joinURL( nitro.options.baseURL, "server/index.mjs" )}');`, "utf8" ); const html = htmlTemplate(nitro.options.baseURL); if (!existsSync(resolve(nitro.options.output.publicDir, "index.html"))) { await fsp.writeFile( resolve(nitro.options.output.publicDir, "index.html"), html, "utf8" ); } if (!existsSync(resolve(nitro.options.output.publicDir, "200.html"))) { await fsp.writeFile( resolve(nitro.options.output.publicDir, "200.html"), html, "utf8" ); } if (!existsSync(resolve(nitro.options.output.publicDir, "404.html"))) { await fsp.writeFile( resolve(nitro.options.output.publicDir, "404.html"), html, "utf8" ); } } } }; }, { name: "service-worker", url: import.meta.url } ); export default [serviceWorker]; function htmlTemplate(baseURL = "/") { return ( /* html */ `
${scriptTemplate(baseURL)} Initializing nitro service worker... ` ); } function scriptTemplate(baseURL = "/") { return ( /* js */ `