"use strict"; module.exports = function bfsTraverseCreator({ types: t, traverse }) { function getFields(path) { return t.VISITOR_KEYS[path.type]; } return function bfsTraverse(path, _visitor) { if (!path.node) { throw new Error("Not a valid path"); } const visitor = traverse.explode(_visitor); const queue = [path]; let current; while (queue.length > 0) { current = queue.shift(); // call if (visitor && visitor[current.type] && Array.isArray(visitor[current.type].enter)) { const fns = visitor[current.type].enter; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = fns[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { const fn = _step.value; if (typeof fn === "function") fn(current); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } const fields = getFields(current); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = fields[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { const field = _step2.value; const child = current.get(field); if (Array.isArray(child)) { // visit container left to right var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = child[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { const c = _step3.value; if (c.node) queue.push(c); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return != null) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } } else { if (child.node) queue.push(child); } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return != null) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } }; };