/* 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-restricted-globals */

'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
  // occurences 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,
    },
    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',
  });
})();