@vividlemon/vite-plugin-sri
Version:
A Vite plugin that adds subresource integrity hashes to your index.html file at build time.
2 lines (1 loc) • 1.22 kB
JavaScript
;const e=require("cheerio"),t=require("node:fs"),r=require("node:crypto"),s=require("node:path");module.exports=()=>{let i;const a={};return{name:"vite-plugin-sri",configResolved(e){i=e},enforce:"post",apply:"build",async writeBundle(n,o){Object.entries(o).forEach((([e,t])=>{a[e]=t}));Object.keys(a).filter((e=>e.endsWith(".html"))).map((e=>{const t=a[e];if("asset"===t.type)return{name:t.fileName,source:t.source}})).filter((e=>!!e)).forEach((async({name:o,source:c})=>{const l=e.load(c),u=l("script").filter("[src]"),d=l("link").filter("[href]"),f=async e=>{let o;const c=e.attribs.src?"src":"href",l=e.attribs[c],u=0===l.indexOf(i.base)?l.substring(i.base.length):l,d=Object.entries(a).find((([,e])=>e.fileName===u))?.[1];if(d)o="asset"===d.type?d.source:d.code;else{i.logger.warn(`cannot find ${u} in output bundle.`);try{o=t.readFileSync(s.resolve(n.dir,u))}catch(e){o=void 0}}o&&(e.attribs.integrity=`sha512-${r.createHash("sha512").update(o).digest().toString("base64")}`),void 0===e.attribs.crossorigin&&(e.attribs.crossorigin="anonymous")};await Promise.all([...u.map((async(e,t)=>await f(t))),...d.map((async(e,t)=>await f(t)))]),t.writeFileSync(s.resolve(i?.root,i?.build.outDir,o),l.html())}))}}};