Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
async function runCommand(options) {
const {budgetsFile, assertions, assertMatrix, preset} = options;
const areAssertionsSet = Boolean(assertions || assertMatrix || preset);
if (!areAssertionsSet && !budgetsFile) throw new Error('No assertions to use');
if (budgetsFile && areAssertionsSet) throw new Error('Cannot use both budgets AND assertions');
// If we have a budgets file, convert it to our assertions format.
if (budgetsFile) options = convertBudgetsToAssertions(readBudgets(budgetsFile));
const lhrs = loadSavedLHRs().map(json => JSON.parse(json));
const uniqueUrls = new Set(lhrs.map(lhr => lhr.finalUrl));
const allResults = getAllAssertionResults(options, lhrs);
const groupedResults = _.groupBy(allResults, result => result.url);
process.stderr.write(
`Checking assertions against ${uniqueUrls.size} URL(s), ${lhrs.length} total run(s)\n\n`
);
let hasFailure = false;
for (const results of groupedResults) {
const url = results[0].url;
const sortedResults = results.sort((a, b) => {
const {level: levelA = 'error', auditId: auditIdA = 'unknown'} = a;
const {level: levelB = 'error', auditId: auditIdB = 'unknown'} = b;
return levelA.localeCompare(levelB) || auditIdA.localeCompare(auditIdB);
});
test: () => loadSavedLHRs().length >= 0,
},
async function runCommand(options) {
/** @type {Array} */
const lhrs = loadSavedLHRs().map(lhr => JSON.parse(lhr));
/** @type {Array>} */
const groupedByUrl = _.groupBy(lhrs, lhr => lhr.finalUrl).map(lhrs =>
lhrs.map(lhr => [lhr, lhr])
);
const representativeLhrs = computeRepresentativeRuns(groupedByUrl);
if (!representativeLhrs.length) {
process.stdout.write('No available reports to open. ');
}
for (const lhr of representativeLhrs) {
if (options.url && lhr.finalUrl !== options.url) continue;
process.stdout.write(`Opening median report for ${lhr.finalUrl}...\n`);
const tmpFile = tmp.fileSync({postfix: '.html'});
fs.writeFileSync(tmpFile.name, getHTMLReportForLHR(lhr));
const targetUrl = targetUrlMap.get(rawUrl) || rawUrl;
await postStatusToGitHub({
slug,
hash,
state,
context,
description,
targetUrl,
githubToken,
githubAppToken,
});
}
} else {
/** @type {Array} */
const lhrs = loadSavedLHRs().map(lhr => JSON.parse(lhr));
/** @type {Array>} */
const lhrsByUrl = _.groupBy(lhrs, lhr => lhr.finalUrl).map(lhrs => lhrs.map(lhr => [lhr, lhr]));
const representativeLhrs = computeRepresentativeRuns(lhrsByUrl);
if (!representativeLhrs.length) return print('No LHRs for status check, skipping.\n');
for (const lhr of representativeLhrs) {
const rawUrl = lhr.finalUrl;
const urlLabel = getUrlLabelForGithub(rawUrl, options);
const state = 'success';
const context = `lhci/url${urlLabel}`;
const categoriesDescription = Object.values(lhr.categories)
.map(category => `${category.title}: ${Math.round(category.score * 100)}`)
.join(', ');
const description = `${categoriesDescription}`;
const targetUrl = targetUrlMap.get(rawUrl) || rawUrl;
async function runTemporaryPublicStorageTarget(options) {
/** @type {Array} */
const lhrs = loadSavedLHRs().map(lhr => JSON.parse(lhr));
/** @type {Array>} */
const lhrsByUrl = _.groupBy(lhrs, lhr => lhr.finalUrl).map(lhrs => lhrs.map(lhr => [lhr, lhr]));
const representativeLhrs = computeRepresentativeRuns(lhrsByUrl);
const targetUrlMap = new Map();
for (const lhr of representativeLhrs) {
const urlAudited = lhr.finalUrl;
print(`Uploading median LHR of ${urlAudited}...`);
try {
const response = await fetch(TEMPORARY_PUBLIC_STORAGE_URL, {
method: 'POST',
headers: {'content-type': 'text/html'},
body: getHTMLReportForLHR(lhr),
});
hash,
branch,
ancestorHash,
commitMessage: getCommitMessage(hash),
author: getAuthor(hash),
avatarUrl: getAvatarUrl(hash),
externalBuildUrl: getExternalBuildUrl(),
runAt: new Date().toISOString(),
committedAt: getCommitTime(hash),
ancestorCommittedAt: ancestorHash ? getCommitTime(ancestorHash) : undefined,
});
print(`Saving CI project ${project.name} (${project.id})\n`);
print(`Saving CI build (${build.id})\n`);
const lhrs = loadSavedLHRs();
const urlReplacementPatterns = options.urlReplacementPatterns.filter(Boolean);
const targetUrlMap = new Map();
const buildViewUrl = new URL(
`/app/projects/${project.slug}/compare/${build.id}`,
options.serverBaseUrl
);
for (const lhr of lhrs) {
const parsedLHR = JSON.parse(lhr);
const url = replaceUrlPatterns(parsedLHR.finalUrl, urlReplacementPatterns);
const run = await api.createRun({
projectId: project.id,
buildId: build.id,
representative: false,
url,