karma-typescript-cssmodules-transform
Version:
PostCSS runner plugin for CSS Modules
82 lines • 3.26 kB
JavaScript
;
var log4js = require("log4js");
var os = require("os");
var postcss = require("postcss");
var log;
var json = {};
var parser = postcss.plugin("karma-typescript-cssmodules-transform-parser", function () {
return function (css) {
css.walkRules(function (rule) {
if (rule.selector === ":export") {
rule.walkDecls(function (decl) {
json[decl.prop] = decl.value;
});
}
});
};
});
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
var configure = function (postcssOptions, options, filter) {
postcssOptions = postcssOptions || {};
options = options || {};
filter = (filter instanceof RegExp) ? filter : /\.css$/;
// eslint-disable-next-line @typescript-eslint/no-var-requires
var genericNames = require("generic-names");
var scopedNameGenerator = options.generateScopedName || "[name]_[local]_[hash:base64:5]";
var transform = function (context, callback) {
postcssOptions.from = context.filename;
postcssOptions.to = context.filename;
if (context.filename.match(filter)) {
log.debug("Transforming %s", context.filename);
if (!context.source) {
return callback(new Error("File is empty"), false);
}
var plugins = [
// eslint-disable-next-line @typescript-eslint/no-var-requires
require("postcss-modules-local-by-default")({ mode: options.mode }),
require("postcss-modules-extract-imports"),
// eslint-disable-next-line @typescript-eslint/no-var-requires
require("postcss-modules-scope")({ generateScopedName: genericNames(scopedNameGenerator, {
context: context.filename
}) }),
require("postcss-modules-values"),
parser
];
postcss(plugins)
.process(context.source, postcssOptions)
.then(function (result) {
result.warnings().forEach(function (warning) {
log.warn(warning.toString());
});
context.source = JSON.stringify(json);
callback(undefined, true);
}, function (error) {
if (error.name === "CssSyntaxError") {
log.warn(error.message + os.EOL + error.showSourceCode());
callback(undefined, false);
}
else {
callback(error, false);
}
});
}
else {
return callback(undefined, false);
}
};
var initialize = function (logOptions) {
log4js.configure({
appenders: logOptions.appenders,
categories: {
default: {
appenders: Object.keys(logOptions.appenders),
level: logOptions.level
}
}
});
log = log4js.getLogger("cssmodules-transform.karma-typescript");
};
return Object.assign(transform, { initialize: initialize });
};
module.exports = configure;
//# sourceMappingURL=transform.js.map