react-inline-for-rix-loader
Version:
for developing webpack rix-loader, folk from https://github.com/martinandert/react-inline
101 lines (67 loc) • 3.52 kB
JavaScript
;
var _Object$assign = require('babel-runtime/core-js/object/assign')['default'];
var _Object$keys = require('babel-runtime/core-js/object/keys')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
exports.__esModule = true;
var _assert = require('assert');
var _assert2 = _interopRequireDefault(_assert);
var _recast = require('recast');
var _transformObjectExpressionIntoStyleSheetObject = require('./transformObjectExpressionIntoStyleSheetObject');
var _transformObjectExpressionIntoStyleSheetObject2 = _interopRequireDefault(_transformObjectExpressionIntoStyleSheetObject);
var _transformStyleSheetObjectIntoSpecification = require('./transformStyleSheetObjectIntoSpecification');
var _transformStyleSheetObjectIntoSpecification2 = _interopRequireDefault(_transformStyleSheetObjectIntoSpecification);
var _generateClassName = require('./generateClassName');
var _generateClassName2 = _interopRequireDefault(_generateClassName);
var n = _recast.types.namedTypes;
var b = _recast.types.builders;
exports['default'] = function (ast, stylesheets, options) {
_recast.visit(ast, {
visitCallExpression: function visitCallExpression(path) {
var node = path.node;
var parent = path.parentPath.node;
if (!isStyleSheetCreate(node.callee)) {
return this.traverse(path);
}
_assert2['default'](n.VariableDeclarator.check(parent), 'return value of StyleSheet.create(...) must be assigned to a variable');
var sheetId = parent.id.name;
var expr = node.arguments[0];
_assert2['default'](expr, 'StyleSheet.create(...) call is missing an argument');
var obj = _transformObjectExpressionIntoStyleSheetObject2['default'](expr, options.context);
var sheet = _transformStyleSheetObjectIntoSpecification2['default'](obj);
stylesheets[sheetId] = sheet;
var gcnOptions = _Object$assign({}, options);
gcnOptions.prefixes = [options.filename, sheetId];
var properties = [];
_Object$keys(sheet).forEach(function (styleId) {
var className = _generateClassName2['default'](styleId, gcnOptions);
var key = b.identifier(styleId);
var value = b.literal(className);
var property = b.property('init', key, value);
properties.push(property);
});
path.replace(b.objectExpression(properties));
return false;
},
visitImportDeclaration: function visitImportDeclaration(path) {
if (path.node.source.value === 'react-inline') {
path.prune();
return false;
}
this.traverse(path);
},
visitVariableDeclarator: function visitVariableDeclarator(path) {
if (isRequireReactInline(path.node)) {
path.prune();
return false;
}
this.traverse(path);
}
});
};
function isStyleSheetCreate(node) {
return n.MemberExpression.check(node) && n.Identifier.check(node.object) && node.object.name === 'StyleSheet' && (n.Identifier.check(node.property) && node.property.name === 'create' || n.Literal.check(node.property) && node.property.value === 'create');
}
function isRequireReactInline(node) {
return n.Identifier.check(node.id) && node.id.name === 'StyleSheet' && n.CallExpression.check(node.init) && n.Identifier.check(node.init.callee) && node.init.callee.name === 'require' && n.Literal.check(node.init.arguments[0]) && node.init.arguments[0].value === 'react-inline';
}
module.exports = exports['default'];