@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.24 kB
JavaScript
import{load as t}from"cheerio";import{writeFileSync as e,readFileSync as r}from"node:fs";import{createHash as i}from"node:crypto";import{resolve as s}from"node:path";const o=()=>{let o;const a={};return{name:"vite-plugin-sri",configResolved(t){o=t},enforce:"post",apply:"build",async writeBundle(n,c){Object.entries(c).forEach((([t,e])=>{a[t]=e}));Object.keys(a).filter((t=>t.endsWith(".html"))).map((t=>{const e=a[t];if("asset"===e.type)return{name:e.fileName,source:e.source}})).filter((t=>!!t)).forEach((async({name:c,source:l})=>{const f=t(l),m=f("script").filter("[src]"),d=f("link").filter("[href]"),p=async t=>{let e;const c=t.attribs.src?"src":"href",l=t.attribs[c],f=0===l.indexOf(o.base)?l.substring(o.base.length):l,m=Object.entries(a).find((([,t])=>t.fileName===f))?.[1];if(m)e="asset"===m.type?m.source:m.code;else{o.logger.warn(`cannot find ${f} in output bundle.`);try{e=r(s(n.dir,f))}catch(t){e=void 0}}e&&(t.attribs.integrity=`sha512-${i("sha512").update(e).digest().toString("base64")}`),void 0===t.attribs.crossorigin&&(t.attribs.crossorigin="anonymous")};await Promise.all([...m.map((async(t,e)=>await p(e))),...d.map((async(t,e)=>await p(e)))]),e(s(o?.root,o?.build.outDir,c),f.html())}))}}};export{o as default};