Skip to content
Snippets Groups Projects
webpack.config.js 7.33 KiB
Newer Older
  • Learn to ignore specific revisions
  • chrisgarrity's avatar
    chrisgarrity committed
    const defaultsDeep = require('lodash.defaultsdeep');
    
    Ray Schamp's avatar
    Ray Schamp committed
    var path = require('path');
    
    var CopyWebpackPlugin = require('copy-webpack-plugin');
    
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    
    var UglifyJsPlugin = require('uglifyjs-webpack-plugin');
    
    
    // PostCss
    var autoprefixer = require('autoprefixer');
    
    var postcssVars = require('postcss-simple-vars');
    var postcssImport = require('postcss-import');
    
    chrisgarrity's avatar
    chrisgarrity committed
    const base = {
    
        mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
    
    chrisgarrity's avatar
    chrisgarrity committed
        devtool: 'cheap-module-source-map',
    
        devServer: {
            contentBase: path.resolve(__dirname, 'build'),
            host: '0.0.0.0',
    
            port: process.env.PORT || 8601
    
    Ray Schamp's avatar
    Ray Schamp committed
        output: {
    
    chrisgarrity's avatar
    chrisgarrity committed
            library: 'GUI',
    
    Ray Schamp's avatar
    Ray Schamp committed
            filename: '[name].js'
        },
    
    chrisgarrity's avatar
    chrisgarrity committed
        externals: {
            React: 'react',
            ReactDOM: 'react-dom'
        },
    
        resolve: {
            symlinks: false
        },
    
    Ray Schamp's avatar
    Ray Schamp committed
        module: {
    
    Ray Schamp's avatar
    Ray Schamp committed
            rules: [{
    
    Ray Schamp's avatar
    Ray Schamp committed
                test: /\.jsx?$/,
    
    Ray Schamp's avatar
    Ray Schamp committed
                loader: 'babel-loader',
    
                include: [path.resolve(__dirname, 'src'), /node_modules[\\/]scratch-[^\\/]+[\\/]src/],
                options: {
                    // Explicitly disable babelrc so we don't catch various config
                    // in much lower dependencies.
                    babelrc: false,
                    plugins: [
    
    Ray Schamp's avatar
    Ray Schamp committed
                        '@babel/plugin-syntax-dynamic-import',
                        '@babel/plugin-transform-async-to-generator',
                        '@babel/plugin-proposal-object-rest-spread',
    
                        ['react-intl', {
                            messagesDir: './translations/messages/'
                        }]],
    
    Ray Schamp's avatar
    Ray Schamp committed
                    presets: [
                        ['@babel/preset-env', {targets: {browsers: ['last 3 versions', 'Safari >= 8', 'iOS >= 8']}}],
                        '@babel/preset-react'
                    ]
    
    Ray Schamp's avatar
    Ray Schamp committed
            {
                test: /\.css$/,
    
    Ray Schamp's avatar
    Ray Schamp committed
                use: [{
                    loader: 'style-loader'
    
    Ray Schamp's avatar
    Ray Schamp committed
                }, {
    
    Ray Schamp's avatar
    Ray Schamp committed
                    loader: 'css-loader',
                    options: {
    
    Ray Schamp's avatar
    Ray Schamp committed
                        modules: true,
    
    Ray Schamp's avatar
    Ray Schamp committed
                        importLoaders: 1,
    
    Ray Schamp's avatar
    Ray Schamp committed
                        localIdentName: '[name]_[local]_[hash:base64:5]',
                        camelCase: true
                    }
                }, {
    
    Ray Schamp's avatar
    Ray Schamp committed
                    loader: 'postcss-loader',
                    options: {
    
                        ident: 'postcss',
    
    Ray Schamp's avatar
    Ray Schamp committed
                        plugins: function () {
                            return [
    
                                postcssImport,
                                postcssVars,
    
    Ray Schamp's avatar
    Ray Schamp committed
                                autoprefixer({
                                    browsers: ['last 3 versions', 'Safari >= 8', 'iOS >= 8']
                                })
                            ];
                        }
                    }
                }]
    
    Ray Schamp's avatar
    Ray Schamp committed
            }]
    
        optimization: {
            minimizer: [
                new UglifyJsPlugin({
                    include: /\.min\.js$/
                })
            ]
        },
        plugins: []
    
    Ray Schamp's avatar
    Ray Schamp committed
    };
    
    module.exports = [
        // to run editor examples
        defaultsDeep({}, base, {
            entry: {
    
                'lib.min': ['react', 'react-dom'],
                'gui': './src/playground/index.jsx',
                'blocksonly': './src/playground/blocks-only.jsx',
                'compatibilitytesting': './src/playground/compatibility-testing.jsx',
                'player': './src/playground/player.jsx'
    
            },
            output: {
                path: path.resolve(__dirname, 'build'),
                filename: '[name].js'
            },
            externals: {
                React: 'react',
                ReactDOM: 'react-dom'
            },
            module: {
                rules: base.module.rules.concat([
                    {
    
                        test: /\.(svg|png|wav|gif|jpg)$/,
    
                        loader: 'file-loader',
                        options: {
                            outputPath: 'static/assets/'
                        }
                    }
                ])
            },
    
            optimization: {
                splitChunks: {
                    chunks: 'all',
                    name: 'lib.min'
                },
                runtimeChunk: {
                    name: 'lib.min'
                }
            },
    
            plugins: base.plugins.concat([
                new webpack.DefinePlugin({
                    'process.env.NODE_ENV': '"' + process.env.NODE_ENV + '"',
    
                    'process.env.DEBUG': Boolean(process.env.DEBUG),
                    'process.env.GA_ID': '"' + (process.env.GA_ID || 'UA-000000-01') + '"'
    
                }),
                new HtmlWebpackPlugin({
    
                    chunks: ['lib.min', 'gui'],
    
                    template: 'src/playground/index.ejs',
    
                    title: 'Scratch 3.0 GUI',
    
                    sentryConfig: process.env.SENTRY_CONFIG ? '"' + process.env.SENTRY_CONFIG + '"' : null
    
                }),
                new HtmlWebpackPlugin({
    
                    chunks: ['lib.min', 'blocksonly'],
    
                    template: 'src/playground/index.ejs',
                    filename: 'blocks-only.html',
                    title: 'Scratch 3.0 GUI: Blocks Only Example'
                }),
                new HtmlWebpackPlugin({
    
                    chunks: ['lib.min', 'compatibilitytesting'],
    
                    template: 'src/playground/index.ejs',
                    filename: 'compatibility-testing.html',
                    title: 'Scratch 3.0 GUI: Compatibility Testing'
                }),
                new HtmlWebpackPlugin({
    
                    chunks: ['lib.min', 'player'],
    
                    template: 'src/playground/index.ejs',
                    filename: 'player.html',
                    title: 'Scratch 3.0 GUI: Player Example'
                }),
                new CopyWebpackPlugin([{
                    from: 'static',
                    to: 'static'
                }]),
                new CopyWebpackPlugin([{
                    from: 'node_modules/scratch-blocks/media',
                    to: 'static/blocks-media'
                }]),
                new CopyWebpackPlugin([{
                    from: 'extensions/**',
                    to: 'static',
                    context: 'src/examples'
                }]),
                new CopyWebpackPlugin([{
                    from: 'extension-worker.{js,js.map}',
                    context: 'node_modules/scratch-vm/dist/web'
                }])
            ])
        })
    ].concat(
    
        process.env.NODE_ENV === 'production' || process.env.BUILD_MODE === 'dist' ? (
    
            // export as library
            defaultsDeep({}, base, {
                target: 'web',
                entry: {
                    'scratch-gui': './src/index.js'
                },
                output: {
                    libraryTarget: 'umd',
                    path: path.resolve('dist')
                },
                externals: {
                    React: 'react',
                    ReactDOM: 'react-dom'
                },
                module: {
                    rules: base.module.rules.concat([
                        {
                            test: /\.(svg|png|wav|gif|jpg)$/,
                            loader: 'file-loader',
                            options: {
                                outputPath: 'static/assets/',
                                publicPath: '/static/assets/'
                            }
    
                    ])
                },
                plugins: base.plugins.concat([
                    new CopyWebpackPlugin([{
                        from: 'node_modules/scratch-blocks/media',
                        to: 'static/blocks-media'
                    }]),
                    new CopyWebpackPlugin([{
                        from: 'extension-worker.{js,js.map}',
                        context: 'node_modules/scratch-vm/dist/web'
                    }])