st-bundle
Version:
CLI for watching and bundling SpringType projects.
86 lines (85 loc) • 3.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const utils_1 = require("../utils/utils");
const cssHandleResources_1 = require("./cssHandleResources");
const cssResolveModule_1 = require("./cssResolveModule");
const cssSourceMap_1 = require("./cssSourceMap");
const cssAutoImport_1 = require("./cssAutoImport");
function evaluateSass(sassModule, options) {
return new Promise((resolve, reject) => {
sassModule.render(options, (err, result) => {
if (err)
return reject(err);
return resolve(result);
});
});
}
function sassImporter(props) {
const userPaths = props.options.paths || [];
const root = path.dirname(props.fileRoot);
const paths = [root].concat(userPaths);
const resolved = cssResolveModule_1.cssResolveModule({
extensions: ['.scss', '.sass', '.css'],
paths,
target: props.url,
tryUnderscore: true,
options: props.options,
});
if (resolved.success) {
let fileContents = utils_1.readFile(resolved.path);
if (props.options.autoImport) {
fileContents = cssAutoImport_1.cssAutoImport({ contents: fileContents, stylesheet: props.options, url: resolved.path });
}
return cssHandleResources_1.cssHandleResources({ path: resolved.path, contents: fileContents }, props);
}
}
exports.sassImporter = sassImporter;
async function renderModule(props) {
const { ctx, module, nodeSass } = props;
const requireSourceMap = module.isCSSSourceMapRequired();
// handle root resources
const processed = cssHandleResources_1.cssHandleResources({ path: module.props.absPath, contents: module.contents }, { options: props.options, ctx: props.ctx, module: module });
let contents = processed.contents;
if (props.options.autoImport) {
contents = cssAutoImport_1.cssAutoImport({ contents: contents, stylesheet: props.options, url: props.module.props.absPath });
}
//const processed = { contents: module.contents, file: module.props.absPath };
const data = await evaluateSass(nodeSass, {
data: contents,
file: processed.file,
sourceMap: requireSourceMap,
includePaths: [path.dirname(module.props.absPath)],
outFile: module.props.absPath,
sourceMapContents: requireSourceMap,
importer: function (url, prev) {
// gathering imported dependencies in order to let the watcher pickup the right module
const result = sassImporter({ options: props.options, ctx, module, url, fileRoot: prev });
if (props.options.breakDependantsCache) {
module.breakDependantsCache = true;
}
if (result && result.file) {
module.addWeakReference(result.file);
return result;
}
return url;
},
});
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 sassHandler(props) {
const { ctx, module } = props;
const nodeSass = require('node-sass');
if (!nodeSass) {
return;
}
return {
render: async () => renderModule({ ctx, module, nodeSass, options: props.options }),
};
}
exports.sassHandler = sassHandler;