/* Copyright 2017 Mozilla Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* eslint-disable no-var, unicorn/no-typeof-undefined */

"use strict";

(function () {
  var baseLocation;
  if (typeof document !== "undefined") {
    baseLocation = new URL("./", document.currentScript.src);
  } else if (typeof location !== "undefined") {
    // Probably worker -- walking subfolders until we will reach root.
    baseLocation = location;
    while (baseLocation.href.includes("/src/")) {
      baseLocation = new URL("..", baseLocation);
    }
  } else {
    throw new Error("Cannot configure SystemJS");
  }

  var PluginBabelPath = "node_modules/systemjs-plugin-babel/plugin-babel.js";
  var SystemJSPluginBabelPath =
    "node_modules/systemjs-plugin-babel/systemjs-babel-browser.js";
  var PluginBabelCachePath = "external/systemjs/plugin-babel-cached.js";

  var isCachingPossible =
    typeof indexedDB !== "undefined" &&
    typeof TextEncoder !== "undefined" &&
    typeof crypto !== "undefined" &&
    typeof crypto.subtle !== "undefined";

  // When we create a bundle, webpack is run on the source and it will replace
  // require with __webpack_require__. When we want to use the real require,
  // __non_webpack_require__ has to be used.
  // In this target, we don't create a bundle, so we have to replace the
  // occurrences of __non_webpack_require__ ourselves.
  function babelPluginReplaceNonWebPackRequire(babel) {
    return {
      visitor: {
        Identifier(path, state) {
          if (path.node.name === "__non_webpack_require__") {
            path.replaceWith(babel.types.identifier("require"));
          }
        },
      },
    };
  }

  SystemJS.config({
    packages: {
      "": {
        defaultExtension: "js",
      },
    },
    paths: {
      pdfjs: new URL("src", baseLocation).href,
      "pdfjs-web": new URL("web", baseLocation).href,
      "pdfjs-test": new URL("test", baseLocation).href,
      "pdfjs-lib": new URL("src/pdf", baseLocation).href,
      "core-js": new URL("node_modules/core-js", baseLocation).href,
      "web-streams-polyfill": new URL(
        "node_modules/web-streams-polyfill",
        baseLocation
      ).href,
    },
    meta: {
      "*": {
        scriptLoad: false,
        esModule: true,
        babelOptions: {
          env: false,
          plugins: [babelPluginReplaceNonWebPackRequire],
        },
      },
    },
    map: {
      "plugin-babel": new URL(PluginBabelPath, baseLocation).href,
      "systemjs-babel-build": new URL(SystemJSPluginBabelPath, baseLocation)
        .href,
      "plugin-babel-cached": new URL(PluginBabelCachePath, baseLocation).href,
    },
    transpiler: isCachingPossible ? "plugin-babel-cached" : "plugin-babel",
  });
})();