UNPKG

motion

Version:

motion - moving development forward

125 lines (89 loc) 4.65 kB
'use strict'; 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