// GENERATED FILE. DO NOT EDIT.
(function (global, factory) {
  function preferDefault(exports) {
    return exports.default || exports;
  }
  if (typeof define === "function" && define.amd) {
    define(["@babel/helper-plugin-utils", "path", "@babel/helper-module-transforms", "@babel/core"], function (_helperPluginUtils, _path, _helperModuleTransforms, _core) {
      var exports = {};
      factory(exports, _helperPluginUtils, _path, _helperModuleTransforms, _core);
      return preferDefault(exports);
    });
  } else if (typeof exports === "object") {
    factory(exports, require("@babel/helper-plugin-utils"), require("path"), require("@babel/helper-module-transforms"), require("@babel/core"));
    if (typeof module === "object") module.exports = preferDefault(exports);
  } else {
    (function () {
      var exports = {};
      factory(exports, global.helperPluginUtils, global.path, global.helperModuleTransforms, global.core);
      global.esm2umd = preferDefault(exports);
    })();
  }
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _helperPluginUtils, _path, _helperModuleTransforms, _core) {
  "use strict";

  Object.defineProperty(_exports, "__esModule", {
    value: true
  });
  _exports.default = esm2umd;
  const buildPrerequisiteAssignment = (0, _core.template)(`
  GLOBAL_REFERENCE = GLOBAL_REFERENCE || {}
`);
  const buildWrapper = (0, _core.template)(`
  (function (global, factory) {
    function preferDefault(exports) {
      return exports.default || exports;
    }
    if (typeof define === "function" && define.amd) {
      define(AMD_ARGUMENTS, function(FORWARD_NAMES) {
        var exports = {};
        factory(exports, FORWARD_NAMES);
        return preferDefault(exports);
      });
    } else if (typeof exports === "object") {
      factory(COMMONJS_ARGUMENTS);
      if (typeof module === "object") module.exports = preferDefault(exports);
    } else {
      (function() {
        var exports = {};
        factory(BROWSER_ARGUMENTS);
        GLOBAL_TO_ASSIGN;
      })();
    }
  })(
    typeof globalThis !== "undefined" ? globalThis
      : typeof self !== "undefined" ? self
      : this,
    function(IMPORT_NAMES) {
  })
`);
  const transformModulesUmd = (0, _helperPluginUtils.declare)((api, options) => {
    api.assertVersion(7);
    const {
      globals,
      exactGlobals,
      loose,
      allowTopLevelThis,
      strict,
      strictMode,
      noInterop
    } = options;

    /**
     * Build the assignment statements that initialize the UMD global.
     */
    function buildBrowserInit(browserGlobals, exactGlobals, filename, moduleName) {
      const moduleNameOrBasename = moduleName ? moduleName.value : (0, _path.basename)(filename, (0, _path.extname)(filename));
      let globalToAssign = _core.types.memberExpression(_core.types.identifier("global"), _core.types.identifier(_core.types.toIdentifier(moduleNameOrBasename)));
      let initAssignments = [];
      if (exactGlobals) {
        const globalName = browserGlobals[moduleNameOrBasename];
        if (globalName) {
          initAssignments = [];
          const members = globalName.split(".");
          globalToAssign = members.slice(1).reduce((accum, curr) => {
            initAssignments.push(buildPrerequisiteAssignment({
              GLOBAL_REFERENCE: _core.types.cloneNode(accum)
            }));
            return _core.types.memberExpression(accum, _core.types.identifier(curr));
          }, _core.types.memberExpression(_core.types.identifier("global"), _core.types.identifier(members[0])));
        }
      }
      initAssignments.push(_core.types.expressionStatement(_core.types.assignmentExpression("=", globalToAssign, _core.types.callExpression(_core.types.identifier("preferDefault"), [_core.types.identifier("exports")]))));
      return initAssignments;
    }

    /**
     * Build the member expression that reads from a global for a given source.
     */
    function buildBrowserArg(browserGlobals, exactGlobals, source) {
      let memberExpression;
      if (exactGlobals) {
        const globalRef = browserGlobals[source];
        if (globalRef) {
          memberExpression = globalRef.split(".").reduce((accum, curr) => _core.types.memberExpression(accum, _core.types.identifier(curr)), _core.types.identifier("global"));
        } else {
          memberExpression = _core.types.memberExpression(_core.types.identifier("global"), _core.types.identifier(_core.types.toIdentifier(source)));
        }
      } else {
        const requireName = (0, _path.basename)(source, (0, _path.extname)(source));
        const globalName = browserGlobals[requireName] || requireName;
        memberExpression = _core.types.memberExpression(_core.types.identifier("global"), _core.types.identifier(_core.types.toIdentifier(globalName)));
      }
      return memberExpression;
    }
    return {
      name: "transform-modules-umd",
      visitor: {
        Program: {
          exit(path) {
            if (!(0, _helperModuleTransforms.isModule)(path)) return;
            const browserGlobals = globals || {};
            let moduleName = (0, _helperModuleTransforms.getModuleName)(this.file.opts, options);
            if (moduleName) moduleName = _core.types.stringLiteral(moduleName);
            const {
              meta,
              headers
            } = (0, _helperModuleTransforms.rewriteModuleStatementsAndPrepareHeader)(path, {
              loose,
              strict,
              strictMode,
              allowTopLevelThis,
              noInterop
            });
            const amdArgs = [];
            const commonjsArgs = [];
            const browserArgs = [];
            const importNames = [];
            const forwardNames = [];
            if ((0, _helperModuleTransforms.hasExports)(meta)) {
              commonjsArgs.push(_core.types.identifier("exports"));
              browserArgs.push(_core.types.identifier("exports"));
              importNames.push(_core.types.identifier(meta.exportName));
            }
            for (const [source, metadata] of meta.source) {
              amdArgs.push(_core.types.stringLiteral(source));
              commonjsArgs.push(_core.types.callExpression(_core.types.identifier("require"), [_core.types.stringLiteral(source)]));
              browserArgs.push(buildBrowserArg(browserGlobals, exactGlobals, source));
              importNames.push(_core.types.identifier(metadata.name));
              forwardNames.push(_core.types.identifier(metadata.name));
              if (!(0, _helperModuleTransforms.isSideEffectImport)(metadata)) {
                const interop = (0, _helperModuleTransforms.wrapInterop)(path, _core.types.identifier(metadata.name), metadata.interop);
                if (interop) {
                  const header = _core.types.expressionStatement(_core.types.assignmentExpression("=", _core.types.identifier(metadata.name), interop));
                  header.loc = meta.loc;
                  headers.push(header);
                }
              }
              headers.push(...(0, _helperModuleTransforms.buildNamespaceInitStatements)(meta, metadata, loose));
            }
            (0, _helperModuleTransforms.ensureStatementsHoisted)(headers);
            path.unshiftContainer("body", headers);
            const {
              body,
              directives
            } = path.node;
            path.node.directives = [];
            path.node.body = [];
            const umdWrapper = path.pushContainer("body", [buildWrapper({
              // MODULE_NAME: moduleName,
              AMD_ARGUMENTS: _core.types.arrayExpression(amdArgs),
              COMMONJS_ARGUMENTS: commonjsArgs,
              BROWSER_ARGUMENTS: browserArgs,
              IMPORT_NAMES: importNames,
              FORWARD_NAMES: forwardNames,
              GLOBAL_TO_ASSIGN: buildBrowserInit(browserGlobals, exactGlobals, this.filename || "unknown", moduleName)
            })])[0];
            const umdFactory = umdWrapper.get("expression.arguments")[1].get("body");
            umdFactory.pushContainer("directives", directives);
            umdFactory.pushContainer("body", body);
          }
        }
      }
    };
  });
  function esm2umd(moduleName, esmCode, options = {}) {
    return "// GENERATED FILE. DO NOT EDIT.\n" + (0, _core.transform)(esmCode, {
      plugins: [[transformModulesUmd, options]],
      moduleId: moduleName
    }).code.trim();
  }
});