esbuild-raw-plugin
Version:
An ESBuild and TSUP plugin that allows importing files as raw text. Useful for loading code files in documentation, interactive demos, or tools like react-live.
3 lines (2 loc) • 1.15 kB
JavaScript
import r from"node:fs";import x from"node:path";var d=e=>({name:`raw-${Math.random().toString(36).slice(2,10)}`,setup(n){var i,s;let l=(i=e==null?void 0:e.ext)!=null?i:["ts","tsx","js","jsx","mjs","mts","module.css","module.scss","css","scss"];n.onResolve({filter:/\?raw$/},t=>({path:t.path,pluginData:x.resolve(t.resolveDir,t.path).replace(/\?raw$/,""),namespace:"raw"})),n.onLoad({filter:/\?raw$/,namespace:"raw"},t=>{let a=t.pluginData;if(e!=null&&e.loader&&e.loader!=="text")return{contents:r.readFileSync(a,"utf8"),loader:e.loader};if(r.existsSync(a)&&r.lstatSync(a).isDirectory()&&(a=x.join(a,"index")),!r.existsSync(a)){for(let c of l)if(r.existsSync(`${a}.${c}`)){a+=`.${c}`;break}}if(!r.existsSync(a))throw new Error(`File not found: ${t.pluginData}
Checked extensions: ${l.join(", ")}. You can customize this using { ext: [...] }.`);return{contents:r.readFileSync(a,"utf8"),loader:"text"}}),(s=e==null?void 0:e.textExtensions)!=null&&s.length&&n.onLoad({filter:new RegExp(`.(${e.textExtensions.map(t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")})$`)},t=>({contents:r.readFileSync(t.path,"utf8"),loader:"text"}))}});export{d as raw};