@n1k1t/unit-generator
Version:
Coverage based unit tests AI generator
87 lines • 4.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const get_cursor_position_1 = __importDefault(require("get-cursor-position"));
const path_1 = __importDefault(require("path"));
const promises_1 = __importDefault(require("fs/promises"));
const promises_2 = require("readline/promises");
const child_process_1 = require("child_process");
const utils_1 = require("../utils");
const env_1 = __importDefault(require("../env"));
exports.default = async (parameters = {}) => {
const intervals = [];
const timestamp = Date.now();
const cwd = process.cwd();
const iterations = parameters.iterations ?? Number(env_1.default.iterations);
const target = parameters.target ?? Number(env_1.default.target);
const terminal = new promises_2.Readline(process.stdout);
const cursor = get_cursor_position_1.default.sync();
const ignore = await (0, utils_1.extractIgnorePaths)(cwd);
const extracted = await (0, utils_1.extractFilesCoverage)(path_1.default.join(cwd, env_1.default.cobertura), {
ignore,
target,
paths: parameters.paths,
limit: parameters.limit,
all: parameters.all,
});
const processed = extracted.map((item) => {
const parsed = path_1.default.parse(item.file);
const temp = path_1.default.join(path_1.default.relative(cwd, path_1.default.join(__dirname, '../')), 'generated', item.id);
return Object.assign(item, {
target,
temp,
spec: path_1.default.join(parsed.dir, `${parsed.name}.spec${parsed.ext}`),
cobertura: path_1.default.join(temp, 'cobertura-coverage.xml'),
status: (0, utils_1.cast)('PENDING'),
spent: 0,
});
});
if (!parameters.verbose) {
intervals.push(setInterval(() => (0, utils_1.actualizeProcessedCoverageRate)(cwd, processed), 1000), setInterval(() => {
terminal.cursorTo(0, cursor.row - 1).clearScreenDown().commit();
(0, utils_1.renderProcessedCoverage)(timestamp, processed);
}, 100));
}
await Promise.all(processed.map(async (item) => {
const jest = [
`${env_1.default.command} -- ${item.spec}`,
'--coverage --forceExit --silent',
`--coverageDirectory=${item.temp}`,
`--collectCoverageFrom=${item.file}`,
].join(' ');
if (!(await promises_1.default.stat(item.spec).catch(() => null))) {
await promises_1.default.writeFile(item.spec, Buffer.from([]), 'utf8');
}
if (!(await promises_1.default.stat(item.temp).catch(() => null))) {
await promises_1.default.mkdir(item.temp);
}
const spawned = (0, child_process_1.spawn)('keploy', [
'gen',
`--model="${parameters.model ?? env_1.default.model}"`,
`--test-command="${jest}"`,
`--test-file-path="${item.spec}"`,
`--max-iterations="${iterations}"`,
`--source-file-path="${item.file}"`,
`--expected-coverage="${item.target * 100}"`,
`--coverage-report-path="${item.cobertura}"`,
], {
shell: true,
env: Object.assign(process.env, { API_KEY: env_1.default.token }),
});
if (parameters.verbose) {
spawned.stdout.on('data', (chunk) => process.stdout.write(chunk));
}
await new Promise((resolve) => spawned.once('exit', (code) => {
item.status = code === 0 ? 'DONE' : 'ERROR';
resolve();
}));
await (0, utils_1.actualizeProcessedCoverageRate)(cwd, [item], { force: true });
await promises_1.default.rm(item.temp, { recursive: true, force: true });
}));
intervals.forEach((interval) => interval.unref());
terminal.cursorTo(0, cursor.row - 1).clearScreenDown().commit();
(0, utils_1.renderProcessedCoverage)(timestamp, processed);
};
//# sourceMappingURL=generate.js.map