aboutsummaryrefslogtreecommitdiff
path: root/webpack.config.js
blob: 737882fe25815b60d19deddf379f71a84019ffe4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
var path = require('path');
var webpack = require('webpack');
const CopyWebpackPlugin = require("copy-webpack-plugin");
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");

const plugins = [
    new CopyWebpackPlugin([{
        from: "deploy",
        to: path.join(__dirname, "build")
    }]),
    new ForkTsCheckerWebpackPlugin({
        tslint: true,
        useTypescriptIncrementalApi: true
    }),
    new webpack.optimize.OccurrenceOrderPlugin(),
    new webpack.HotModuleReplacementPlugin(),
];

function transferEnvironmentVariables() {
    const prefix = "_CLIENT_";
    const {
        parsed
    } = require('dotenv').config();
    if (!parsed) {
        return;
    }
    const resolvedClientSide = Object.keys(parsed).reduce((mapping, envKey) => {
        if (envKey.startsWith(prefix)) {
            mapping[`process.env.${envKey.replace(prefix, "")}`] = JSON.stringify(parsed[envKey]);
        }
        return mapping;
    }, {});
    plugins.push(new webpack.DefinePlugin(resolvedClientSide));
}

transferEnvironmentVariables();

module.exports = {
    mode: 'development',
    entry: {
        bundle: ["./src/client/views/Main.tsx", 'webpack-hot-middleware/client?reload=true'],
        viewer: ["./src/debug/Viewer.tsx", 'webpack-hot-middleware/client?reload=true'],
        repl: ["./src/debug/Repl.tsx", 'webpack-hot-middleware/client?reload=true'],
        test: ["./src/debug/Test.tsx", 'webpack-hot-middleware/client?reload=true'],
        inkControls: ["./src/mobile/InkControls.tsx", 'webpack-hot-middleware/client?reload=true'],
        imageUpload: ["./src/mobile/ImageUpload.tsx", 'webpack-hot-middleware/client?reload=true'],
    },
    optimization: {
        noEmitOnErrors: true
    },
    devtool: "source-map",
    node: {
        fs: 'empty',
        module: 'empty',
        dns: 'mock',
        tls: 'mock',
        net: 'mock'
    },
    output: {
        filename: "[name].js",
        path: path.resolve(__dirname, "build"),
        publicPath: "/"
    },
    resolve: {
        extensions: ['.js', '.ts', '.tsx']
    },
    module: {
        rules: [{
                test: [/\.tsx?$/],
                use: [{
                    loader: 'ts-loader',
                    options: {
                        transpileOnly: true
                    }
                }]
            },
            {
                test: /\.scss|css$/,
                use: [{
                        loader: "style-loader"
                    },
                    {
                        loader: "css-loader"
                    },
                    {
                        loader: "sass-loader"
                    }
                ]
            },
            {
                test: /\.(jpg|png|pdf)$/,
                use: [{
                    loader: 'file-loader'
                }]
            },
            {
                test: /\.(png|jpg|gif)$/i,
                use: [{
                    loader: 'url-loader',
                    options: {
                        limit: 8192
                    }
                }]
            }
        ]
    },
    plugins,
    devServer: {
        compress: false,
        host: "localhost",
        contentBase: path.join(__dirname, 'deploy'),
        port: 4321,
        hot: true,
        https: false,
        overlay: {
            warnings: true,
            errors: true
        }
    },
    externals: [
        'child_process'
    ]
};