postcss-export-custom-variables
Version:
Export custom media queries, custom properties, custom property sets, and custom selectors from CSS as JavaScript variables
150 lines (116 loc) • 18.4 kB
JavaScript
;
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// native tooling
var fs = require('fs');
// external tooling
var postcss = require('postcss');
// custom variable matches
var customPropertyMatch = /^--([_a-zA-Z]+[_a-zA-Z0-9-]*)$/;
var customPropertySetMatch = /^--([_a-zA-Z]+[_a-zA-Z0-9-]*):$/;
var customMediaQueryMatch = /^--([_a-zA-Z]+[_a-zA-Z0-9-]*)\s+(.+)$/;
var customSelectorMatch = /^:--([_a-zA-Z]+[_a-zA-Z0-9-]*)\s+(.+)$/;
// plugin
module.exports = postcss.plugin('postcss-export-custom-variables', function () {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _options$customMediaQ = options.customMediaQueryAssigner,
customMediaQueryAssigner = _options$customMediaQ === undefined ? defaultAssigner : _options$customMediaQ,
_options$customProper = options.customPropertyAssigner,
customPropertyAssigner = _options$customProper === undefined ? defaultAssigner : _options$customProper,
_options$customProper2 = options.customPropertySetAssigner,
customPropertySetAssigner = _options$customProper2 === undefined ? defaultPropertySetAssigner : _options$customProper2,
_options$customSelect = options.customSelectorAssigner,
customSelectorAssigner = _options$customSelect === undefined ? defaultAssigner : _options$customSelect,
_options$exporter = options.exporter,
exporter = _options$exporter === undefined ? defaultJsExporter : _options$exporter,
_options$variables = options.variables,
variables = _options$variables === undefined ? {} : _options$variables;
return function (root) {
root.walk(function (node) {
if (isCustomMediaQuery(node)) {
var _node$params$match = node.params.match(customMediaQueryMatch),
_node$params$match2 = _slicedToArray(_node$params$match, 3),
name = _node$params$match2[1],
queries = _node$params$match2[2];
Object.assign(variables, customMediaQueryAssigner(name, queries, node));
} else if (isCustomProperty(node)) {
var _node$prop$match = node.prop.match(customPropertyMatch),
_node$prop$match2 = _slicedToArray(_node$prop$match, 2),
property = _node$prop$match2[1];
Object.assign(variables, customPropertyAssigner(property, node.value, node));
} else if (isCustomPropertySet(node)) {
var _node$selector$match = node.selector.match(customPropertySetMatch),
_node$selector$match2 = _slicedToArray(_node$selector$match, 2),
_property = _node$selector$match2[1];
Object.assign(variables, customPropertySetAssigner(_property, node.nodes, node));
} else if (isCustomSelector(node)) {
var _node$params$match3 = node.params.match(customSelectorMatch),
_node$params$match4 = _slicedToArray(_node$params$match3, 3),
_property2 = _node$params$match4[1],
selectors = _node$params$match4[2];
Object.assign(variables, customSelectorAssigner(_property2, selectors, node));
}
});
return exporter === 'js' ? defaultJsExporter(variables, options, root) : exporter === 'json' ? defaultJsonExporter(variables, options, root) : exporter(variables, options, root);
};
});
// Extensions for default Assigners and default exports
module.exports.defaultAssigner = defaultAssigner;
module.exports.defaultPropertySetAssigner = defaultPropertySetAssigner;
module.exports.defaultJsExporter = defaultJsExporter;
module.exports.defaultJsonExporter = defaultJsonExporter;
// Variable detection functions
function isCustomMediaQuery(node) {
return node.type === 'atrule' && node.name === 'custom-media' && customMediaQueryMatch.test(node.params);
}
function isCustomProperty(node) {
return node.type === 'decl' && customPropertyMatch.test(node.prop);
}
function isCustomPropertySet(node) {
return node.type === 'rule' && customPropertySetMatch.test(node.selector);
}
function isCustomSelector(node) {
return node.type === 'atrule' && node.name === 'custom-selector' && customSelectorMatch.test(node.params);
}
// Default Assigner functions
function defaultAssigner(rawproperty, rawvalue) {
var property = rawproperty.replace(/-+(.|$)/g, function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
letter = _ref2[1];
return letter.toUpperCase();
});
return _defineProperty({}, property, rawvalue);
}
function defaultPropertySetAssigner(rawproperty, nodes) {
return defaultAssigner(rawproperty, Object.assign.apply(Object, _toConsumableArray(nodes.map(function (node) {
var property = node.prop.replace(/-+(.|$)/g, function (_ref4) {
var _ref5 = _slicedToArray(_ref4, 2),
letter = _ref5[1];
return letter.toUpperCase();
});
return _defineProperty({}, property, node.value);
}))));
}
// Default export functions
function defaultJsExporter(variables, options, root) {
var pathname = options.destination || root.source && root.source.input && root.source.input.file && root.source.input.file + '.js' || 'custom-variables.js';
var contents = Object.keys(variables).reduce(function (buffer, key) {
return buffer + 'export const ' + key + ' = ' + JSON.stringify(variables[key]).replace(/(^|{|,)"(.+?)":/g, '$1$2:') + ';\n';
}, '');
return new Promise(function (resolve, reject) {
fs.writeFile(pathname, contents, function (error) {
return error ? reject(error) : resolve();
});
});
}
function defaultJsonExporter(variables, options, root) {
var pathname = options.destination || root.source && root.source.input && root.source.input.file && root.source.input.file + '.json' || 'custom-variables.json';
var contents = JSON.stringify(variables, null, ' ');
return new Promise(function (resolve, reject) {
fs.writeFile(pathname, contents, function (error) {
return error ? reject(error) : resolve();
});
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxPQUF4QyxFQUFpRCxJQUFqRCxFQUF1RDtBQUN0RCxLQUFNLFdBQVcsUUFBUSxXQUFSLElBQXVCLEtBQUssTUFBTCxJQUFlLEtBQUssTUFBTCxDQUFZLEtBQTNCLElBQW9DLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsSUFBdEQsSUFBOEQsS0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixJQUFsQixHQUF5QixPQUE5RyxJQUF5SCx1QkFBMUk7QUFDQSxLQUFNLFdBQVcsS0FBSyxTQUFMLENBQWUsU0FBZixFQUEwQixJQUExQixFQUFnQyxJQUFoQyxDQUFqQjs7QUFFQSxRQUFPLElBQUksT0FBSixDQUFZLFVBQUMsT0FBRCxFQUFVLE1BQVYsRUFBcUI7QUFDdkMsS0FBRyxTQUFILENBQ0MsUUFERCxFQUVDLFFBRkQsRUFHQyxVQUFDLEtBQUQ7QUFBQSxVQUFXLFFBQVEsT0FBTyxLQUFQLENBQVIsR0FBd0IsU0FBbkM7QUFBQSxHQUhEO0FBS0EsRUFOTSxDQUFQO0FBT0EiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBuYXRpdmUgdG9vbGluZ1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuXG4vLyBleHRlcm5hbCB0b29saW5nXG5jb25zdCBwb3N0Y3NzID0gcmVxdWlyZSgncG9zdGNzcycpO1xuXG4vLyBjdXN0b20gdmFyaWFibGUgbWF0Y2hlc1xuY29uc3QgY3VzdG9tUHJvcGVydHlNYXRjaCAgICA9IC9eLS0oW19hLXpBLVpdK1tfYS16QS1aMC05LV0qKSQvO1xuY29uc3QgY3VzdG9tUHJvcGVydHlTZXRNYXRjaCA9IC9eLS0oW19hLXpBLVpdK1tfYS16QS1aMC05LV0qKTokLztcbmNvbnN0IGN1c3RvbU1lZGlhUXVlcnlNYXRjaCAgPSAvXi0tKFtfYS16QS1aXStbX2EtekEtWjAtOS1dKilcXHMrKC4rKSQvO1xuY29uc3QgY3VzdG9tU2VsZWN0b3JNYXRjaCAgICA9IC9eOi0tKFtfYS16QS1aXStbX2EtekEtWjAtOS1dKilcXHMrKC4rKSQvO1xuXG4vLyBwbHVnaW5cbm1vZHVsZS5leHBvcnRzID0gcG9zdGNzcy5wbHVnaW4oJ3Bvc3Rjc3MtZXhwb3J0LWN1c3RvbS12YXJpYWJsZXMnLCAob3B0aW9ucyA9IHt9KSA9PiB7XG5cdGNvbnN0IHtcblx0XHRjdXN0b21NZWRpYVF1ZXJ5QXNzaWduZXIgID0gZGVmYXVsdEFzc2lnbmVyLFxuXHRcdGN1c3RvbVByb3BlcnR5QXNzaWduZXIgICAgPSBkZWZhdWx0QXNzaWduZXIsXG5cdFx0Y3VzdG9tUHJvcGVydHlTZXRBc3NpZ25lciA9IGRlZmF1bHRQcm9wZXJ0eVNldEFzc2lnbmVyLFxuXHRcdGN1c3RvbVNlbGVjdG9yQXNzaWduZXIgICAgPSBkZWZhdWx0QXNzaWduZXIsXG5cdFx0ZXhwb3J0ZXIgICAgICAgICAgICAgICAgICA9IGRlZmF1bHRKc0V4cG9ydGVyLFxuXHRcdHZhcmlhYmxlcyAgICAgICAgICAgICAgICAgPSB7fVxuXHR9ID0gb3B0aW9ucztcblxuXHRyZXR1cm4gKHJvb3QpID0+IHtcblx0XHRyb290LndhbGsoXG5cdFx0XHQobm9kZSkgPT4ge1xuXHRcdFx0XHRpZiAoaXNDdXN0b21NZWRpYVF1ZXJ5KG5vZGUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgWyAsIG5hbWUsIHF1ZXJpZXMgXSA9IG5vZGUucGFyYW1zLm1hdGNoKGN1c3RvbU1lZGlhUXVlcnlNYXRjaCk7XG5cblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKHZhcmlhYmxlcywgY3VzdG9tTWVkaWFRdWVyeUFzc2lnbmVyKG5hbWUsIHF1ZXJpZXMsIG5vZGUpKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0N1c3RvbVByb3BlcnR5KG5vZGUpKSB7XG5cdFx0XHRcdFx0Y29uc3QgWyAsIHByb3BlcnR5IF0gPSBub2RlLnByb3AubWF0Y2goY3VzdG9tUHJvcGVydHlNYXRjaCk7XG5cblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKHZhcmlhYmxlcywgY3VzdG9tUHJvcGVydHlBc3NpZ25lcihwcm9wZXJ0eSwgbm9kZS52YWx1ZSwgbm9kZSkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3VzdG9tUHJvcGVydHlTZXQobm9kZSkpIHtcblx0XHRcdFx0XHRjb25zdCBbICwgcHJvcGVydHkgXSA9IG5vZGUuc2VsZWN0b3IubWF0Y2goY3VzdG9tUHJvcGVydHlTZXRNYXRjaCk7XG5cblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKHZhcmlhYmxlcywgY3VzdG9tUHJvcGVydHlTZXRBc3NpZ25lcihwcm9wZXJ0eSwgbm9kZS5ub2Rlcywgbm9kZSkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3VzdG9tU2VsZWN0b3Iobm9kZSkpIHtcblx0XHRcdFx0XHRjb25zdCBbICwgcHJvcGVydHksIHNlbGVjdG9ycyBdID0gbm9kZS5wYXJhbXMubWF0Y2goY3VzdG9tU2VsZWN0b3JNYXRjaCk7XG5cblx0XHRcdFx0XHRPYmplY3QuYXNzaWduKHZhcmlhYmxlcywgY3VzdG9tU2VsZWN0b3JBc3NpZ25lcihwcm9wZXJ0eSwgc2VsZWN0b3JzLCBub2RlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0cmV0dXJuIGV4cG9ydGVyID09PSAnanMnXG5cdFx0XHQ/IGRlZmF1bHRKc0V4cG9ydGVyKHZhcmlhYmxlcywgb3B0aW9ucywgcm9vdClcblx0XHRcdDogZXhwb3J0ZXIgPT09ICdqc29uJ1xuXHRcdFx0XHQ/IGRlZmF1bHRKc29uRXhwb3J0ZXIodmFyaWFibGVzLCBvcHRpb25zLCByb290KVxuXHRcdFx0XHQ6IGV4cG9ydGVyKHZhcmlhYmxlcywgb3B0aW9ucywgcm9vdCk7XG5cdH07XG59KTtcblxuLy8gRXh0ZW5zaW9ucyBmb3IgZGVmYXVsdCBBc3NpZ25lcnMgYW5kIGRlZmF1bHQgZXhwb3J0c1xuXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0QXNzaWduZXIgICAgICAgICAgICA9IGRlZmF1bHRBc3NpZ25lcjtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHRQcm9wZXJ0eVNldEFzc2lnbmVyID0gZGVmYXVsdFByb3BlcnR5U2V0QXNzaWduZXI7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0SnNFeHBvcnRlciAgICAgICAgICA9IGRlZmF1bHRKc0V4cG9ydGVyO1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdEpzb25FeHBvcnRlciAgICAgICAgPSBkZWZhdWx0SnNvbkV4cG9ydGVyO1xuXG4vLyBWYXJpYWJsZSBkZXRlY3Rpb24gZnVuY3Rpb25zXG5cbmZ1bmN0aW9uIGlzQ3VzdG9tTWVkaWFRdWVyeShub2RlKSB7XG5cdHJldHVybiBub2RlLnR5cGUgPT09ICdhdHJ1bGUnICYmIG5vZGUubmFtZSA9PT0gJ2N1c3RvbS1tZWRpYScgJiYgY3VzdG9tTWVkaWFRdWVyeU1hdGNoLnRlc3Qobm9kZS5wYXJhbXMpO1xufVxuXG5mdW5jdGlvbiBpc0N1c3RvbVByb3BlcnR5KG5vZGUpIHtcblx0cmV0dXJuIG5vZGUudHlwZSA9PT0gJ2RlY2wnICAgJiYgY3VzdG9tUHJvcGVydHlNYXRjaC50ZXN0KG5vZGUucHJvcCk7XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tUHJvcGVydHlTZXQobm9kZSkge1xuXHRyZXR1cm4gbm9kZS50eXBlID09PSAncnVsZScgICAmJiBjdXN0b21Qcm9wZXJ0eVNldE1hdGNoLnRlc3Qobm9kZS5zZWxlY3Rvcik7XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tU2VsZWN0b3Iobm9kZSkge1xuXHRyZXR1cm4gbm9kZS50eXBlID09PSAnYXRydWxlJyAmJiBub2RlLm5hbWUgPT09ICdjdXN0b20tc2VsZWN0b3InICYmIGN1c3RvbVNlbGVjdG9yTWF0Y2gudGVzdChub2RlLnBhcmFtcyk7XG59XG5cbi8vIERlZmF1bHQgQXNzaWduZXIgZnVuY3Rpb25zXG5cbmZ1bmN0aW9uIGRlZmF1bHRBc3NpZ25lcihyYXdwcm9wZXJ0eSwgcmF3dmFsdWUpIHtcblx0Y29uc3QgcHJvcGVydHkgPSByYXdwcm9wZXJ0eS5yZXBsYWNlKC8tKygufCQpL2csIChbICwgbGV0dGVyXSkgPT4gbGV0dGVyLnRvVXBwZXJDYXNlKCkpO1xuXG5cdHJldHVybiB7XG5cdFx0W3Byb3BlcnR5XTogcmF3dmFsdWVcblx0fTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByb3BlcnR5U2V0QXNzaWduZXIocmF3cHJvcGVydHksIG5vZGVzKSB7XG5cdHJldHVybiBkZWZhdWx0QXNzaWduZXIoXG5cdFx0cmF3cHJvcGVydHksXG5cdFx0T2JqZWN0LmFzc2lnbihcblx0XHRcdC4uLm5vZGVzLm1hcChcblx0XHRcdFx0KG5vZGUpID0+IHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG5vZGUucHJvcC5yZXBsYWNlKC8tKygufCQpL2csIChbICwgbGV0dGVyXSkgPT4gbGV0dGVyLnRvVXBwZXJDYXNlKCkpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFtwcm9wZXJ0eV06IG5vZGUudmFsdWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vLyBEZWZhdWx0IGV4cG9ydCBmdW5jdGlvbnNcblxuZnVuY3Rpb24gZGVmYXVsdEpzRXhwb3J0ZXIodmFyaWFibGVzLCBvcHRpb25zLCByb290KSB7XG5cdGNvbnN0IHBhdGhuYW1lID0gb3B0aW9ucy5kZXN0aW5hdGlvbiB8fCByb290LnNvdXJjZSAmJiByb290LnNvdXJjZS5pbnB1dCAmJiByb290LnNvdXJjZS5pbnB1dC5maWxlICYmIHJvb3Quc291cmNlLmlucHV0LmZpbGUgKyAnLmpzJyB8fCAnY3VzdG9tLXZhcmlhYmxlcy5qcyc7XG5cdGNvbnN0IGNvbnRlbnRzID0gT2JqZWN0LmtleXModmFyaWFibGVzKS5yZWR1Y2UoXG5cdFx0KGJ1ZmZlciwga2V5KSA9PiBgJHsgYnVmZmVyIH1leHBvcnQgY29uc3QgJHsga2V5IH0gPSAkeyBKU09OLnN0cmluZ2lmeSh2YXJpYWJsZXNba2V5XSkucmVwbGFjZSgvKF58e3wsKVwiKC4rPylcIjovZywgJyQxJDI6JykgfTtcXG5gLFxuXHRcdCcnXG5cdCk7XG5cblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRmcy53cml0ZUZpbGUoXG5cdFx0XHRwYXRobmFtZSxcblx0XHRcdGNvbnRlbnRzLFxuXHRcdFx0KGVycm9yKSA9PiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKClcblx0XHQpO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEpzb25FeHBvcnRlcih2YXJpYWJsZXMsIG9wdGlvbnMsIHJvb3QpIHtcblx0Y29uc3QgcGF0aG5hbWUgPSBvcHRpb25zLmRlc3RpbmF0aW9uIHx8IHJvb3Quc291cmNlICYmIHJvb3Quc291cmNlLmlucHV0ICYmIHJvb3Quc291cmNlLmlucHV0LmZpbGUgJiYgcm9vdC5zb3VyY2UuaW5wdXQuZmlsZSArICcuanNvbicgfHwgJ2N1c3RvbS12YXJpYWJsZXMuanNvbic7XG5cdGNvbnN0IGNvbnRlbnRzID0gSlNPTi5zdHJpbmdpZnkodmFyaWFibGVzLCBudWxsLCAnICAnKTtcblxuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGZzLndyaXRlRmlsZShcblx0XHRcdHBhdGhuYW1lLFxuXHRcdFx0Y29udGVudHMsXG5cdFx0XHQoZXJyb3IpID0+IGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUoKVxuXHRcdCk7XG5cdH0pO1xufVxuIl19