HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //proc/1233/root/home/arjun/projects/buyercall_forms/buyercall/config/webpack.config.js
const path = require('path');

// Webpack and third party plugins.
const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const ManifestRevisionPlugin = require('manifest-revision-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

// Environment detection.
const node_env = process.env.NODE_ENV || 'development';

// Global server name
const SERVER_NAME = process.env.SERVER_NAME || 'localhost:8000';
const URL_SCHEME = process.env.URL_SCHEME || 'http';
/*
 Configuration settings
 ------------------------------------------------------------------------------
 */

// Where is your project located relative to this config?
const context = path.join(__dirname, '..');

// Where are your source assets located?
const rootAssetPath = './buyercall/assets';
const contextRoot = path.join(context, rootAssetPath);

// Which human languages do you want to support? (regex)
const languages = /en|es/;

// Where will the files get built to?
// var buildOutputPath = './build/public';
const buildOutputPath = path.join(context, './build/public');

// How should certain asset types be configured?
const assets = {
    fonts: {
        path: 'fonts',
        filename: '[path][name].[hash].[ext]'
    },
    images: {
        path: 'images',
        filename: '[path][name].[hash].[ext]'
    },
    images_theme: {
        path: 'images/theme',
        filename: '[path][name].[ext]'
    },
    scripts: {
        path: 'scripts',
        filename: '[name].[chunkhash].js',
        chunkFilename: '[id].[chunkhash].js'
    },
    components: {
        path: 'components',
        filename: '[name].[chunkhash].[ext]',
        chunkFilename: '[id].[chunkhash].[ext]'
    },
    styles: {
        path: 'styles',
        filename: '[name].[chunkhash].css',
        chunkFilename: '[id].[chunkhash].css'
    }
};

// Which top level JS and CSS files should get output?
const chunks = {
    app_js: [
        path.join(contextRoot, assets.scripts.path, 'entry.js')
    ],
    app_css: [
        path.join(contextRoot, assets.styles.path, 'default.scss')
    ],
    frontend_js: [
        path.join(contextRoot, assets.scripts.path, 'frontend.js')
    ],
    backend_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js')
    ],
    widgets_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.components.path, 'widgets.js')
    ],
    widgets_css: [
        path.join(contextRoot, assets.styles.path, 'widgets.scss')
    ],
    outbound_backend_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.scripts.path, 'outbound_backend_js.js'),
    ],
    inbound_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.components.path, 'inbound/inbound.js')
    ],
    call_widget_js: [
        path.join(contextRoot, assets.components.path, 'widgets/call_widget.js')
    ],
    agents_dashboard_js: [
        path.join(contextRoot, assets.components.path, 'agents/agents_dashboard.js')
    ],
    leads_dashboard_js: [
        path.join(contextRoot, assets.components.path, 'leads/leads_dashboard.js')
    ],
    sms_dashboard_js: [
        path.join(contextRoot, assets.components.path, 'sms/sms_dashboard.js'),
        path.join(contextRoot, assets.components.path, 'lead-sms.js')
    ],
    contacts_dashboard_js: [
        path.join(contextRoot, assets.components.path, 'contacts/contacts_dashboard.js'),
        path.join(contextRoot, assets.components.path, 'lead-sms.js')
    ],
    contacts_edit_js: [
        path.join(contextRoot, assets.components.path, 'contacts/contacts_edit.js'),
        path.join(contextRoot, assets.components.path, 'lead-sms.js')
    ],
    leads_backend_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.scripts.path, 'index.js'),
        path.join(contextRoot, assets.scripts.path, 'tables.js')
    ],
    agent_form_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.scripts.path, 'agent_form.js'),
    ],
    group_form_js: [
        path.join(contextRoot, assets.scripts.path, 'group_form.js'),
    ],
    forms_backend_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.scripts.path, 'forms_backend.js')
    ],
    forms_backend_edit_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.scripts.path, 'forms_backend_edit.js')
    ],
    form_leads_backend_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.scripts.path, 'form_leads_backend.js')
    ],
    form_leads_backend_new_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js')
    ],    
    form_leads_backend_edit_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.scripts.path, 'form_leads_backend_edit.js')
    ],
    partnership_new_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.components.path, 'sysadmin/partnership_new.js')
    ],
    account_edit_js: [
        path.join(contextRoot, assets.scripts.path, 'backend.js'),
        path.join(contextRoot, assets.components.path, 'partnership/account_edit.js')
    ],
    vendor_js: [
        'bootstrap',
        'moment',
        path.join(contextRoot, assets.scripts.path, 'vendor', 'jquery-ui.min.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'material.min.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'perfect-scrollbar.jquery.min.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'chartist.min.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'jquery.bootstrap-wizard.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'gsdk-bootstrap-wizard.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'jquery.select-bootstrap.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'bootstrap-notify.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'bootstrap-colorpicker.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'bootstrap-datetimepicker.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'fullcalendar.min.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'jasny-bootstrap.min.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'jquery-jvectormap.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'jquery.tagsinput.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'jquery.auto-complete.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'sweetalert2.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'nouislider.min.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'material-dashboard.js'),
        path.join(contextRoot, assets.scripts.path, 'vendor', 'player.min.js'),
    ],
    vendor_css: [
        // Bootstrap configuration settings:
        // https://gist.github.com/anonymous/ef4593b01915d647ed88
        // http://getbootstrap.com/customize/?id=ef4593b01915d647ed88
        path.join(contextRoot, assets.styles.path, 'vendor', 'bootstrap.3.3.5.min.css'),
        path.join(contextRoot, assets.styles.path, 'vendor', 'font-awesome.4.3.0.css'),
        path.join(contextRoot, assets.styles.path, 'vendor', 'material-dashboard.scss'),
        path.join(contextRoot, assets.styles.path, 'vendor', 'jquery.auto-complete.css'),
        path.join(contextRoot, assets.styles.path, 'vendor', 'progres-bar.css'),
    ],
    contact_lead_js : [
        path.join(contextRoot, assets.scripts.path, 'mobile', 'contact_leads.js'),
    ],
    contact_note_js : [
        path.join(contextRoot, assets.scripts.path, 'mobile', 'contact_note.js'),
    ],
    contact_detail_js : [
        path.join(contextRoot, assets.scripts.path, 'mobile', 'contact_detail.js'),
    ],
    contact_timeline_js : [
        path.join(contextRoot, assets.scripts.path, 'mobile', 'contact_timeline.js'),
    ],
    add_contact_js : [
        path.join(contextRoot, assets.scripts.path, 'mobile', 'add_contact.js'),
    ],
    voicemail_js : [
        path.join(contextRoot, assets.scripts.path, 'mobile', 'mediaelement-and-player.min.js'),
        path.join(contextRoot, assets.scripts.path, 'mobile', 'voicemail.js'),
    ],
    mobile_js : [
        'popper.js',
        'jquery-mask-plugin',
        path.join(contextRoot, assets.scripts.path, 'mobile', 'bootstrap-datepicker.js'),
        path.join(contextRoot, assets.scripts.path, 'mobile', 'bootstrap.min.js'),
        path.join(contextRoot, assets.scripts.path, 'mobile', 'mobile.js'),
    ],
    mobile_css : [
        path.join(contextRoot, assets.styles.path, 'mobile', 'datepicker.css'),
        path.join(contextRoot, assets.styles.path, 'mobile', 'bootstrap.min.css'),
        path.join(contextRoot, assets.styles.path, 'mobile', 'mediaelementplayer.css'),
        path.join(contextRoot, assets.styles.path, 'mobile', 'mobile.css'),
    ],
};

