|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- var path = require('path')
-
- var webpack = require('webpack')
- var ExtractTextPlugin = require('extract-text-webpack-plugin')
- var deepExtend = require('deep-extend')
- var autoprefixer = require('autoprefixer')
-
- var loadersByExtension = require('./build-tools/loadersByExtension')
-
- module.exports = function(options) {
-
- // Special options, that have logic in this file
- // ...with defaults
- var specialOptions = deepExtend({}, {
- hot: false,
- separateStylesheets: true,
- minimize: false,
- longTermCaching: false,
- sourcemaps: false,
- }, options._special)
-
- var loadersMap = {
- 'js(x)?': {
- loader: 'babel?retainLines=true',
- include: [ path.join(__dirname, 'src') ],
- },
- 'json': 'json-loader',
- 'txt|yaml': 'raw-loader',
- 'png|jpg|jpeg|gif|svg': specialOptions.disableAssets ? 'null-loader' : 'url-loader?limit=10000',
- 'woff|woff2': specialOptions.disableAssets ? 'null-loader' : 'url-loader?limit=100000',
- 'ttf|eot': specialOptions.disableAssets ? 'null-loader' : 'file-loader',
- "worker.js": ["worker-loader?inline=true", "babel"]
- }
-
- var plugins = []
-
- if( specialOptions.separateStylesheets ) {
- plugins.push(new ExtractTextPlugin('[name].css' + (specialOptions.longTermCaching ? '?[contenthash]' : ''), {
- allChunks: true
- }))
- }
-
- if( specialOptions.minimize ) {
-
- plugins.push(
- new webpack.optimize.UglifyJsPlugin({
- compressor: {
- warnings: false
- }
- }),
- new webpack.optimize.DedupePlugin()
- )
-
- plugins.push( new webpack.NoErrorsPlugin())
-
- }
-
- plugins.push(
- new webpack.DefinePlugin({
- 'process.env': {
- NODE_ENV: specialOptions.minimize ? JSON.stringify('production') : null,
- WEBPACK_INLINE_STYLES: !Boolean(specialOptions.separateStylesheets)
- },
- }))
-
- var cssLoader = 'css-loader!postcss-loader'
-
- var completeStylesheetLoaders = deepExtend({
- 'css': cssLoader,
- 'scss': cssLoader + '!' + 'sass-loader?outputStyle=expanded&sourceMap=true&sourceMapContents=true',
- 'less': cssLoader + '!' + 'less-loader',
- }, specialOptions.stylesheetLoaders)
-
- if(specialOptions.cssModules) {
- cssLoader = cssLoader + '?module' + (specialOptions.minimize ? '' : '&localIdentName=[path][name]---[local]---[hash:base64:5]')
- }
-
- Object.keys(completeStylesheetLoaders).forEach(function(ext) {
- var ori = completeStylesheetLoaders[ext]
- if(specialOptions.separateStylesheets) {
- completeStylesheetLoaders[ext] = ExtractTextPlugin.extract('style-loader', ori)
- } else {
- completeStylesheetLoaders[ext] = 'style-loader!' + ori
- }
- })
-
- var loaders = loadersByExtension(deepExtend({}, loadersMap, specialOptions.loaders, completeStylesheetLoaders))
- var extraLoaders = (options.module || {} ).loaders
-
- if(Array.isArray(extraLoaders)) {
- loaders = loaders.concat(extraLoaders)
- delete options.module.loaders
- }
-
- var completeConfig = deepExtend({
- entry: {},
-
- output: {
- path: path.join(__dirname, 'dist'),
- publicPath: '/',
- filename: '[name].js',
- chunkFilename: '[name].js'
- },
-
- target: 'web',
-
- // yaml-js has a reference to `fs`, this is a workaround
- node: {
- fs: 'empty'
- },
-
- module: {
- loaders: loaders,
- },
-
- resolveLoader: {
- root: path.join(__dirname, 'node_modules'),
- },
-
- externals: {
- 'buffertools': true // json-react-schema/deeper depends on buffertools, which fails.
- },
-
- resolve: {
- root: path.join(__dirname, './src'),
- modulesDirectories: ['node_modules'],
- extensions: ["", ".web.js", ".js", ".jsx", ".json", ".less"],
- packageAlias: 'browser',
- alias: {
- base: "getbase/src/less/base"
- }
- },
-
- postcss: function() {
- return [autoprefixer]
- },
-
- devtool: specialOptions.sourcemaps ? 'cheap-module-source-map' : null,
-
- plugins,
-
- }, options)
-
- return completeConfig
- }
|