parent
9b4a1db997
commit
6fa10e6a36
2 changed files with 57 additions and 73 deletions
6
.prettierignore
Normal file
6
.prettierignore
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
/node_modules/
|
||||||
|
/public/
|
||||||
|
/vendor/
|
||||||
|
karma.config.js
|
||||||
|
webpack.config.js
|
||||||
|
svg.config.js
|
|
@ -9,14 +9,12 @@ const StatsWriterPlugin = require('webpack-stats-plugin').StatsWriterPlugin;
|
||||||
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
||||||
const CompressionPlugin = require('compression-webpack-plugin');
|
const CompressionPlugin = require('compression-webpack-plugin');
|
||||||
const NameAllModulesPlugin = require('name-all-modules-plugin');
|
const NameAllModulesPlugin = require('name-all-modules-plugin');
|
||||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
|
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
||||||
.BundleAnalyzerPlugin;
|
|
||||||
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
|
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
|
||||||
|
|
||||||
const ROOT_PATH = path.resolve(__dirname, '..');
|
const ROOT_PATH = path.resolve(__dirname, '..');
|
||||||
const IS_PRODUCTION = process.env.NODE_ENV === 'production';
|
const IS_PRODUCTION = process.env.NODE_ENV === 'production';
|
||||||
const IS_DEV_SERVER =
|
const IS_DEV_SERVER = process.argv.join(' ').indexOf('webpack-dev-server') !== -1;
|
||||||
process.argv.join(' ').indexOf('webpack-dev-server') !== -1;
|
|
||||||
const DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost';
|
const DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost';
|
||||||
const DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10) || 3808;
|
const DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10) || 3808;
|
||||||
const DEV_SERVER_LIVERELOAD = process.env.DEV_SERVER_LIVERELOAD !== 'false';
|
const DEV_SERVER_LIVERELOAD = process.env.DEV_SERVER_LIVERELOAD !== 'false';
|
||||||
|
@ -29,10 +27,10 @@ let watchAutoEntries = [];
|
||||||
function generateEntries() {
|
function generateEntries() {
|
||||||
// generate automatic entry points
|
// generate automatic entry points
|
||||||
const autoEntries = {};
|
const autoEntries = {};
|
||||||
const pageEntries = glob.sync('pages/**/index.js', {
|
const pageEntries = glob.sync('pages/**/index.js', { cwd: path.join(ROOT_PATH, 'app/assets/javascripts') });
|
||||||
cwd: path.join(ROOT_PATH, 'app/assets/javascripts'),
|
watchAutoEntries = [
|
||||||
});
|
path.join(ROOT_PATH, 'app/assets/javascripts/pages/'),
|
||||||
watchAutoEntries = [path.join(ROOT_PATH, 'app/assets/javascripts/pages/')];
|
];
|
||||||
|
|
||||||
function generateAutoEntries(path, prefix = '.') {
|
function generateAutoEntries(path, prefix = '.') {
|
||||||
const chunkPath = path.replace(/\/index\.js$/, '');
|
const chunkPath = path.replace(/\/index\.js$/, '');
|
||||||
|
@ -40,16 +38,16 @@ function generateEntries() {
|
||||||
autoEntries[chunkName] = `${prefix}/${path}`;
|
autoEntries[chunkName] = `${prefix}/${path}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
pageEntries.forEach(path => generateAutoEntries(path));
|
pageEntries.forEach(( path ) => generateAutoEntries(path));
|
||||||
|
|
||||||
autoEntriesCount = Object.keys(autoEntries).length;
|
autoEntriesCount = Object.keys(autoEntries).length;
|
||||||
|
|
||||||
const manualEntries = {
|
const manualEntries = {
|
||||||
common: './commons/index.js',
|
common: './commons/index.js',
|
||||||
main: './main.js',
|
main: './main.js',
|
||||||
raven: './raven/index.js',
|
raven: './raven/index.js',
|
||||||
webpack_runtime: './webpack.js',
|
webpack_runtime: './webpack.js',
|
||||||
ide: './ide/index.js',
|
ide: './ide/index.js',
|
||||||
};
|
};
|
||||||
|
|
||||||
return Object.assign(manualEntries, autoEntries);
|
return Object.assign(manualEntries, autoEntries);
|
||||||
|
@ -63,12 +61,8 @@ const config = {
|
||||||
output: {
|
output: {
|
||||||
path: path.join(ROOT_PATH, 'public/assets/webpack'),
|
path: path.join(ROOT_PATH, 'public/assets/webpack'),
|
||||||
publicPath: '/assets/webpack/',
|
publicPath: '/assets/webpack/',
|
||||||
filename: IS_PRODUCTION
|
filename: IS_PRODUCTION ? '[name].[chunkhash].bundle.js' : '[name].bundle.js',
|
||||||
? '[name].[chunkhash].bundle.js'
|
chunkFilename: IS_PRODUCTION ? '[name].[chunkhash].chunk.js' : '[name].chunk.js',
|
||||||
: '[name].bundle.js',
|
|
||||||
chunkFilename: IS_PRODUCTION
|
|
||||||
? '[name].[chunkhash].chunk.js'
|
|
||||||
: '[name].chunk.js',
|
|
||||||
},
|
},
|
||||||
|
|
||||||
module: {
|
module: {
|
||||||
|
@ -97,8 +91,8 @@ const config = {
|
||||||
{
|
{
|
||||||
loader: 'worker-loader',
|
loader: 'worker-loader',
|
||||||
options: {
|
options: {
|
||||||
inline: true,
|
inline: true
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
{ loader: 'babel-loader' },
|
{ loader: 'babel-loader' },
|
||||||
],
|
],
|
||||||
|
@ -109,7 +103,7 @@ const config = {
|
||||||
loader: 'file-loader',
|
loader: 'file-loader',
|
||||||
options: {
|
options: {
|
||||||
name: '[name].[hash].[ext]',
|
name: '[name].[hash].[ext]',
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /katex.css$/,
|
test: /katex.css$/,
|
||||||
|
@ -119,8 +113,8 @@ const config = {
|
||||||
{
|
{
|
||||||
loader: 'css-loader',
|
loader: 'css-loader',
|
||||||
options: {
|
options: {
|
||||||
name: '[name].[hash].[ext]',
|
name: '[name].[hash].[ext]'
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
@ -130,18 +124,15 @@ const config = {
|
||||||
loader: 'file-loader',
|
loader: 'file-loader',
|
||||||
options: {
|
options: {
|
||||||
name: '[name].[hash].[ext]',
|
name: '[name].[hash].[ext]',
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /monaco-editor\/\w+\/vs\/loader\.js$/,
|
test: /monaco-editor\/\w+\/vs\/loader\.js$/,
|
||||||
use: [
|
use: [
|
||||||
{ loader: 'exports-loader', options: 'l.global' },
|
{ loader: 'exports-loader', options: 'l.global' },
|
||||||
{
|
{ loader: 'imports-loader', options: 'l=>{},this=>l,AMDLoader=>this,module=>undefined' },
|
||||||
loader: 'imports-loader',
|
|
||||||
options: 'l=>{},this=>l,AMDLoader=>this,module=>undefined',
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
noParse: [/monaco-editor\/\w+\/vs\//],
|
noParse: [/monaco-editor\/\w+\/vs\//],
|
||||||
|
@ -159,10 +150,10 @@ const config = {
|
||||||
source: false,
|
source: false,
|
||||||
chunks: false,
|
chunks: false,
|
||||||
modules: false,
|
modules: false,
|
||||||
assets: true,
|
assets: true
|
||||||
});
|
});
|
||||||
return JSON.stringify(stats, null, 2);
|
return JSON.stringify(stats, null, 2);
|
||||||
},
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// prevent pikaday from including moment.js
|
// prevent pikaday from including moment.js
|
||||||
|
@ -179,7 +170,7 @@ const config = {
|
||||||
new NameAllModulesPlugin(),
|
new NameAllModulesPlugin(),
|
||||||
|
|
||||||
// assign deterministic chunk ids
|
// assign deterministic chunk ids
|
||||||
new webpack.NamedChunksPlugin(chunk => {
|
new webpack.NamedChunksPlugin((chunk) => {
|
||||||
if (chunk.name) {
|
if (chunk.name) {
|
||||||
return chunk.name;
|
return chunk.name;
|
||||||
}
|
}
|
||||||
|
@ -196,12 +187,9 @@ const config = {
|
||||||
const pagesBase = path.join(ROOT_PATH, 'app/assets/javascripts/pages');
|
const pagesBase = path.join(ROOT_PATH, 'app/assets/javascripts/pages');
|
||||||
|
|
||||||
if (m.resource.indexOf(pagesBase) === 0) {
|
if (m.resource.indexOf(pagesBase) === 0) {
|
||||||
moduleNames.push(
|
moduleNames.push(path.relative(pagesBase, m.resource)
|
||||||
path
|
.replace(/\/index\.[a-z]+$/, '')
|
||||||
.relative(pagesBase, m.resource)
|
.replace(/\//g, '__'));
|
||||||
.replace(/\/index\.[a-z]+$/, '')
|
|
||||||
.replace(/\//g, '__'),
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
moduleNames.push(path.relative(m.context, m.resource));
|
moduleNames.push(path.relative(m.context, m.resource));
|
||||||
}
|
}
|
||||||
|
@ -209,8 +197,7 @@ const config = {
|
||||||
|
|
||||||
chunk.forEachModule(collectModuleNames);
|
chunk.forEachModule(collectModuleNames);
|
||||||
|
|
||||||
const hash = crypto
|
const hash = crypto.createHash('sha256')
|
||||||
.createHash('sha256')
|
|
||||||
.update(moduleNames.join('_'))
|
.update(moduleNames.join('_'))
|
||||||
.digest('hex');
|
.digest('hex');
|
||||||
|
|
||||||
|
@ -228,17 +215,10 @@ const config = {
|
||||||
// copy pre-compiled vendor libraries verbatim
|
// copy pre-compiled vendor libraries verbatim
|
||||||
new CopyWebpackPlugin([
|
new CopyWebpackPlugin([
|
||||||
{
|
{
|
||||||
from: path.join(
|
from: path.join(ROOT_PATH, `node_modules/monaco-editor/${IS_PRODUCTION ? 'min' : 'dev'}/vs`),
|
||||||
ROOT_PATH,
|
|
||||||
`node_modules/monaco-editor/${IS_PRODUCTION ? 'min' : 'dev'}/vs`,
|
|
||||||
),
|
|
||||||
to: 'monaco-editor/vs',
|
to: 'monaco-editor/vs',
|
||||||
transform: function(content, path) {
|
transform: function(content, path) {
|
||||||
if (
|
if (/\.js$/.test(path) && !/worker/i.test(path) && !/typescript/i.test(path)) {
|
||||||
/\.js$/.test(path) &&
|
|
||||||
!/worker/i.test(path) &&
|
|
||||||
!/typescript/i.test(path)
|
|
||||||
) {
|
|
||||||
return (
|
return (
|
||||||
'(function(){\n' +
|
'(function(){\n' +
|
||||||
'var define = this.define, require = this.require;\n' +
|
'var define = this.define, require = this.require;\n' +
|
||||||
|
@ -248,23 +228,23 @@ const config = {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return content;
|
return content;
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
]),
|
]),
|
||||||
],
|
],
|
||||||
|
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: ['.js'],
|
extensions: ['.js'],
|
||||||
alias: {
|
alias: {
|
||||||
'~': path.join(ROOT_PATH, 'app/assets/javascripts'),
|
'~': path.join(ROOT_PATH, 'app/assets/javascripts'),
|
||||||
emojis: path.join(ROOT_PATH, 'fixtures/emojis'),
|
'emojis': path.join(ROOT_PATH, 'fixtures/emojis'),
|
||||||
empty_states: path.join(ROOT_PATH, 'app/views/shared/empty_states'),
|
'empty_states': path.join(ROOT_PATH, 'app/views/shared/empty_states'),
|
||||||
icons: path.join(ROOT_PATH, 'app/views/shared/icons'),
|
'icons': path.join(ROOT_PATH, 'app/views/shared/icons'),
|
||||||
images: path.join(ROOT_PATH, 'app/assets/images'),
|
'images': path.join(ROOT_PATH, 'app/assets/images'),
|
||||||
vendor: path.join(ROOT_PATH, 'vendor/assets/javascripts'),
|
'vendor': path.join(ROOT_PATH, 'vendor/assets/javascripts'),
|
||||||
vue$: 'vue/dist/vue.esm.js',
|
'vue$': 'vue/dist/vue.esm.js',
|
||||||
spec: path.join(ROOT_PATH, 'spec/javascripts'),
|
'spec': path.join(ROOT_PATH, 'spec/javascripts'),
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// sqljs requires fs
|
// sqljs requires fs
|
||||||
|
@ -279,14 +259,14 @@ if (IS_PRODUCTION) {
|
||||||
new webpack.NoEmitOnErrorsPlugin(),
|
new webpack.NoEmitOnErrorsPlugin(),
|
||||||
new webpack.LoaderOptionsPlugin({
|
new webpack.LoaderOptionsPlugin({
|
||||||
minimize: true,
|
minimize: true,
|
||||||
debug: false,
|
debug: false
|
||||||
}),
|
}),
|
||||||
new webpack.optimize.UglifyJsPlugin({
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
sourceMap: true,
|
sourceMap: true
|
||||||
}),
|
}),
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
'process.env': { NODE_ENV: JSON.stringify('production') },
|
'process.env': { NODE_ENV: JSON.stringify('production') }
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
// compression can require a lot of compute time and is disabled in CI
|
// compression can require a lot of compute time and is disabled in CI
|
||||||
|
@ -304,7 +284,7 @@ if (IS_DEV_SERVER) {
|
||||||
headers: { 'Access-Control-Allow-Origin': '*' },
|
headers: { 'Access-Control-Allow-Origin': '*' },
|
||||||
stats: 'errors-only',
|
stats: 'errors-only',
|
||||||
hot: DEV_SERVER_LIVERELOAD,
|
hot: DEV_SERVER_LIVERELOAD,
|
||||||
inline: DEV_SERVER_LIVERELOAD,
|
inline: DEV_SERVER_LIVERELOAD
|
||||||
};
|
};
|
||||||
config.plugins.push(
|
config.plugins.push(
|
||||||
// watch node_modules for changes if we encounter a missing module compile error
|
// watch node_modules for changes if we encounter a missing module compile error
|
||||||
|
@ -320,14 +300,12 @@ if (IS_DEV_SERVER) {
|
||||||
];
|
];
|
||||||
|
|
||||||
// report our auto-generated bundle count
|
// report our auto-generated bundle count
|
||||||
console.log(
|
console.log(`${autoEntriesCount} entries from '/pages' automatically added to webpack output.`);
|
||||||
`${autoEntriesCount} entries from '/pages' automatically added to webpack output.`,
|
|
||||||
);
|
|
||||||
|
|
||||||
callback();
|
callback();
|
||||||
});
|
})
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
);
|
);
|
||||||
if (DEV_SERVER_LIVERELOAD) {
|
if (DEV_SERVER_LIVERELOAD) {
|
||||||
config.plugins.push(new webpack.HotModuleReplacementPlugin());
|
config.plugins.push(new webpack.HotModuleReplacementPlugin());
|
||||||
|
@ -342,7 +320,7 @@ if (WEBPACK_REPORT) {
|
||||||
openAnalyzer: false,
|
openAnalyzer: false,
|
||||||
reportFilename: path.join(ROOT_PATH, 'webpack-report/index.html'),
|
reportFilename: path.join(ROOT_PATH, 'webpack-report/index.html'),
|
||||||
statsFilename: path.join(ROOT_PATH, 'webpack-report/stats.json'),
|
statsFilename: path.join(ROOT_PATH, 'webpack-report/stats.json'),
|
||||||
}),
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue