const banner = require('neutrino-middleware-banner'); const compile = require('neutrino-middleware-compile-loader'); const copy = require('neutrino-middleware-copy'); const progress = require('neutrino-middleware-progress'); const clean = require('neutrino-middleware-clean'); const nodeExternals = require('webpack-node-externals'); const { join } = require('path'); const merge = require('deepmerge'); const CWD = process.cwd(); const SRC = join(CWD, 'src'); const BUILD = join(CWD, 'build'); const TEST = join(CWD, 'test'); const PROJECT_MODULES = join(CWD, 'node_modules'); const MODULES = join(__dirname, 'node_modules'); const PKG = require(join(CWD, 'package.json')); module.exports = (config, neutrino) => { neutrino.use(compile({ include: [SRC, TEST], babel: { presets: [ [require.resolve('babel-preset-env'), { modules: false, targets: { node: 6.9 } }] ] } })); config.options.set('performance', { hints: false }); config .target('node') .node .set('__filename', false) .set('__dirname', false) .end() .devtool('source-map') .externals([nodeExternals()]) .context(CWD) .entry('index') .add(join(SRC, 'index.js')) .end() .output .path(BUILD) .filename('[name].js') .libraryTarget('commonjs2') .chunkFilename('[id].[chunkhash].js') .end() .resolve .modules .add(PROJECT_MODULES) .add(MODULES) .end() .extensions .add('.js') .add('json') .end() .end() .resolveLoader .modules .add(PROJECT_MODULES) .add(MODULES); const hasSourceMap = (PKG.dependencies && 'source-map-support' in PKG.dependencies) || (PKG.devDependencies && 'source-map-support' in PKG.devDependencies); if (hasSourceMap) { neutrino.use(banner()); } if (process.env.NODE_ENV !== 'development') { neutrino.use([ copy({ patterns: [{ context: SRC, from: `**/*` }], options: { ignore: ['*.js*'] } }), progress(), clean({ paths: [BUILD] }) ]) } if (config.module.rules.has('lint')) { config.module .rule('lint') .loader('eslint', props => merge(props, { 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', // enforces error handling in callbacks (node environment) 'handle-callback-err': 'off', // Allow console in Node.js 'no-console': 'off', // 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 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 process.exit() 'no-process-exit': 'off', // restrict usage of specified node modules 'no-restricted-modules': 'off', // disallow use of synchronous methods (off by default) 'no-sync': 'off' } } })); } };