"use strict";

exports.__esModule = true;
exports.default = void 0;

var _normalizeOptions = _interopRequireDefault(require("./normalizeOptions"));

var _resolvePath = _interopRequireDefault(require("./resolvePath"));

exports.resolvePath = _resolvePath.default;

var _call = _interopRequireDefault(require("./transformers/call"));

var _import = _interopRequireDefault(require("./transformers/import"));

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

// Public API for external plugins
const importVisitors = {
  CallExpression: _call.default,
  'ImportDeclaration|ExportDeclaration': _import.default
};
const visitor = {
  Program: {
    enter(programPath, state) {
      programPath.traverse(importVisitors, state);
    },

    exit(programPath, state) {
      programPath.traverse(importVisitors, state);
    }

  }
};

var _default = ({
  types
}) => ({
  name: 'module-resolver',

  manipulateOptions(opts) {
    if (opts.filename === undefined) {
      opts.filename = 'unknown';
    }
  },

  pre(file) {
    this.types = types;
    const currentFile = file.opts.filename;
    this.normalizedOpts = (0, _normalizeOptions.default)(currentFile, this.opts); // We need to keep track of all handled nodes so we do not try to transform them twice,
    // because we run before (enter) and after (exit) all nodes are handled

    this.moduleResolverVisited = new Set();
  },

  visitor,

  post() {
    this.moduleResolverVisited.clear();
  }

});

exports.default = _default;