#!/usr/bin/env node const puppeteer = require('puppeteer'); const fs = require('fs'); const args = process.argv.slice(2); const host = args[0] || 'http://127.0.0.1:8080'; const indexMatches = [ '.gz', '.map', '3rdpartylicenses.txt', 'ngsw-manifest.json', 'ngsw.json', 'worker-basic.min.js', 'ngsw-worker.js', 'favicon', 'index.html', 'manifest.webmanifest', '.svg' ]; let results = ''; async function main() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page._client.send('ServiceWorker.disable') page.on('console', msg => console.log(msg.text())); console.log('Page: loaded'); await page.goto(host); const allRequests = new Map(); page.on('request', req => { allRequests.set(req.url(), req); }); await page.reload({ waitUntil: 'networkidle2' }); Array.from(allRequests.values()).forEach(req => { const url = req.url(); // filter out urls that match these extensions for (const exlude of indexMatches) { if (url.indexOf(exlude) != -1) return false; } // if external, dont worry about it for now // const origin = new URL(host); if (url.indexOf(origin.origin) === -1) return false; // Format the url to remove the host const formatted = url.replace(`${origin.origin}/`, ''); if (origin.pathname.includes(formatted)) return false; // if it's an empty string, just ignore it if (!formatted) return false; let type = url.substr(-3) == 'css' ? 'style' : 'script'; results += `;rel=preload;as=${type},`; }); await browser.close(); updateWith(results); } function updateWith(result) { fs.readFile('firebase.json', 'utf8', function(err, data) { if (err) { return console.log(err); } let re = /("headers":\s*\[\s*{\s*"key":\s*"Link",\s*"value":\s*")(.*)("\s*}\s*\])/gm; if (re.exec(data)) { let newConfig = data.replace(re, `$1${result}$3`); fs.writeFile('firebase.json', newConfig, 'utf8', function(err) { if (err) return console.log(err); console.log('firebase.json updated successfully.'); }); } else { console.log("Couldn't find a valid firebase config to update."); return; } }); } main();