motion
Version:
motion - moving development forward
125 lines (89 loc) • 4.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _state = require('../state');
var _state2 = _interopRequireDefault(_state);
var _helpers = require('../lib/helpers');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }
exports.default = {
enter(node, parent, scope, file) {
const el = node.openingElement;
// avoid reprocessing
if (node.motionJSXVisits != 2) {
// add index keys for repeat elements
if (node.motionJSXVisits == 1) {
if (scope.hasBinding('_index')) {
el.name.elements.push(_helpers.t.identifier('_'));
el.name.elements.push(_helpers.t.identifier('_index'));
}
node.motionJSXVisits = 2;
return;
}
// top level JSX element
if (scope.hasOwnBinding('view')) {
_state2.default.viewRootNodes.push(node);
}
node.motionJSXVisits = 1;
const name = (0, _helpers.nodeToNameString)(el.name);
// ['quotedname', key]
let key;
if (_state2.default.keyBase[name]) key = ++_state2.default.keyBase[name];else key = _state2.default.keyBase[name] = 1;
let arr = [_helpers.t.literal(name), _helpers.t.literal(key)];
// track meta
if (_state2.default.meta.views[_state2.default.currentView]) {
_state2.default.meta.views[_state2.default.currentView].els[name] = {
location: (0, _helpers.normalizeLocation)(el.loc), 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 _name$split2 = _toArray(_name$split);
let rootName = _name$split2[0];
let children = _name$split2.slice(1);
let isVariable = (scope.hasOwnBinding(rootName) || file.scope.hasOwnBinding(rootName)) && (0, _helpers.isUpperCase)(rootName);
// either gives <Modal> or <Modal.Header>
const getVar = (rootName, name) => rootName == name ? _helpers.t.identifier(name) : _helpers.t.memberExpression(_helpers.t.identifier(rootName), _helpers.t.identifier(children.join('.')));
if (isVariable) arr = [getVar(rootName, name)].concat(arr);
el.name = _helpers.t.arrayExpression(arr);
// process attributes
if (!el.attributes) return;
let rpt = _helpers.idFn;
let iff = _helpers.idFn;
let route = _helpers.idFn;
for (let attr of el.attributes) {
const attrName = attr.name && attr.name.name;
const expr = attr.value && (attr.value.expression || _helpers.t.literal(attr.value.value));
if (attrName == 'class' && (0, _helpers.isUpperCase)(name)) _state2.default.viewHasChildWithClass = true;
if (_helpers.options.routing && attrName == 'route') {
route = _node => _helpers.t.logicalExpression('&&', _helpers.t.callExpression(_helpers.t.identifier('Motion.routeMatch'), [expr]), _node);
// spread routeprops onto route
el.attributes.push(_helpers.t.JSXSpreadAttribute(_helpers.t.callExpression(_helpers.t.identifier('Motion.routeParams'), [expr])));
}
if (attrName == 'if') {
iff = _node => _helpers.t.logicalExpression('&&', _helpers.t.callExpression(_helpers.t.identifier('Motion.iff'), [expr]), _node);
}
if (attrName == 'repeat') {
rpt = _node => {
// remove repeat from inner node
// const opening = _node.openingElement
// opening.attributes = opening.attributes.filter(attr => attr.name !== 'repeat')
return _helpers.t.callExpression(_helpers.t.memberExpression(_helpers.t.callExpression(_helpers.t.identifier('Motion.range'), [expr]), _helpers.t.identifier('map')), [_helpers.t.functionExpression(null, [_helpers.t.identifier('_'), _helpers.t.identifier('_index')], _helpers.t.blockStatement([_helpers.t.returnStatement(_node)]))]);
};
}
}
// wrap outermost JSX elements (in views) in this.render()
let wrap = _helpers.idFn;
const isDirectChildOfView = scope.hasOwnBinding('view');
if (isDirectChildOfView) wrap = node => _helpers.t.callExpression(_helpers.t.identifier('view.render'), [_helpers.t.functionExpression(null, [], _helpers.t.blockStatement([_helpers.t.returnStatement(node)]))]);
return wrap(iff(route(rpt(node))));
}
}
};
//# sourceMappingURL=JSXElement.js.map