156 lines
5.0 KiB
JavaScript
156 lines
5.0 KiB
JavaScript
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
|
|
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
const ESLintPlugin = require('eslint-webpack-plugin');
|
|
const Dotenv = require('dotenv-webpack');
|
|
const path = require('path');
|
|
const paths = require('./paths');
|
|
const envPath = require('./envPath');
|
|
|
|
module.exports = {
|
|
// Where webpack looks to start building the bundle
|
|
entry: [path.normalize(`${paths.src}/index.tsx`)],
|
|
|
|
// Where webpack outputs the assets and bundles
|
|
output: {
|
|
path: path.normalize(paths.build),
|
|
filename: '[name].bundle.js',
|
|
publicPath: '/',
|
|
},
|
|
|
|
// Customize the webpack build process
|
|
plugins: [
|
|
// Removes/cleans build folders and unused assets when rebuilding
|
|
new CleanWebpackPlugin(),
|
|
|
|
// Puts variables in .env files into process.env
|
|
new Dotenv({
|
|
path: path.normalize(envPath),
|
|
}),
|
|
new CopyWebpackPlugin({
|
|
patterns: [
|
|
{
|
|
from: path.normalize(`${paths.src}/netlify-redirect`),
|
|
to: path.normalize(paths.build),
|
|
globOptions: {
|
|
ignore: ['*.DS_Store'],
|
|
},
|
|
noErrorOnMissing: true,
|
|
},
|
|
{
|
|
from: './node_modules/@pdftron/webviewer/public',
|
|
to: path.normalize(`${paths.build}/public/webviewer`),
|
|
globOptions: {
|
|
ignore: ['*.DS_Store'],
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
|
|
// Generates an HTML file from a template
|
|
new HtmlWebpackPlugin({
|
|
title: 'Company',
|
|
inject: 'body',
|
|
appMountId: 'app',
|
|
favicon: paths.src + '/images/favicon.png',
|
|
template: `${paths.src}/index.html`, // template file
|
|
filename: 'index.html', // output file
|
|
// ', //Lets us load the appropriate dev scripts in the html
|
|
axios: 'https://cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js',
|
|
bootstrap: 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js',
|
|
bootStrapCss: 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css',
|
|
|
|
react: 'https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js',
|
|
reactDom: 'https://cdn.jsdelivr.net/npm/react-dom@17.0.2/index.min.js', // Lets us load the appropriate dev scripts in the html
|
|
popper: 'https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/cjs/popper.min.js',
|
|
|
|
redux: 'https://cdn.jsdelivr.net/npm/redux@4.1.0/lib/redux.min.js',
|
|
reactRedux: 'https://cdn.jsdelivr.net/npm/react-redux@7.2.4/lib/index.min.js',
|
|
reactRouterDom: 'https://cdn.jsdelivr.net/npm/react-router-dom@5.2.0/index.min.js',
|
|
}),
|
|
// ESLint configuration
|
|
new ESLintPlugin({
|
|
files: ['.', 'src', 'config'],
|
|
formatter: 'table',
|
|
failOnError: false,
|
|
emitWarning: true,
|
|
}),
|
|
|
|
// Prettier configuration
|
|
// new PrettierPlugin(),
|
|
],
|
|
resolve: {
|
|
alias: {
|
|
RocketAssets: `${paths.src}/shared/assets`,
|
|
Components: path.normalize(`${paths.src}/shared/components`),
|
|
Containers: path.normalize(`${paths.src}/shared/containers`),
|
|
Context: path.normalize(`${paths.src}/shared/context`),
|
|
HOC: path.normalize(`${paths.src}/shared/hoc`),
|
|
Utils: path.normalize(`${paths.src}/shared/utils`),
|
|
Hooks: path.normalize(`${paths.src}/shared/hooks`),
|
|
Themes: path.normalize(`${paths.src}/shared/themes`),
|
|
Routes: path.normalize(`${paths.src}/routes`),
|
|
},
|
|
symlinks: false,
|
|
cacheWithContext: false,
|
|
extensions: ['.ts', '.tsx', '.js', '.json', '.jsx', '.mjs', '.css', '.scss', '.sass'],
|
|
},
|
|
|
|
// Determine how modules within the project are treated
|
|
module: {
|
|
rules: [
|
|
// JavaScript: Use Babel to transpile JavaScript files
|
|
{
|
|
test: /\.(js|jsx|tsx|ts|mjs)$/,
|
|
exclude: /(node_modules|bower_components)/,
|
|
loader: 'babel-loader',
|
|
},
|
|
{
|
|
test: /\.(ts|tsx)$/,
|
|
use: [
|
|
{
|
|
loader: 'ts-loader',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
test: /\.svg$/,
|
|
use: ['@svgr/webpack'],
|
|
},
|
|
{
|
|
test: /\.(?:ico|png|jpg|gif|jpeg|ttf)$/,
|
|
type: 'assets/resource',
|
|
},
|
|
|
|
// Images: Copy image files to build folder
|
|
{ test: /\.(?:ico|gif|png|jpg|jpeg)$/i, type: 'assets' },
|
|
|
|
// Fonts and SVGs: Inline files
|
|
// { test: /\.(woff(2)?|eot|ttf|otf|svg|)$/, type: 'assets/inline' },
|
|
],
|
|
},
|
|
// externals: {
|
|
// axios: {
|
|
// amd: 'axios',
|
|
// },
|
|
// bootstrap: 'bootstrap',
|
|
// react: 'React', // Case matters here
|
|
// 'react-dom': 'ReactDOM',
|
|
// 'react-router-dom': 'react-router-dom',
|
|
// popperCore: {
|
|
// root: 'PopperJS',
|
|
// commonjs2: 'popper.js',
|
|
// commonjs: 'popper.js',
|
|
// amd: 'popper.js',
|
|
// },
|
|
// 'react-router-dom': 'ReactRouter',
|
|
// redux: 'redux',
|
|
// 'react-redux': 'react-redux',
|
|
// },
|
|
// externalsPresets: { web: false, webAsync: true },
|
|
// optimization: {
|
|
// // fix node modules not packaged into zip
|
|
// concatenateModules: false,
|
|
// },
|
|
};
|