@teambit/tester
Version:
300 lines (295 loc) • 8.49 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TesterMain = void 0;
function _fsExtra() {
const data = _interopRequireDefault(require("fs-extra"));
_fsExtra = function () {
return data;
};
return data;
}
function _cli() {
const data = require("@teambit/cli");
_cli = function () {
return data;
};
return data;
}
function _lodash() {
const data = _interopRequireDefault(require("lodash.compact"));
_lodash = function () {
return data;
};
return data;
}
function _envs() {
const data = require("@teambit/envs");
_envs = function () {
return data;
};
return data;
}
function _logger() {
const data = require("@teambit/logger");
_logger = function () {
return data;
};
return data;
}
function _workspace() {
const data = require("@teambit/workspace");
_workspace = function () {
return data;
};
return data;
}
function _graphql() {
const data = require("@teambit/graphql");
_graphql = function () {
return data;
};
return data;
}
function _builder() {
const data = require("@teambit/builder");
_builder = function () {
return data;
};
return data;
}
function _ui() {
const data = require("@teambit/ui");
_ui = function () {
return data;
};
return data;
}
function _lodash2() {
const data = require("lodash");
_lodash2 = function () {
return data;
};
return data;
}
function _devFiles() {
const data = require("@teambit/dev-files");
_devFiles = function () {
return data;
};
return data;
}
function _test() {
const data = require("./test.cmd");
_test = function () {
return data;
};
return data;
}
function _tester() {
const data = require("./tester.aspect");
_tester = function () {
return data;
};
return data;
}
function _tester2() {
const data = require("./tester.service");
_tester2 = function () {
return data;
};
return data;
}
function _tester3() {
const data = require("./tester.task");
_tester3 = function () {
return data;
};
return data;
}
function _utils() {
const data = require("./utils");
_utils = function () {
return data;
};
return data;
}
function _tester4() {
const data = require("./tester.graphql");
_tester4 = function () {
return data;
};
return data;
}
function _junitGenerator() {
const data = require("./utils/junit-generator");
_junitGenerator = function () {
return data;
};
return data;
}
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
class TesterMain {
constructor(patterns,
/**
* graphql extension.
*/
graphql,
/**
* envs extension.
*/
envs,
/**
* workspace extension.
*/
workspace,
/**
* tester service.
*/
service,
/**
* build task.
*/
task, devFiles, builder) {
this.patterns = patterns;
this.graphql = graphql;
this.envs = envs;
this.workspace = workspace;
this.service = service;
this.task = task;
this.devFiles = devFiles;
this.builder = builder;
_defineProperty(this, "_testsResults", []);
}
async test(components, opts) {
const options = this.getOptions(opts);
const envsRuntime = await this.envs.createEnvironment(components);
if (opts?.env) {
return envsRuntime.runEnv(opts.env, this.service, options);
}
const results = await envsRuntime.run(this.service, options);
if (opts?.junit) {
await this.generateJUnit(opts?.junit, results);
}
return results;
}
async generateJUnit(filePath, testsResults) {
const components = testsResults.results.map(envResult => envResult.data?.components).flat();
const jUnit = (0, _junitGenerator().testsResultsToJUnitFormat)((0, _lodash().default)(components));
await _fsExtra().default.outputFile(filePath, jUnit);
}
/**
* watch all components for changes and test upon each.
*/
async watch(components, opts) {
const options = this.getOptions(opts);
const envsRuntime = await this.envs.createEnvironment(components);
if (opts?.env) {
return envsRuntime.runEnv(opts.env, this.service, options);
}
this.service.onTestRunComplete(results => {
results.components.forEach(component => {
this._testsResults[component.componentId.toString()] = component;
});
});
return envsRuntime.run(this.service, options);
}
async uiWatch() {
const components = await this.workspace.list();
return this.watch(components, {
watch: true,
debug: false,
ui: true
});
}
async getTestsResults(component, idHasVersion = true) {
const entry = component.get(_tester().TesterAspect.id);
const isModified = !idHasVersion && (await component.isModified());
const data = this.builder.getDataByAspect(component, _tester().TesterAspect.id);
if ((entry || data) && !isModified) {
return {
testsResults: data?.tests || entry?.data.tests,
loading: false,
coverage: data?.tests.coverage
};
}
return this.getTestsResultsFromState(component);
}
getTestsResultsFromState(component) {
const tests = this._testsResults[component.id.toString()];
return {
testsResults: tests?.results,
loading: tests?.loading || false,
coverage: tests?.coverage
};
}
/**
* Get the tests patterns from the config. (used as default patterns in case the env does not provide them via getTestsDevPatterns)
* @returns
*/
getPatterns() {
return this.patterns;
}
getComponentDevPatterns(component) {
const env = this.envs.calculateEnv(component, {
skipWarnings: !!this.workspace?.inInstallContext
}).env;
const componentPatterns = env.getTestsDevPatterns ? env.getTestsDevPatterns(component) : this.getPatterns();
return {
name: 'tests',
pattern: componentPatterns
};
}
getDevPatternToRegister() {
return this.getComponentDevPatterns.bind(this);
}
/**
* get all test files of a component.
*/
getTestFiles(component) {
return (0, _utils().detectTestFiles)(component, this.devFiles);
}
getOptions(options) {
const defaults = {
watch: false,
debug: false
};
return (0, _lodash2().merge)(defaults, options);
}
static async provider([cli, envs, workspace, loggerAspect, graphql, ui, devFiles, builder], config) {
const logger = loggerAspect.createLogger(_tester().TesterAspect.id);
const testerService = new (_tester2().TesterService)(workspace, logger, graphql.pubsub, devFiles);
envs.registerService(testerService);
const tester = new TesterMain(config.patterns, graphql, envs, workspace, testerService, new (_tester3().TesterTask)(_tester().TesterAspect.id, devFiles), devFiles, builder);
devFiles.registerDevPattern(tester.getDevPatternToRegister());
if (workspace) {
ui.registerOnStart(async () => {
if (!config.watchOnStart) return undefined;
await tester.uiWatch();
return undefined;
});
}
cli.register(new (_test().TestCmd)(tester, workspace, logger));
graphql.register(() => (0, _tester4().testerSchema)(tester, graphql));
return tester;
}
}
exports.TesterMain = TesterMain;
_defineProperty(TesterMain, "runtime", _cli().MainRuntime);
_defineProperty(TesterMain, "dependencies", [_cli().CLIAspect, _envs().EnvsAspect, _workspace().WorkspaceAspect, _logger().LoggerAspect, _graphql().GraphqlAspect, _ui().UIAspect, _devFiles().DevFilesAspect, _builder().BuilderAspect]);
_defineProperty(TesterMain, "defaultConfig", {
/**
* default test regex for which files tester to apply on.
*/
patterns: ['**/*.spec.+(js|ts|jsx|tsx)', '**/*.test.+(js|ts|jsx|tsx)'],
/**
* determine whether to watch on start.
*/
watchOnStart: false
});
_tester().TesterAspect.addRuntime(TesterMain);
//# sourceMappingURL=tester.main.runtime.js.map