Update release notes
[sdc.git] / openecomp-ui / webpack.config.js
index c723a7a..a007714 100644 (file)
 'use strict';
 
 const path = require('path');
-const webpack = require('webpack');
+const CleanWebpackPlugin = require('clean-webpack-plugin');
+const { DefinePlugin, HotModuleReplacementPlugin } = require('webpack');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const devConfig = require('./tools/getDevConfig');
 const proxyServer = require('./proxy-server');
 
-let localDevConfig = {};
-try {
-       localDevConfig = require('./devConfig');
-} catch (e) {}
-let devConfig = Object.assign({}, require('./devConfig.defaults'), localDevConfig);
-let devPort = process.env.PORT || devConfig.port;
+const devPort = process.env.PORT || devConfig.port;
+const publicPath = 'http://localhost:' + devPort + '/onboarding/';
 
-let webpackCommon = require('./webpack.common');
+module.exports = (env, argv) => {
+    const IS_DEV = argv.mode && argv.mode === 'development';
+    let language;
+    if (
+        env === undefined ||
+        env.language === undefined ||
+        env.language === ''
+    ) {
+        console.log('Setting language to default "en".');
+        language = 'en';
+    } else {
+        language = env.language;
+        console.log('Setting language to  "' + env.language + '".');
+    }
 
-function getEntrySources(sources) {
-       for (let i in sources) {
-               if (sources.hasOwnProperty(i)) {
-                       sources[i].push('webpack-dev-server/client?http://localhost:' + devPort);
-                       sources[i].push('webpack/hot/only-dev-server');
-               }
-       }
-       return sources;
-}
-
-let webpackDevConfig = Object.assign({}, webpackCommon, {
-       entry: getEntrySources(devConfig.bundles),
-       devtool: 'eval-source-map',
-       output: {
-               path: path.join(__dirname, 'dist'),
-               publicPath: `http://localhost:${devPort}/onboarding/`,
-               filename: '[name].js'
-       },
-       devServer: {
-               port: devPort,
-               historyApiFallback: true,
-               publicPath: `http://localhost:${devPort}/onboarding/`,
-               contentBase: path.join(__dirname, 'dist'),
-               hot: true,
-               inline: true,
-               stats: {
-                       colors: true,
-                       exclude: ['node_modules']
-               },
-               setup: proxyServer
-       },
-       plugins: [
-               new webpack.DefinePlugin({
-                       DEV: true,
-                       DEBUG: true
-               }),
-               new webpack.HotModuleReplacementPlugin(),
-               new webpack.LoaderOptionsPlugin({
-                       options: {
-                               eslint: {
-                                       configFile: './.eslintrc',
-                                       emitError: true,
-                                       emitWarning: true
-                               },
-                               context: '/'
-                       }
-               })
-       ]
-});
-
-module.exports = webpackDevConfig;
+    const webpackConfig = {
+        entry: {
+            'punch-outs': ['sdc-app/punch-outs.js']
+        },
+        cache: true,
+        devtool: IS_DEV ? 'eval-source-map' : undefined,
+        performance: { hints: false },
+        resolve: {
+            modules: [path.resolve('.'), path.join(__dirname, 'node_modules')],
+            alias: {
+                i18nJson: 'nfvo-utils/i18n/' + language + '.json',
+                'nfvo-utils': 'src/nfvo-utils',
+                'nfvo-components': 'src/nfvo-components',
+                'sdc-app': 'src/sdc-app',
+                // TODO - this is needed for heatValidation standalone. Can be deprecated down the line
+                'react-select/dist/': 'node_modules' + '/react-select/dist/'
+            }
+        },
+        output: {
+            path: path.join(__dirname, 'dist'),
+            publicPath: IS_DEV ? publicPath : './',
+            filename: IS_DEV ? '[name].js' : '[name]_' + language + '.js'
+        },
+        module: {
+            rules: [
+                {
+                    enforce: 'pre',
+                    test: /\.(js|jsx)$/,
+                    include: path.resolve(__dirname, 'src'),
+                    use: [{ loader: 'eslint-loader' }]
+                },
+                {
+                    test: /\.(js|jsx)$/,
+                    include: path.resolve(__dirname, 'src'),
+                    use: [{ loader: 'babel-loader' }]
+                },
+                {
+                    test: /\.(js|jsx)$/,
+                    loader: 'source-map-loader',
+                    include: path.resolve(__dirname, 'src'),
+                    enforce: 'pre'
+                },
+                {
+                    test: /\.(css|scss)$/,
+                    use: [
+                        {
+                            loader: 'style-loader'
+                        },
+                        {
+                            loader: 'css-loader'
+                        },
+                        {
+                            loader: 'sass-loader',
+                            options: {
+                                output: { path: path.join(__dirname, 'dist') }
+                            }
+                        }
+                    ],
+                    include: [
+                        /resources/,
+                        path.join(__dirname, IS_DEV ? '../dox-sequence-diagram-ui/' : 'node_modules/dox-sequence-diagram-ui/'),
+                        path.join(__dirname, 'node_modules/react-datepicker/'),
+                        path.join(__dirname, 'node_modules/react-select/'),
+                        path.join(__dirname, 'node_modules/onap-ui-common/'),
+                        path.join(__dirname, 'node_modules/react-checkbox-tree/')
+                    ]
+                },
+                {
+                    test: /\.(svg)(\?.*)?$/,
+                    loader: 'url-loader',
+                    options: {
+                        limit: 16384,
+                        mimetype: 'image/svg+xml'
+                    },
+                    include: [
+                        path.join(
+                            __dirname,
+                            'node_modules/dox-sequence-diagram-ui/'
+                        ),
+                        path.join(__dirname, 'node_modules/onap-ui-common/')
+                    ]
+                },
+                {
+                    test: /\.worker\.js$/,
+                    use: { loader: 'worker-loader' }
+                }
+            ]
+        },
+        plugins: IS_DEV
+            ? [
+                  new CleanWebpackPlugin(['dist'], { watch: false }),
+                  new DefinePlugin({
+                      DEBUG: true,
+                      DEV: true
+                  }),
+                  new HotModuleReplacementPlugin()
+              ]
+            : [
+                  new DefinePlugin({
+                      DEBUG: false,
+                      DEV: false,
+                  }),
+                  new HtmlWebpackPlugin({
+                    filename: 'index.html',
+                    template: __dirname + '/src/index.html'
+                  })
+              ]
+    };
+    if (IS_DEV) {
+        webpackConfig.output.globalObject = 'this';
+        webpackConfig.entry['punch-outs'].push('react-hot-loader/patch');
+        webpackConfig.entry['punch-outs'].push(
+            'webpack-dev-server/client?http://localhost:' + devPort
+        );
+        webpackConfig.entry['punch-outs'].push('webpack/hot/only-dev-server');
+        webpackConfig.devServer = {
+            port: devPort,
+            historyApiFallback: true,
+            publicPath: publicPath,
+            contentBase: path.join(__dirname, 'dist'),
+            inline: true,
+            hot: true,
+            stats: {
+                colors: true,
+                exclude: [path.join(__dirname, 'node_modules')]
+            },
+            before: proxyServer
+        };
+    }
+    console.log('Running build for: ' + argv.mode);
+    return webpackConfig;
+};