Client: avoid loading javascript ressource over the network
[oweals/peertube.git] / client / config / webpack.dev.js
1 const helpers = require('./helpers')
2 const webpackMerge = require('webpack-merge') // used to merge webpack configs
3 const webpackMergeDll = webpackMerge.strategy({plugins: 'replace'})
4 const commonConfig = require('./webpack.common.js') // the settings that are common to prod and dev
5
6 /**
7  * Webpack Plugins
8  */
9 const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin')
10 const DefinePlugin = require('webpack/lib/DefinePlugin')
11 const NamedModulesPlugin = require('webpack/lib/NamedModulesPlugin')
12 const LoaderOptionsPlugin = require('webpack/lib/LoaderOptionsPlugin')
13
14 /**
15  * Webpack Constants
16  */
17 const ENV = process.env.ENV = process.env.NODE_ENV = 'development'
18 const HOST = process.env.HOST || 'localhost'
19 const PORT = process.env.PORT || 3000
20 const HMR = helpers.hasProcessFlag('hot')
21 const METADATA = webpackMerge(commonConfig({env: ENV}).metadata, {
22   host: HOST,
23   port: PORT,
24   ENV: ENV,
25   HMR: HMR
26 })
27
28 const DllBundlesPlugin = require('webpack-dll-bundles-plugin').DllBundlesPlugin
29
30 /**
31  * Webpack configuration
32  *
33  * See: http://webpack.github.io/docs/configuration.html#cli
34  */
35 module.exports = function (env) {
36   return webpackMerge(commonConfig({ env: ENV }), {
37     /**
38     * Developer tool to enhance debugging
39     *
40     * See: http://webpack.github.io/docs/configuration.html#devtool
41     * See: https://github.com/webpack/docs/wiki/build-performance#sourcemaps
42     */
43     devtool: 'cheap-module-source-map',
44
45     /**
46     * Options affecting the output of the compilation.
47     *
48     * See: http://webpack.github.io/docs/configuration.html#output
49     */
50     output: {
51       /**
52       * The output directory as absolute path (required).
53       *
54       * See: http://webpack.github.io/docs/configuration.html#output-path
55       */
56       path: helpers.root('dist'),
57
58       /**
59       * Specifies the name of each output file on disk.
60       * IMPORTANT: You must not specify an absolute path here!
61       *
62       * See: http://webpack.github.io/docs/configuration.html#output-filename
63       */
64       filename: '[name].bundle.js',
65
66       /**
67       * The filename of the SourceMaps for the JavaScript files.
68       * They are inside the output.path directory.
69       *
70       * See: http://webpack.github.io/docs/configuration.html#output-sourcemapfilename
71       */
72       sourceMapFilename: '[name].map',
73
74       /** The filename of non-entry chunks as relative path
75       * inside the output.path directory.
76       *
77       * See: http://webpack.github.io/docs/configuration.html#output-chunkfilename
78       */
79       chunkFilename: '[id].chunk.js',
80
81       library: 'ac_[name]',
82       libraryTarget: 'var',
83
84       publicPath: '/client/'
85     },
86
87     externals: {
88       webtorrent: 'WebTorrent'
89     },
90
91     module: {
92
93       rules: [
94         {
95           test: /\.ts$/,
96           use: [
97             {
98               loader: 'tslint-loader',
99               options: {
100                 configFile: 'tslint.json'
101               }
102             }
103           ],
104           exclude: [
105             /\.(spec|e2e)\.ts$/,
106             /node_modules\//
107           ]
108         }
109       ]
110     },
111
112     plugins: [
113
114       /**
115       * Plugin: DefinePlugin
116       * Description: Define free variables.
117       * Useful for having development builds with debug logging or adding global constants.
118       *
119       * Environment helpers
120       *
121       * See: https://webpack.github.io/docs/list-of-plugins.html#defineplugin
122       */
123       // NOTE: when adding more properties, make sure you include them in custom-typings.d.ts
124       new DefinePlugin({
125         'ENV': JSON.stringify(METADATA.ENV),
126         'HMR': METADATA.HMR,
127         'process.env': {
128           'ENV': JSON.stringify(METADATA.ENV),
129           'NODE_ENV': JSON.stringify(METADATA.ENV),
130           'HMR': METADATA.HMR
131         }
132       }),
133
134       new DllBundlesPlugin({
135         bundles: {
136           polyfills: [
137             'core-js',
138             {
139               name: 'zone.js',
140               path: 'zone.js/dist/zone.js'
141             },
142             {
143               name: 'zone.js',
144               path: 'zone.js/dist/long-stack-trace-zone.js'
145             }
146           ],
147           vendor: [
148             '@angular/platform-browser',
149             '@angular/platform-browser-dynamic',
150             '@angular/core',
151             '@angular/common',
152             '@angular/forms',
153             '@angular/http',
154             '@angular/router',
155             '@angularclass/hmr',
156             'rxjs'
157           ]
158         },
159         dllDir: helpers.root('dll'),
160         webpackConfig: webpackMergeDll(commonConfig({env: ENV}), {
161           devtool: 'cheap-module-source-map',
162           plugins: []
163         })
164       }),
165
166       /**
167        * Plugin: AddAssetHtmlPlugin
168        * Description: Adds the given JS or CSS file to the files
169        * Webpack knows about, and put it into the list of assets
170        * html-webpack-plugin injects into the generated html.
171        *
172        * See: https://github.com/SimenB/add-asset-html-webpack-plugin
173        */
174       new AddAssetHtmlPlugin([
175         { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('polyfills')}`) },
176         { filepath: helpers.root(`dll/${DllBundlesPlugin.resolveFile('vendor')}`) }
177       ]),
178
179       /**
180       * Plugin: NamedModulesPlugin (experimental)
181       * Description: Uses file names as module name.
182       *
183       * See: https://github.com/webpack/webpack/commit/a04ffb928365b19feb75087c63f13cadfc08e1eb
184       */
185       new NamedModulesPlugin(),
186
187       /**
188       * Plugin LoaderOptionsPlugin (experimental)
189       *
190       * See: https://gist.github.com/sokra/27b24881210b56bbaff7
191       */
192       new LoaderOptionsPlugin({
193         debug: true,
194         options: {
195
196           /**
197           * Static analysis linter for TypeScript advanced options configuration
198           * Description: An extensible linter for the TypeScript language.
199           *
200           * See: https://github.com/wbuchwalter/tslint-loader
201           */
202           tslint: {
203             emitErrors: false,
204             failOnHint: false,
205             resourcePath: 'src'
206           },
207
208           // FIXME: Remove
209           // https://github.com/bholloway/resolve-url-loader/issues/36
210           // https://github.com/jtangelder/sass-loader/issues/289
211           context: __dirname,
212           output: {
213             path: helpers.root('dist')
214           }
215
216         }
217       })
218
219     ],
220
221     /**
222     * Webpack Development Server configuration
223     * Description: The webpack-dev-server is a little node.js Express server.
224     * The server emits information about the compilation state to the client,
225     * which reacts to those events.
226     *
227     * See: https://webpack.github.io/docs/webpack-dev-server.html
228     */
229     devServer: {
230       port: METADATA.port,
231       host: METADATA.host,
232       historyApiFallback: true,
233       watchOptions: {
234         aggregateTimeout: 300,
235         poll: 1000
236       },
237       outputPath: helpers.root('dist')
238     },
239
240     /*
241     * Include polyfills or mocks for various node stuff
242     * Description: Node configuration
243     *
244     * See: https://webpack.github.io/docs/configuration.html#node
245     */
246     node: {
247       global: true,
248       crypto: 'empty',
249       process: true,
250       module: false,
251       clearImmediate: false,
252       setImmediate: false
253     }
254   })
255 }