// Avoid parsing this code to speed up rebuilds.
/*var noParse = [
    path.join(contextRoot, assets.scripts.path, 'vendor'),
    path.join(contextRoot, assets.styles.path, 'vendor')
];*/
const noParse = /(scripts\/vendor)/;
// const noParse = /(scripts\/vendor)|(styles\/vendor)/;

// Where will assets get served in development mode? This depends on running
// the webpack dev server.
const publicPath = process.env.PUBLIC_PATH || 'http://localhost:2992/assets/';

/*
 Do not edit past this line unless you are tinkering with webpack.
 ------------------------------------------------------------------------------
 */

const optimization = {};

// Plugins that will load in all environments.
const plugins = [

    new MiniCssExtractPlugin(
        {
            filename: assets.styles.filename,
            chunkFilename: assets.styles.chunkFilename
        }
    ),

    // http://webpack.github.io/docs/list-of-plugins.html#contextreplacementplugin
    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, languages)
];

// Development environment only plugins.
if (node_env !== 'development') {
    // plugins.push(developmentPlugins[0]);
    optimization.minimizer = [
        new UglifyJsPlugin({
            uglifyOptions: {
                warnings: false
            },
        }),
    ];
}

// The location of manifest.json to be used by flask-webpack
// See https://github.com/nickjj/manifest-revision-webpack-plugin
const manifestPath = path.join('build', 'manifest.json');
// Preserve manifest between ManifestRevisionPlugin.format calls
const manifest = {};
/*
 * Builds manifest.json for use from flask-webpack. See
 * https://github.com/nickjj/manifest-revision-webpack-plugin
 */
