|
1 | 1 | #!/usr/bin/env node |
2 | 2 |
|
3 | 3 | const fs = require('fs'); |
| 4 | +const path = require('path'); |
| 5 | + |
| 6 | +const crypto = require('crypto'); |
4 | 7 |
|
5 | 8 | const configProd = require('../config.prod'); |
6 | 9 | const configDev = require('../config.dev'); |
7 | 10 |
|
8 | 11 | const dev = process.argv && process.argv.indexOf('--dev') > -1; |
9 | 12 |
|
10 | | -// https://stackoverflow.com/a/14181136/5404186 |
11 | | -function updateIndexHml(filename) { |
12 | | - fs.readFile(`./www/${filename}`, 'utf8', function (err, data) { |
| 13 | +function updateCSP(filename) { |
| 14 | + fs.readFile(`${filename}`, 'utf8', function (err, data) { |
13 | 15 | if (err) { |
14 | 16 | return console.log(err); |
15 | 17 | } |
16 | 18 |
|
17 | | - const result = data.replace(/<@API_URL@>/g, dev ? configDev.API_URL : configProd.API_URL); |
| 19 | + // 1. Replace API Url |
| 20 | + let result = data.replace(/<@API_URL@>/g, dev ? configDev.API_URL : configProd.API_URL); |
| 21 | + |
| 22 | + // 2. Update service worker loader hash |
| 23 | + const swHash = findSWHash(data); |
| 24 | + if (swHash) { |
| 25 | + result = result.replace(/<@SW_LOADER@>/g, swHash); |
| 26 | + } |
| 27 | + |
| 28 | + // 3. Update CSS link until https://github.com/ionic-team/stencil/issues/2039 solved |
| 29 | + result = result.replace(/rel=stylesheet media="\(max-width: 0px\)" importance=low onload="this\.media=''"/g, 'rel=stylesheet importance=low'); |
18 | 30 |
|
19 | | - fs.writeFile(`./www/${filename}`, result, 'utf8', function (err) { |
| 31 | + fs.writeFile(`${filename}`, result, 'utf8', function (err) { |
20 | 32 | if (err) return console.log(err); |
21 | 33 | }); |
22 | 34 | }); |
23 | 35 | } |
24 | 36 |
|
25 | | -updateIndexHml('index.html'); |
| 37 | +function findSWHash(data) { |
| 38 | + const sw = /(<.?script data-build.*?>)([\s\S]*?)(<\/script>)/gm; |
| 39 | + |
| 40 | + let m; |
| 41 | + while (m = sw.exec(data)) { |
| 42 | + if (m && m.length >= 3 && m[2].indexOf('serviceWorker') > -1) { |
| 43 | + return `'sha256-${crypto.createHash('sha256').update(m[2]).digest('base64')}'`; |
| 44 | + } |
| 45 | + } |
| 46 | + |
| 47 | + return undefined; |
| 48 | +} |
| 49 | + |
| 50 | +function findHTMLFiles(dir, files) { |
| 51 | + fs.readdirSync(dir).forEach(file => { |
| 52 | + const fullPath = path.join(dir, file); |
| 53 | + if (fs.lstatSync(fullPath).isDirectory()) { |
| 54 | + findHTMLFiles(fullPath, files); |
| 55 | + } else if (path.extname(fullPath) === '.html') { |
| 56 | + files.push(fullPath); |
| 57 | + } |
| 58 | + }); |
| 59 | +} |
| 60 | + |
| 61 | +let htmlFiles = []; |
| 62 | +findHTMLFiles('./www/', htmlFiles); |
26 | 63 |
|
27 | | -if (!dev) { |
28 | | - updateIndexHml('index-org.html'); |
| 64 | +for (const file of htmlFiles) { |
| 65 | + updateCSP(`./${file}`); |
29 | 66 | } |
0 commit comments