st-bundle
Version:
CLI for watching and bundling SpringType projects.
78 lines (77 loc) • 3.55 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../../utils/utils");
const cssHandleResources_1 = require("../cssHandleResources");
const cssResolveModule_1 = require("../cssResolveModule");
const cssSourceMap_1 = require("../cssSourceMap");
async function renderWithLess(less, contents, options) {
return new Promise((resolve, reject) => {
less.render(contents, options).then(function (output) {
return resolve({ css: output.css, map: output.map });
}, function (error) {
return reject(error);
});
});
}
async function renderModule(props) {
const Importer = {
install: (less, manager) => {
manager.addFileManager(new (class extends less.FileManager {
loadFile(url, root, options, environment) {
return new Promise((resolve, reject) => {
const userPaths = props.options.paths || [];
const paths = [root].concat(userPaths);
const resolved = cssResolveModule_1.cssResolveModule({
extensions: ['.less', '.css'],
paths,
target: url,
tryUnderscore: true,
options: props.options,
});
if (resolved.success) {
if (props.options.breakDependantsCache) {
props.module.breakDependantsCache = true;
}
props.module.addWeakReference(resolved.path);
const contents = utils_1.readFile(resolved.path);
const processed = cssHandleResources_1.cssHandleResources({ path: resolved.path, contents: contents }, { options: props.options, ctx: props.ctx, module: props.module });
return resolve({ contents: processed.contents, filename: resolved.path, options, environment });
}
else {
reject(`Cannot find module ${url} at ${root}`);
}
});
}
})());
},
};
const module = props.module;
const requireSourceMap = props.module.isCSSSourceMapRequired();
// handle root resources
const processed = cssHandleResources_1.cssHandleResources({ path: props.module.props.absPath, contents: props.module.contents }, { options: props.options, ctx: props.ctx, module: props.module });
let pluginList = [Importer];
if (props.options.less) {
if (props.options.less.plugins) {
pluginList = pluginList.concat(props.options.less.plugins);
}
}
const data = await renderWithLess(props.less, processed.contents, {
sourceMap: requireSourceMap && { outputSourceFiles: true },
filename: module.props.absPath,
plugins: pluginList,
});
let sourceMap;
if (data.map) {
sourceMap = cssSourceMap_1.alignCSSSourceMap({ module: props.module, sourceMap: data.map, ctx: props.ctx });
}
return { map: sourceMap, css: data.css };
}
exports.renderModule = renderModule;
function lessHandler(props) {
const { ctx, module } = props;
const less = require('less');
return {
render: async () => renderModule({ ctx, module, less, options: props.options }),
};
}
exports.lessHandler = lessHandler;