@n1k1t/unit-generator
Version:
Coverage based unit tests AI generator
90 lines • 4.23 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildRenderer = exports.extractIgnoredPaths = exports.extractCoberturaItems = void 0;
const get_cursor_position_1 = __importDefault(require("get-cursor-position"));
const minimatch_1 = __importDefault(require("minimatch"));
const path_1 = __importDefault(require("path"));
const promises_1 = __importDefault(require("fs/promises"));
const fast_glob_1 = __importDefault(require("fast-glob"));
const lodash_1 = __importDefault(require("lodash"));
const promises_2 = require("readline/promises");
const models_1 = require("../models");
const extractCoberturaItems = async (location, options) => {
const target = options?.target ?? 1;
const cwd = options?.cwd ?? process.cwd();
const paths = (options?.paths?.map((nested) => path_1.default.join(cwd, nested)) ?? []).map((nested) => {
const parsed = path_1.default.parse(nested);
if (!parsed.ext.length && !parsed.name.endsWith('*')) {
return path_1.default.join(nested, '*');
}
if (parsed.ext.length && parsed.name.endsWith('.spec')) {
return path_1.default.join(parsed.dir, `${parsed.name.replace('.spec', '')}${parsed.ext}`);
}
return nested;
});
const cobertura = await models_1.Cobertura.build(location);
const project = await models_1.Project.build({ cwd });
const ignore = project.sources.ignore.concat(options?.ignore ?? []);
const map = new Map(cobertura.items.map((item) => [item.path, item]));
const found = paths.length
? await (0, fast_glob_1.default)(paths, { cwd, ignore, onlyFiles: true })
: cobertura.items.map((item) => item.path);
const filtered = found
.map((nested) => {
const item = map.get(nested) ?? models_1.CoberturaItem.build(nested);
return item.assign({ path: path_1.default.relative(cwd, item.path) });
})
.filter((item) => {
const parsed = path_1.default.parse(item.path);
if (item.rate >= target) {
return false;
}
if (parsed.ext !== '.ts' && parsed.ext !== '.js') {
return false;
}
if (parsed.name.endsWith('.spec')) {
return false;
}
if (options?.ignore?.length && options.ignore.some((pattern) => (0, minimatch_1.default)(item.path, pattern))) {
return false;
}
if (ignore.some((pattern) => (0, minimatch_1.default)(item.path, pattern))) {
return false;
}
return true;
});
return lodash_1.default.sortBy(filtered, ['path']).slice(0, options?.limit ?? Infinity);
};
exports.extractCoberturaItems = extractCoberturaItems;
const extractIgnoredPaths = async (cwd) => {
const raw = await promises_1.default.readFile(path_1.default.join(cwd, '.unitignore'), 'utf8').catch(() => null);
return raw?.split('\n').map((segment) => segment.trim()).filter(Boolean) ?? [];
};
exports.extractIgnoredPaths = extractIgnoredPaths;
const buildRenderer = () => {
const terminal = new promises_2.Readline(process.stdout);
const cursor = get_cursor_position_1.default.sync();
return (assistants) => {
terminal.cursorTo(0, cursor.row - 1).clearScreenDown().commit();
console.log(`model: ${assistants[0]?.context.provider.model}`);
console.log('');
console.table(assistants.map((assistant) => ({
file: assistant.source.code.path,
rate: assistant.source.cobertura.rate,
target: assistant.source.target,
iteration: assistant.steps.length,
strategy: assistant.state.strategy,
action: assistant.is(['COMPLETED'])
? '✓'
: assistant.state.action
? `${assistant.state.action.status === 'OK' ? '✓' : '✗'} ${assistant.state.action.message}`
: '⏱',
spent: Number((assistant.calculateTimeSpent() / 1000).toFixed(3)),
})));
};
};
exports.buildRenderer = buildRenderer;
//# sourceMappingURL=utils.js.map