mirror of
https://github.com/grafana/grafana.git
synced 2026-02-03 20:49:50 -05:00
* Coverage: Add some DX improvements to by codeowner script * Potential fix for code scanning alert no. 3796: Shell command built from environment values Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * Potential fix for code scanning alert no. 3797: Shell command built from environment values Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * fix package.json and yarn lock * reorder imports * fix issue for frontend-platform: exclude files in any /test/ dir * wip * add ora spinner for codeowners manifest step * cleanup --------- Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
88 lines
2.5 KiB
JavaScript
88 lines
2.5 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const { AutoComplete } = require('enquirer');
|
|
const cp = require('node:child_process');
|
|
const { hideBin } = require('yargs/helpers');
|
|
const yargs = require('yargs/yargs');
|
|
|
|
const { getCodeowners } = require('./codeowners-manifest/utils.js');
|
|
|
|
const JEST_CONFIG_PATH = 'jest.config.codeowner.js';
|
|
|
|
async function promptCodeownerName() {
|
|
const teams = await getCodeowners();
|
|
const prompt = new AutoComplete({
|
|
name: 'flavor',
|
|
message: 'Select your team to run tests by codeowner.',
|
|
limit: 10,
|
|
choices: teams.filter((team) => team.startsWith('@grafana/')),
|
|
});
|
|
return await prompt.run();
|
|
}
|
|
|
|
/**
|
|
* Run test coverage for a specific codeowner
|
|
* @param {string} codeownerName - The codeowner name to run coverage for
|
|
* @param {boolean} noOpen - Whether to skip opening the coverage report in the browser
|
|
*/
|
|
async function runTestCoverageByCodeowner(codeownerName, noOpen = process.env.CI === 'true') {
|
|
const teams = await getCodeowners();
|
|
if (!teams.includes(codeownerName)) {
|
|
throw new Error(`Codeowner "${codeownerName}" was not found.`);
|
|
}
|
|
|
|
process.env.CODEOWNER_NAME = codeownerName;
|
|
process.env.SHOULD_OPEN_COVERAGE_REPORT = String(!noOpen);
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const child = cp.spawn('jest', [`--config=${JEST_CONFIG_PATH}`], {
|
|
stdio: 'inherit',
|
|
shell: true,
|
|
});
|
|
|
|
child.on('error', (error) => {
|
|
reject(new Error(`Failed to start Jest: ${error.message}`));
|
|
});
|
|
|
|
child.on('close', (code) => {
|
|
if (code === 0) {
|
|
resolve();
|
|
} else {
|
|
reject(new Error(`Jest exited with code ${code}`));
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
if (require.main === module) {
|
|
(async () => {
|
|
try {
|
|
const argv = yargs(hideBin(process.argv)).parse();
|
|
const teams = await getCodeowners();
|
|
let codeownerName = argv._[0];
|
|
if (codeownerName != null && !teams.includes(codeownerName)) {
|
|
const msg = `Codeowner "${codeownerName}" was not found.`;
|
|
codeownerName = null;
|
|
if (process.env.CI === 'true') {
|
|
throw new Error(msg);
|
|
} else {
|
|
console.warn(`⚠️ ${msg}`);
|
|
}
|
|
}
|
|
|
|
if (!codeownerName) {
|
|
codeownerName = await promptCodeownerName();
|
|
}
|
|
|
|
const noOpen = argv['open'] === false;
|
|
|
|
console.log(`🧪 Running test coverage for codeowner: ${codeownerName}`);
|
|
await runTestCoverageByCodeowner(codeownerName, noOpen);
|
|
} catch (e) {
|
|
console.error(e.message);
|
|
process.exit(1);
|
|
}
|
|
})();
|
|
}
|
|
|
|
module.exports = { runTestCoverageByCodeowner };
|