mirror of
https://github.com/S2-/minifyfromhtml.git
synced 2025-08-03 12:20:04 +02:00
105 lines
3.2 KiB
JavaScript
105 lines
3.2 KiB
JavaScript
"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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}; |