const manifestRevisionPlugin = new ManifestRevisionPlugin(manifestPath, {
    rootAssetPath: rootAssetPath,
    ignorePaths: ['/fonts', '/styles', '/scripts'],
    extensionsRegex: /\.(jpe?g|png|gif|svg([\?]?.*))$/i,
    format: function (data, assets) {
        // Since the result of this function will replace the existing
        // manifest.json, we need to read the file and extend it with
        // new data.
        const output = {
            publicPath: data.publicPath,
            assets: manifest
        };
        for (let key in assets) {
            output.assets[key] = assets[key];
        }

        for (let chunk in data.assetsByChunkName) {
            let chunkValue = data.assetsByChunkName[chunk];
            if (typeof chunkValue == 'string') {
                chunkValue = [chunkValue];
            }

            for (let i = 0; i < chunkValue.length; i++) {
                const chunkWithExtension = chunk + '.' + chunkValue[i].split('.').slice(-1)[0];
                output.assets[chunkWithExtension] = chunkValue[i];
            }
        }

        return output;
    }
});

// Define global replace strings
const definePlugin = new webpack.DefinePlugin({
    SERVER_NAME: JSON.stringify(SERVER_NAME),
    URL_SCHEME: JSON.stringify(URL_SCHEME)
});

/*optimization.splitChunks = {
    cacheGroups: {
        commons: {
            test: /[\\/]node_modules[\\/]/,
            name: 'vendor_js',
            filename: 'vendor_js.js',
            chunks: 'all',
        }
    }
};*/

// JS files and templates used in the web site itself
const resources = [
    {
        mode: node_env,
        target: 'web',
        context: path.join(__dirname, '../'),
        entry: chunks,
        output: {
            path: buildOutputPath,
            publicPath: publicPath,
            filename: assets.scripts.filename,
            chunkFilename: assets.scripts.chunkFilename
        },
        externals: {
            'jquery': 'jQuery'
        },
        resolve: {
            // Allow requiring files without supplying the extension.
            extensions: ['.json', '.js', '.min.js', '.scss'],
            modules: [
                path.join(contextRoot, assets.scripts.path, 'vendor'),
                'node_modules'
            ]
        },
        optimization,
        module: {
            // noParse: noParse,
            rules: [
                {
                    test: /\.js$/i,
                    exclude: /node_modules/,
                    use: [
                        {
                            loader: 'babel-loader',
                            options: {
                                presets: ["@babel/preset-env"]
                            }
                        }
                    ]
                },
                {
                    test: /\.s?css$/i,
                    use: [
                        'style-loader',
                        {
                            loader: MiniCssExtractPlugin.loader,
                            options: {
                                hmr: node_env === 'development',
                            },
                        },
                        'css-loader',
                        {
                            loader: 'postcss-loader',
                            options: {
                                config: {
                                    path: './config/'
                                }
                            }
                        },
                        {
                            loader: 'sass-loader',
                            options: {
                                sassOptions: {
                                    includePaths: [path.join(contextRoot, assets.styles.path)],
                                },
                            },
                        },
                    ],
                },
                {
                    test: /\.(jpe?g|png|gif|svg([\?]?.*))$/i,
                    use: [
                        {
                            loader: 'file-loader',
                            options: {
                                context: rootAssetPath,
                                name: assets.images.filename
                            }
                        },
                        {
                            loader: 'image-webpack-loader',
                            options: {
                                // bypassOnDebug: true,
                                disable: true,
                            },
                        }
                    ]
                },
                {
                    test: /\.(woff([\?]?.*)|woff2([\?]?.*))$/i,
                    use: [
                        {
                            loader: 'url-loader',
                            options: {
                                limit: 100000,
                            },
                        },
                    ],
                },
                {
                    test: /\.(ttf([\?]?.*)|eot([\?]?.*))$/i,
                    use: [
                        {
                            loader: 'file-loader',
                            options: {
                                context: rootAssetPath,
                                name: assets.fonts.filename
                            }
                        },
                    ]
                },
                {
                    test: /\.tpl$/,
                    use: ['underscore-template-loader']
                },
                {
                    test: /\.po$/,
                    use: [
                        'json-loader',
                        'po-loader'
                    ]
                },
            ]
        },
        plugins: plugins.concat([
            manifestRevisionPlugin,

            definePlugin,

            new webpack.ProvidePlugin({
                '__': 'localize',
                '_': 'underscore',
                'html': 'html_utils',
            })
        ]),
        devServer: {
            watchOptions: {
                aggregateTimeout: 300,
                poll: 1000
            },
            headers: {
                "Cache-Control": "public; max-age=43200"
            }
        },
        //devtool: 'source-map'
    }
];


