You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

140 lines
3.9 KiB

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 loaderMerge = require('neutrino-middleware-loader-merge');
const startServer = require('neutrino-middleware-start-server');
const hot = require('neutrino-middleware-hot');
const namedModules = require('neutrino-middleware-named-modules');
const nodeExternals = require('webpack-node-externals');
const { join } = require('path');
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 = neutrino => {
const { config } = neutrino;
neutrino.use(namedModules);
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({ whitelist: [/^webpack/] })])
.context(CWD)
.entry('index')
.add(join(SRC, 'index.js'))
.end()
.output
.path(BUILD)
.filename('[name].js')
.libraryTarget('commonjs2')
.chunkFilename('[id].[hash:5]-[chunkhash:7].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(clean, { paths: [BUILD] });
neutrino.use(progress);
neutrino.use(copy, {
patterns: [{ context: SRC, from: `**/*` }],
options: { ignore: ['*.js*'] }
});
} else {
config
.devtool('inline-sourcemap')
.entry('index')
.add('webpack/hot/poll?1000')
.end()
.output.options.set('devtoolModuleFilenameTemplate', '[absolute-resource-path]');
neutrino.use(hot);
neutrino.use(startServer, join(SRC, 'index.js'));
}
if (config.module.rules.has('lint')) {
neutrino.use(loaderMerge('lint', 'eslint'), {
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'
}
});
}
};