const CopyPlugin = require("copy-webpack-plugin"); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const path = require('path'); const { stylePaths } = require('./stylePaths'); const copy_files = [ "./src/manifest.json", ]; module.exports = { devtool: "source-map", entry: './src/index.tsx', module: { rules: [ { test: /\.(ts|tsx|jsx)?$/, use: [ { loader: 'ts-loader', options: { transpileOnly: true, experimentalWatchApi: true, }, } ] }, { test: /\.s[ac]ss$/i, use: [ "css-loader", "sass-loader", ], }, { test: /\.css$/, include: [...stylePaths], use: [MiniCssExtractPlugin.loader, 'css-loader'], }, { test: /\.(svg|ttf|eot|woff|woff2)$/, // only process modules with this loader // if they live under a 'fonts' or 'pficon' directory include: [ path.resolve(__dirname, 'node_modules/patternfly/dist/fonts'), path.resolve(__dirname, 'node_modules/@patternfly/react-core/dist/styles/assets/fonts'), path.resolve(__dirname, 'node_modules/@patternfly/react-core/dist/styles/assets/pficon'), path.resolve(__dirname, 'node_modules/@patternfly/patternfly/assets/fonts'), path.resolve(__dirname, 'node_modules/@patternfly/patternfly/assets/pficon'), ], use: { loader: 'file-loader', options: { // Limit at 50k. larger files emited into separate files limit: 5000, outputPath: 'fonts', name: '[name].[ext]', }, }, }, { test: /\.svg$/, include: (input) => input.indexOf('background-filter.svg') > 1, use: [ { loader: 'url-loader', options: { limit: 5000, outputPath: 'svgs', name: '[name].[ext]', }, }, ], }, { test: /\.(jpg|jpeg|png|gif)$/i, include: [ path.resolve(__dirname, 'src'), path.resolve(__dirname, 'node_modules/patternfly'), path.resolve(__dirname, 'node_modules/@patternfly/patternfly/assets/images'), path.resolve(__dirname, 'node_modules/@patternfly/react-styles/css/assets/images'), path.resolve(__dirname, 'node_modules/@patternfly/react-core/dist/styles/assets/images'), path.resolve( __dirname, 'node_modules/@patternfly/react-core/node_modules/@patternfly/react-styles/css/assets/images' ), path.resolve( __dirname, 'node_modules/@patternfly/react-table/node_modules/@patternfly/react-styles/css/assets/images' ), path.resolve( __dirname, 'node_modules/@patternfly/react-inline-edit-extension/node_modules/@patternfly/react-styles/css/assets/images' ), ], use: [ { loader: 'url-loader', options: { limit: 5000, outputPath: 'images', name: '[name].[ext]', }, }, ], }, ], }, resolve: { extensions: ['.tsx', '.ts', '.js'], modules: ["node_modules", 'pkg/lib'], alias: { 'font-awesome': 'font-awesome-sass/assets/stylesheets' }, }, resolveLoader: { modules: ["node_modules", 'pkg/lib'], }, plugins: [ new CopyPlugin({ patterns: copy_files }), new HtmlWebpackPlugin({ template: path.resolve(__dirname, 'src', 'index.html'), }), new MiniCssExtractPlugin({ filename: 'bundle.css', }), ], output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, devServer: { static: path.join(__dirname, "dist"), compress: true, port: 4000, }, };