UNPKG

@vite-pwa/create-pwa

Version:
38 lines (33 loc) 5.13 kB
import t from"node:fs";import e from"node:path";import x from"node:process";import{p as P,a as h,b,g as W,d as A}from"../shared/create-pwa.DNW-qV5p.mjs";import{e as u,a as R,i as S,P as k,R as F,V as O,W as p}from"../index.mjs";import"fs";import"node:url";import"child_process";import"path";import"readline";import"events";function N(r){const{cdProjectName:i,rootPath:o,pkgManager:n,templateDir:a,customServiceWorker:s,prompt:f,pwaAssets:g,name:m,description:y}=r;t.rmSync(e.resolve(o,"public","favicon.ico")),t.copyFileSync(e.resolve(a,"public","favicon.svg"),e.resolve(o,"public","favicon.svg")),u(e.resolve(o,"app","routes","_index.tsx"),d=>d.replace('"New Remix App"',`"${m}"`).replace('{ name: "description", content: "Welcome to Remix!" },',`{ name: "description", content: "${y||m}!" },`).replace("<h1>Welcome to Remix</h1>",`<h1>Welcome to ${m}</h1>`)),V(r),t.copyFileSync(e.resolve(a,"app","root.tsx"),e.resolve(o,"app","root.tsx")),t.copyFileSync(e.resolve(a,"pwa-assets.config.ts"),e.resolve(o,"pwa-assets.config.ts")),s&&(t.copyFileSync(e.resolve(a,"app","shared-sw.ts"),e.resolve(o,"app","shared-sw.ts")),f?t.copyFileSync(e.resolve(a,"app","prompt-sw.ts"),e.resolve(o,"app","sw.ts")):t.copyFileSync(e.resolve(a,"app","claims-sw.ts"),e.resolve(o,"app","sw.ts"))),C(o,r),u(e.resolve(o,"tsconfig.json"),d=>{const l=JSON.parse(d.split(` `).filter(w=>!w.trim().startsWith("//")).join(` `));return l.compilerOptions??={},l.compilerOptions.types??=[],l.compilerOptions.types.push("vite-plugin-pwa/info","vite-plugin-pwa/pwa-assets","vite-plugin-pwa/react","@vite-pwa/remix","@vite-pwa/remix/remix-sw"),JSON.stringify(l,null,2).replace('"noEmit": true',`// Vite takes care of building everything, not tsc. "noEmit": true`)});const c=JSON.parse(t.readFileSync(e.join(o,"package.json"),"utf-8"));c.devDependencies??={};const v=[["@vite-pwa/assets-generator",k],["@vite-pwa/remix",F],["vite-plugin-pwa",O],["workbox-window",p]];switch(s&&v.push(["workbox-core",p],["workbox-cacheable-response",p],["workbox-precaching",p],["workbox-routing",p],["workbox-strategies",p]),R("devDependencies",v,c,!0),S(r,n==="npm",c,!0),t.writeFileSync(e.join(o,"package.json"),JSON.stringify(c,null,2),"utf-8"),console.log(` PWA configuration done. Now run: `),o!==x.cwd()&&console.log(` cd ${i.includes(" ")?`"${i}"`:i}`),n){case"yarn":console.log(" yarn"),g||console.log(" yarn generate-pwa-icons"),console.log(" yarn dev");break;default:console.log(` ${n} install`),g||console.log(` ${n} run generate-pwa-icons`),console.log(` ${n} run dev`);break}console.log()}function V(r){const{templateDir:i,rootPath:o,reloadSW:n,offline:a}=r;t.mkdirSync(e.resolve(o,"app","components"),{recursive:!0}),t.copyFileSync(e.resolve(i,"app","components","PWAManifest.tsx"),e.resolve(o,"app","components","PWAManifest.tsx")),t.copyFileSync(e.resolve(i,"app","components","PWAAssets.tsx"),e.resolve(o,"app","components","PWAAssets.tsx")),t.copyFileSync(e.resolve(i,"app","components","PWABadge.css"),e.resolve(o,"app","components","PWABadge.css"));let s=t.readFileSync(e.join(i,"app","components","PWABadge.tsx"),"utf-8");return a||(s=s.replace("offlineReady: [offlineReady, setOfflineReady],","").replace("setOfflineReady(false)","").replace("(offlineReady || needRefresh)","needRefresh").replace("{ offlineReady",'<span id="toast-message">New content available, click on reload button to update.</span>').replace('? <span id="toast-message">App ready to work offline</span>',"").replace(': <span id="toast-message">New content available, click on reload button to update.</span>}',"")),n?s=s.replace("PERIODIC_SYNC_COMMENT","check for updates every hour").replace("const period = 0","const period = 60 * 60 * 1000"):s=s.replace("PERIODIC_SYNC_COMMENT",`periodic sync is disabled, change the value to enable it, the period is in milliseconds // You can remove onRegisteredSW callback and registerPeriodicSync function`),t.writeFileSync(e.resolve(o,"app","components","PWABadge.tsx"),s,"utf-8"),s}function C(r,i){const o=P(` import { vitePlugin as remix } from "@remix-run/dev"; import { defineConfig } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; import { RemixVitePWA } from "@vite-pwa/remix"; declare module "@remix-run/node" { interface Future { v3_singleFetch: true; } } const { RemixVitePWAPlugin, RemixPWAPreset } = RemixVitePWA(); export default defineConfig({ plugins: [ remix({ future: { v3_fetcherPersist: true, v3_relativeSplatPath: true, v3_throwAbortReason: true, v3_singleFetch: true, v3_lazyRouteDiscovery: true, }, presets: [RemixPWAPreset()], }), tsconfigPaths(), ], }); `),n=["**/*.{js,html,css,png,svg,ico}"];h(o,{from:"@vite-pwa/remix",constructor:"RemixVitePWAPlugin",options:b(!0,i,"app",{workbox:{globPatterns:n,cleanupOutdatedCaches:!0,clientsClaim:!0},injectManifest:{globPatterns:n},devOptions:{enabled:!1,suppressWarnings:!0,navigateFallback:"/",navigateFallbackAllowlist:[/^\/$/],type:"module"}})}),u(`${r}/vite.config.ts`,()=>W(o,A).code.replace("import RemixVitePWAPlugin, ","import "))}export{N as customize};