UNPKG

neutrino-preset-egg-typescript

Version:

Neutrino preset for supporting Egg.js build with typescript

128 lines (109 loc) 3.34 kB
'use strict'; const banner = require('neutrino-middleware-banner'); const compile = require('neutrino-middleware-compile-loader'); const copy = require('neutrino-middleware-copy'); const clean = require('neutrino-middleware-clean'); const loaderMerge = require('neutrino-middleware-loader-merge'); const nameModule = require('neutrino-middleware-named-modules'); const nodeExternals = require('webpack-node-externals'); const typescript = require.resolve('awesome-typescript-loader'); const babelEnv = require('babel-preset-env'); const glob = require('glob'); const { join, extname } = require('path'); const { path } = require('ramda'); const MODULES = join(__dirname, 'node_modules'); module.exports = neutrino => { const config = neutrino.config; if (!path([ 'options', 'compile', 'targets', 'node' ], neutrino)) { Object.assign(neutrino.options, { compile: { targets: { node: 6.9, }, }, }); } const globPattern = [ neutrino.options.root + '/app/**/*.ts', neutrino.options.root + '/config/**\.*', neutrino.options.root + '/index.ts', ]; const files = glob.sync(`{${globPattern.join(',')}}`).reduce((acc, item) => { const obj = {}; const ext = extname(item); obj[ item.replace(neutrino.options.root.replace(/\\/g, '/') + '/', '') .replace(ext, '') ] = item; return Object.assign(acc, obj); }, {}); Object.keys(files).forEach(name => { config.entry(name).add(files[name]); }); // TypeScript config.module .rule('compile') .test(/\.tsx?$/) .use('ts') .loader(typescript); config.performance .hints(false); config.target('node').node .set('__filename', false) .set('__dirname', false); config .devtool('source-map') .externals([ nodeExternals({ whitelist: [ /^webpack/ ] }) ]) .context(neutrino.options.root); config.output .path(neutrino.options.output) .filename('[name].js') .libraryTarget('commonjs2') .chunkFilename('[id].[hash.5]-[chunkhash:7].js'); config.resolve .modules .add('node_modules') .add(neutrino.options.node_modules) .add(MODULES); config.resolve .extensions .add('.js') .add('.ts') .add('.json'); config.resolveLoader .modules .add(neutrino.options.node_modules) .add(MODULES); // special handle config .when(process.env.NODE_ENV && process.env.NODE_ENV !== 'development', () => { neutrino.use(clean, { paths: [ neutrino.options.output ] }); neutrino.use(copy, { patterns: [{ context: neutrino.options.source, from: '**/*' }], options: { ignore: [ '*.js*', '*.ts*' ] }, }); config.devtool('inline-sourcemap'); config.output.devtoolModuleFilenameTemplate('[absolute-resource-path]'); } ) .when(neutrino.config.module.rules.has('lint'), () => { neutrino.use(loaderMerge('lint', 'eslint'), { extends: 'eslint-config-egg', }); } ); // add source-map-support banner neutrino.use(banner); neutrino.use(nameModule); neutrino.use(compile, { include: [ neutrino.options.source, neutrino.options.tests ], presets: [ [ babelEnv, { modules: false, targets: neutrino.options.compile.targets, }], ], }); };