UNPKG

@vulppi/bun-svelte-loader

Version:

A Bun loader for Svelte components

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