esbuild-plugin-less
Version:
esbuild plugin for less files
2 lines (1 loc) • 1.63 kB
JavaScript
import{promises as S}from"fs";import L from"path";import w from"less";import u from"fs";import c from"path";var v=/@import.*?["']([^"']+)["'].*?/,y=/@import.*?["']([^"']+)["'].*?/g,R=/(?:\/\*(?:[\s\S]*?)\*\/)|(\/\/(?:.*)$)/gm,b=[".css",".less"];function f(t,r=[],n=new Set){try{if(n.has(t))return[];n.add(t);let a=c.dirname(t),m=(u.readFileSync(t).toString("utf8").replace(R,"").match(y)||[]).map(e=>e.match(v)[1]).filter(e=>!!e).map(e=>{let o=c.resolve(a,c.extname(e)?e:`${e}.less`);if(!u.existsSync(o))for(let p=0;p<r.length;p++){let x=c.resolve(r[p],c.extname(e)?e:`${e}.less`);if(u.existsSync(x)){o=x;break}}return o});return m.reduce((e,o)=>[...e,...f(o,r,n)],m).filter(e=>b.includes(c.extname(e).toLowerCase()))}catch{return[]}}function g(t){let r=t.extract.filter(a=>a),n=r.length===3?r[1]:r[0];return{text:t.message,location:{namespace:"file",file:t.filename,line:t.line,column:t.column,lineText:n}}}function M(t={},r={}){return{name:"less-loader",setup:n=>{let a=r.filter;n.onResolve({filter:a||/\.less$/,namespace:"file"},async s=>{let i=(await n.resolve(s.path,{kind:s.kind,importer:s.importer,resolveDir:s.resolveDir,pluginData:s.pluginData})).path;return{path:i,watchFiles:[i,...f(i,t.paths||[])]}}),n.onLoad({filter:a||/\.less$/,namespace:"file"},async s=>{let l=await S.readFile(s.path,"utf-8"),i=L.dirname(s.path),h=L.basename(s.path).endsWith(".module.less"),d=r.inline===!0?"text":h?"local-css":"css",e={filename:s.path,relativeUrls:!0,...t,paths:[...t.paths||[],i]};try{return{contents:(await w.render(l,e)).css,loader:d,resolveDir:i}}catch(o){return{errors:[g(o)],resolveDir:i}}})}}}export{M as lessLoader};