repo_description: OpenTelemetry JavaScript Client
repo_topics: api distributed-tracing metrics monitoring telemetry
code: /*!
   * Copyright The OpenTelemetry Authors
   *
   * 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.
   */
  
  const webpack = require('webpack')
  
  // This is the webpack configuration for browser Karma tests with coverage.
  module.exports = {
    mode: 'development',
    target: 'web',
    output: {filename: 'bundle.js'},
    resolve: {
      extensions: ['.ts', '.js'],
      fallback: {
        // Enable the assert library polyfill because that is used in tests
        "assert": require.resolve('assert/'),
        "util": require.resolve('util/'),
      },
    },
    devtool: 'eval-source-map',
    plugins: [
      new webpack.ProvidePlugin({
        // Make a global `process` variable that points to the `process` package,
        // because the `util` package expects there to be a global variable named `process`.
        // Thanks to https://stackoverflow.com/a/65018686/14239942
        // NOTE: I wish there was a better way as this pollutes the tests with a defined 'process' global.
        process: 'process/browser.js'
      }),
      // Benchmark.js checks for AMD's define function which doesn't exist in webpack.
      // NOTE: This pollutes tests with a defined 'self.define' global.
      new webpack.BannerPlugin({
        banner: 'self.define = self.define || Object.assign(function(){}, {amd: false});',
        raw: true
      })
    ],
    module: {
      rules: [
        {test: /\.ts$/, use: 'ts-loader'},
        {
          test: /\.js$/,
          exclude: {
            and: [/node_modules/], // Exclude libraries in node_modules ...
            not: [
              // Except for a few of them that needs to be transpiled because they use modern syntax
              /zone.js/,
            ],
          },
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/preset-env'],
            }
          },
        },
        {
          enforce: 'post',
          exclude: /(node_modules|\.test\.[tj]sx?$)/,
          test: /\.ts$/,
          use: {
            loader: 'babel-loader',
            options: {
              plugins: ['babel-plugin-istanbul'],
            }
          },
        },
      ],
    },
  };
  