Blame webpack.config.js

Packit Service eebd6f
const path = require("path");
Packit Service eebd6f
const webpack = require("webpack");
Packit Service eebd6f
const CopyWebpackPlugin = require("copy-webpack-plugin");
Packit Service eebd6f
const HtmlWebpackPlugin = require("html-webpack-plugin");
Packit Service eebd6f
const CleanWebpackPlugin = require("clean-webpack-plugin");
Packit Service eebd6f
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
Packit Service 0c2606
const ESLintPlugin = require("eslint-webpack-plugin");
Packit Service eebd6f
const babelConfig = require("./babel.config");
Packit Service eebd6f
Packit Service eebd6f
const nodedir = path.resolve(process.env.SRCDIR || __dirname, "node_modules");
Packit Service eebd6f
Packit Service eebd6f
const [mode, devtool] =
Packit Service eebd6f
  process.env.NODE_ENV === "production" ? ["production", "source-map"] : ["development", "inline-source-map"];
Packit Service eebd6f
Packit Service eebd6f
const output = {
Packit Service eebd6f
  path: path.resolve(__dirname, "./public/dist"),
Packit Service eebd6f
  filename: "[name].js",
Packit Service eebd6f
  sourceMapFilename: "[file].map",
Packit Service eebd6f
};
Packit Service eebd6f
Packit Service eebd6f
// add istanbul as babel plugin to enable code coverage
Packit Service eebd6f
process.argv.includes("--with-coverage") && babelConfig.plugins.push("istanbul");
Packit Service eebd6f
Packit Service eebd6f
const plugins = [
Packit Service eebd6f
  new CleanWebpackPlugin(["public/dist"]),
Packit Service eebd6f
  // automatically load jquery instead of having to import or require them everywhere
Packit Service eebd6f
  new webpack.ProvidePlugin({
Packit Service eebd6f
    $: "jquery",
Packit Service eebd6f
    jQuery: "jquery",
Packit Service eebd6f
  }),
Packit Service eebd6f
  // copy our assets
Packit Service eebd6f
  new CopyWebpackPlugin([
Packit Service eebd6f
    {
Packit Service eebd6f
      from: "./public/manifest.json",
Packit Service eebd6f
    },
Packit Service eebd6f
  ]),
Packit Service eebd6f
  // main.js has to be injected into body and after 
Packit Service eebd6f
  new HtmlWebpackPlugin({
Packit Service eebd6f
    filename: "index.html",
Packit Service eebd6f
    template: "public/index.ejs",
Packit Service eebd6f
    inject: "body",
Packit Service eebd6f
  }),
Packit Service eebd6f
  // avoid multi chunks for every index.js inside pages folder
Packit Service eebd6f
  new webpack.optimize.LimitChunkCountPlugin({
Packit Service eebd6f
    maxChunks: 1,
Packit Service eebd6f
  }),
Packit Service eebd6f
  new MiniCssExtractPlugin({
Packit Service eebd6f
    filename: "[name].css",
Packit Service eebd6f
    chunkFilename: "[name].bundle.css",
Packit Service eebd6f
  }),
Packit Service 0c2606
  new ESLintPlugin({
Packit Service 0c2606
    files: ["components/**/*.js, core/**/*.js, pages/**/*.js, data/**/*.js"],
Packit Service 0c2606
  }),
Packit Service eebd6f
];
Packit Service eebd6f
Packit Service eebd6f
module.exports = {
Packit Service eebd6f
  mode,
Packit Service eebd6f
  entry: "./main.js",
Packit Service eebd6f
  plugins,
Packit Service eebd6f
  output,
Packit Service eebd6f
  devtool,
Packit Service eebd6f
  externals: { cockpit: "cockpit", jQuery: "jquery" },
Packit Service eebd6f
  // disable noisy warnings about exceeding the recommended size limit
Packit Service eebd6f
  performance: {
Packit Service eebd6f
    maxEntrypointSize: 20000000,
Packit Service eebd6f
    maxAssetSize: 20000000,
Packit Service eebd6f
  },
Packit Service eebd6f
  resolve: { alias: { "font-awesome": path.resolve(nodedir, "font-awesome-sass/assets/stylesheets") } },
Packit Service eebd6f
  module: {
Packit Service eebd6f
    rules: [
Packit Service eebd6f
      {
Packit Service eebd6f
        test: /\.(js|jsx)$/,
Packit Service eebd6f
        include: [
Packit Service eebd6f
          path.resolve(__dirname, "./actions"),
Packit Service eebd6f
          path.resolve(__dirname, "./components"),
Packit Service eebd6f
          path.resolve(__dirname, "./core"),
Packit Service eebd6f
          path.resolve(__dirname, "./pages"),
Packit Service eebd6f
          path.resolve(__dirname, "./data"),
Packit Service eebd6f
          path.resolve(__dirname, "./main.js"),
Packit Service eebd6f
        ],
Packit Service eebd6f
        use: {
Packit Service eebd6f
          loader: "babel-loader",
Packit Service eebd6f
          options: babelConfig,
Packit Service eebd6f
        },
Packit Service eebd6f
      },
Packit Service eebd6f
      // add type: "javascript/auto" when transforming JSON via loader to JS
Packit Service eebd6f
      {
Packit Service eebd6f
        include: [path.resolve(__dirname, "./routes.json")],
Packit Service eebd6f
        use: [
Packit Service eebd6f
          {
Packit Service eebd6f
            loader: "babel-loader",
Packit Service eebd6f
            options: babelConfig,
Packit Service eebd6f
          },
Packit Service eebd6f
          path.resolve(__dirname, "./utils/routes-loader.js"),
Packit Service eebd6f
        ],
Packit Service eebd6f
        type: "javascript/auto",
Packit Service eebd6f
      },
Packit Service eebd6f
      {
Packit Service eebd6f
        test: /\.css$/,
Packit Service eebd6f
        use: [
Packit Service eebd6f
          MiniCssExtractPlugin.loader,
Packit Service eebd6f
          {
Packit Service eebd6f
            loader: "css-loader",
Packit Service eebd6f
            options: { url: false },
Packit Service eebd6f
          },
Packit Service eebd6f
        ],
Packit Service eebd6f
      },
Packit Service eebd6f
      /* HACK: remove unwanted fonts from PatternFly's css */
Packit Service eebd6f
      {
Packit Service eebd6f
        test: /patternfly-cockpit.scss$/,
Packit Service eebd6f
        use: [
Packit Service eebd6f
          MiniCssExtractPlugin.loader,
Packit Service eebd6f
          {
Packit Service eebd6f
            loader: "css-loader",
Packit Service eebd6f
            options: { url: false },
Packit Service eebd6f
          },
Packit Service eebd6f
          {
Packit Service eebd6f
            loader: "string-replace-loader",
Packit Service eebd6f
            options: {
Packit Service eebd6f
              multiple: [
Packit Service eebd6f
                {
Packit Service eebd6f
                  search: /src:url[(]"patternfly-icons-fake-path\/glyphicons-halflings-regular[^}]*/g,
Packit Service eebd6f
                  replace: 'font-display:block; src:url("../base1/fonts/glyphicons.woff") format("woff");',
Packit Service eebd6f
                },
Packit Service eebd6f
                {
Packit Service eebd6f
                  search: /src:url[(]"patternfly-fonts-fake-path\/PatternFlyIcons[^}]*/g,
Packit Service eebd6f
                  replace: 'src:url("../base1/fonts/patternfly.woff") format("woff");',
Packit Service eebd6f
                },
Packit Service eebd6f
                {
Packit Service eebd6f
                  search: /src:url[(]"patternfly-fonts-fake-path\/fontawesome[^}]*/,
Packit Service eebd6f
                  replace: 'font-display:block; src:url("../base1/fonts/fontawesome.woff?v=4.2.0") format("woff");',
Packit Service eebd6f
                },
Packit Service eebd6f
                {
Packit Service eebd6f
                  search: /src:url\("patternfly-icons-fake-path\/pficon[^}]*/g,
Packit Service eebd6f
                  replace: 'src:url("../base1/fonts/patternfly.woff") format("woff");',
Packit Service eebd6f
                },
Packit Service eebd6f
                {
Packit Service eebd6f
                  search: /@font-face[^}]*patternfly-fonts-fake-path[^}]*}/g,
Packit Service eebd6f
                  replace: "",
Packit Service eebd6f
                },
Packit Service eebd6f
              ],
Packit Service eebd6f
            },
Packit Service eebd6f
          },
Packit Service eebd6f
          {
Packit Service eebd6f
            loader: "sass-loader",
Packit Service eebd6f
            options: {
Packit Service eebd6f
              sassOptions: {
Packit Service eebd6f
                includePaths: [
Packit Service eebd6f
                  // Teach webpack to resolve these references in order to build PF3 scss
Packit Service eebd6f
                  path.resolve(nodedir, "font-awesome-sass", "assets", "stylesheets"),
Packit Service eebd6f
                  path.resolve(nodedir, "patternfly", "dist", "sass"),
Packit Service eebd6f
                  path.resolve(nodedir, "bootstrap-sass", "assets", "stylesheets"),
Packit Service eebd6f
                ],
Packit Service eebd6f
                outputStyle: "compressed",
Packit Service eebd6f
              },
Packit Service eebd6f
            },
Packit Service eebd6f
          },
Packit Service eebd6f
        ],
Packit Service eebd6f
      },
Packit Service eebd6f
    ],
Packit Service eebd6f
  },
Packit Service eebd6f
};