UNPKG

ember-legacy-class-transform

Version:
149 lines (143 loc) 17.5 kB
'use strict'; 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==