motion
Version:
motion - moving development forward
113 lines (84 loc) • 4.54 kB
JavaScript
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _state = require('../state');
var _state2 = _interopRequireDefault(_state);
var _libHelpers = require('../lib/helpers');
var _motionNiceStyles = require('motion-nice-styles');
var _motionNiceStyles2 = _interopRequireDefault(_motionNiceStyles);
var _stilr = require('../stilr');
var _stilr2 = _interopRequireDefault(_stilr);
exports['default'] = {
exit: function exit(node) {
if (node._motionViewParsed) return; // avoid parsing twice
if (_state2['default'].inView && node.expression && node.expression.callee && node.expression.callee.name == 'Motion.view') {
var _ret = (function () {
var getSelector = function getSelector(viewName, tag) {
var cleanViewName = viewName.replace('.', '-');
tag = tag.replace(/^\$/, '');
// styling root tag
if (shouldStyleTagnameAsRoot && tag == _state2['default'].inView.toLowerCase() || tag == '') return _libHelpers.viewMainSelector(cleanViewName, _libHelpers.options);
// styling child view
if (tag[0] == tag[0].toUpperCase()) return _libHelpers.viewMainSelector(cleanViewName + ' .View' + tag, _libHelpers.options);
// styling tag in view
return _libHelpers.viewSelector(cleanViewName, tag, _libHelpers.options);
};
node._motionViewParsed = true;
// check if child tag is direct root
var shouldStyleTagnameAsRoot = _libHelpers.shouldStyleAsRoot();
var viewName = _state2['default'].inView;
var styles = _state2['default'].viewStyles[viewName];
if (!styles) return {
v: undefined
};
var rawStyles = {};
// turns styles babel tree into js again
Object.keys(styles).forEach(function (tag) {
var styleProps = styles[tag];
var viewstyle = styleProps.reduce(function (acc, cur) {
// TODO this is way specific to what we extract
// there should be a way to turn AST back into code here without rewriting babel itself
acc[cur.key.name] = _libHelpers.t.isArrayExpression(cur.value) ? cur.value.elements.map(function (e) {
return e.value;
}) : _libHelpers.t.isUnaryExpression(cur.value) ? (cur.value.operator === '-' ? -1 : 1) * cur.value.argument.value : cur.value.value;
return acc;
}, {});
_motionNiceStyles2['default'](viewstyle);
rawStyles[tag] = viewstyle;
});
var stylesheet = _stilr2['default'].create(rawStyles, {
selector: function selector(tag) {
return getSelector(viewName, tag);
}
});
var classNamesObject = _libHelpers.t.objectExpression(Object.keys(stylesheet).reduce(function (acc, key) {
acc.push(_libHelpers.t.property(null, _libHelpers.t.literal(key), _libHelpers.t.literal(stylesheet[key])));
return acc;
}, []));
if (_libHelpers.options.writeStyle) _libHelpers.options.writeStyle(viewName, _stilr2['default'].render());
_stilr2['default'].clear();
// inline the static styles as js object for use when needing to override dynamics
var stylesObject = _libHelpers.t.objectExpression(Object.keys(styles).reduce(function (acc, key) {
acc.push(_libHelpers.t.property(null, _libHelpers.t.literal(key), _libHelpers.t.objectExpression(styles[key])));
return acc;
}, []));
// Motion.staticStyles('ViewName', {}, ``)
var staticStyleExpr = _libHelpers.t.expressionStatement(_libHelpers.t.callExpression(_libHelpers.t.identifier('Motion.staticStyles'), [_libHelpers.t.literal(viewName), classNamesObject, stylesObject]));
// Motion.viewRoots["Name"] = "RootElementName"
if (_libHelpers.shouldStyleAsRoot()) {
var viewRootNodeExpr = _libHelpers.t.expressionStatement(_libHelpers.t.assignmentExpression('=', _libHelpers.t.identifier('Motion.viewRoots["' + viewName + '"]'), _libHelpers.t.literal(_libHelpers.getRootTagName())));
return {
v: [staticStyleExpr, viewRootNodeExpr, node]
};
}
// reset
_state2['default'].inView = false;
_state2['default'].viewStyles[viewName] = {};
return {
v: [staticStyleExpr, node]
};
})();
if (typeof _ret === 'object') return _ret.v;
}
}
};
module.exports = exports['default'];