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