UNPKG

webapp-astro-pwa

Version:

A ready-to-use Astro component library for adding Progressive Web App (PWA) support to your Astro projects. This package provides drop-in components and utilities for manifest injection, service worker registration, install prompts, and more. Includes a w

74 lines (68 loc) 2.73 kB
import fs from "fs"; import type { Config } from "../types"; import { checkIsFileExistsInRoot, generateManifestFile, runShellCommand, getConfigJSON, checkIsPWAConfigChanged, updatePWAConfig, getPWAConfigPathFromGrandparent, } from "./utilities"; /** * @param config - The configuration object to apply. * @returns The updated or existing configuration object. * @description * Applies configuration changes to the PWA config file if necessary. * - Reads the current PWA config from the grandparent directory.{@link getPWAConfigPathFromGrandparent}, {@link getConfigJSON}. * - Compares it with the provided config.{@link checkIsPWAConfigChanged}. * - If changes are detected, runs a shell command {@link runShellCommand} to regenerate and bundle the service worker, * updates the config file, and returns the updated config. * - If no changes are detected, returns the existing config. * - If the config file does not exist, returns the provided config {@link updatePWAConfig}. */ function applyConfigurationsToFile(config: Config): Config { const PWAConfigFilePath = getPWAConfigPathFromGrandparent(); if (PWAConfigFilePath && fs.existsSync(PWAConfigFilePath)) { const pwaConfigJSON = getConfigJSON(PWAConfigFilePath); const isSWFileExists = checkIsFileExistsInRoot("public/sw.js"); if (!isSWFileExists) { runShellCommand("npm run generateAndBundleSW"); return pwaConfigJSON; } const isFileChanged: boolean = checkIsPWAConfigChanged(config, pwaConfigJSON); if (!isFileChanged) return pwaConfigJSON; const finalConfigJSON = updatePWAConfig(pwaConfigJSON, config); const pwaConfigFilePath = getPWAConfigPathFromGrandparent(); if (pwaConfigFilePath && fs.existsSync(pwaConfigFilePath)) { fs.writeFileSync(pwaConfigFilePath, JSON.stringify(finalConfigJSON, null, 2)); } runShellCommand("npm run generateAndBundleSW"); return finalConfigJSON; } return config; } /** * @param config - The configuration object for the integration. * @returns An Astro integration object with setup hooks. * @description * Astro integration builder for the powered web app. * - Applies configuration changes to the PWA config file. * - Optionally generates a manifest file if requested in the config. * - Injects the manifest file into the page if the configuration indicates it should be used. * {@link applyConfigurationsToFile} * */ export default function PoweredWebAppBuilder(config: Config) { return { name: "astro-hello", hooks: { "astro:config:setup": () => { applyConfigurationsToFile(config); if (config?.createManifest) { generateManifestFile(config); } }, }, }; }