@vulppi/bun-svelte-loader
Version:
A Bun loader for Svelte components
3 lines (2 loc) • 1.73 kB
JavaScript
import h from"fs/promises";import{glob as _}from"glob";import o from"path";import{compile as v,compileModule as E,preprocess as j}from"svelte/compiler";import g from"xxhash-wasm";var S=/\.svelte\.(?:t|j)s$/,w=/<[A-Za-z][A-Za-z0-9-]*(?:\s[^>]*?)?>/,f=/\.svelte(?:\.(?:t|j)s)?$/,d=/\?svelte-css$/,u=new Map,b={name:"svelte-plugin",setup(i){i.onLoad({filter:d,namespace:"svelte-css"},e=>({contents:u.has(e.path)?u.get(e.path):"",loader:"css"})),i.onLoad({filter:f},async e=>{let s=await h.readFile(e.path,"utf8"),a=!w.test(s)||S.test(e.path),n=await j(s,[],{filename:e.path});try{let t;a?t=E(n.code,{filename:o.basename(e.path),generate:"client",dev:!0}):t=v(n.code,{filename:o.basename(e.path),css:"external",generate:"client",hmr:!0});let r=t.js.code,p=t.css?.code,c=r;if(p){let{h32:l}=await g(),m=`${l(e.path)}?svelte-css`;u.set(m,p),c=`import "${m}";
${r}`}return{contents:c,loader:"js",resolveDir:o.dirname(e.path)}}catch(t){console.error("Error compiling svelte module:",t)}}),i.onResolve({filter:d},e=>({path:e.path,namespace:"svelte-css"})),i.onResolve({filter:/^[^.$]/,namespace:"file"},async e=>{try{if(/^(?:[\/\\.]|[a-zA-Z]+:)/.test(e.path)||!f.test(e.importer))return;let s="",a=[];if(/^@/.test(e.path)){let[c,l,...m]=e.path.split("/");s=o.join(process.cwd(),"node_modules",c,l,"**","package.json"),a=m}else{let[c,...l]=e.path.split("/");s=o.join("node_modules",c,"**","package.json"),a=l}let[n]=await _(s.replace(/\\/g,"/"),{nodir:!0,absolute:!0});if(!await h.exists(n))return;let t=await h.readFile(n,"utf8"),r=JSON.parse(t),p=a.length>0?r.exports?.[[".",...a].join("/")]?.svelte:r.svelte||r.exports?.["."]?.svelte;return p?{path:o.join(o.dirname(n),p),namespace:"file"}:void 0}catch{return}})}};export{b as default};