“use strict”;

Object.defineProperty(exports, “__esModule”, {

value: true

}); exports.parseSync = parseSync; exports.parseAsync = parseAsync; exports.parse = void 0;

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

var _normalizeFile = _interopRequireDefault(require(“./transformation/normalize-file”));

var _normalizeOpts = _interopRequireDefault(require(“./transformation/normalize-opts”));

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

const parse = function parse(code, opts, callback) {

if (typeof opts === "function") {
  callback = opts;
  opts = undefined;
}

if (callback === undefined) return parseSync(code, opts);
const config = (0, _config.default)(opts);

if (config === null) {
  return null;
}

const cb = callback;
process.nextTick(() => {
  let ast = null;

  try {
    const cfg = (0, _config.default)(opts);
    if (cfg === null) return cb(null, null);
    ast = (0, _normalizeFile.default)(cfg.passes, (0, _normalizeOpts.default)(cfg), code).ast;
  } catch (err) {
    return cb(err);
  }

  cb(null, ast);
});

};

exports.parse = parse;

function parseSync(code, opts) {

const config = (0, _config.default)(opts);

if (config === null) {
  return null;
}

return (0, _normalizeFile.default)(config.passes, (0, _normalizeOpts.default)(config), code).ast;

}

function parseAsync(code, opts) {

return new Promise((res, rej) => {
  parse(code, opts, (err, result) => {
    if (err == null) res(result);else rej(err);
  });
});

}