2021-03-05 17:03:04 +08:00

98 lines
3.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import assert from 'assert';
import { join } from 'path';
import { existsSync } from 'fs';
import { Logger } from '@fesjs/compiler';
import { options as CliOptions } from 'jest-cli/build/cli/args';
import createDefaultConfig from './createDefaultConfig';
const logger = new Logger('fes:plugin-unit-jest');
function getCommandOptiton() {
const opts = [];
Object.keys(CliOptions).forEach((key) => {
const option = CliOptions[key];
const opt = {};
if (key !== 'version') {
if (option.alias) {
opt.name = `-${option.alias} --${key}`;
} else {
opt.name = `--${key}`;
}
opt.description = option.description;
opts.push(opt);
}
});
return opts;
}
export default function (api) {
const { utils: { mergeConfig }, cwd } = api;
api.registerCommand({
command: 'test',
description: 'run unit tests with jest',
options: getCommandOptiton(),
async fn({ args }) {
process.env.NODE_ENV = 'test';
if (args._[0] === 'test') {
args._.shift();
}
args.debug && logger.log(`args: ${JSON.stringify(args)}`);
// Read config from cwd/jest.config.js
const userJestConfigFile = join(cwd, 'jest.config.js');
const userJestConfig = existsSync(userJestConfigFile) && require(userJestConfigFile);
args.debug && logger.log(`config from jest.config.js: ${JSON.stringify(userJestConfig)}`);
// Read jest config from package.json
const packageJSONPath = join(cwd, 'package.json');
const packageJestConfig = existsSync(packageJSONPath) && require(packageJSONPath).jest;
args.debug && logger.log(`jest config from package.json: ${JSON.stringify(packageJestConfig)}`);
// Merge configs
// user config and args config could have value function for modification
const config = mergeConfig(
createDefaultConfig(cwd, args),
packageJestConfig,
userJestConfig
);
args.debug && logger.log(`final config: ${JSON.stringify(config)}`);
// Generate jest options
const argsConfig = Object.keys(CliOptions).reduce((prev, name) => {
if (args[name]) prev[name] = args[name];
// Convert alias args into real one
const { alias } = CliOptions[name];
if (alias && args[alias]) prev[name] = args[alias];
return prev;
}, {});
args.debug && logger.log(`config from args: ${JSON.stringify(argsConfig)}`);
// 比较大的库建议使用require使用时才加载提升fes命令的效率
const { runCLI } = require('jest');
// Run jest
const result = await runCLI(
{
// @ts-ignore
_: args._ || [],
// @ts-ignore
$0: args.$0 || '',
// 必须是单独的 config 配置,值为 string否则不生效
// @ts-ignore
config: JSON.stringify(config),
...argsConfig
},
[cwd]
);
args.debug && logger.log(result);
// Throw error when run failed
assert(result.results.success, 'Test with jest failed');
}
});
}