1 | "use strict";
|
2 |
|
3 | var _fs = _interopRequireDefault(require("fs"));
|
4 |
|
5 | var _webpackMerge = _interopRequireDefault(require("webpack-merge"));
|
6 |
|
7 | var _miniCssExtractPlugin = _interopRequireDefault(require("mini-css-extract-plugin"));
|
8 |
|
9 | var _path = _interopRequireDefault(require("path"));
|
10 |
|
11 | var _terserWebpackPlugin = _interopRequireDefault(require("terser-webpack-plugin"));
|
12 |
|
13 | var _webpack = _interopRequireDefault(require("webpack"));
|
14 |
|
15 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
16 |
|
17 | var config = function config(customizations) {
|
18 | var mode = process.env.NODE_ENV;
|
19 | var tsScriptConfigPath = _fs["default"].existsSync("".concat(process.cwd(), "/tsconfig.json")) ? "".concat(process.cwd(), "/tsconfig.json") : _path["default"].resolve('node_modules', '@procore', 'core-webpack', 'tsconfig.json');
|
20 | var output = mode === 'production' ? {
|
21 | path: _path["default"].resolve("".concat(process.cwd()), 'build'),
|
22 | filename: '[name].bundle.js',
|
23 | libraryTarget: 'umd'
|
24 | } : {
|
25 | path: '/',
|
26 | publicPath: 'http://localhost:5000/',
|
27 | filename: '[name].bundle.js',
|
28 | libraryTarget: 'umd'
|
29 | };
|
30 | var plugins = [new _miniCssExtractPlugin["default"]({
|
31 | filename: '[name].bundle.css'
|
32 | })];
|
33 | var client = process.env.CLIENT_NAME ? "-".concat(process.env.CLIENT_NAME) : '';
|
34 | var digest = process.env.CLIENT_DIGEST ? "-".concat(process.env.CLIENT_DIGEST) : '';
|
35 | plugins = mode === 'development' ? plugins : plugins.concat([new _webpack["default"].SourceMapDevToolPlugin({
|
36 | test: /\.js$/,
|
37 | filename: "sourcemaps/[name].bundle".concat(client).concat(digest, ".js.map"),
|
38 | append: false,
|
39 | exclude: [/node_modules\/*/]
|
40 | }), new _webpack["default"].SourceMapDevToolPlugin({
|
41 | test: /\.css$/,
|
42 | filename: '[file].map',
|
43 | exclude: [/node_modules\/*/]
|
44 | })]);
|
45 | var defaults = {
|
46 | entry: {
|
47 | index: _path["default"].resolve('src', 'index.js')
|
48 | },
|
49 | devServer: {
|
50 | headers: {
|
51 | 'Access-Control-Allow-Origin': '*'
|
52 | },
|
53 | host: '0.0.0.0',
|
54 | hot: true,
|
55 | inline: true,
|
56 | port: '5000'
|
57 | },
|
58 | devtool: mode === 'production' ? false : 'inline-source-map',
|
59 | mode: mode,
|
60 | module: {
|
61 | rules: [{
|
62 | test: /\.tsx?$/,
|
63 | exclude: /node_modules/,
|
64 | use: {
|
65 | loader: require.resolve('ts-loader'),
|
66 | options: {
|
67 | context: process.cwd(),
|
68 | configFile: tsScriptConfigPath
|
69 | }
|
70 | }
|
71 | }, {
|
72 | test: /\.jsx?$/,
|
73 | exclude: /node_modules/,
|
74 | use: {
|
75 | loader: require.resolve('babel-loader'),
|
76 | options: {
|
77 | plugins: [require.resolve('@babel/plugin-proposal-object-rest-spread'), require.resolve('@babel/plugin-transform-runtime'), require.resolve('babel-plugin-transform-class-properties')],
|
78 | presets: [require.resolve('@babel/preset-env'), require.resolve('@babel/preset-react')]
|
79 | }
|
80 | }
|
81 | }, {
|
82 | test: /\.s?[ca]ss$/,
|
83 | exclude: /node_modules/,
|
84 | use: [{
|
85 | loader: mode === 'development' ? require.resolve('style-loader') : _miniCssExtractPlugin["default"].loader
|
86 | }, {
|
87 | loader: require.resolve('css-loader'),
|
88 | options: {
|
89 | localIdentName: '[local]--[hash:base64:5]',
|
90 | modules: true,
|
91 | importLoaders: 1
|
92 | }
|
93 | }, {
|
94 | loader: require.resolve('postcss-loader'),
|
95 | options: {
|
96 | ident: 'postcss',
|
97 | plugins: function plugins() {
|
98 | return [require('postcss-preset-env')({
|
99 | browsers: 'last 2 versions'
|
100 | }), require('precss')()];
|
101 | }
|
102 | }
|
103 | }]
|
104 | }, {
|
105 | test: /\.(gif|jpe?g|png|svg|eot|ttf|otf|woff2?)$/,
|
106 | use: require.resolve('file-loader')
|
107 | }]
|
108 | },
|
109 | optimization: {
|
110 | minimizer: [new _terserWebpackPlugin["default"]({
|
111 | cache: true,
|
112 | parallel: 2,
|
113 | sourceMap: true,
|
114 | terserOptions: {
|
115 | compress: {
|
116 | drop_console: true
|
117 | }
|
118 | }
|
119 | })],
|
120 | splitChunks: {
|
121 | cacheGroups: {
|
122 | "default": {
|
123 | minChunks: 2,
|
124 | priority: -20,
|
125 | reuseExistingChunk: true
|
126 | },
|
127 | styles: {
|
128 | chunks: 'all',
|
129 | enforce: true,
|
130 | name: 'styles',
|
131 | test: /\.css$/
|
132 | },
|
133 | vendors: {
|
134 | test: /[\\/]node_modules[\\/]/,
|
135 | priority: -10
|
136 | }
|
137 | }
|
138 | }
|
139 | },
|
140 | output: output,
|
141 | plugins: plugins,
|
142 | resolve: {
|
143 | extensions: ['.css', '.js', '.jsx', '.scss', '.ts', '.tsx']
|
144 | }
|
145 | };
|
146 | return typeof customizations === 'function' ? customizations(_webpackMerge["default"], defaults) : (0, _webpackMerge["default"])(defaults, customizations);
|
147 | };
|
148 |
|
149 | exports = module.exports = config; |
\ | No newline at end of file |