“use strict”;

Object.defineProperty(exports, “__esModule”, {

value: true

}); exports.default = _default; exports.CodeGenerator = void 0;

var _sourceMap = _interopRequireDefault(require(“./source-map”));

var _printer = _interopRequireDefault(require(“./printer”));

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

class Generator extends _printer.default {

constructor(ast, opts = {}, code) {
  const format = normalizeOptions(code, opts);
  const map = opts.sourceMaps ? new _sourceMap.default(opts, code) : null;
  super(format, map);
  this.ast = ast;
}

generate() {
  return super.generate(this.ast);
}

}

function normalizeOptions(code, opts) {

const format = {
  auxiliaryCommentBefore: opts.auxiliaryCommentBefore,
  auxiliaryCommentAfter: opts.auxiliaryCommentAfter,
  shouldPrintComment: opts.shouldPrintComment,
  retainLines: opts.retainLines,
  retainFunctionParens: opts.retainFunctionParens,
  comments: opts.comments == null || opts.comments,
  compact: opts.compact,
  minified: opts.minified,
  concise: opts.concise,
  jsonCompatibleStrings: opts.jsonCompatibleStrings,
  indent: {
    adjustMultilineComment: true,
    style: "  ",
    base: 0
  },
  decoratorsBeforeExport: !!opts.decoratorsBeforeExport,
  jsescOption: Object.assign({
    quotes: "double",
    wrap: true
  }, opts.jsescOption)
};

if (format.minified) {
  format.compact = true;

  format.shouldPrintComment = format.shouldPrintComment || (() => format.comments);
} else {
  format.shouldPrintComment = format.shouldPrintComment || (value => format.comments || value.indexOf("@license") >= 0 || value.indexOf("@preserve") >= 0);
}

if (format.compact === "auto") {
  format.compact = code.length > 500000;

  if (format.compact) {
    console.error("[BABEL] Note: The code generator has deoptimised the styling of " + `${opts.filename} as it exceeds the max of ${"500KB"}.`);
  }
}

if (format.compact) {
  format.indent.adjustMultilineComment = false;
}

return format;

}

class CodeGenerator {

constructor(ast, opts, code) {
  this._generator = new Generator(ast, opts, code);
}

generate() {
  return this._generator.generate();
}

}

exports.CodeGenerator = CodeGenerator;

function _default(ast, opts, code) {

const gen = new Generator(ast, opts, code);
return gen.generate();

}