UNPKG

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
'use strict'; 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'];