twreporter-react
Version:
React-Redux site for The Reporter Foundation in Taiwan
94 lines (67 loc) • 2.67 kB
JavaScript
;
var _getIterator = require("babel-runtime/core-js/get-iterator")["default"];
var _interopRequireDefault = require("babel-runtime/helpers/interop-require-default")["default"];
var _interopRequireWildcard = require("babel-runtime/helpers/interop-require-wildcard")["default"];
exports.__esModule = true;
var _babelHelperBindifyDecorators = require("babel-helper-bindify-decorators");
var _babelHelperBindifyDecorators2 = _interopRequireDefault(_babelHelperBindifyDecorators);
var _babelTypes = require("babel-types");
var t = _interopRequireWildcard(_babelTypes);
/*:: import type { NodePath } from "babel-traverse"*/
exports["default"] = function (classPath) {
classPath.assertClass();
var memoisedExpressions = [];
function maybeMemoise(path) {
if (!path.node || path.isPure()) return;
var uid = classPath.scope.generateDeclaredUidIdentifier();
memoisedExpressions.push(t.assignmentExpression("=", uid, path.node));
path.replaceWith(uid);
}
function memoiseDecorators(paths /*: Array<NodePath>*/) {
if (!Array.isArray(paths) || !paths.length) return;
// ensure correct evaluation order of decorators
paths = paths.reverse();
// bind decorators if they're member expressions
_babelHelperBindifyDecorators2["default"](paths);
for (var _iterator = paths, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var path = _ref;
maybeMemoise(path);
}
}
maybeMemoise(classPath.get("superClass"));
memoiseDecorators(classPath.get("decorators"), true);
var methods /*: Array<NodePath>*/ = classPath.get("body.body");
for (var _iterator2 = methods, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
var _ref2;
if (_isArray2) {
if (_i2 >= _iterator2.length) break;
_ref2 = _iterator2[_i2++];
} else {
_i2 = _iterator2.next();
if (_i2.done) break;
_ref2 = _i2.value;
}
var methodPath = _ref2;
if (methodPath.is("computed")) {
maybeMemoise(methodPath.get("key"));
}
if (methodPath.has("decorators")) {
memoiseDecorators(classPath.get("decorators"));
}
}
if (memoisedExpressions) {
classPath.insertBefore(memoisedExpressions.map(function (expr) {
return t.expressionStatement(expr);
}));
}
};
module.exports = exports["default"];