Fix 'Unable to import service with missing ecompGeneratedNaming in metadata'-bug
[sdc.git] / openecomp-ui / webpack.config.js
index 2cccba8..a007714 100644 (file)
-/*-
- * ============LICENSE_START=======================================================
- * SDC
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
 'use strict';
 
-var path = require('path');
-var webpack = require('webpack');
-
-var localDevConfig = {};
-try {
-       localDevConfig = require('./devConfig');
-} catch(e) {}
-var devConfig = Object.assign({}, require('./devConfig.defaults'), localDevConfig);
-var devPort = process.env.PORT || devConfig.port;
-var latestProgress = 0;
-
-module.exports = {
-       devtool: 'eval-source-map',
-       entry: {
-               bundle: [
-                       'sdc-app/sdc.app.jsx',
-                       `webpack-dev-server/client?http://localhost:${devPort}`,
-                       'webpack/hot/only-dev-server'
-               ],
-               'punch-outs': [
-                       'sdc-app/punch-outs.js',
-                       `webpack-dev-server/client?http://localhost:${devPort}`,
-                       'webpack/hot/only-dev-server'
-               ],
-               'heat-validation': [
-                       'sdc-app/heatValidation.app.jsx',
-                       `webpack-dev-server/client?http://localhost:${devPort}`,
-                       'webpack/hot/only-dev-server'
-               ]
-       },
-       resolve: {
-               root: [path.resolve('.')],
-               alias: {
-                       i18nJson: 'nfvo-utils/i18n/locale.json',
-                       'nfvo-utils': 'src/nfvo-utils',
-                       'nfvo-components': 'src/nfvo-components',
-                       'sdc-app': 'src/sdc-app'
-               }
-       },
-       output: {
-               path: path.join(__dirname, 'dist/dev'),
-               publicPath: `http://localhost:${devPort}/onboarding/`,
-               filename: '[name].js'
-       },
-       devServer: {
-               port: devPort,
-               historyApiFallback: true,
-               publicPath: `http://localhost:${devPort}/onboarding/`,
-               contentBase: path.join(__dirname, 'dist/dev'),
-               hot: true,
-               progress: true,
-               inline: true,
-               debug: true,
-               stats: {
-                       colors: true
-               }
-       },
-       module: {
-               preLoaders: [
-                       {test: /\.(js|jsx)$/, loader: 'source-map-loader', exclude: /node_modules/}
-               ],
-               loaders: [
-                       {test: /\.(js|jsx)$/, loaders: ['react-hot', 'babel-loader', 'eslint-loader'], exclude: /node_modules/},
-                       {test: /\.(css|scss)$/, loaders: ['style', 'css?sourceMap', 'sass?sourceMap']},
+const path = require('path');
+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');
 
-                       // required for font icons
-                       {test: /\.(woff|woff2)(\?.*)?$/,   loader: 'url-loader?limit=16384&mimetype=application/font-woff' },
-                       {test: /\.(ttf|eot|otf)(\?.*)?$/,    loader: 'file-loader' },
-                       {test: /\.(png|jpg|svg)(\?.*)?$/, loader: 'url-loader?limit=16384'},
+const devPort = process.env.PORT || devConfig.port;
+const publicPath = 'http://localhost:' + devPort + '/onboarding/';
 
-                       {test: /\.json$/, loaders: ['json']},
-                       {test: /\.html$/, loaders: ['html']}
-               ]
-       },
-       eslint: {
-               configFile: './.eslintrc',
-               emitError: true,
-               emitWarning: true
-       },
-       plugins: [
-               new webpack.DefinePlugin({
-                       DEV: true,
-                       DEBUG: true
-               }),
-               new webpack.HotModuleReplacementPlugin(),
-               new webpack.ProgressPlugin(function (percentage, msg) {
-                       if (percentage == 0) {
-                               latestProgress = 0;
-                               console.log(); //new line
-                       }
-                       var progressVal = (percentage * 100).toFixed(0);
-                       if (progressVal > latestProgress) {
-                               latestProgress = progressVal
-                               //process.stdout.clearLine();
-                               process.stdout.write(msg + ' ' + progressVal + '%\r');
-                       }
-               })
-       ]
+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 + '".');
+    }
 
+    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;
 };