60 lines
No EOL
1.4 KiB
JavaScript
60 lines
No EOL
1.4 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = loadBlockHoistPlugin;
|
|
|
|
var _config = _interopRequireDefault(require("../config"));
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
const sortBy = require("lodash/sortBy");
|
|
|
|
let LOADED_PLUGIN;
|
|
|
|
function loadBlockHoistPlugin() {
|
|
if (!LOADED_PLUGIN) {
|
|
const config = _config.default.sync({
|
|
babelrc: false,
|
|
configFile: false,
|
|
plugins: [blockHoistPlugin]
|
|
});
|
|
|
|
LOADED_PLUGIN = config ? config.passes[0][0] : undefined;
|
|
if (!LOADED_PLUGIN) throw new Error("Assertion failure");
|
|
}
|
|
|
|
return LOADED_PLUGIN;
|
|
}
|
|
|
|
const blockHoistPlugin = {
|
|
name: "internal.blockHoist",
|
|
visitor: {
|
|
Block: {
|
|
exit({
|
|
node
|
|
}) {
|
|
let hasChange = false;
|
|
|
|
for (let i = 0; i < node.body.length; i++) {
|
|
const bodyNode = node.body[i];
|
|
|
|
if ((bodyNode == null ? void 0 : bodyNode._blockHoist) != null) {
|
|
hasChange = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!hasChange) return;
|
|
node.body = sortBy(node.body, function (bodyNode) {
|
|
let priority = bodyNode == null ? void 0 : bodyNode._blockHoist;
|
|
if (priority == null) priority = 1;
|
|
if (priority === true) priority = 2;
|
|
return -1 * priority;
|
|
});
|
|
}
|
|
|
|
}
|
|
}
|
|
}; |