1 | 'use strict'
|
2 |
|
3 | const merge = require('webpack-merge')
|
4 | const webpack = require('webpack')
|
5 | const webpackConfig = require('./webpack.config')
|
6 | const { fromRoot, hasFile } = require('../utils')
|
7 | const userConfig = require('./user')()
|
8 | const isTSEnable = process.env.AEGIR_TS === 'true'
|
9 | const isWebworker = process.env.AEGIR_RUNNER === 'webworker'
|
10 |
|
11 |
|
12 | const 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 |
|
22 | const 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 |
|
52 | const 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 |
|
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 |
|
144 | module.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 | }
|