templates/rails_app/config/webpack/shared.js in railman-1.0.3 vs templates/rails_app/config/webpack/shared.js in railman-1.0.4

- old
+ new

@@ -1,80 +1,54 @@ -// Note: You must restart bin/webpack-watcher for changes to take effect +// Note: You must restart bin/webpack-dev-server for changes to take effect +/* eslint global-require: 0 */ +/* eslint import/no-dynamic-require: 0 */ + const webpack = require('webpack') -const path = require('path') -const process = require('process') -const glob = require('glob') +const { basename, dirname, join, relative, resolve } = require('path') +const { sync } = require('glob') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const ManifestPlugin = require('webpack-manifest-plugin') const extname = require('path-complete-extname') +const { env, paths, publicPath, loadersDir } = require('./configuration.js') -let distDir = process.env.WEBPACK_DIST_DIR +const extensionGlob = `**/*{${paths.extensions.join(',')}}*` +const packPaths = sync(join(paths.source, paths.entry, extensionGlob)) -if (distDir === undefined) { - distDir = 'packs' -} - -const config = { - entry: glob.sync(path.join('app', 'javascript', 'packs', '*.js*')).reduce( +module.exports = { + entry: packPaths.reduce( (map, entry) => { - const basename = path.basename(entry, extname(entry)) const localMap = map - localMap[basename] = path.resolve(entry) + const namespace = relative(join(paths.source, paths.entry), dirname(entry)) + localMap[join(namespace, basename(entry, extname(entry)))] = resolve(entry) return localMap }, {} ), - output: { filename: '[name].js', path: path.resolve('public', distDir) }, + output: { + filename: '[name].js', + path: resolve(paths.output, paths.entry), + publicPath + }, module: { - rules: [ - { - test: /.vue$/, loader: 'vue-loader', - options: { - loaders: { 'scss': 'vue-style-loader!css-loader!sass-loader', 'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax'} - } - }, - { test: /.png$/, loader: 'url-loader?mimetype=image/png'}, - { test: /\.coffee(\.erb)?$/, loader: 'coffee-loader' }, - { - test: /\.js(\.erb)?$/, - exclude: /node_modules/, - loader: 'babel-loader', - options: { - presets: [ - ['env', { modules: false }] - ] - } - }, - { - test: /\.erb$/, - enforce: 'pre', - exclude: /node_modules/, - loader: 'rails-erb-loader', - options: { - runner: 'DISABLE_SPRING=1 bin/rails runner' - } - } - ] + rules: sync(join(loadersDir, '*.js')).map(loader => require(loader)) }, plugins: [ - new webpack.EnvironmentPlugin(Object.keys(process.env)) + new webpack.EnvironmentPlugin(JSON.parse(JSON.stringify(env))), + new ExtractTextPlugin(env.NODE_ENV === 'production' ? '[name]-[hash].css' : '[name].css'), + new ManifestPlugin({ fileName: paths.manifest, publicPath, writeToFileEmit: true }) ], resolve: { - alias: { 'vue$':'vue/dist/vue.esm.js' }, - extensions: ['.js', '.coffee'], + extensions: paths.extensions, modules: [ - path.resolve('app/javascript'), - path.resolve('node_modules') + resolve(paths.source), + resolve(paths.node_modules) ] }, resolveLoader: { - modules: [path.resolve('node_modules')] + modules: [paths.node_modules] } -} - -module.exports = { - distDir, - config }