13 changed files with 432 additions and 388 deletions
@ -1,99 +1,105 @@ |
|||||
'use strict'; |
'use strict'; |
||||
|
|
||||
const merge = require('webpack-merge').smart; |
const config = require('neutrino-preset-base'); |
||||
const preset = require('neutrino-preset-base'); |
|
||||
const nodeExternals = require('webpack-node-externals'); |
const nodeExternals = require('webpack-node-externals'); |
||||
const path = require('path'); |
const path = require('path'); |
||||
const webpack = require('webpack'); |
const webpack = require('webpack'); |
||||
|
const merge = require('deepmerge'); |
||||
|
|
||||
const MODULES = path.join(__dirname, '../node_modules'); |
const MODULES = path.join(__dirname, '../node_modules'); |
||||
|
|
||||
const config = merge(preset, { |
config |
||||
target: 'node', |
.target('node') |
||||
output: { |
.devtool('source-map') |
||||
filename: '[name].js', |
.externals([nodeExternals()]) |
||||
libraryTarget: 'commonjs2' |
.node |
||||
}, |
.set('__filename', false) |
||||
resolve: { |
.set('__dirname', false) |
||||
modules: [MODULES] |
.end() |
||||
}, |
.output |
||||
resolveLoader: { |
.filename('[name].js') |
||||
modules: [MODULES] |
.libraryTarget('commonjs2'); |
||||
}, |
|
||||
devtool: 'source-map', |
config.resolve.modules.add(MODULES); |
||||
node: { |
config.resolveLoader.modules.add(MODULES); |
||||
__filename: false, |
|
||||
__dirname: false |
config |
||||
}, |
.plugin('options') |
||||
plugins: [ |
.use(webpack.LoaderOptionsPlugin, { |
||||
new webpack.LoaderOptionsPlugin({ |
emitError: true, |
||||
options: { |
failOnError: true, |
||||
emitError: true, |
mocha: { |
||||
failOnError: true, |
reporter: 'spec', |
||||
mocha: { |
ui: 'tdd', |
||||
reporter: 'spec', |
bail: true |
||||
ui: 'tdd', |
} |
||||
bail: true |
}); |
||||
} |
|
||||
} |
config |
||||
}), |
.plugin('banner') |
||||
new webpack.BannerPlugin({ |
.use(webpack.BannerPlugin, { |
||||
banner: 'require("source-map-support").install();', |
banner: `require('source-map-support').install();`, |
||||
raw: true, |
raw: true, |
||||
entryOnly: true |
entryOnly: true |
||||
}) |
}); |
||||
], |
|
||||
externals: [nodeExternals()], |
config.options.set('performance', { |
||||
performance: { |
hints: false |
||||
hints: false |
|
||||
} |
|
||||
}); |
}); |
||||
|
|
||||
const babelLoader = config.module.rules.find(r => r.use && r.use.loader && r.use.loader.includes('babel')); |
config.module |
||||
|
.rule('compile') |
||||
// Polyfill based on Node.js LTS 6.9.0
|
.loader('babel', ({ options }) => { |
||||
babelLoader.use.options.presets[0][1].targets.node = 6.9; |
options.presets[0][1].targets.node = 6.9; |
||||
|
|
||||
const eslintLoader = config.module.rules.find(r => r.use && r.use.loader && r.use.loader.includes('eslint')); |
|
||||
|
|
||||
eslintLoader.use.options.env.node = true; |
return { options }; |
||||
|
}); |
||||
|
|
||||
Object.assign(eslintLoader.use.options.rules, { |
config.module |
||||
// enforce return after a callback
|
.rule('lint') |
||||
'callback-return': 'off', |
.loader('eslint', ({ options }) => { |
||||
|
return { |
||||
|
options: merge(options, { |
||||
|
envs: ['node'], |
||||
|
rules: { |
||||
|
// enforce return after a callback
|
||||
|
'callback-return': 'off', |
||||
|
|
||||
// require all requires be top-level
|
// require all requires be top-level
|
||||
// http://eslint.org/docs/rules/global-require
|
// http://eslint.org/docs/rules/global-require
|
||||
'global-require': 'error', |
'global-require': 'error', |
||||
|
|
||||
// enforces error handling in callbacks (node environment)
|
// enforces error handling in callbacks (node environment)
|
||||
'handle-callback-err': 'off', |
'handle-callback-err': 'off', |
||||
|
|
||||
// Allow console in Node.js
|
// Allow console in Node.js
|
||||
'no-console': 'off', |
'no-console': 'off', |
||||
|
|
||||
// disallow mixing regular variable and require declarations
|
// disallow mixing regular variable and require declarations
|
||||
'no-mixed-requires': ['off', false], |
'no-mixed-requires': ['off', false], |
||||
|
|
||||
// disallow use of new operator with the require function
|
// disallow use of new operator with the require function
|
||||
'no-new-require': 'error', |
'no-new-require': 'error', |
||||
|
|
||||
// disallow string concatenation with __dirname and __filename
|
// disallow string concatenation with __dirname and __filename
|
||||
// http://eslint.org/docs/rules/no-path-concat
|
// http://eslint.org/docs/rules/no-path-concat
|
||||
'no-path-concat': 'error', |
'no-path-concat': 'error', |
||||
|
|
||||
// disallow use of process.env
|
// disallow use of process.env
|
||||
'no-process-env': 'off', |
'no-process-env': 'off', |
||||
|
|
||||
// disallow process.exit()
|
// disallow process.exit()
|
||||
'no-process-exit': 'off', |
'no-process-exit': 'off', |
||||
|
|
||||
// restrict usage of specified node modules
|
// restrict usage of specified node modules
|
||||
'no-restricted-modules': 'off', |
'no-restricted-modules': 'off', |
||||
|
|
||||
// disallow use of synchronous methods (off by default)
|
// disallow use of synchronous methods (off by default)
|
||||
'no-sync': 'off' |
'no-sync': 'off' |
||||
}); |
} |
||||
|
}) |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
|
||||
module.exports = config; |
module.exports = config; |
||||
|
@ -1,62 +1,75 @@ |
|||||
'use strict'; |
'use strict'; |
||||
|
|
||||
const preset = require('neutrino-preset-web'); |
const config = require('neutrino-preset-web'); |
||||
const merge = require('deepmerge'); |
const merge = require('deepmerge'); |
||||
const webpackMerge = require('webpack-merge').smart; |
|
||||
const path = require('path'); |
const path = require('path'); |
||||
const webpack = require('webpack'); |
const webpack = require('webpack'); |
||||
|
|
||||
const MODULES = path.join(__dirname, '../node_modules'); |
const MODULES = path.join(__dirname, '../node_modules'); |
||||
const eslintLoader = preset.module.rules.find(r => r.use && r.use.loader && r.use.loader.includes('eslint')); |
|
||||
const babelLoader = preset.module.rules.find(r => r.use && r.use.loader && r.use.loader.includes('babel')); |
// modify lint rule and loader
|
||||
|
config.module |
||||
eslintLoader.test = /\.jsx?$/; |
.rule('lint') |
||||
babelLoader.test = /\.jsx?$/; |
.test(/\.jsx?$/) |
||||
babelLoader.use.options.presets.push(require.resolve('babel-preset-stage-0')); |
.loader('eslint', ({ options }) => { |
||||
babelLoader.use.options.presets.push(require.resolve('babel-preset-react')); |
return { |
||||
|
options: merge(options, { |
||||
eslintLoader.use.options = merge(eslintLoader.use.options, { |
plugins: ['react'], |
||||
plugins: ['react'], |
baseConfig: { |
||||
extends: [ |
extends: ['plugin:react/recommended'] |
||||
'plugin:react/recommended' |
}, |
||||
], |
parserOptions: { |
||||
settings: { |
ecmaFeatures: { |
||||
pragma: 'React', |
experimentalObjectRestSpread: true |
||||
version: '15.0' |
} |
||||
}, |
}, |
||||
parserOptions: { |
rules: { |
||||
ecmaFeatures: { |
'react/prop-types': ['off'], |
||||
experimentalObjectRestSpread: true, |
'jsx-quotes': ['error', 'prefer-double'] |
||||
jsx: true |
} |
||||
|
}) |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
// modify babel rule and loader
|
||||
|
config.module |
||||
|
.rule('compile') |
||||
|
.test(/\.jsx?$/) |
||||
|
.loader('babel', ({ options }) => { |
||||
|
if (process.env.NODE_ENV === 'development') { |
||||
|
options.plugins.push(require.resolve('react-hot-loader/babel')); |
||||
} |
} |
||||
}, |
|
||||
rules: { |
return { |
||||
'react/prop-types': ['off'], |
options: merge(options, { |
||||
|
presets: [ |
||||
// specify whether double or single quotes should be used in JSX attributes
|
require.resolve('babel-preset-stage-0'), |
||||
// http://eslint.org/docs/rules/jsx-quotes
|
require.resolve('babel-preset-react') |
||||
'jsx-quotes': ['error', 'prefer-double'] |
] |
||||
} |
}) |
||||
}); |
}; |
||||
|
}); |
||||
const config = webpackMerge(preset, { |
|
||||
resolve: { |
config.resolve |
||||
modules: [MODULES], |
.modules |
||||
extensions: ['.jsx'] |
.add(MODULES) |
||||
}, |
.end() |
||||
resolveLoader: { |
.extensions |
||||
modules: [MODULES] |
.add('.jsx'); |
||||
}, |
|
||||
externals: { |
config.resolveLoader.modules.add(MODULES); |
||||
|
|
||||
|
config |
||||
|
.externals({ |
||||
'react/addons': true, |
'react/addons': true, |
||||
'react/lib/ExecutionEnvironment': true, |
'react/lib/ExecutionEnvironment': true, |
||||
'react/lib/ReactContext': 'window' |
'react/lib/ReactContext': 'window' |
||||
} |
}); |
||||
}); |
|
||||
|
|
||||
if (process.env.NODE_ENV === 'development') { |
if (process.env.NODE_ENV === 'development') { |
||||
config.entry.index.unshift(require.resolve('react-hot-loader/patch')); |
config |
||||
babelLoader.use.options.plugins.push(require.resolve('react-hot-loader/babel')); |
.entry('index') |
||||
|
.add(require.resolve('react-hot-loader/patch')); |
||||
} |
} |
||||
|
|
||||
module.exports = config; |
module.exports = config; |
||||
|
Loading…
Reference in new issue