webpack 4 upgrade
[sdc.git] / openecomp-ui / webpack.config.js
1 'use strict';
2
3 const path = require('path');
4 const CleanWebpackPlugin = require('clean-webpack-plugin');
5 const { DefinePlugin, HotModuleReplacementPlugin } = require('webpack');
6
7 const devConfig = require('./tools/getDevConfig');
8 const proxyServer = require('./proxy-server');
9 const fs = require('fs');
10
11 let devPort = process.env.PORT || devConfig.port;
12 let publicPath = 'http://localhost:' + devPort + '/onboarding/';
13
14 module.exports = (env, argv) => {
15     let DEV = argv.mode && argv.mode === 'development';
16     let language = null;
17     if (
18         env === undefined ||
19         env.language === undefined ||
20         env.language === ''
21     ) {
22         console.log('Setting language to default "en".');
23         language = 'en';
24     } else {
25         language = env.language;
26         console.log('Setting language to  "' + env.language + '".');
27     }
28
29     var webpackConfig = {
30         entry: {
31             'punch-outs': ['sdc-app/punch-outs.js']
32         },
33         cache: true,
34         devtool: DEV ? 'eval-source-map' : undefined,
35         performance: { hints: false },
36         resolve: {
37             modules: [path.resolve('.'), path.join(__dirname, 'node_modules')],
38             alias: {
39                 i18nJson: 'nfvo-utils/i18n/' + language + '.json',
40                 'nfvo-utils': 'src/nfvo-utils',
41                 'nfvo-components': 'src/nfvo-components',
42                 'sdc-app': 'src/sdc-app',
43                 // TODO - this is needed for heatValidation standalone. Can be deprecated down the line
44                 'react-select/dist/': 'node_modules' + '/react-select/dist/'
45             }
46         },
47         output: {
48             path: path.join(__dirname, 'dist'),
49             publicPath: DEV ? publicPath : '/onboarding/',
50             filename: DEV ? '[name].js' : '[name]_' + language + '.js'
51         },
52         module: {
53             rules: [
54                 {
55                     enforce: 'pre',
56                     test: /\.(js|jsx)$/,
57                     include: path.resolve(__dirname, 'src'),
58                     use: [{ loader: 'eslint-loader' }]
59                 },
60                 {
61                     test: /\.(js|jsx)$/,
62                     include: path.resolve(__dirname, 'src'),
63                     use: [{ loader: 'babel-loader' }]
64                 },
65                 {
66                     test: /\.(js|jsx)$/,
67                     loader: 'source-map-loader',
68                     include: path.resolve(__dirname, 'src'),
69                     enforce: 'pre'
70                 },
71                 {
72                     test: /\.(css|scss)$/,
73                     use: [
74                         {
75                             loader: 'style-loader'
76                         },
77                         {
78                             loader: 'css-loader'
79                         },
80                         {
81                             loader: 'sass-loader',
82                             options: {
83                                 output: { path: path.join(__dirname, 'dist') }
84                             }
85                         }
86                     ],
87                     include: [
88                         /resources/,
89                         path.join(
90                             __dirname,
91                             'node_modules/dox-sequence-diagram-ui/'
92                         ),
93                         path.join(__dirname, 'node_modules/react-datepicker/'),
94                         path.join(__dirname, 'node_modules/react-select/'),
95                         path.join(__dirname, 'node_modules/sdc-ui/')
96                     ]
97                 },
98                 {
99                     test: /\.(svg)(\?.*)?$/,
100                     loader: 'url-loader',
101                     options: {
102                         limit: 16384,
103                         mimetype: 'image/svg+xml'
104                     },
105                     include: [
106                         path.join(
107                             __dirname,
108                             'node_modules/dox-sequence-diagram-ui/'
109                         ),
110                         path.join(__dirname, 'node_modules/sdc-ui/')
111                     ]
112                 }
113             ]
114         },
115         plugins: DEV
116             ? [
117                   new CleanWebpackPlugin(['dist'], { watch: false }),
118                   new DefinePlugin({
119                       DEBUG: DEV === true,
120                       DEV: DEV === true
121                   }),
122                   new HotModuleReplacementPlugin()
123               ]
124             : [
125                   new DefinePlugin({
126                       DEBUG: DEV === true,
127                       DEV: DEV === true
128                   })
129               ]
130     };
131     if (DEV) {
132         webpackConfig.entry['punch-outs'].push('react-hot-loader/patch');
133         webpackConfig.entry['punch-outs'].push(
134             'webpack-dev-server/client?http://localhost:' + devPort
135         );
136         webpackConfig.entry['punch-outs'].push('webpack/hot/only-dev-server');
137         webpackConfig.devServer = {
138             port: devPort,
139             historyApiFallback: true,
140             publicPath: publicPath,
141             contentBase: path.join(__dirname, 'dist'),
142             inline: true,
143             hot: true,
144             stats: {
145                 colors: true,
146                 exclude: [path.join(__dirname, 'node_modules')]
147             },
148             before: proxyServer
149         };
150     }
151     console.log('Running build for : ' + argv.mode);
152     return webpackConfig;
153 };