postcss-bem-linter
Version:
A BEM linter for postcss
86 lines (75 loc) • 2.77 kB
JavaScript
const presetPatterns = require('./preset-patterns');
/**
* Given some user options, put together a config object that
* the validators can use.
*
* @param {Object|String} [primaryOptions = 'suit']
* @param {RegExp|String} [primaryOptions.componentName]
* @param {RegExp|String} [primaryOptions.utilitySelectors]
* @param {Object|Function} [primaryOptions.componentSelectors]
* @param {RegExp|String} [primaryOptions.ignoreSelectors]
* @param {RegExp|String} [primaryOptions.ignoreCustomProperties]
* @param {String} [primaryOptions.preset] - The same as passing a string for `primaryOptions`
* @param {Object} [primaryOptions.presetOptions] - Options that are can be used by
* a pattern (e.g. `namespace`)
* @param {Object} [secondaryOptions] - The same as `primaryOptions.presetOptions`
* @return {Object} The configuration object
*/
module.exports = (primaryOptions, secondaryOptions) => {
let patterns = primaryOptions || 'suit';
if (typeof patterns === 'string') {
patterns = presetPatterns[patterns];
} else if (patterns.preset) {
patterns = presetPatterns[patterns.preset];
// Enable overriding of preset patterns
if (primaryOptions.utilitySelectors) {
patterns.utilitySelectors = primaryOptions.utilitySelectors;
}
if (primaryOptions.componentName) {
patterns.componentName = primaryOptions.componentName;
}
if (primaryOptions.componentSelectors) {
patterns.componentSelectors = primaryOptions.componentSelectors;
}
if (primaryOptions.ignoreSelectors) {
patterns.ignoreSelectors = primaryOptions.ignoreSelectors;
}
if (primaryOptions.ignoreCustomProperties) {
patterns.ignoreCustomProperties = primaryOptions.ignoreCustomProperties;
}
}
let presetOptions = secondaryOptions || {};
if (primaryOptions && primaryOptions.presetOptions) {
presetOptions = primaryOptions.presetOptions;
}
const implicitComponents = getImplicitDefineValue(
'implicitComponents',
primaryOptions,
secondaryOptions
);
const implicitUtilities = getImplicitDefineValue(
'implicitUtilities',
primaryOptions,
secondaryOptions
);
return {
patterns,
presetOptions,
componentNamePattern: patterns.componentName || /^[-_a-zA-Z0-9]+$/,
implicitComponents,
implicitUtilities,
};
};
function getImplicitDefineValue(key, primaryOptions, secondaryOptions) {
let implicitValue = false;
if (secondaryOptions && secondaryOptions[key] !== undefined) {
implicitValue = secondaryOptions[key];
} else if (primaryOptions && primaryOptions[key]) {
implicitValue = primaryOptions[key];
}
if (typeof implicitValue === 'string') {
implicitValue = [implicitValue];
}
return implicitValue;
}
;