less-plugin-css-modules
Version:
A less plugin for css modules
124 lines (95 loc) • 3.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _yargs = require('yargs');
var _yargs2 = _interopRequireDefault(_yargs);
var _genericNames = require('generic-names');
var _genericNames2 = _interopRequireDefault(_genericNames);
var _postcss = require('postcss');
var _postcss2 = _interopRequireDefault(_postcss);
var _postcssModulesLocalByDefault = require('postcss-modules-local-by-default');
var _postcssModulesLocalByDefault2 = _interopRequireDefault(_postcssModulesLocalByDefault);
var _postcssModulesScope = require('postcss-modules-scope');
var _postcssModulesScope2 = _interopRequireDefault(_postcssModulesScope);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var OPTIONS = {
mode: {
describe: '',
example: 'lessc index.less --css-modules="--mode=global"',
choices: ['global', 'local', 'pure']
},
hashPrefix: {
describe: '',
example: 'lessc index.less --css-modules="--hashPrefix=project_name"',
type: 'string'
},
generateScopedName: {
describe: '',
example: 'lessc index.less --css-modules="--generateScopedName=[name]__[local]___[hash:base64:5]"',
type: 'string'
}
};
/**
* @class CSSModules
* @param {Object} [options]
* @param {string} [options.mode]
* @param {string} [options.hashPrefix]
* @param {string|function} [options.generateScopedName='[name]__[local]___[hash:base64:5]']
*/
function CSSModules() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.options = options;
}
CSSModules.prototype.minVersion = [2, 1, 0];
CSSModules.prototype.install = function (less, pluginManager) {
pluginManager.addPostProcessor(new CSSProcessor(this.options));
};
CSSModules.prototype.printUsage = function () {
console.log('');
console.log('CSS Modules Plugin');
console.log('specify plugin with --css-modules');
console.log('');
};
/**
* @param {string} options
*/
CSSModules.prototype.setOptions = function (options) {
this.options = _yargs2.default.options(OPTIONS).parse(options);
};
exports.default = CSSModules;
/**
* @class CSSProcessor
* @param {Object} [options]
* @param {string} [options.mode]
* @param {string} [options.hashPrefix]
* @param {string|function} [options.generateScopedName]
*/
function CSSProcessor() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.options = options;
}
/**
* [process description]
* @param {string} css
* @returns {string}
*/
CSSProcessor.prototype.process = function (css) {
var processor = (0, _postcss2.default)();
if (this.options.mode) {
processor.use((0, _postcssModulesLocalByDefault2.default)({
mode: this.options.mode
}));
}
var typeGenerateScopedName = typeof this.options.generateScopedName;
var pattern = typeGenerateScopedName === 'string' ? this.options.generateScopedName : '[name]__[local]___[hash:base64:5]';
var scopedName = typeGenerateScopedName === 'function' ? this.options.generateScopedName : (0, _genericNames2.default)(pattern, {
context: process.cwd(),
hashPrefix: this.options.hashPrefix
});
processor.use((0, _postcssModulesScope2.default)({
generateScopedName: scopedName
}));
var result = processor.process(css);
return result.toString();
};