{"version":3,"file":"index.mjs","names":["packageJson.version","fs"],"sources":["../package.json","../src/lib/log.ts","../src/lib/modules.ts","../src/lib/api.ts","../src/lib/context.ts","../src/lib/utils.ts","../src/lib/validator.ts","../src/plugins/build.ts","../src/plugins/dev.ts","../src/lib/constants.ts","../src/lib/options.ts","../src/plugins/main.ts","../src/index.ts"],"sourcesContent":["","import type { BuildResult } from \"@serwist/build\";\nimport { cyan, dim, green, yellow } from \"kolorist\";\nimport type { ResolvedConfig } from \"vite\";\n\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nexport const logSerwistResult = (buildResult: Pick<BuildResult, \"count\" | \"size\" | \"warnings\">, viteOptions: ResolvedConfig) => {\n  const { logLevel = \"info\" } = viteOptions;\n\n  if (logLevel === \"silent\") return;\n\n  const { count, size, warnings } = buildResult;\n\n  if (logLevel === \"info\") {\n    console.info(\n      [\n        \"\",\n        `${cyan(`@serwist/vite v${packageJson.version}`)} ${green(\"files generated.\")}`,\n        `${green(\"✓\")} ${count} precache entries ${dim(`(${(size / 1024).toFixed(2)} KiB)`)}`,\n        // log build warning\n        warnings && warnings.length > 0 ? yellow([\"⚠ warnings\", ...warnings.map((w) => `  ${w}`), \"\"].join(\"\\n\")) : \"\",\n      ].join(\"\\n\"),\n    );\n  }\n};\n","import assert from \"node:assert\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type * as SerwistBuild from \"@serwist/build\";\n\nimport type { SerwistViteContext } from \"./context.js\";\n\nexport const loadSerwistBuild = async (): Promise<typeof SerwistBuild> => {\n  // \"@serwist/build\" is large and makes config loading slow.\n  // Since it is not always used, we only load this when it is needed.\n  try {\n    return await import(\"@serwist/build\");\n  } catch (_) {\n    // We don't have a default export, don't worry.\n    return require(\"@serwist/build\");\n  }\n};\n\ninterface BuildResult extends SerwistBuild.GetManifestResult {\n  manifestString: string;\n}\n\nexport const injectManifest = async (options: SerwistBuild.GetManifestOptionsComplete): Promise<BuildResult> => {\n  const { getFileManifestEntries } = await loadSerwistBuild();\n  const { count, size, manifestEntries, warnings } = await getFileManifestEntries(options);\n  const manifestString = manifestEntries === undefined ? \"undefined\" : JSON.stringify(manifestEntries);\n  return {\n    warnings,\n    size,\n    count,\n    manifestEntries,\n    manifestString,\n  };\n};\n\nexport const generateServiceWorker = async (ctx: SerwistViteContext) => {\n  const { plugins, rollupOptions, rollupFormat } = ctx.options;\n\n  const parsedSwDest = path.parse(ctx.options.injectManifest.swDest);\n\n  let injectManifestResult: BuildResult | undefined;\n\n  if (ctx.options.injectManifest.injectionPoint) {\n    await ctx.options.integration?.beforeBuildServiceWorker?.(ctx.options);\n    injectManifestResult = await injectManifest(ctx.options.injectManifest);\n  }\n\n  const isProduction = ctx.options.mode === \"production\";\n  const isDev = ctx.options.mode === \"development\";\n\n  if (isDev && !ctx.options.devOptions.bundle) {\n    if (!injectManifestResult) {\n      throw new Error(\"injectManifest failed to generate results. This is likely a bug.\");\n    }\n\n    const { errors, escapeRegExp, getSourceMapURL, rebasePath, replaceAndUpdateSourceMap, translateURLToSourcemapPaths } = await loadSerwistBuild();\n\n    // Make sure we leave swSrc and swDest out of the precache manifest.\n    for (const file of [ctx.options.injectManifest.swSrc, ctx.options.injectManifest.swDest]) {\n      ctx.options.injectManifest.globIgnores!.push(\n        rebasePath({\n          file,\n          baseDirectory: ctx.options.injectManifest.globDirectory,\n        }),\n      );\n    }\n\n    const injectionPoint = ctx.options.injectManifest.injectionPoint!;\n\n    const globalRegexp = new RegExp(escapeRegExp(injectionPoint), \"g\");\n\n    let swFileContents: string;\n    try {\n      swFileContents = await fs.readFile(ctx.options.injectManifest.swSrc, \"utf8\");\n    } catch (error) {\n      throw new Error(`${errors[\"invalid-sw-src\"]} ${error instanceof Error && error.message ? error.message : \"\"}`);\n    }\n\n    const injectionResults = swFileContents.match(globalRegexp);\n    // See https://github.com/GoogleChrome/workbox/issues/2230\n    if (!injectionResults) {\n      throw new Error(`${errors[\"injection-point-not-found\"]} ${injectionPoint}`);\n    }\n\n    assert(injectionResults.length === 1, `${errors[\"multiple-injection-points\"]} ${injectionPoint}`);\n\n    const filesToWrite: Record<string, string> = {};\n\n    const url = getSourceMapURL(swFileContents);\n    // See https://github.com/GoogleChrome/workbox/issues/2957\n    const { destPath, srcPath, warning } = translateURLToSourcemapPaths(url, ctx.options.injectManifest.swSrc, ctx.options.injectManifest.swDest);\n    if (warning) {\n      injectManifestResult.warnings.push(warning);\n    }\n\n    // If our swSrc file contains a sourcemap, we would invalidate that\n    // mapping if we just replaced injectionPoint with the stringified manifest.\n    // Instead, we need to update the swDest contents as well as the sourcemap\n    // (assuming it's a real file, not a data: URL) at the same time.\n    // See https://github.com/GoogleChrome/workbox/issues/2235\n    // and https://github.com/GoogleChrome/workbox/issues/2648\n    if (srcPath && destPath) {\n      const { map, source } = await replaceAndUpdateSourceMap({\n        originalMap: JSON.parse(await fs.readFile(srcPath, \"utf8\")),\n        jsFilename: path.basename(ctx.options.injectManifest.swDest),\n        originalSource: swFileContents,\n        replaceString: injectManifestResult.manifestString,\n        searchString: injectionPoint,\n      });\n\n      filesToWrite[ctx.options.injectManifest.swDest] = source;\n      filesToWrite[destPath] = map;\n    } else {\n      // If there's no sourcemap associated with swSrc, a simple string\n      // replacement will suffice.\n      filesToWrite[ctx.options.injectManifest.swDest] = swFileContents.replace(globalRegexp, injectManifestResult.manifestString);\n    }\n\n    for (const [file, contents] of Object.entries(filesToWrite)) {\n      try {\n        await fs.mkdir(path.dirname(file), { recursive: true });\n      } catch (error: unknown) {\n        throw new Error(`${errors[\"unable-to-make-sw-directory\"]} '${error instanceof Error && error.message ? error.message : \"\"}'`);\n      }\n\n      await fs.writeFile(file, contents);\n    }\n  } else {\n    const define: Record<string, any> = {\n      // Nuxt does some really weird stuff. During the build, they MANUALLY\n      // set browser APIs, such as window, document, location,..., to `undefined`??\n      // Probably some Vue or server stuff. Their `define` doesn't seem to have anything\n      // particularly useful for the service worker anyway, so we don't extend it.\n      ...(ctx.framework === \"nuxt\" ? undefined : ctx.viteConfig.define),\n      \"process.env.NODE_ENV\": `\"${ctx.options.mode}\"`,\n    };\n    if (ctx.options.injectManifest.injectionPoint && injectManifestResult) {\n      define[ctx.options.injectManifest.injectionPoint] = injectManifestResult.manifestString;\n    }\n    const { build } = await import(\"vite\");\n    await build({\n      logLevel: ctx.viteConfig.isProduction ? \"info\" : \"warn\",\n      root: ctx.viteConfig.root,\n      base: ctx.viteConfig.base,\n      resolve: ctx.viteConfig.resolve,\n      // Don't copy anything from public folder\n      publicDir: false,\n      build: {\n        sourcemap: ctx.viteConfig.build.sourcemap,\n        lib: {\n          entry: ctx.options.injectManifest.swSrc,\n          name: \"app\",\n          formats: [rollupFormat],\n        },\n        // @ts-expect-error Currently on Vite 8 (migrated to Rolldown)'s types\n        rollupOptions: {\n          ...rollupOptions,\n          plugins,\n          output: {\n            entryFileNames: parsedSwDest.base,\n          },\n        },\n        outDir: parsedSwDest.dir,\n        emptyOutDir: false,\n        minify: isProduction || ctx.options.devOptions.minify,\n      },\n      configFile: false,\n      define,\n    });\n  }\n\n  return injectManifestResult;\n};\n","import { yellow } from \"kolorist\";\n\nimport type { SerwistViteContext } from \"./context.js\";\nimport { logSerwistResult } from \"./log.js\";\nimport { generateServiceWorker } from \"./modules.js\";\nimport type { ExtendManifestEntriesHook, SerwistViteApi } from \"./types.js\";\n\nexport const createApi = (ctx: SerwistViteContext): SerwistViteApi => {\n  return {\n    get disabled() {\n      return ctx?.options?.disable;\n    },\n    async generateSW() {\n      if (ctx.options.disable) {\n        return undefined;\n      }\n      const buildResult = await generateServiceWorker(ctx);\n      if (buildResult) {\n        if (ctx.viteConfig.isProduction) {\n          // Log Serwist result\n          logSerwistResult(buildResult, ctx.viteConfig);\n        } else if (buildResult.warnings && buildResult.warnings.length > 0) {\n          console.warn(yellow([\"[@serwist/vite] Warnings\", ...buildResult.warnings.map((w) => ` - ${w}`), \"\"].join(\"\\n\")));\n        }\n      }\n    },\n    extendManifestEntries(fn: ExtendManifestEntriesHook) {\n      const { options } = ctx;\n      if (options.disable) return;\n\n      const result = fn(options.injectManifest.additionalPrecacheEntries || []);\n\n      if (result != null) {\n        options.injectManifest.additionalPrecacheEntries = result;\n      }\n    },\n  };\n};\n","import type { ResolvedConfig } from \"vite\";\n\nimport type { PluginOptions, PluginOptionsComplete } from \"./types.js\";\n\nexport type SerwistViteFrameworks = \"nuxt\";\n\nexport interface SerwistViteContext {\n  /**\n   * Resolved Vite config.\n   *\n   * Note: This value is set by our main plugin, located at plugins/main.ts.\n   */\n  viteConfig: ResolvedConfig;\n  /**\n   * Provided options.\n   */\n  userOptions: PluginOptions;\n  /**\n   * Resolved options.\n   *\n   * Note: this is different from `userOptions` in that it has been parsed, whereas\n   * `userOptions` is the raw configuration that the user provides us.\n   */\n  options: PluginOptionsComplete;\n  useImportRegister: boolean;\n  /**\n   * Is the plugin running on dev?\n   *\n   * Note: This value is set by our dev plugin, located at plugins/dev.ts.\n   */\n  devEnvironment: boolean;\n  /** To tailor our APIs to these frameworks. */\n  framework: SerwistViteFrameworks | undefined;\n}\n\nexport const createContext = (userOptions: PluginOptions, framework: SerwistViteFrameworks | undefined): SerwistViteContext => {\n  return {\n    userOptions,\n    options: undefined!,\n    viteConfig: undefined!,\n    useImportRegister: false,\n    devEnvironment: false,\n    framework,\n  };\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport const slash = (str: string) => {\n  return str.replace(/\\\\/g, \"/\");\n};\n\nexport const resolveBasePath = (base: string) => {\n  if (isAbsolute(base)) return base;\n  return !base.startsWith(\"/\") && !base.startsWith(\"./\") ? `/${base}` : base;\n};\n\nexport const isAbsolute = (url: string) => {\n  return url.match(/^(?:[a-z]+:)?\\/\\//i);\n};\n\nexport const normalizePath = (path: string) => {\n  return path.replace(/\\\\/g, \"/\");\n};\n\n// Source: https://github.com/sveltejs/kit/blob/6419d3eaa7bf1b0a756b28f06a73f71fe042de0a/packages/kit/src/utils/filesystem.js\n// License: MIT\n/**\n * Internal function used by `@serwist/vite`.\n * Resolves a file path without extension. Also handles `/index` if the path\n * actually points to a directory.\n * @internal\n * @param ctx\n * @param api\n * @returns\n */\nexport const resolveEntry = (entry: string): string | null => {\n  if (fs.existsSync(entry)) {\n    const stats = fs.statSync(entry);\n    if (stats.isDirectory()) {\n      return resolveEntry(path.join(entry, \"index\"));\n    }\n\n    return entry;\n  }\n  const dir = path.dirname(entry);\n\n  if (fs.existsSync(dir)) {\n    const base = path.basename(entry);\n    const files = fs.readdirSync(dir);\n\n    const found = files.find((file) => file.replace(/\\.[^.]+$/, \"\") === base);\n\n    if (found) return path.join(dir, found);\n  }\n\n  return null;\n};\n\n// Source: https://github.com/sveltejs/kit/blob/6419d3eaa7bf1b0a756b28f06a73f71fe042de0a/packages/kit/src/utils/filesystem.js\n// License: MIT\n/**\n * Internal function used by `@serwist/vite`.\n * Converts a filesystem path to a Vite `@fs` URL.\n * @internal\n * @param ctx\n * @param api\n * @returns\n */\nexport const toFs = (str: string) => {\n  str = str.replace(/\\\\/g, \"/\");\n  // Windows/Linux separation - Windows starts with a drive letter, we need a / in front there\n  return `/@fs${str.startsWith(\"/\") ? \"\" : \"/\"}${str}`;\n};\n","import { SerwistConfigError, validationErrorMap } from \"@serwist/build/schema\";\nimport { z } from \"zod\";\nimport type { InjectManifestOptionsComplete } from \"./types.js\";\n\nexport const validateInjectManifestOptions = async (input: unknown): Promise<InjectManifestOptionsComplete> => {\n  const result = await (await import(\"./schema.js\")).injectManifestOptions.spa(input, { error: validationErrorMap });\n  if (!result.success) {\n    throw new SerwistConfigError({ moduleName: \"@serwist/vite\", message: z.prettifyError(result.error) });\n  }\n  return result.data;\n};\n","import type { Plugin } from \"vite\";\n\nimport type { SerwistViteContext } from \"../lib/context.js\";\nimport type { SerwistViteApi } from \"../lib/types.js\";\n\n/**\n * Internal build plugin used by `@serwist/vite`.\n * @internal\n * @param ctx\n * @param api\n * @returns\n */\nexport const buildPlugin = (ctx: SerwistViteContext, api: SerwistViteApi) => {\n  return <Plugin>{\n    name: \"@serwist/vite:build\",\n    enforce: \"post\",\n    apply: \"build\",\n    closeBundle: {\n      sequential: true,\n      order: ctx.userOptions?.integration?.closeBundleOrder,\n      async handler() {\n        if (!ctx.viteConfig.build.ssr && !ctx.options.disable) {\n          await api.generateSW();\n        }\n      },\n    },\n    buildEnd(error) {\n      if (error) throw error;\n    },\n  };\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { normalizePath, type Plugin } from \"vite\";\n\nimport type { SerwistViteContext } from \"../lib/context.js\";\nimport type { SerwistViteApi } from \"../lib/types.js\";\nimport { toFs } from \"../lib/utils.js\";\n\n// This plugin handles the service worker in two ways:\n// - If `devOptions.bundle` is enabled, hook a middleware that bundles the service worker\n// through `api.generateSW()` and returns the result into Vite's dev server.\n// - Otherwise, run `injectManifest` and return the service worker through `async load(id)`. Although\n// `precacheEntries` is always `undefined`, we still do this to check the user's `injectManifest` options\n// in dev mode.\n/**\n * Internal dev plugin used by `@serwist/vite`.\n * @internal\n * @param ctx\n * @param api\n * @returns\n */\nexport const devPlugin = (ctx: SerwistViteContext, api: SerwistViteApi): Plugin => {\n  return {\n    name: \"@serwist/vite:dev\",\n    apply: \"serve\",\n    configureServer(server) {\n      ctx.devEnvironment = true;\n      server.middlewares.use(async (req, res, next) => {\n        if (!ctx.options.disable && req.url === ctx.options.swUrl) {\n          if (ctx.options.devOptions.bundle) {\n            await api.generateSW();\n            const content = await fs.readFile(ctx.options.injectManifest.swDest, \"utf-8\");\n            await fs.rm(ctx.options.injectManifest.swDest);\n            res.setHeader(\"Content-Type\", \"application/javascript\");\n            res.write(content);\n            res.end();\n          } else {\n            res.setHeader(\"Content-Type\", \"application/javascript\");\n            res.write(`import \"${toFs(path.resolve(ctx.options.injectManifest.swSrc))}\";`);\n            res.end();\n          }\n        } else {\n          next();\n        }\n      });\n    },\n    async load(id) {\n      if (!ctx.options.disable && !ctx.options.devOptions.bundle) {\n        const swSrcId = normalizePath(ctx.options.injectManifest.swSrc);\n        if (id === swSrcId) {\n          await api.generateSW();\n          const content = await fs.readFile(ctx.options.injectManifest.swDest, \"utf-8\");\n          await fs.rm(ctx.options.injectManifest.swDest);\n          return content;\n        }\n      }\n      return undefined;\n    },\n  };\n};\n","export const SERWIST_VIRTUAL = \"virtual:serwist\";\nexport const RESOLVED_SERWIST_VIRTUAL = `\\0${SERWIST_VIRTUAL}`;\n","import path from \"node:path\";\nimport process from \"node:process\";\n\nimport type { ResolvedConfig } from \"vite\";\n\nimport type { PluginOptions, PluginOptionsComplete } from \"./types.js\";\nimport { resolveBasePath, slash } from \"./utils.js\";\nimport { validateInjectManifestOptions } from \"./validator.js\";\n\nconst prepareConfigForValidation = (\n  viteConfig: ResolvedConfig,\n  {\n    mode = process.env.NODE_ENV === \"production\" || process.env.NODE_ENV === \"development\" ? process.env.NODE_ENV : \"production\",\n    base = viteConfig.base,\n    scope: _scope,\n    devOptions,\n    ...injectManifest\n  }: PluginOptions,\n) => {\n  const basePath = resolveBasePath(base);\n  return {\n    mode,\n    base: basePath,\n    scope: _scope || basePath,\n    devOptions,\n    ...injectManifest,\n  };\n};\n\nexport const resolveOptions = async (options: PluginOptions, viteConfig: ResolvedConfig): Promise<PluginOptionsComplete> => {\n  const {\n    mode,\n    type,\n    scope,\n    base,\n    disable,\n    integration,\n    swUrl,\n    swSrc,\n    swDest,\n    plugins,\n    rollupFormat,\n    rollupOptions,\n    devOptions,\n    ...userInjectManifest\n  } = await validateInjectManifestOptions(prepareConfigForValidation(viteConfig, options));\n\n  let assetsDir = slash(viteConfig.build.assetsDir ?? \"assets\");\n  if (assetsDir[assetsDir.length - 1] !== \"/\") assetsDir += \"/\";\n\n  // remove './' prefix from assetsDir\n  const dontCacheBustURLsMatching = new RegExp(`^${assetsDir.replace(/^\\.*?\\//, \"\")}`);\n\n  const resolvedPluginOptions = {\n    mode,\n    type,\n    scope,\n    base,\n    disable,\n    integration,\n    swUrl,\n    plugins,\n    rollupFormat,\n    rollupOptions,\n    devOptions,\n    injectManifest: {\n      dontCacheBustURLsMatching,\n      ...userInjectManifest,\n      swSrc: path.resolve(viteConfig.root, swSrc),\n      swDest: path.resolve(viteConfig.root, viteConfig.build.outDir, swDest),\n      disablePrecacheManifest: !viteConfig.isProduction,\n    },\n  } satisfies PluginOptionsComplete;\n\n  return resolvedPluginOptions;\n};\n","import path from \"node:path\";\n\nimport type { Plugin, UserConfig } from \"vite\";\n\nimport { RESOLVED_SERWIST_VIRTUAL, SERWIST_VIRTUAL } from \"../lib/constants.js\";\nimport type { SerwistViteContext } from \"../lib/context.js\";\nimport { resolveOptions } from \"../lib/options.js\";\nimport type { SerwistViteApi } from \"../lib/types.js\";\n\n/**\n * Internal plugin used by `@serwist/vite`.\n * @internal\n * @param ctx\n * @param api\n * @returns\n */\nexport const mainPlugin = (ctx: SerwistViteContext, api: SerwistViteApi) => {\n  return <Plugin>{\n    name: \"@serwist/vite\",\n    enforce: \"pre\",\n    config() {\n      return <UserConfig>{\n        ssr: {\n          noExternal: [],\n        },\n      };\n    },\n    async configResolved(config) {\n      ctx.viteConfig = config;\n      ctx.userOptions?.integration?.configureOptions?.(config, ctx.userOptions);\n      ctx.options = await resolveOptions(ctx.userOptions, config);\n    },\n    resolveId(id) {\n      if (id === SERWIST_VIRTUAL) {\n        return RESOLVED_SERWIST_VIRTUAL;\n      }\n      return undefined;\n    },\n    load(id) {\n      if (id === RESOLVED_SERWIST_VIRTUAL) {\n        return `export const swUrl = \"${path.posix.join(ctx.options.base, ctx.options.swUrl)}\";\nexport const swScope = \"${ctx.options.scope}\";\nexport const swType = \"${ctx.devEnvironment ? \"module\" : ctx.options.type}\";\nexport const getSerwist = async () => {\n  if (\"serviceWorker\" in navigator) {\n    return new (await import(\"@serwist/window\")).Serwist(swUrl, { scope: swScope, type: swType });\n  }\n  return undefined;\n}`;\n      }\n      return undefined;\n    },\n    api,\n  };\n};\n","import type { Plugin } from \"vite\";\n\nimport { createApi } from \"./lib/api.js\";\nimport { createContext } from \"./lib/context.js\";\nimport type { DevOptions, ExtendManifestEntriesHook, Hooks, PluginOptions, PluginOptionsComplete, SerwistViteApi } from \"./lib/types.js\";\nimport { resolveEntry, toFs } from \"./lib/utils.js\";\nimport { validateInjectManifestOptions } from \"./lib/validator.js\";\nimport { buildPlugin } from \"./plugins/build.js\";\nimport { devPlugin } from \"./plugins/dev.js\";\nimport { mainPlugin } from \"./plugins/main.js\";\n\n/**\n * Integrates Serwist into your Vite app.\n * @param userOptions\n * @returns\n */\nexport const serwist = (userOptions: PluginOptions): Plugin[] => {\n  const ctx = createContext(userOptions, undefined);\n  const api = createApi(ctx);\n  return [mainPlugin(ctx, api), buildPlugin(ctx, api), devPlugin(ctx, api)];\n};\n\n// This allows for customization.\nexport { buildPlugin as build, createApi, createContext, devPlugin as dev, mainPlugin as main, resolveEntry, toFs, validateInjectManifestOptions };\nexport type { SerwistViteContext } from \"./lib/context.js\";\nexport type { PluginOptions, PluginOptionsComplete, Hooks, ExtendManifestEntriesHook, DevOptions, SerwistViteApi };\n"],"mappings":"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"}