ap-ssg
Version:
A fast, modular, SEO-optimized static site generator that minifies CSS, JS, and HTML for improved performance. It also supports JSON-LD, sitemap generation, and more, making it ideal for production-ready websites.
80 lines (71 loc) • 2.99 kB
JavaScript
const fs = require("fs-extra");
const path = require("path");
const AssetExtractor = require("ap-assets-extractor");
const { getBuildServiceWorkerFilePath } = require("../configs/paths");
const userConfig = require("../configs/userConfig");
exports.generateServiceWorkerFile = async function (config) {
const filePath = getBuildServiceWorkerFilePath();
try {
// Extract assets from HTML files using AssetExtractor
let filesToCache = await new AssetExtractor(userConfig.outDir).runExtractor(
config.htmlFiles
);
// Exclude external URLs (starting with http:// or https://)
filesToCache = filesToCache.filter((file) => !file.startsWith("http"));
// Generate service worker content dynamically
const serviceWorkerContent = `
const CACHE_NAME = \`pwa-cache-v${new Date().toString()}\`;
const ASSETS_TO_CACHE = ${JSON.stringify(filesToCache, null, 2)};
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
console.log('Service Worker: Caching Assets');
return cache.addAll(ASSETS_TO_CACHE);
})
);
});
self.addEventListener('activate', (event) => {
const cacheWhitelist = [CACHE_NAME];
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (!cacheWhitelist.includes(cacheName)) {
console.log('Service Worker: Deleting old cache', cacheName);
return caches.delete(cacheName);
}
})
);
})
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((cachedResponse) => {
if (cachedResponse) {
console.log('Service Worker: Returning cached response for', event.request.url);
return cachedResponse;
}
return fetch(event.request).then((response) => {
if (!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
const responseToCache = response.clone();
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, responseToCache);
console.log('Service Worker: Caching new resource', event.request.url);
});
return response;
});
})
);
});
`;
// Write the generated service worker file to the build folder
await fs.writeFile(filePath, serviceWorkerContent.trim());
const message = "Service Worker file successfully generated at:" + filePath;
return message;
} catch (error) {
console.error("Error generating Service Worker file:", error);
}
};