UNPKG

@vite-pwa/nuxt

Version:

Zero-config PWA for Nuxt 3

114 lines (111 loc) 4.08 kB
import { readFile } from 'node:fs/promises'; import { resolve, relative, basename } from 'node:path'; import process from 'node:process'; import { instructions } from '@vite-pwa/assets-generator/api/instructions'; import { loadConfig } from '@vite-pwa/assets-generator/config'; import { p as pwaIcons, g as generatePwaImageType } from '../shared/nuxt.da05c5d6.mjs'; import '@nuxt/kit'; import 'vite-plugin-pwa'; import 'node:crypto'; import 'node:fs'; import 'pathe'; async function preparePWAIconTypes(options, nuxt) { if (!options.pwaAssets || options.pwaAssets.disabled) return; const configuration = resolvePWAAssetsOptions(options); if (!configuration || configuration.disabled) return; const root = nuxt.options.vite.root ?? process.cwd(); const { config, sources } = await loadConfiguration(root, configuration); if (!config.preset) return; const { preset, images, headLinkOptions: userHeadLinkOptions } = config; if (!images) return; if (Array.isArray(images) && (!images.length || images.length > 1)) return; const useImage = Array.isArray(images) ? images[0] : images; const imageFile = resolve(root, useImage); const publicDir = resolve(root, nuxt.options.dir.public ?? "public"); const imageName = relative(publicDir, imageFile); const xhtml = userHeadLinkOptions?.xhtml === true; const includeId = userHeadLinkOptions?.includeId === true; const assetsInstructions = await instructions({ imageResolver: () => readFile(resolve(root, useImage)), imageName, preset, faviconPreset: userHeadLinkOptions?.preset, htmlLinks: { xhtml, includeId }, basePath: nuxt.options.app.baseURL ?? "/", resolveSvgName: userHeadLinkOptions?.resolveSvgName ?? ((name) => basename(name)) }); const transparentNames = Object.values(assetsInstructions.transparent).map(({ name }) => name); const maskableNames = Object.values(assetsInstructions.maskable).map(({ name }) => name); const faviconNames = Object.values(assetsInstructions.favicon).map(({ name }) => name); const appleNames = Object.values(assetsInstructions.apple).map(({ name }) => name); const appleSplashScreenNames = Object.values(assetsInstructions.appleSplashScreen).map(({ name }) => name); const dts = { dts: pwaIcons({ transparent: transparentNames, maskable: maskableNames, favicon: faviconNames, apple: appleNames, appleSplashScreen: appleSplashScreenNames }), transparent: generatePwaImageType("PwaTransparentImage", transparentNames), maskable: generatePwaImageType("PwaMaskableImage", maskableNames), favicon: generatePwaImageType("PwaFaviconImage", faviconNames), apple: generatePwaImageType("PwaAppleImage", appleNames), appleSplashScreen: generatePwaImageType("PwaAppleSplashScreenImage", appleSplashScreenNames) }; if (nuxt.options.dev && nuxt.options.ssr) { sources.forEach((source) => nuxt.options.watch.push(source.replace(/\\/g, "/"))); } return dts; } function resolvePWAAssetsOptions(options) { if (!options.pwaAssets) return; const { disabled: useDisabled, config, preset, image = "public/favicon.svg", htmlPreset = "2023", overrideManifestIcons = false, includeHtmlHeadLinks = true, injectThemeColor = true, integration } = options.pwaAssets ?? {}; const disabled = useDisabled || !config && !preset; return { disabled, config: disabled || !config ? false : config, preset: disabled || config ? false : preset ?? "minimal-2023", images: [image], htmlPreset, overrideManifestIcons, includeHtmlHeadLinks, injectThemeColor, integration }; } async function loadConfiguration(root, pwaAssets) { if (pwaAssets.config === false) { return await loadConfig(root, { config: false, preset: pwaAssets.preset, images: pwaAssets.images, logLevel: "silent" }); } return await loadConfig( root, typeof pwaAssets.config === "boolean" ? root : { config: pwaAssets.config } ); } export { preparePWAIconTypes };