parcel-bundler
Version:
<p align="center"> <a href="https://parceljs.org/" target="_blank"> <img alt="Parcel" src="https://user-images.githubusercontent.com/19409/31321658-f6aed0f2-ac3d-11e7-8100-1587e676e0ec.png" width="749"> </a> </p>
51 lines (43 loc) • 1.33 kB
JavaScript
const CSSAsset = require('./CSSAsset');
const config = require('../utils/config');
const localRequire = require('../utils/localRequire');
const promisify = require('../utils/promisify');
class LESSAsset extends CSSAsset {
async parse(code) {
// less should be installed locally in the module that's being required
let less = await localRequire('less', this.name);
let render = promisify(less.render.bind(less));
let opts =
this.package.less ||
(await config.load(this.name, ['.lessrc', '.lessrc.js'])) ||
{};
opts.filename = this.name;
opts.plugins = (opts.plugins || []).concat(urlPlugin(this));
let res = await render(code, opts);
res.render = () => res.css;
return res;
}
collectDependencies() {
for (let dep of this.ast.imports) {
this.addDependency(dep, {includedInParent: true});
}
}
}
function urlPlugin(asset) {
return {
install: (less, pluginManager) => {
let visitor = new less.visitors.Visitor({
visitUrl: (node) => {
node.value.value = asset.addURLDependency(
node.value.value,
node.currentFileInfo.filename
);
return node;
}
});
visitor.run = visitor.visit;
pluginManager.addVisitor(visitor);
}
};
}
module.exports = LESSAsset;