UNPKG

3.49 kBJavaScriptView Raw
1'use strict'
2
3const merge = require('webpack-merge')
4const webpack = require('webpack')
5const webpackConfig = require('./webpack.config')
6const { fromRoot, hasFile } = require('../utils')
7const userConfig = require('./user')()
8const isTSEnable = process.env.AEGIR_TS === 'true'
9const isWebworker = process.env.AEGIR_RUNNER === 'webworker'
10
11// Env to pass in the bundle with DefinePlugin
12const env = {
13 TS_ENABLED: process.env.AEGIR_TS,
14 'process.env': JSON.stringify(process.env),
15 TEST_DIR: JSON.stringify(fromRoot('test')),
16 TEST_BROWSER_JS: hasFile('test', isTSEnable ? 'browser.ts' : 'browser.js')
17 ? JSON.stringify(fromRoot('test', isTSEnable ? 'browser.ts' : 'browser.js'))
18 : JSON.stringify('')
19}
20
21// Webpack overrides for karma
22const karmaWebpackConfig = merge.strategy({ plugins: 'replace' })(webpackConfig(), {
23 entry: '',
24 output: {
25 libraryTarget: 'var'
26 },
27 plugins: [
28 new webpack.DefinePlugin(env)
29 ],
30 module: {
31 rules: [
32 {
33 oneOf: [
34 {
35 test: /\.(js|ts)$/,
36 include: fromRoot('test'),
37 use: {
38 loader: require.resolve('babel-loader'),
39 options: {
40 presets: [require('./babelrc')()],
41 babelrc: false,
42 cacheDirectory: true
43 }
44 }
45 }
46 ]
47 }
48 ]
49 }
50})
51
52const karmaConfig = (config, argv) => {
53 const files = argv.filesCustom
54 const mocha = {
55 reporter: 'spec',
56 timeout: argv.timeout ? Number(argv.timeout) : 5000,
57 bail: argv.bail,
58 grep: argv.grep,
59 invert: argv.invert
60 }
61
62 const karmaEntry = `${__dirname}/karma-entry.js`
63
64 if (!files.length) {
65 // only try to load *.spec.js if we aren't specifying custom files
66 files.push(karmaEntry)
67 }
68
69 return {
70 browsers: ['ChromeHeadlessNoSandbox'],
71 customLaunchers: {
72 ChromeHeadlessNoSandbox: {
73 base: 'ChromeHeadless',
74 flags: ['--no-sandbox']
75 }
76 },
77 frameworks: isWebworker ? ['mocha-webworker'] : ['mocha'],
78 basePath: process.cwd(),
79 files: files
80 .map(f => {
81 return {
82 pattern: f,
83 included: !isWebworker
84 }
85 })
86 .concat([
87 {
88 pattern: 'test/fixtures/**/*',
89 watched: false,
90 served: true,
91 included: false
92 }
93 ]),
94
95 preprocessors: files.reduce((acc, f) => {
96 acc[f] = ['webpack', 'sourcemap']
97 return acc
98 }, {}),
99
100 client: {
101 mocha,
102 mochaWebWorker: {
103 pattern: [
104 ...files,
105 'karma-entry.js'
106 ],
107 mocha
108 }
109 },
110
111 webpack: karmaWebpackConfig,
112
113 webpackMiddleware: {
114 stats: 'errors-only'
115 },
116
117 reporters: [
118 argv.progress && 'progress',
119 !argv.progress && 'mocha'
120 ].filter(Boolean),
121
122 mochaReporter: {
123 output: 'autowatch',
124 showDiff: true
125 },
126
127 plugins: [
128 'karma-chrome-launcher',
129 'karma-firefox-launcher',
130 'karma-mocha',
131 'karma-mocha-reporter',
132 'karma-mocha-webworker',
133 'karma-sourcemap-loader',
134 'karma-webpack'
135 ],
136
137 autoWatch: false,
138 singleRun: true,
139 colors: true,
140 browserNoActivityTimeout: 50 * 1000
141 }
142}
143
144module.exports = (config) => {
145 var argv = require('yargs-parser')(process.argv.slice(2), {
146 array: ['files-custom'],
147 boolean: ['progress', 'bail'],
148 string: ['timeout']
149 })
150 config.set(merge(karmaConfig(config, argv), userConfig.karma))
151}