| /* istanbul ignore next */ | 
| 'use strict'; | 
|   | 
| const debug = require('debug')('egg-bin'); | 
| const path = require('path'); | 
| const rimraf = require('mz-modules/rimraf'); | 
| const testExclude = require('test-exclude'); | 
|   | 
| const Command = require('./test'); | 
| const EXCLUDES = Symbol('cov#excludes'); | 
|   | 
| /* istanbul ignore next */ | 
| class CovCommand extends Command { | 
|   constructor(argv) { | 
|     super(argv); | 
|   | 
|     this.usage = 'Usage: egg-bin cov'; | 
|   | 
|     this.options = { | 
|       x: { | 
|         description: 'istanbul coverage ignore, one or more fileset patterns', | 
|         type: 'string', | 
|       }, | 
|       prerequire: { | 
|         description: 'prerequire files for coverage instrument', | 
|         type: 'boolean', | 
|       }, | 
|       nyc: { | 
|         description: 'nyc instruments passthrough', | 
|         type: 'string', | 
|         default: '--temp-directory ./node_modules/.nyc_output -r text-summary -r json-summary -r json -r lcov', | 
|       }, | 
|     }; | 
|   | 
|     // you can add ignore dirs here | 
|     this[EXCLUDES] = new Set([ | 
|       'example/', | 
|       'examples/', | 
|       'mocks**/', | 
|       'docs/', | 
|     ].concat(testExclude.defaultExclude)); | 
|   } | 
|   | 
|   get description() { | 
|     return 'Run test with coverage'; | 
|   } | 
|   | 
|   * run(context) { | 
|     const { cwd, argv, execArgv, env } = context; | 
|     if (argv.prerequire) { | 
|       env.EGG_BIN_PREREQUIRE = 'true'; | 
|     } | 
|     delete argv.prerequire; | 
|   | 
|     // ignore coverage | 
|     if (argv.x) { | 
|       if (Array.isArray(argv.x)) { | 
|         for (const exclude of argv.x) { | 
|           this.addExclude(exclude); | 
|         } | 
|       } else { | 
|         this.addExclude(argv.x); | 
|       } | 
|       argv.x = undefined; | 
|     } | 
|     const excludes = (process.env.COV_EXCLUDES && process.env.COV_EXCLUDES.split(',')) || []; | 
|     for (const exclude of excludes) { | 
|       this.addExclude(exclude); | 
|     } | 
|   | 
|     const nycCli = require.resolve('nyc/bin/nyc.js'); | 
|     const coverageDir = path.join(cwd, 'coverage'); | 
|     yield rimraf(coverageDir); | 
|     const outputDir = path.join(cwd, 'node_modules/.nyc_output'); | 
|     yield rimraf(outputDir); | 
|   | 
|     const opt = { | 
|       cwd, | 
|       execArgv, | 
|       env: Object.assign({ | 
|         NODE_ENV: 'test', | 
|         EGG_TYPESCRIPT: context.argv.typescript, | 
|       }, env), | 
|     }; | 
|   | 
|     // save coverage-xxxx.json to $PWD/coverage | 
|     const covArgs = yield this.getCovArgs(context); | 
|     if (!covArgs) return; | 
|     debug('covArgs: %j', covArgs); | 
|     yield this.helper.forkNode(nycCli, covArgs, opt); | 
|   } | 
|   | 
|   /** | 
|    * add istanbul coverage ignore | 
|    * @param {String} exclude - glob pattern | 
|    */ | 
|   addExclude(exclude) { | 
|     this[EXCLUDES].add(exclude); | 
|   } | 
|   | 
|   /** | 
|    * get coverage args | 
|    * @param {Object} context - { cwd, argv, ...} | 
|    * @return {Array} args for nyc | 
|    * @protected | 
|    */ | 
|   * getCovArgs(context) { | 
|     let covArgs = [ | 
|       // '--show-process-tree', | 
|     ]; | 
|   | 
|     // typescript support | 
|     if (context.argv.typescript) { | 
|       covArgs.push('--extension', '.ts'); | 
|       this.addExclude('typings/'); | 
|       this.addExclude('**/*.d.ts'); | 
|     } | 
|   | 
|     // nyc args passthrough | 
|     const nycArgs = context.argv.nyc; | 
|     context.argv.nyc = undefined; | 
|     if (nycArgs) { | 
|       covArgs = covArgs.concat(nycArgs.split(' ')); | 
|     } | 
|   | 
|     for (const exclude of this[EXCLUDES]) { | 
|       covArgs.push('-x'); | 
|       covArgs.push(exclude); | 
|     } | 
|     covArgs.push(require.resolve('mocha/bin/_mocha')); | 
|     const testArgs = yield this.formatTestArgs(context); | 
|     if (!testArgs) return; | 
|     covArgs = covArgs.concat(testArgs); | 
|     return covArgs; | 
|   } | 
| } | 
|   | 
| module.exports = CovCommand; |