ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
149 lines (143 loc) • 17.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = traverse;
exports.normalizeVisitor = normalizeVisitor;
var _visitorKeys = require('../types/visitor-keys');
var _visitorKeys2 = _interopRequireDefault(_visitorKeys);
var _errors = require('./errors');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function visitNode(visitor, node) {
let handler = visitor[node.type] || visitor.All || null;
let result;
if (handler && handler['enter']) {
result = handler['enter'].call(null, node);
}
if (result !== undefined && result !== null) {
if (JSON.stringify(node) === JSON.stringify(result)) {
result = undefined;
} else if (Array.isArray(result)) {
return visitArray(visitor, result) || result;
} else {
return visitNode(visitor, result) || result;
}
}
if (result === undefined) {
let keys = _visitorKeys2.default[node.type];
for (let i = 0; i < keys.length; i++) {
visitKey(visitor, handler, node, keys[i]);
}
if (handler && handler['exit']) {
result = handler['exit'].call(null, node);
}
}
return result;
}
function visitKey(visitor, handler, node, key) {
let value = node[key];
if (!value) {
return;
}
let keyHandler = handler && (handler.keys[key] || handler.keys.All);
let result;
if (keyHandler && keyHandler.enter) {
result = keyHandler.enter.call(null, node, key);
if (result !== undefined) {
throw (0, _errors.cannotReplaceOrRemoveInKeyHandlerYet)(node, key);
}
}
if (Array.isArray(value)) {
visitArray(visitor, value);
} else {
let result = visitNode(visitor, value);
if (result !== undefined) {
assignKey(node, key, result);
}
}
if (keyHandler && keyHandler.exit) {
result = keyHandler.exit.call(null, node, key);
if (result !== undefined) {
throw (0, _errors.cannotReplaceOrRemoveInKeyHandlerYet)(node, key);
}
}
}
function visitArray(visitor, array) {
for (let i = 0; i < array.length; i++) {
let result = visitNode(visitor, array[i]);
if (result !== undefined) {
i += spliceArray(array, i, result) - 1;
}
}
}
function assignKey(node, key, result) {
if (result === null) {
throw (0, _errors.cannotRemoveNode)(node[key], node, key);
} else if (Array.isArray(result)) {
if (result.length === 1) {
node[key] = result[0];
} else {
if (result.length === 0) {
throw (0, _errors.cannotRemoveNode)(node[key], node, key);
} else {
throw (0, _errors.cannotReplaceNode)(node[key], node, key);
}
}
} else {
node[key] = result;
}
}
function spliceArray(array, index, result) {
if (result === null) {
array.splice(index, 1);
return 0;
} else if (Array.isArray(result)) {
array.splice(index, 1, ...result);
return result.length;
} else {
array.splice(index, 1, result);
return 1;
}
}
function traverse(node, visitor) {
visitNode(normalizeVisitor(visitor), node);
}
function normalizeVisitor(visitor) {
let normalizedVisitor = {};
for (let type in visitor) {
let handler = visitor[type] || visitor.All;
let normalizedKeys = {};
if (typeof handler === 'object') {
let keys = handler.keys;
if (keys) {
for (let key in keys) {
let keyHandler = keys[key];
if (typeof keyHandler === 'object') {
normalizedKeys[key] = {
enter: typeof keyHandler.enter === 'function' ? keyHandler.enter : null,
exit: typeof keyHandler.exit === 'function' ? keyHandler.exit : null
};
} else if (typeof keyHandler === 'function') {
normalizedKeys[key] = {
enter: keyHandler,
exit: null
};
}
}
}
normalizedVisitor[type] = {
enter: typeof handler.enter === 'function' ? handler.enter : null,
exit: typeof handler.exit === 'function' ? handler.exit : null,
keys: normalizedKeys
};
} else if (typeof handler === 'function') {
normalizedVisitor[type] = {
enter: handler,
exit: null,
keys: normalizedKeys
};
}
}
return normalizedVisitor;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90cmF2ZXJzYWwvdHJhdmVyc2UuanMiXSwibmFtZXMiOlsidHJhdmVyc2UiLCJub3JtYWxpemVWaXNpdG9yIiwidmlzaXROb2RlIiwidmlzaXRvciIsIm5vZGUiLCJoYW5kbGVyIiwidHlwZSIsIkFsbCIsInJlc3VsdCIsImNhbGwiLCJ1bmRlZmluZWQiLCJKU09OIiwic3RyaW5naWZ5IiwiQXJyYXkiLCJpc0FycmF5IiwidmlzaXRBcnJheSIsImtleXMiLCJpIiwibGVuZ3RoIiwidmlzaXRLZXkiLCJrZXkiLCJ2YWx1ZSIsImtleUhhbmRsZXIiLCJlbnRlciIsImFzc2lnbktleSIsImV4aXQiLCJhcnJheSIsInNwbGljZUFycmF5IiwiaW5kZXgiLCJzcGxpY2UiLCJub3JtYWxpemVkVmlzaXRvciIsIm5vcm1hbGl6ZWRLZXlzIl0sIm1hcHBpbmdzIjoiOzs7OztrQkE2RndCQSxRO1FBR1JDLGdCLEdBQUFBLGdCOztBQWhHaEI7Ozs7QUFDQTs7OztBQUNBLFNBQVNDLFNBQVQsQ0FBbUJDLE9BQW5CLEVBQTRCQyxJQUE1QixFQUFrQztBQUM5QixRQUFJQyxVQUFVRixRQUFRQyxLQUFLRSxJQUFiLEtBQXNCSCxRQUFRSSxHQUE5QixJQUFxQyxJQUFuRDtBQUNBLFFBQUlDLE1BQUo7QUFDQSxRQUFJSCxXQUFXQSxRQUFRLE9BQVIsQ0FBZixFQUFpQztBQUM3QkcsaUJBQVNILFFBQVEsT0FBUixFQUFpQkksSUFBakIsQ0FBc0IsSUFBdEIsRUFBNEJMLElBQTVCLENBQVQ7QUFDSDtBQUNELFFBQUlJLFdBQVdFLFNBQVgsSUFBd0JGLFdBQVcsSUFBdkMsRUFBNkM7QUFDekMsWUFBSUcsS0FBS0MsU0FBTCxDQUFlUixJQUFmLE1BQXlCTyxLQUFLQyxTQUFMLENBQWVKLE1BQWYsQ0FBN0IsRUFBcUQ7QUFDakRBLHFCQUFTRSxTQUFUO0FBQ0gsU0FGRCxNQUVPLElBQUlHLE1BQU1DLE9BQU4sQ0FBY04sTUFBZCxDQUFKLEVBQTJCO0FBQzlCLG1CQUFPTyxXQUFX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SSxPQUFPMUIsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUN0Q3lCLDhCQUFrQnhCLElBQWxCLElBQTBCO0FBQ3RCaUIsdUJBQU9sQixPQURlO0FBRXRCb0Isc0JBQU0sSUFGZ0I7QUFHdEJULHNCQUFNZTtBQUhnQixhQUExQjtBQUtIO0FBQ0o7QUFDRCxXQUFPRCxpQkFBUDtBQUNIIiwiZmlsZSI6ImxpYi90cmF2ZXJzYWwvdHJhdmVyc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdmlzaXRvcktleXMgZnJvbSAnLi4vdHlwZXMvdmlzaXRvci1rZXlzJztcbmltcG9ydCB7IGNhbm5vdFJlbW92ZU5vZGUsIGNhbm5vdFJlcGxhY2VOb2RlLCBjYW5ub3RSZXBsYWNlT3JSZW1vdmVJbktleUhhbmRsZXJZZXQgfSBmcm9tICcuL2Vycm9ycyc7XG5mdW5jdGlvbiB2aXNpdE5vZGUodmlzaXRvciwgbm9kZSkge1xuICAgIGxldCBoYW5kbGVyID0gdmlzaXRvcltub2RlLnR5cGVdIHx8IHZpc2l0b3IuQWxsIHx8IG51bGw7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyWydlbnRlciddKSB7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZXJbJ2VudGVyJ10uY2FsbChudWxsLCBub2RlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkobm9kZSkgPT09IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2aXNpdEFycmF5KHZpc2l0b3IsIHJlc3VsdCkgfHwgcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZpc2l0Tm9kZSh2aXNpdG9yLCByZXN1bHQpIHx8IHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGtleXMgPSB2aXNpdG9yS2V5c1tub2RlLnR5cGVdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZpc2l0S2V5KHZpc2l0b3IsIGhhbmRsZXIsIG5vZGUsIGtleXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyICYmIGhhbmRsZXJbJ2V4aXQnXSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlclsnZXhpdCddLmNhbGwobnVsbCwgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHZpc2l0S2V5KHZpc2l0b3IsIGhhbmRsZXIsIG5vZGUsIGtleSkge1xuICAgIGxldCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGtleUhhbmRsZXIgPSBoYW5kbGVyICYmIChoYW5kbGVyLmtleXNba2V5XSB8fCBoYW5kbGVyLmtleXMuQWxsKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChrZXlIYW5kbGVyICYmIGtleUhhbmRsZXIuZW50ZXIpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5SGFuZGxlci5lbnRlci5jYWxsKG51bGwsIG5vZGUsIGtleSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgY2Fubm90UmVwbGFjZU9yUmVtb3ZlSW5LZXlIYW5kbGVyWWV0KG5vZGUsIGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZpc2l0QXJyYXkodmlzaXRvciwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB2aXNpdE5vZGUodmlzaXRvciwgdmFsdWUpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2lnbktleShub2RlLCBrZXksIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleUhhbmRsZXIgJiYga2V5SGFuZGxlci5leGl0KSB7XG4gICAgICAgIHJlc3VsdCA9IGtleUhhbmRsZXIuZXhpdC5jYWxsKG51bGwsIG5vZGUsIGtleSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgY2Fubm90UmVwbGFjZU9yUmVtb3ZlSW5LZXlIYW5kbGVyWWV0KG5vZGUsIGtleSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2aXNpdEFycmF5KHZpc2l0b3IsIGFycmF5KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdmlzaXROb2RlKHZpc2l0b3IsIGFycmF5W2ldKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpICs9IHNwbGljZUFycmF5KGFycmF5LCBpLCByZXN1bHQpIC0gMTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2lnbktleShub2RlLCBrZXksIHJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgY2Fubm90UmVtb3ZlTm9kZShub2RlW2tleV0sIG5vZGUsIGtleSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIG5vZGVba2V5XSA9IHJlc3VsdFswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgY2Fubm90UmVtb3ZlTm9kZShub2RlW2tleV0sIG5vZGUsIGtleSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGNhbm5vdFJlcGxhY2VOb2RlKG5vZGVba2V5XSwgbm9kZSwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVba2V5XSA9IHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBzcGxpY2VBcnJheShhcnJheSwgaW5kZXgsIHJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxLCAuLi5yZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYXZlcnNlKG5vZGUsIHZpc2l0b3IpIHtcbiAgICB2aXNpdE5vZGUobm9ybWFsaXplVmlzaXRvcih2aXNpdG9yKSwgbm9kZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVmlzaXRvcih2aXNpdG9yKSB7XG4gICAgbGV0IG5vcm1hbGl6ZWRWaXNpdG9yID0ge307XG4gICAgZm9yIChsZXQgdHlwZSBpbiB2aXNpdG9yKSB7XG4gICAgICAgIGxldCBoYW5kbGVyID0gdmlzaXRvclt0eXBlXSB8fCB2aXNpdG9yLkFsbDtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRLZXlzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGxldCBrZXlzID0gaGFuZGxlci5rZXlzO1xuICAgICAgICAgICAgaWYgKGtleXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4ga2V5cykge1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5SGFuZGxlciA9IGtleXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXlIYW5kbGVyID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEtleXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRlcjogdHlwZW9mIGtleUhhbmRsZXIuZW50ZXIgPT09ICdmdW5jdGlvbicgPyBrZXlIYW5kbGVyLmVudGVyIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0OiB0eXBlb2Yga2V5SGFuZGxlci5leGl0ID09PSAnZnVuY3Rpb24nID8ga2V5SGFuZGxlci5leGl0IDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEtleXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRlcjoga2V5SGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0OiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9ybWFsaXplZFZpc2l0b3JbdHlwZV0gPSB7XG4gICAgICAgICAgICAgICAgZW50ZXI6IHR5cGVvZiBoYW5kbGVyLmVudGVyID09PSAnZnVuY3Rpb24nID8gaGFuZGxlci5lbnRlciA6IG51bGwsXG4gICAgICAgICAgICAgICAgZXhpdDogdHlwZW9mIGhhbmRsZXIuZXhpdCA9PT0gJ2Z1bmN0aW9uJyA/IGhhbmRsZXIuZXhpdCA6IG51bGwsXG4gICAgICAgICAgICAgICAga2V5czogbm9ybWFsaXplZEtleXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRWaXNpdG9yW3R5cGVdID0ge1xuICAgICAgICAgICAgICAgIGVudGVyOiBoYW5kbGVyLFxuICAgICAgICAgICAgICAgIGV4aXQ6IG51bGwsXG4gICAgICAgICAgICAgICAga2V5czogbm9ybWFsaXplZEtleXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRWaXNpdG9yO1xufSJdfQ==