forked from reverietracker/chromatic
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwebpack.config.js
More file actions
126 lines (115 loc) · 3.65 KB
/
Copy pathwebpack.config.js
File metadata and controls
126 lines (115 loc) · 3.65 KB
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
124
125
126
require('ts-node').register({ transpileOnly: true, compilerOptions: { module: 'commonjs' } });
// Some TS modules imported during config evaluation import Lua sources (e.g. `import x from "./file.lua"`).
// Webpack handles this via `raw-loader`, but Node/ts-node needs a require hook during config load.
require.extensions['.lua'] = function (module, filename) {
module.exports = require('fs').readFileSync(filename, 'utf8');
};
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const webpack = require('webpack');
const { BridgeWatchPlugin } = require('./scripts/bridge-watch-plugin.ts');
const fs = require('fs');
const dotenv = require('dotenv');
const { buildSeoConfig } = require('./scripts/buildSeoConfig');
const { SeoAssetsWebpackPlugin } = require('./scripts/seo-assets-webpack-plugin');
const { BUILD_INFO, getBridgeCartFilename } = require('./scripts/buildInfo');
const envPath = path.join(__dirname, '.env');
const envLocalPath = path.join(__dirname, '.env.local');
if (fs.existsSync(envLocalPath)) dotenv.config({ path: envLocalPath });
if (fs.existsSync(envPath)) dotenv.config({ path: envPath });
const SEO = buildSeoConfig(process.env);
// This is the main configuration object.
// Here, you write different options and tell Webpack what to do
module.exports = {
// Path to your entry point. From this file Webpack will begin its work
entry: './src/index.tsx',
// Path and filename of your result bundle.
// Webpack will bundle all JavaScript into this file
output: {
filename: `bundle.${BUILD_INFO.commitHash}.js`,
path: path.resolve(__dirname, "dist"),
publicPath: "",
clean: true,
},
module: {
rules: [
{
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
{
test: /\.lua$/,
use: 'raw-loader',
},
{
test: /\.jsonc$/,
type: 'javascript/auto',
use: {
loader: path.resolve(__dirname, 'scripts/jsonc-loader.js'),
},
},
{
test: /\.([jt])sx?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
"@babel/preset-env",
[
"@babel/preset-react",
{ runtime: "automatic" }
],
"@babel/preset-typescript"
],
},
},
},
],
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx'],
},
plugins: [
new HtmlWebpackPlugin({
title: SEO.title,
template: 'index.html',
seo: SEO,
}),
new HtmlWebpackPlugin({
filename: 'tic80-iframe-shell.html',
template: 'public/tic80-iframe-shell.html',
inject: false,
bridgeCartFilename: getBridgeCartFilename(BUILD_INFO),
}),
new MiniCssExtractPlugin({
filename: `[name].${BUILD_INFO.commitHash}.css`,
}),
new CopyWebpackPlugin({
patterns: [
{
from: "public", // source folder
to: ".", // copy into dist root (default output.path)
globOptions: {
ignore: [
'**/robots.txt',
'**/sitemap.xml',
'**/tic80-iframe-shell.html',
],
},
},
],
}),
new SeoAssetsWebpackPlugin(SEO),
new webpack.DefinePlugin({
BUILD_INFO: JSON.stringify(BUILD_INFO),
}),
new BridgeWatchPlugin({
bridgeDir: path.resolve(__dirname, 'bridge'),
}),
],
// Default mode for Webpack is production.
mode: 'development'
};