// Externally-loaded call widget script
resources.push({
    mode: node_env,
    target: 'web',
    context: path.join(__dirname, '../'),
    entry: {
        call_widget_external: [
            path.join(contextRoot, assets.components.path, 'widgets/call_widget.js')
        ],
    },
    output: {
        path: buildOutputPath,
        publicPath: publicPath,
        filename: '[name].js',
        chunkFilename: '[id].js'
    },
    resolve: {
        // Allow requiring files without supplying the extension.
        extensions: ['.json', '.js', '.min.js', '.scss'],
        modules: [
            path.join(contextRoot, assets.scripts.path, 'vendor'),
            'node_modules'
        ]
    },
    module: {
        // noParse: noParse,
        rules: [
            {
                test: /\.js$/i,
                exclude: /node_modules/,
                use: [
                    {
                        loader: 'babel-loader',
                        options: {
                            presets: ["@babel/preset-env"]
                        }
                    }
                ]
            },
            {
                test: /\.s?css$/i,
                use: [
                    'style-loader',
                    'css-loader',
                    {
                        loader: 'postcss-loader',
                        options: {
                            config: {
                                path: './config/'
                            }
                        }
                    },
                    {
                        loader: 'sass-loader',
                        options: {
                            sassOptions: {
                                includePaths: [path.join(contextRoot, assets.styles.path)],
                            },
                        },
                    },
                ],
            },
            {
                test: /\.(jpe?g|png|gif|svg([\?]?.*))$/i,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            context: rootAssetPath,
                            name: assets.images.filename
                        }
                    },
                    {
                        loader: 'image-webpack-loader',
                        options: {
                            // bypassOnDebug: true,
                            disable: true,
                        },
                    }
                ]
            },
            {
                test: /\.(woff([\?]?.*)|woff2([\?]?.*))$/i,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 100000,
                        },
                    },
                ],
            },
            {
                test: /\.(ttf([\?]?.*)|eot([\?]?.*))$/i,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            context: rootAssetPath,
                            name: assets.fonts.filename
                        }
                    },
                ]
            },
            {
                test: /\.tpl$/,
                use: ['underscore-template-loader']
            },
            {
                test: /\.po$/,
                use: [
                    'json-loader',
                    'po-loader'
                ]
            },
        ]
    },
    plugins: [
        manifestRevisionPlugin,

        definePlugin,

        new webpack.ProvidePlugin({
            '_': 'underscore',
            '$': 'jquery',
            'jQuery': 'jquery'
        })
    ],
    devServer: {
        watchOptions: {
            aggregateTimeout: 300,
            poll: 1000
        }
    }
});

module.exports = resources;