“use strict”;

Object.defineProperty(exports, “__esModule”, {

value: true

}); exports.default = loadBlockHoistPlugin;

function _sortBy() {

const data = _interopRequireDefault(require("lodash/sortBy"));

_sortBy = function () {
  return data;
};

return data;

}

var _config = _interopRequireDefault(require(“../config”));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

let LOADED_PLUGIN;

function loadBlockHoistPlugin() {

if (!LOADED_PLUGIN) {
  const config = (0, _config.default)({
    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 && bodyNode._blockHoist != null) {
          hasChange = true;
          break;
        }
      }

      if (!hasChange) return;
      node.body = (0, _sortBy().default)(node.body, function (bodyNode) {
        let priority = bodyNode && bodyNode._blockHoist;
        if (priority == null) priority = 1;
        if (priority === true) priority = 2;
        return -1 * priority;
      });
    }

  }
}

};