update-sri.js (1710B)
1 const fs = require("fs"); 2 const path = require("path"); 3 const sriToolbox = require("sri-toolbox"); 4 5 const version = process.argv[2]; 6 7 function read(file, encoding) { 8 return new Promise((resolve, reject) => 9 fs.readFile(file, encoding, (err, body) => 10 err ? reject(err) : resolve(body))); 11 } 12 13 function write(file, data) { 14 return new Promise((resolve, reject) => 15 fs.writeFile(file, data, (err) => 16 err ? reject(err) : resolve())); 17 } 18 19 Promise.all(process.argv.slice(3).map(file => 20 read(file, "utf8") 21 .then(body => { 22 // 1 - url prefix: "http…/KaTeX/ 23 // 2 - opening quote: " 24 // 3 - preserved suffix: /katex.min.js" integrity="…" 25 // 4 - file name: katex.min.js 26 // 5 - integrity opening quote: " 27 // 6 - old hash: sha384-… 28 // 7 - integrity hash algorithm: sha384 29 const re = /((["'])https?:\/\/cdnjs.cloudflare.com\/ajax\/libs\/KaTeX\/)[^\/"']+(\/([^"']+)\2(?:\s+integrity=(["'])(([^-]+)-[^"']+)\5)?)/g; 30 const hashes = {}; 31 body = body.replace(re, (m, pre, oq1, post, file, oq2, old, algo) => { 32 if (old) { 33 hashes[old] = { file, algo }; 34 } 35 return pre + version + post; 36 }); 37 return Promise.all(Object.keys(hashes).map(hash => 38 read(path.join("dist", hashes[hash].file), null) 39 .then(data => { 40 body = body.replace(hash, sriToolbox.generate({ 41 algorithms: [hashes[hash].algo], 42 }, data)); 43 }) 44 )).then(() => write(file, body)); 45 }) 46 )).then(() => process.exit(0), err => { 47 console.error(err.stack); 48 process.exit(1); 49 });