const path = require('path'); const webpack = require('webpack'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); const plugins = [ new CopyWebpackPlugin([ { from: 'deploy', to: path.join(__dirname, 'build'), }, ]), new HtmlWebpackPlugin({ title: 'Caching', }), new ForkTsCheckerWebpackPlugin({ tslint: true, // memoryLimit: 4096, useTypescriptIncrementalApi: true, }), new webpack.ProvidePlugin({ Buffer: ['buffer', 'Buffer'] }), new webpack.ProvidePlugin({ process: 'process/browser' }), 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'], mobileInterface: ['./src/client/views/Main.tsx', 'webpack-hot-middleware/client?reload=true'], }, devtool: 'source-map', output: { filename: '[name].js', path: path.resolve(__dirname, 'build'), publicPath: '/', }, resolve: { extensions: ['.js', '.ts', '.tsx'], fallback: { fs: false, tls: false, net: false, zlib: false, dns: false, crypto: false, assert: false, os: false, path: require.resolve('path-browserify'), http: require.resolve('http-browserify'), https: require.resolve('https-browserify'), stream: require.resolve('stream-browserify'), buffer: require.resolve('buffer'), }, }, module: { rules: [ { test: [/\.tsx?$/], use: [ { loader: 'ts-loader', options: { transpileOnly: true, }, }, ], }, { test: /\.m?js/, resolve: { fullySpecified: false, }, }, { test: /\.(woff|woff2|ttf|eot|otf|svg)$/, use: 'file-loader?name=fonts/[name].[ext]!static', }, { test: /\.(scss|css)$/, // 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, }, }, ], }, ], noParse: [require.resolve('typescript/lib/typescript.js')], }, plugins, externals: ['child_process'], };