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