UNPKG

ember-legacy-class-transform

Version:
135 lines 17.4 kB
import visitorKeys from '../types/visitor-keys'; import { cannotRemoveNode, cannotReplaceNode, cannotReplaceOrRemoveInKeyHandlerYet } from './errors'; function visitNode(visitor, node) { var handler = visitor[node.type] || visitor.All || null; var result = void 0; 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) { var keys = visitorKeys[node.type]; for (var 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) { var value = node[key]; if (!value) { return; } var keyHandler = handler && (handler.keys[key] || handler.keys.All); var result = void 0; if (keyHandler && keyHandler.enter) { result = keyHandler.enter.call(null, node, key); if (result !== undefined) { throw cannotReplaceOrRemoveInKeyHandlerYet(node, key); } } if (Array.isArray(value)) { visitArray(visitor, value); } else { var _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 cannotReplaceOrRemoveInKeyHandlerYet(node, key); } } } function visitArray(visitor, array) { for (var i = 0; i < array.length; i++) { var result = visitNode(visitor, array[i]); if (result !== undefined) { i += spliceArray(array, i, result) - 1; } } } function assignKey(node, key, result) { if (result === null) { throw cannotRemoveNode(node[key], node, key); } else if (Array.isArray(result)) { if (result.length === 1) { node[key] = result[0]; } else { if (result.length === 0) { throw cannotRemoveNode(node[key], node, key); } else { throw 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.apply(array, [index, 1].concat(result)); return result.length; } else { array.splice(index, 1, result); return 1; } } export default function traverse(node, visitor) { visitNode(normalizeVisitor(visitor), node); } export function normalizeVisitor(visitor) { var normalizedVisitor = {}; for (var type in visitor) { var handler = visitor[type] || visitor.All; var normalizedKeys = {}; if (typeof handler === 'object') { var keys = handler.keys; if (keys) { for (var key in keys) { var 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90cmF2ZXJzYWwvdHJhdmVyc2UuanMiXSwibmFtZXMiOlsidmlzaXRvcktleXMiLCJjYW5ub3RSZW1vdmVOb2RlIiwiY2Fubm90UmVwbGFjZU5vZGUiLCJjYW5ub3RSZXBsYWNlT3JSZW1vdmVJbktleUhhbmRsZXJZZXQiLCJ2aXNpdE5vZGUiLCJ2aXNpdG9yIiwibm9kZSIsImhhbmRsZXIiLCJ0eXBlIiwiQWxsIiwicmVzdWx0IiwiY2FsbCIsInVuZGVmaW5lZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJBcnJheSIsImlzQXJyYXkiLCJ2aXNpdEFycmF5Iiwia2V5cyIsImkiLCJsZW5ndGgiLCJ2aXNpdEtleSIsImtleSIsInZhbHVlIiwia2V5SGFuZGxlciIsImVudGVyIiwiYXNzaWduS2V5IiwiZXhpdCIsImFycmF5Iiwic3BsaWNlQXJyYXkiLCJpbmRleCIsInNwbGljZSIsInRyYXZlcnNlIiwibm9ybWFsaXplVmlzaXRvciIsIm5vcm1hbGl6ZWRWaXNpdG9yIiwibm9ybWFsaXplZEtleXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsdUJBQXhCO0FBQ0EsU0FBU0MsZ0JBQVQsRUFBMkJDLGlCQUEzQixFQUE4Q0Msb0NBQTlDLFFBQTBGLFVBQTFGO0FBQ0EsU0FBU0MsU0FBVCxDQUFtQkMsT0FBbkIsRUFBNEJDLElBQTVCLEVBQWtDO0FBQzlCLFFBQUlDLFVBQVVGLFFBQVFDLEtBQUtFLElBQWIsS0FBc0JILFFBQVFJLEdBQTlCLElBQXFDLElBQW5EO0FBQ0EsUUFBSUMsZUFBSjtBQUNBLFFBQUlILFdBQVdBLFFBQVEsT0FBUixDQUFmLEVBQWlDO0FBQzdCRyxpQkFBU0gsUUFBUSxPQUFSLEVBQWlCSSxJQUFqQixDQUFzQixJQUF0QixFQUE0QkwsSUFBNUIsQ0FBVDtBQUNIO0FBQ0QsUUFBSUksV0FBV0UsU0FBWCxJQUF3QkYsV0FBVyxJQUF2QyxFQUE2QztBQUN6QyxZQUFJRyxLQUFLQyxTQUFMLENBQWVSLElBQWYsTUFBeUJP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QixLQUE5QyxHQUFzRCxJQUR2QztBQUV0QkUsc0JBQU0sT0FBT3BCLFFBQVFvQixJQUFmLEtBQXdCLFVBQXhCLEdBQXFDcEIsUUFBUW9CLElBQTdDLEdBQW9ELElBRnBDO0FBR3RCVCxzQkFBTWlCO0FBSGdCLGFBQTFCO0FBS0gsU0F2QkQsTUF1Qk8sSUFBSSxPQUFPNUIsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUN0QzJCLDhCQUFrQjFCLElBQWxCLElBQTBCO0FBQ3RCaUIsdUJBQU9sQixPQURlO0FBRXRCb0Isc0JBQU0sSUFGZ0I7QUFHdEJULHNCQUFNaUI7QUFIZ0IsYUFBMUI7QUFLSDtBQUNKO0FBQ0QsV0FBT0QsaUJBQVA7QUFDSCIsImZpbGUiOiJsaWIvdHJhdmVyc2FsL3RyYXZlcnNlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHZpc2l0b3JLZXlzIGZyb20gJy4uL3R5cGVzL3Zpc2l0b3Ita2V5cyc7XG5pbXBvcnQgeyBjYW5ub3RSZW1vdmVOb2RlLCBjYW5ub3RSZXBsYWNlTm9kZSwgY2Fubm90UmVwbGFjZU9yUmVtb3ZlSW5LZXlIYW5kbGVyWWV0IH0gZnJvbSAnLi9lcnJvcnMnO1xuZnVuY3Rpb24gdmlzaXROb2RlKHZpc2l0b3IsIG5vZGUpIHtcbiAgICBsZXQgaGFuZGxlciA9IHZpc2l0b3Jbbm9kZS50eXBlXSB8fCB2aXNpdG9yLkFsbCB8fCBudWxsO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlclsnZW50ZXInXSkge1xuICAgICAgICByZXN1bHQgPSBoYW5kbGVyWydlbnRlciddLmNhbGwobnVsbCwgbm9kZSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG5vZGUpID09PSBKU09OLnN0cmluZ2lmeShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRBcnJheSh2aXNpdG9yLCByZXN1bHQpIHx8IHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2aXNpdE5vZGUodmlzaXRvciwgcmVzdWx0KSB8fCByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBrZXlzID0gdmlzaXRvcktleXNbbm9kZS50eXBlXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2aXNpdEtleSh2aXNpdG9yLCBoYW5kbGVyLCBub2RlLCBrZXlzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyWydleGl0J10pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXJbJ2V4aXQnXS5jYWxsKG51bGwsIG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB2aXNpdEtleSh2aXNpdG9yLCBoYW5kbGVyLCBub2RlLCBrZXkpIHtcbiAgICBsZXQgdmFsdWUgPSBub2RlW2tleV07XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBrZXlIYW5kbGVyID0gaGFuZGxlciAmJiAoaGFuZGxlci5rZXlzW2tleV0gfHwgaGFuZGxlci5rZXlzLkFsbCk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoa2V5SGFuZGxlciAmJiBrZXlIYW5kbGVyLmVudGVyKSB7XG4gICAgICAgIHJlc3VsdCA9IGtleUhhbmRsZXIuZW50ZXIuY2FsbChudWxsLCBub2RlLCBrZXkpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IGNhbm5vdFJlcGxhY2VPclJlbW92ZUluS2V5SGFuZGxlcllldChub2RlLCBrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2aXNpdEFycmF5KHZpc2l0b3IsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdmlzaXROb2RlKHZpc2l0b3IsIHZhbHVlKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NpZ25LZXkobm9kZSwga2V5LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChrZXlIYW5kbGVyICYmIGtleUhhbmRsZXIuZXhpdCkge1xuICAgICAgICByZXN1bHQgPSBrZXlIYW5kbGVyLmV4aXQuY2FsbChudWxsLCBub2RlLCBrZXkpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IGNhbm5vdFJlcGxhY2VPclJlbW92ZUluS2V5SGFuZGxlcllldChub2RlLCBrZXkpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdmlzaXRBcnJheSh2aXNpdG9yLCBhcnJheSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHZpc2l0Tm9kZSh2aXNpdG9yLCBhcnJheVtpXSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaSArPSBzcGxpY2VBcnJheShhcnJheSwgaSwgcmVzdWx0KSAtIDE7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhc3NpZ25LZXkobm9kZSwga2V5LCByZXN1bHQpIHtcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IGNhbm5vdFJlbW92ZU5vZGUobm9kZVtrZXldLCBub2RlLCBrZXkpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSByZXN1bHRbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IGNhbm5vdFJlbW92ZU5vZGUobm9kZVtrZXldLCBub2RlLCBrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBjYW5ub3RSZXBsYWNlTm9kZShub2RlW2tleV0sIG5vZGUsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBub2RlW2tleV0gPSByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gc3BsaWNlQXJyYXkoYXJyYXksIGluZGV4LCByZXN1bHQpIHtcbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSwgLi4ucmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmF2ZXJzZShub2RlLCB2aXNpdG9yKSB7XG4gICAgdmlzaXROb2RlKG5vcm1hbGl6ZVZpc2l0b3IodmlzaXRvciksIG5vZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVZpc2l0b3IodmlzaXRvcikge1xuICAgIGxldCBub3JtYWxpemVkVmlzaXRvciA9IHt9O1xuICAgIGZvciAobGV0IHR5cGUgaW4gdmlzaXRvcikge1xuICAgICAgICBsZXQgaGFuZGxlciA9IHZpc2l0b3JbdHlwZV0gfHwgdmlzaXRvci5BbGw7XG4gICAgICAgIGxldCBub3JtYWxpemVkS2V5cyA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBsZXQga2V5cyA9IGhhbmRsZXIua2V5cztcbiAgICAgICAgICAgIGlmIChrZXlzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleUhhbmRsZXIgPSBrZXlzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5SGFuZGxlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRLZXlzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXI6IHR5cGVvZiBrZXlIYW5kbGVyLmVudGVyID09PSAnZnVuY3Rpb24nID8ga2V5SGFuZGxlci5lbnRlciA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDogdHlwZW9mIGtleUhhbmRsZXIuZXhpdCA9PT0gJ2Z1bmN0aW9uJyA/IGtleUhhbmRsZXIuZXhpdCA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleUhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRLZXlzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXI6IGtleUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vcm1hbGl6ZWRWaXNpdG9yW3R5cGVdID0ge1xuICAgICAgICAgICAgICAgIGVudGVyOiB0eXBlb2YgaGFuZGxlci5lbnRlciA9PT0gJ2Z1bmN0aW9uJyA/IGhhbmRsZXIuZW50ZXIgOiBudWxsLFxuICAgICAgICAgICAgICAgIGV4aXQ6IHR5cGVvZiBoYW5kbGVyLmV4aXQgPT09ICdmdW5jdGlvbicgPyBoYW5kbGVyLmV4aXQgOiBudWxsLFxuICAgICAgICAgICAgICAgIGtleXM6IG5vcm1hbGl6ZWRLZXlzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBub3JtYWxpemVkVmlzaXRvclt0eXBlXSA9IHtcbiAgICAgICAgICAgICAgICBlbnRlcjogaGFuZGxlcixcbiAgICAgICAgICAgICAgICBleGl0OiBudWxsLFxuICAgICAgICAgICAgICAgIGtleXM6IG5vcm1hbGl6ZWRLZXlzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkVmlzaXRvcjtcbn0iXX0=