@mongodb-js/compass-query-bar
Version:
Renders a component for executing MongoDB queries through a GUI.
190 lines (179 loc) • 5.06 kB
JavaScript
const webpack = require('webpack');
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { spawn } = require('child_process');
const project = require('./project');
const GLOBALS = {
'process.env': {
'NODE_ENV': JSON.stringify('development')
},
__DEV__: JSON.stringify(JSON.parse('true'))
};
module.exports = {
target: 'electron-renderer',
entry: {
index: [
// activate HMR for React
'react-hot-loader/patch',
// bundle the client for webpack-dev-server
// and connect to the provided endpoint
'webpack-dev-server/client?http://0.0.0.0:8080',
// bundle the client for hot reloading
// only- means to only hot reload for successful updates
'webpack/hot/only-dev-server',
// the entry point of our plugin for dev
path.resolve(project.path.electron, 'renderer/index.js')
]
},
output: {
path: project.path.output,
publicPath: '/',
filename: '[name].js'
},
resolve: {
modules: ['node_modules'],
extensions: ['.js', '.jsx', '.json', 'less'],
alias: {
actions: path.join(project.path.src, 'actions'),
components: path.join(project.path.src, 'components'),
constants: path.join(project.path.src, 'constants'),
fonts: path.join(project.path.src, 'assets/fonts'),
images: path.join(project.path.src, 'assets/images'),
less: path.join(project.path.src, 'assets/less'),
models: path.join(project.path.src, 'models'),
plugin: path.join(project.path.src, 'index.js'),
stores: path.join(project.path.src, 'stores'),
storybook: project.path.storybook
}
},
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: 'style-loader'},
{ loader: 'css-loader' }
]
},
// For styles that have to be global (see https://github.com/css-modules/css-modules/pull/65)
{
test: /\.less$/,
include: [/\.global/, /bootstrap/],
use: [
{ loader: 'style-loader' },
{
loader: 'css-loader',
options: {
modules: false
}
},
{
loader: 'postcss-loader',
options: {
plugins: function() {
return [
project.plugin.autoprefixer
];
}
}
},
{
loader: 'less-loader',
options: {
noIeCompat: true
}
}
]
},
// For CSS-Modules locally scoped styles
{
test: /\.less$/,
exclude: [/\.global/, /bootstrap/, /node_modules/],
use: [
{ loader: 'style-loader' },
{
loader: 'css-loader',
options: {
modules: true,
importLoaders: 1,
localIdentName: 'QueryBar_[name]-[local]__[hash:base64:5]'
}
},
{
loader: 'postcss-loader',
options: {
plugins: function() {
return [
project.plugin.autoprefixer
];
}
}
},
{
loader: 'less-loader',
options: {
noIeCompat: true
}
}
]
},
{
test: /node_modules[\\\/]JSONStream[\\\/]index\.js/,
use: [{ loader: 'shebang-loader' }]
},
{
test: /\.(js|jsx)$/,
use: [{ loader: 'babel-loader' }],
exclude: /(node_modules)/
},
{
test: /\.(png|jpg|jpeg|gif|svg)$/,
use: [{
loader: 'url-loader',
query: {
limit: 8192,
name: 'assets/images/[name]__[hash:base64:5].[ext]'
}
}]
},
{
test: /\.(woff|woff2|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
use: [{
loader: 'url-loader',
query: {
limit: 8192,
name: 'assets/fonts/[name]__[hash:base64:5].[ext]'
}
}]
}
]
},
plugins: [
// Enable HMR globally
new webpack.HotModuleReplacementPlugin(),
// Prints more readable module names in the browser console on HMR updates
new webpack.NamedModulesPlugin(),
// Do not emit compiled assets that include errors
new webpack.NoEmitOnErrorsPlugin(),
// Creates HTML page for us at build time
new HtmlWebpackPlugin(),
// Defines global variables
new webpack.DefinePlugin(GLOBALS)
],
devtool: 'cheap-source-map',
devServer: {
host: '0.0.0.0',
hot: true,
contentBase: project.path.output,
stats: {
colors: true,
chunks: false,
children: false
},
setup() {
spawn('electron', [project.path.electron], { shell: true, env: process.env, stdio: 'inherit' })
.on('close', () => process.exit(0))
.on('error', spawnError => console.error(spawnError)); // eslint-disable-line no-console
}
}
};