deploy/copy_server_files.js (90 lines of code) (raw):

const fs = require('fs'); const path = require('path'); let argIndex = 2; const INDEX_FILE = process.argv[argIndex++]; if(!INDEX_FILE) { throw new Error('Index file path not set'); } const DEST_INDEX_FILE = process.argv[argIndex++]; if(!DEST_INDEX_FILE) { throw new Error('Destination index file path not set'); } const SERVICE_WORKER_FILE = process.argv[argIndex++]; if(!SERVICE_WORKER_FILE) { throw new Error('Service worker file path not set'); } const CUSTOM_SERVICE_WORKER_FILE = process.argv[argIndex++]; if(!CUSTOM_SERVICE_WORKER_FILE) { throw new Error('Service worker file path not set'); } const SERVICE_WORKER_DATA_FILE = process.argv[argIndex++]; if(!SERVICE_WORKER_DATA_FILE) { throw new Error('Service worker data file path not set'); } const WEBMANIFEST_FILE = process.argv[argIndex++]; if(!WEBMANIFEST_FILE) { throw new Error('Webmanifest file path not set'); } const FAVICON_FILE = process.argv[argIndex++]; if(!FAVICON_FILE) { throw new Error('Favicon file path not set'); } const ICON_FILE = process.argv[argIndex++]; if(!ICON_FILE) { throw new Error('Icon file path not set'); } const CDN_BASE_URL = process.argv[argIndex++]; if(!CDN_BASE_URL) { throw new Error('CDN base URL not set'); } const ASSETS_DEST_DIR = process.argv[argIndex++]; if(!ASSETS_DEST_DIR) { throw new Error('Assets destination path not set'); } // create index destination directory const indexDestDir = path.dirname(path.join(process.cwd(), DEST_INDEX_FILE)); try { fs.mkdirSync(indexDestDir, {recursive: true}); } catch(err) { console.warn("Error creating service worker dir", err); } // create assets destination directory const assetsDestDir = path.join(process.cwd(), ASSETS_DEST_DIR); try { fs.mkdirSync(assetsDestDir, {recursive: true}); } catch(err) { console.warn("Error creating assets dir", err); } fs.copyFileSync(path.join(process.cwd(), INDEX_FILE), path.join(process.cwd(), DEST_INDEX_FILE)); fs.copyFileSync(path.join(process.cwd(), SERVICE_WORKER_FILE), path.join(assetsDestDir, path.basename(SERVICE_WORKER_FILE))); fs.copyFileSync(path.join(process.cwd(), CUSTOM_SERVICE_WORKER_FILE), path.join(assetsDestDir, path.basename(CUSTOM_SERVICE_WORKER_FILE))); fs.copyFileSync(path.join(process.cwd(), FAVICON_FILE), path.join(assetsDestDir, path.basename(FAVICON_FILE))); fs.copyFileSync(path.join(process.cwd(), ICON_FILE), path.join(assetsDestDir, path.basename(ICON_FILE))); let serviceWorkerData = JSON.parse(fs.readFileSync(path.join(process.cwd(), SERVICE_WORKER_DATA_FILE), 'utf-8')); for(const group of serviceWorkerData.assetGroups) { for(let k = 0; k < group.urls.length; k++) { let url = group.urls[k]; if(url !== '/index.html' && url !== '/favicon.ico') { group.urls[k] = getAssetURL(url); } } } const newHashTable = {}; for(const url of Object.keys(serviceWorkerData.hashTable)) { if(url !== '/index.html' && url !== '/favicon.ico') { newHashTable[getAssetURL(url)] = serviceWorkerData.hashTable[url]; } else { newHashTable[url] = serviceWorkerData.hashTable[url]; } } serviceWorkerData.hashTable = newHashTable; fs.writeFileSync(path.join(assetsDestDir, path.basename(SERVICE_WORKER_DATA_FILE)), JSON.stringify(serviceWorkerData)); let manifest = JSON.parse(fs.readFileSync(path.join(process.cwd(), WEBMANIFEST_FILE), 'utf-8')); for(const icon of manifest.icons) { icon.src = getAssetURL(icon.src); } fs.writeFileSync(path.join(assetsDestDir, path.basename(WEBMANIFEST_FILE)), JSON.stringify(manifest)); function getAssetURL(url) { // remove starting slash - need URL to be relative to cdn base URL if(url && url[0] === '/') { url = url.slice(1); } return (new URL(url, CDN_BASE_URL)).toString(); }