st-bundle
Version:
CLI for watching and bundling SpringType projects.
75 lines (74 loc) • 2.93 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const postcss = require("postcss");
const atImport = require("postcss-import");
const utils_1 = require("../../utils/utils");
const cssHandleResources_1 = require("../cssHandleResources");
const cssResolveModule_1 = require("../cssResolveModule");
const cssSourceMap_1 = require("../cssSourceMap");
async function callPostCSS(plugins, css, options, logger) {
return new Promise((resolve, reject) => {
postcss(plugins)
.process(css, options)
.then(resolve)
.catch(reject);
});
}
async function renderModule(props) {
function loader(url, opts) {
const data = cssHandleResources_1.cssHandleResources({ path: url, contents: utils_1.readFile(url) }, {
options: props.options,
fileRoot: path.dirname(url),
ctx: props.ctx,
url: url,
module: props.module,
});
return data.contents;
}
function resolver(url, root, importOptions) {
const userPaths = props.options.paths || [];
const paths = [root].concat(userPaths);
const resolved = cssResolveModule_1.cssResolveModule({
extensions: ['.css', '.scss', '.sass'],
paths,
target: url,
tryUnderscore: true,
options: props.options,
});
if (resolved.success) {
if (props.options.breakDependantsCache) {
props.module.breakDependantsCache = true;
}
props.module.addWeakReference(resolved.path);
return resolved.path;
}
}
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 = [atImport({ load: loader, resolve: resolver })];
if (props.options.postCSS) {
if (props.options.postCSS.plugins) {
pluginList = pluginList.concat(props.options.postCSS.plugins);
}
}
const data = await callPostCSS(pluginList, processed.contents, {
from: props.module.props.absPath,
to: props.module.props.absPath,
map: requireSourceMap && { inline: false },
}, props.ctx.log);
let sourceMap;
if (data.map) {
sourceMap = cssSourceMap_1.alignCSSSourceMap({ module: props.module, sourceMap: data.map, ctx: props.ctx });
}
return { map: sourceMap, css: data.css && data.css.toString() };
}
exports.renderModule = renderModule;
function postCSSHandler(props) {
const { ctx, module } = props;
return {
render: async () => renderModule({ ctx, module, options: props.options }),
};
}
exports.postCSSHandler = postCSSHandler;