text: import jest from 'jest'
  import { options as CliOptions } from 'jest-cli/build/cli/args'
  import { join } from 'path'
  import { existsSync } from 'fs'
  
  const debug = require('debug')('test')
  
  process.env.NODE_ENV = 'test'
  
  export default function (originOpts = {}) {
    const opts = { ...originOpts }
    const { cwd = process.cwd(), moduleNameMapper } = opts
    let transformInclude = opts.transformInclude || []
    if (typeof transformInclude === 'string') {
      transformInclude = [transformInclude]
    }
  
    const jestConfigFile = join(cwd, 'jest.config.js')
    let userJestConfig = {}
    if (existsSync(jestConfigFile)) {
      userJestConfig = require(jestConfigFile); // eslint-disable-line
    }
  
    const {
      moduleNameMapper: userModuleNameMapper,
      extraSetupFiles,
      ...restUserJestConfig
    } = userJestConfig
  
    const config = {
      rootDir: process.cwd(),
      setupFiles: [
        require.resolve('./shim.js'),
        require.resolve('./setupTests.js'),
        ...(extraSetupFiles || [])
      ],
      resolver: require.resolve('jest-pnp-resolver'),
      transform: {
        '\\.(t|j)sx?$': require.resolve('./transformers/jsTransformer'),
        '\\.svg$': require.resolve('./transformers/fileTransformer')
      },
      transformIgnorePatterns: [
        // 加 [^/]*? 是为了兼容 tnpm 的目录结构
        // 比如：_ddn-test@1.5.5@test
        `node_modules/(?!([^/]*?ddn|[^/]*?test|[^/]*?enzyme-adapter-react-16|${transformInclude.join(
          '|'
        )})/)`
      ],
      testMatch: ['**/?*.(spec|test|e2e).(j|t)s?(x)'],
      moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json'],
      setupFilesAfterEnv: [require.resolve('./jasmine')],
      moduleNameMapper: {
        '\\.(css|less|sass|scss)$': require.resolve('identity-obj-proxy'),
        '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': require.resolve(
          './fileMock.js'
        ),
        ...(moduleNameMapper || {}),
        ...(userModuleNameMapper || {})
      },
      testPathIgnorePatterns: [
        '/node_modules/',
        '/examples/'
      ],
      testSequencer: require.resolve('./testSequencer.js'),
      ...(restUserJestConfig || {})
    }
  
    delete opts.transformInclude
  
    // Convert alias option into real one
    Object.keys(CliOptions).forEach(name => {
      const { alias } = CliOptions[name] || {}
      if (alias && opts[alias]) {
        opts[name] = opts[alias]
        delete opts[alias]
      }
    })
  
    return new Promise((resolve, reject) => {
      jest
        .runCLI(
          {
            config: JSON.stringify(config),
            ...opts
          },
          [cwd]
        )
        .then(result => {
          debug(result)
          const { results } = result
          if (results.success) {
            resolve()
          } else {
            reject(new Error('Jest failed'))
          }
        })
        .catch(e => {
          console.log(e)
        })
    })
  }
  