motion
Version:
motion - moving development forward
158 lines (117 loc) • 5.73 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');
exports['default'] = {
enter: function enter(node, parent, scope, file) {
var el = node.openingElement;
// avoid reprocessing
if (node.motionJSXVisits != 2) {
var _iterator, _isArray, _i;
var _ref;
var _ret = (function () {
// add index keys for repeat elements
if (node.motionJSXVisits == 1) {
if (scope.hasBinding('_index')) {
el.name.elements.push(_libHelpers.t.identifier('_'));
el.name.elements.push(_libHelpers.t.identifier('_index'));
}
node.motionJSXVisits = 2;
return {
v: undefined
};
}
// top level JSX element
if (scope.hasOwnBinding('view')) {
_state2['default'].viewRootNodes.push(node);
}
inJSX = true;
node.motionJSXVisits = 1;
var name = _libHelpers.nodeToNameString(el.name);
// ['quotedname', key]
var key = undefined;
if (_state2['default'].keyBase[name]) key = ++_state2['default'].keyBase[name];else key = _state2['default'].keyBase[name] = 1;
var arr = [_libHelpers.t.literal(name), _libHelpers.t.literal(key)];
// track meta
if (_state2['default'].meta.views[_state2['default'].currentView]) {
_state2['default'].meta.views[_state2['default'].currentView].els[name] = {
location: _libHelpers.normalizeLocation(el.loc), key: key
};
}
/*
checks whether user is referencing variable or view
check root to see if the variable exists
Modal.Footer would have a root of Modal
*/
// safer, checks for file scope or view scope only
var _name$split = name.split('.');
var rootName = _name$split[0];
var children = _name$split.slice(1);
var isVariable = (scope.hasOwnBinding(rootName) || file.scope.hasOwnBinding(rootName)) && _libHelpers.isUpperCase(rootName);
// either gives <Modal> or <Modal.Header>
var getVar = function getVar(rootName, name) {
return rootName == name ? _libHelpers.t.identifier(name) : _libHelpers.t.memberExpression(_libHelpers.t.identifier(rootName), _libHelpers.t.identifier(children.join('.')));
};
if (isVariable) arr = [getVar(rootName, name)].concat(arr);
el.name = _libHelpers.t.arrayExpression(arr);
// process attributes
if (!el.attributes) return {
v: undefined
};
var rpt = _libHelpers.idFn;
var iff = _libHelpers.idFn;
var route = _libHelpers.idFn;
var _loop = function () {
if (_isArray) {
if (_i >= _iterator.length) return 'break';
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) return 'break';
_ref = _i.value;
}
var attr = _ref;
var attrName = attr.name && attr.name.name;
var expr = attr.value && (attr.value.expression || _libHelpers.t.literal(attr.value.value));
if (attrName == 'class' && _libHelpers.isUpperCase(name)) _state2['default'].viewHasChildWithClass = true;
if (_libHelpers.options.routing && attrName == 'route') {
route = function (_node) {
return _libHelpers.t.logicalExpression('&&', _libHelpers.t.callExpression(_libHelpers.t.identifier('Motion.routeMatch'), [expr]), _node);
};
// spread routeprops onto route
el.attributes.push(_libHelpers.t.JSXSpreadAttribute(_libHelpers.t.callExpression(_libHelpers.t.identifier('Motion.routeParams'), [expr])));
}
if (attrName == 'if') {
iff = function (_node) {
return _libHelpers.t.logicalExpression('&&', _libHelpers.t.callExpression(_libHelpers.t.identifier('Motion.iff'), [expr]), _node);
};
}
if (attrName == 'repeat') {
rpt = function (_node) {
// remove repeat from inner node
// const opening = _node.openingElement
// opening.attributes = opening.attributes.filter(attr => attr.name !== 'repeat')
return _libHelpers.t.callExpression(_libHelpers.t.memberExpression(_libHelpers.t.callExpression(_libHelpers.t.identifier('Motion.range'), [expr]), _libHelpers.t.identifier('map')), [_libHelpers.t.functionExpression(null, [_libHelpers.t.identifier('_'), _libHelpers.t.identifier('_index')], _libHelpers.t.blockStatement([_libHelpers.t.returnStatement(_node)]))]);
};
}
};
for (_iterator = el.attributes, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ret2 = _loop();
if (_ret2 === 'break') break;
}
// wrap outermost JSX elements (in views) in this.render()
var wrap = _libHelpers.idFn;
var isDirectChildOfView = scope.hasOwnBinding('view');
if (isDirectChildOfView) wrap = function (node) {
return _libHelpers.t.callExpression(_libHelpers.t.identifier('view.render'), [_libHelpers.t.functionExpression(null, [], _libHelpers.t.blockStatement([_libHelpers.t.returnStatement(node)]))]);
};
return {
v: wrap(iff(route(rpt(node))))
};
})();
if (typeof _ret === 'object') return _ret.v;
}
}
};
module.exports = exports['default'];