diff --git a/webpack/builder/webpack.prod.config.js b/webpack/builder/webpack.prod.config.js index 8a2184d44d..dbd8d51a57 100644 --- a/webpack/builder/webpack.prod.config.js +++ b/webpack/builder/webpack.prod.config.js @@ -4,27 +4,25 @@ // more control of the output bundle in order to fix unexpected behavior in old browsers. const webpack = require('webpack'); -const {resolve} = require('path'); -const PACKAGE = require('../../package.json'); -const version = PACKAGE.version; +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const WebpackDeleteAfterEmit = require('webpack-delete-after-emit'); +const { resolve } = require('path'); +const { version } = require('../../package.json'); +const entryPoints = require('./entryPoints'); +const rootDir = file => resolve(__dirname, '../../', file); const isVendor = (module, count) => { const userRequest = module.userRequest; return userRequest && userRequest.indexOf('node_modules') >= 0; }; -const entryPoints = { - builder_embed: ['whatwg-fetch', resolve(__dirname, '../../', 'lib/assets/javascripts/builder/public_editor.js')], - dataset: resolve(__dirname, '../../', 'lib/assets/javascripts/builder/dataset.js'), - builder: resolve(__dirname, '../../', 'lib/assets/javascripts/builder/editor.js') -}; - module.exports = env => { return { entry: entryPoints, output: { filename: `${version}/javascripts/[name].js`, - path: resolve(__dirname, '../../', 'public/assets') + path: rootDir('public/assets') }, resolve: { modules: require('../common/modules.js'), @@ -68,6 +66,27 @@ module.exports = env => { __ENV__: JSON.stringify('prod') }), + new ExtractTextPlugin({ + filename: `./${version}/stylesheets/[name].css` + }), + + new CopyWebpackPlugin([ + { + from: rootDir('app/assets/images'), + to: `./${version}/images/`, + toType: 'dir' + } + ]), + + new WebpackDeleteAfterEmit({ + globs: [ + `${version}/javascripts/common_editor3.js`, + `${version}/javascripts/common_editor3.js.map`, + `${version}/javascripts/editor3.js`, + `${version}/javascripts/editor3.js.map` + ] + }), + // Minify new webpack.optimize.UglifyJsPlugin({ sourceMap: true, @@ -91,7 +110,7 @@ module.exports = env => { test: /\.js$/, loader: 'shim-loader', include: [ - resolve(__dirname, '../../', 'node_modules/internal-carto.js') + rootDir('node_modules/internal-carto.js') ], options: { shim: { @@ -111,20 +130,69 @@ module.exports = env => { test: /\.tpl$/, use: 'tpl-loader', include: [ - resolve(__dirname, '../../', 'lib/assets/javascripts/builder'), - resolve(__dirname, '../../', 'lib/assets/javascripts/dashboard'), - resolve(__dirname, '../../', 'lib/assets/javascripts/deep-insights'), - resolve(__dirname, '../../', 'node_modules/internal-carto.js') + rootDir('lib/assets/javascripts/builder'), + rootDir('lib/assets/javascripts/dashboard'), + rootDir('lib/assets/javascripts/deep-insights'), + rootDir('node_modules/internal-carto.js') ] }, { test: /\.mustache$/, use: 'raw-loader', include: [ - resolve(__dirname, '../../', 'lib/assets/javascripts/builder'), - resolve(__dirname, '../../', 'lib/assets/javascripts/deep-insights'), - resolve(__dirname, '../../', 'node_modules/internal-carto.js') + rootDir('lib/assets/javascripts/builder'), + rootDir('lib/assets/javascripts/deep-insights'), + rootDir('node_modules/internal-carto.js') ] + }, + { + test: /\.s?css$/, + use: ExtractTextPlugin.extract({ + use: [ + { + loader: 'css-loader', + options: { + alias: { + // This is because of Carto.js _leaflet partial + '../../img': '../img' + }, + sourceMap: false + } + }, + { + loader: 'sass-loader', + options: { + data: `$assetsDir: "/assets/${version}";`, + sourceMap: false, + includePaths: [ + rootDir('node_modules/cartoassets/src/scss') + ] + } + } + ] + }) + }, + { + test: /\.(ttf|eot|woff|woff2|svg)(.+#.+)?$/, + use: { + loader: 'file-loader', + options: { + name: `[name].[ext]`, + outputPath: `${version}/fonts/`, + publicPath: `/assets/${version}/fonts/` + } + } + }, + { + test: /\.(png|gif)$/, + use: { + loader: 'file-loader', + options: { + name: `[name].[ext]`, + outputPath: `${version}/images/`, + publicPath: `/assets/${version}/images/` + } + } } ] },