forked from EnixCoda/Gitako
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack.config.js
151 lines (142 loc) · 4.12 KB
/
webpack.config.js
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
const webpack = require('webpack')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin')
const path = require('path')
const Dotenv = require('dotenv-webpack')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const srcPath = path.resolve(__dirname, 'src')
const packagesPath = path.resolve(__dirname, 'packages')
function resolvePathInput(input) {
return path.isAbsolute(input) ? input : path.resolve(process.cwd(), input)
}
const buildTarget = process.env.TARGET
const buildTargetOutputMap = {
safari: 'Safari/Gitako/Gitako Extension/Resources',
}
const envOutputDir = process.env.OUTPUT_DIR || buildTargetOutputMap[buildTarget]
const outputPath = envOutputDir ? resolvePathInput(envOutputDir) : path.resolve(__dirname, 'dist')
const IN_PRODUCTION_MODE = process.env.NODE_ENV === 'production'
const plugins = [
new CopyWebpackPlugin([
{
from: './src/manifest.json',
to: 'manifest.json',
transform(content) {
const { version, description, author, homepage: homepage_url } = require('./package.json')
const manifest = JSON.parse(content)
Object.assign(manifest, {
version,
description,
author,
homepage_url,
})
// Disable custom domains for Safari
if (buildTarget === 'safari') {
Reflect.deleteProperty(manifest, 'optional_permissions')
Reflect.deleteProperty(manifest, 'background')
}
if (!IN_PRODUCTION_MODE) {
Object.assign(manifest, {
web_accessible_resources: manifest.web_accessible_resources.concat('*.map'), // enable source mapping while developing
})
}
return JSON.stringify(manifest)
},
},
{
from: './src/assets/icons/*',
to: 'icons/[name].[ext]',
},
{
from: './vscode-icons/icons/*',
to: 'icons/vscode/[name].[ext]',
},
{
from: 'node_modules/webextension-polyfill/dist/browser-polyfill.js',
to: 'browser-polyfill.js',
},
{
from: './src/firefox-shim.js',
to: 'firefox-shim.js',
},
]),
new ForkTsCheckerWebpackPlugin(),
new Dotenv(),
new MiniCssExtractPlugin(),
]
const analyze = process.env.ANALYZE !== undefined
if (analyze) {
plugins.push(new BundleAnalyzerPlugin())
console.log(`BundleAnalyzerPlugin added`)
}
plugins.push(
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
'process.env.VERSION': JSON.stringify(process.env.VERSION),
}),
)
module.exports = {
entry: {
content: './src/content.tsx',
background: './src/background.ts',
},
devtool: IN_PRODUCTION_MODE ? 'source-map' : 'inline-source-map',
mode: IN_PRODUCTION_MODE ? 'production' : 'development',
output: {
path: outputPath,
filename: '[name].js',
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
modules: [srcPath, packagesPath, 'node_modules'],
},
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'babel-loader',
options: {
cacheDirectory: true,
},
include: [srcPath, packagesPath],
exclude: /node_modules/,
sideEffects: false,
},
{
test: /\.js$/,
loader: 'babel-loader',
// Transpile as least files under node_modules
include: /node_modules\/(webext-content-scripts|webext-detect-page)\/.*\.js$/,
options: {
cacheDirectory: true,
},
},
{
test: /\.scss$/,
loader: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
include: [srcPath],
},
{
test: /\.svg$/,
resourceQuery: /inline/,
loader: ['url-loader'],
},
{
test: /\.csv$/,
loader: ['raw-loader'],
},
{
test: /\.json$/,
loader: ['json-loader'],
include: [srcPath],
},
{
test: /\.png$/,
loader: ['url-loader'],
include: [srcPath],
},
],
},
plugins,
}