@code-pushup/lighthouse-plugin 0.98.0 → 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/src/lib/constants.d.ts +1 -0
- package/src/lib/constants.js +1 -0
- package/src/lib/constants.js.map +1 -1
- package/src/lib/format.d.ts +1 -0
- package/src/lib/format.js +4 -0
- package/src/lib/format.js.map +1 -0
- package/src/lib/lighthouse-plugin.js +3 -3
- package/src/lib/lighthouse-plugin.js.map +1 -1
- package/src/lib/processing.d.ts +3 -2
- package/src/lib/processing.js +38 -7
- package/src/lib/processing.js.map +1 -1
- package/src/lib/runner/runner.js +67 -33
- package/src/lib/runner/runner.js.map +1 -1
- package/src/lib/runner/utils.d.ts +1 -1
- package/src/lib/runner/utils.js +38 -26
- package/src/lib/runner/utils.js.map +1 -1
- package/src/lib/utils.d.ts +0 -6
- package/src/lib/utils.js +6 -10
- package/src/lib/utils.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/lighthouse-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.100.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Code PushUp plugin for measuring web performance and quality with Lighthouse 🔥",
|
|
6
6
|
"homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-lighthouse#readme",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
},
|
|
37
37
|
"type": "module",
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@code-pushup/models": "0.
|
|
40
|
-
"@code-pushup/utils": "0.
|
|
39
|
+
"@code-pushup/models": "0.100.0",
|
|
40
|
+
"@code-pushup/utils": "0.100.0",
|
|
41
41
|
"ansis": "^3.3.0",
|
|
42
42
|
"chrome-launcher": "^1.1.1",
|
|
43
43
|
"lighthouse": "^12.0.0",
|
package/src/lib/constants.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const DEFAULT_CHROME_FLAGS: string[];
|
|
2
2
|
export declare const LIGHTHOUSE_PLUGIN_SLUG = "lighthouse";
|
|
3
|
+
export declare const LIGHTHOUSE_PLUGIN_TITLE = "Lighthouse";
|
|
3
4
|
export declare const LIGHTHOUSE_OUTPUT_PATH: string;
|
|
4
5
|
export declare const LIGHTHOUSE_GROUP_SLUGS: readonly ["performance", "accessibility", "best-practices", "seo"];
|
|
5
6
|
export declare const SINGLE_URL_THRESHOLD = 1;
|
package/src/lib/constants.js
CHANGED
|
@@ -4,6 +4,7 @@ import { DEFAULT_PERSIST_OUTPUT_DIR } from '@code-pushup/models';
|
|
|
4
4
|
// headless is needed to pass CI on Linux and Windows (locally it works without headless too)
|
|
5
5
|
export const DEFAULT_CHROME_FLAGS = [...DEFAULT_FLAGS, '--headless'];
|
|
6
6
|
export const LIGHTHOUSE_PLUGIN_SLUG = 'lighthouse';
|
|
7
|
+
export const LIGHTHOUSE_PLUGIN_TITLE = 'Lighthouse';
|
|
7
8
|
export const LIGHTHOUSE_OUTPUT_PATH = path.join(DEFAULT_PERSIST_OUTPUT_DIR, LIGHTHOUSE_PLUGIN_SLUG);
|
|
8
9
|
export const LIGHTHOUSE_GROUP_SLUGS = [
|
|
9
10
|
'performance',
|
package/src/lib/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,6FAA6F;AAC7F,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,aAAa,EAAE,YAAY,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AACnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAC7C,0BAA0B,EAC1B,sBAAsB,CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,aAAa;IACb,eAAe;IACf,gBAAgB;IAChB,KAAK;CACG,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,6FAA6F;AAC7F,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,aAAa,EAAE,YAAY,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC;AACnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAEpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAC7C,0BAA0B,EAC1B,sBAAsB,CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,aAAa;IACb,eAAe;IACf,gBAAgB;IAChB,KAAK;CACG,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const formatMetaLog: (message: string) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/lib/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,sBAAsB,CAAC,uBAAuB,CAAC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { normalizeUrlInput } from '@code-pushup/utils';
|
|
3
|
-
import { LIGHTHOUSE_PLUGIN_SLUG } from './constants.js';
|
|
3
|
+
import { LIGHTHOUSE_PLUGIN_SLUG, LIGHTHOUSE_PLUGIN_TITLE, } from './constants.js';
|
|
4
4
|
import { normalizeFlags } from './normalize-flags.js';
|
|
5
5
|
import { processAuditsAndGroups } from './processing.js';
|
|
6
6
|
import { createRunnerFunction } from './runner/runner.js';
|
|
@@ -15,10 +15,10 @@ export function lighthousePlugin(urls, flags) {
|
|
|
15
15
|
const packageJson = createRequire(import.meta.url)('../../package.json');
|
|
16
16
|
return {
|
|
17
17
|
slug: LIGHTHOUSE_PLUGIN_SLUG,
|
|
18
|
+
title: LIGHTHOUSE_PLUGIN_TITLE,
|
|
19
|
+
icon: 'lighthouse',
|
|
18
20
|
packageName: packageJson.name,
|
|
19
21
|
version: packageJson.version,
|
|
20
|
-
title: 'Lighthouse',
|
|
21
|
-
icon: 'lighthouse',
|
|
22
22
|
audits,
|
|
23
23
|
groups,
|
|
24
24
|
runner: createRunnerFunction(normalizedUrls, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lighthouse-plugin.js","sourceRoot":"","sources":["../../../src/lib/lighthouse-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"lighthouse-plugin.js","sourceRoot":"","sources":["../../../src/lib/lighthouse-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,UAAU,gBAAgB,CAC9B,IAAgB,EAChB,KAAyB;IAEzB,MAAM,EACJ,UAAU,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,GAAG,aAAa,EACjB,GAAG,cAAc,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEhC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAElE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,cAAc,EAAE;QAChE,UAAU;QACV,UAAU;QACV,cAAc;KACf,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,oBAAoB,CACkB,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,MAAM;QACN,MAAM;QACN,MAAM,EAAE,oBAAoB,CAAC,cAAc,EAAE;YAC3C,UAAU;YACV,UAAU;YACV,cAAc;YACd,GAAG,aAAa;SACjB,CAAC;QACF,OAAO;QACP,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC"}
|
package/src/lib/processing.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { Audit, Group } from '@code-pushup/models';
|
|
1
2
|
import { type FilterOptions } from './utils.js';
|
|
2
3
|
export declare function expandOptionsForUrls(options: FilterOptions, urlCount: number): FilterOptions;
|
|
3
4
|
export declare function processAuditsAndGroups(urls: string[], options: FilterOptions): {
|
|
4
|
-
audits:
|
|
5
|
-
groups:
|
|
5
|
+
audits: Audit[];
|
|
6
|
+
groups: Group[];
|
|
6
7
|
};
|
package/src/lib/processing.js
CHANGED
|
@@ -1,21 +1,52 @@
|
|
|
1
|
-
import { addIndex, expandAuditsForUrls, expandGroupsForUrls, shouldExpandForUrls, } from '@code-pushup/utils';
|
|
1
|
+
import { addIndex, expandAuditsForUrls, expandGroupsForUrls, logger, objectFromEntries, objectToEntries, pluralizeToken, shouldExpandForUrls, } from '@code-pushup/utils';
|
|
2
|
+
import { formatMetaLog } from './format.js';
|
|
2
3
|
import { LIGHTHOUSE_GROUPS, LIGHTHOUSE_NAVIGATION_AUDITS, } from './runner/constants.js';
|
|
3
4
|
import { markSkippedAuditsAndGroups } from './utils.js';
|
|
4
5
|
export function expandOptionsForUrls(options, urlCount) {
|
|
5
|
-
return
|
|
6
|
+
return objectFromEntries(objectToEntries(options).map(([key, value = []]) => [
|
|
6
7
|
key,
|
|
7
|
-
Array.
|
|
8
|
-
? value.flatMap(slug => Array.from({ length: urlCount }, (_, i) => addIndex(slug, i)))
|
|
9
|
-
: value,
|
|
8
|
+
value.flatMap(slug => Array.from({ length: urlCount }, (_, i) => addIndex(slug, i))),
|
|
10
9
|
]));
|
|
11
10
|
}
|
|
12
11
|
export function processAuditsAndGroups(urls, options) {
|
|
12
|
+
logTotal();
|
|
13
13
|
if (!shouldExpandForUrls(urls.length)) {
|
|
14
|
-
|
|
14
|
+
const marked = markSkippedAuditsAndGroups(LIGHTHOUSE_NAVIGATION_AUDITS, LIGHTHOUSE_GROUPS, options);
|
|
15
|
+
logSkipped(marked);
|
|
16
|
+
return marked;
|
|
15
17
|
}
|
|
16
18
|
const expandedAudits = expandAuditsForUrls(LIGHTHOUSE_NAVIGATION_AUDITS, urls);
|
|
17
19
|
const expandedGroups = expandGroupsForUrls(LIGHTHOUSE_GROUPS, urls);
|
|
18
20
|
const expandedOptions = expandOptionsForUrls(options, urls.length);
|
|
19
|
-
|
|
21
|
+
logExpanded(expandedAudits, expandedGroups, urls);
|
|
22
|
+
const marked = markSkippedAuditsAndGroups(expandedAudits, expandedGroups, expandedOptions);
|
|
23
|
+
logSkipped(marked);
|
|
24
|
+
return marked;
|
|
25
|
+
}
|
|
26
|
+
function logTotal() {
|
|
27
|
+
logger.info(formatMetaLog(`Created ${pluralizeToken('group', LIGHTHOUSE_GROUPS.length)} and ${pluralizeToken('audit', LIGHTHOUSE_NAVIGATION_AUDITS.length)} from Lighthouse's categories and navigation audits`));
|
|
28
|
+
}
|
|
29
|
+
function logExpanded(expandedAudits, expandedGroups, urls) {
|
|
30
|
+
logger.info(formatMetaLog(`Expanded audits (${LIGHTHOUSE_NAVIGATION_AUDITS.length} → ${expandedAudits.length}) and groups (${LIGHTHOUSE_GROUPS.length} → ${expandedGroups.length}) for ${pluralizeToken('URL', urls.length)}`));
|
|
31
|
+
}
|
|
32
|
+
function logSkipped(marked) {
|
|
33
|
+
const { audits, groups } = marked;
|
|
34
|
+
const formattedCounts = [
|
|
35
|
+
{ name: 'audit', items: audits },
|
|
36
|
+
{ name: 'group', items: groups },
|
|
37
|
+
]
|
|
38
|
+
.map(({ name, items }) => {
|
|
39
|
+
const skipped = items.filter(({ isSkipped }) => isSkipped);
|
|
40
|
+
if (skipped.length === 0) {
|
|
41
|
+
return '';
|
|
42
|
+
}
|
|
43
|
+
return `${skipped.length} out of ${pluralizeToken(name, items.length)}`;
|
|
44
|
+
})
|
|
45
|
+
.filter(Boolean)
|
|
46
|
+
.join(' and ');
|
|
47
|
+
if (!formattedCounts) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
logger.info(formatMetaLog(`Skipping ${formattedCounts}`));
|
|
20
51
|
}
|
|
21
52
|
//# sourceMappingURL=processing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processing.js","sourceRoot":"","sources":["../../../src/lib/processing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"processing.js","sourceRoot":"","sources":["../../../src/lib/processing.ts"],"names":[],"mappings":"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"}
|
package/src/lib/runner/runner.js
CHANGED
|
@@ -1,50 +1,84 @@
|
|
|
1
|
+
import ansis from 'ansis';
|
|
1
2
|
import { runLighthouse } from 'lighthouse/cli/run.js';
|
|
2
3
|
import path from 'node:path';
|
|
3
|
-
import { addIndex, ensureDirectoryExists,
|
|
4
|
+
import { addIndex, asyncSequential, ensureDirectoryExists, formatAsciiTable, formatReportScore, logger, shouldExpandForUrls, stringifyError, } from '@code-pushup/utils';
|
|
4
5
|
import { DEFAULT_CLI_FLAGS } from './constants.js';
|
|
5
|
-
import { enrichFlags,
|
|
6
|
+
import { enrichFlags, filterAuditOutputs, getConfig, toAuditOutputs, withLocalTmpDir, } from './utils.js';
|
|
6
7
|
export function createRunnerFunction(urls, flags = DEFAULT_CLI_FLAGS) {
|
|
7
8
|
return withLocalTmpDir(async () => {
|
|
8
9
|
const config = await getConfig(flags);
|
|
9
10
|
const normalizationFlags = enrichFlags(flags);
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
...audit,
|
|
22
|
-
slug: addIndex(audit.slug, index),
|
|
23
|
-
}));
|
|
24
|
-
return [...acc, ...processedOutputs];
|
|
25
|
-
}
|
|
26
|
-
catch (error) {
|
|
27
|
-
logger.warn(stringifyError(error));
|
|
28
|
-
return acc;
|
|
29
|
-
}
|
|
30
|
-
}, Promise.resolve([]));
|
|
31
|
-
if (allResults.length === 0) {
|
|
11
|
+
const urlsCount = urls.length;
|
|
12
|
+
const isSingleUrl = !shouldExpandForUrls(urlsCount);
|
|
13
|
+
const allResults = await asyncSequential(urls, (url, urlIndex) => {
|
|
14
|
+
const enrichedFlags = isSingleUrl
|
|
15
|
+
? normalizationFlags
|
|
16
|
+
: enrichFlags(flags, urlIndex + 1);
|
|
17
|
+
const step = { urlIndex, urlsCount };
|
|
18
|
+
return runLighthouseForUrl(url, enrichedFlags, config, step);
|
|
19
|
+
});
|
|
20
|
+
const collectedResults = allResults.filter(res => res != null);
|
|
21
|
+
if (collectedResults.length === 0) {
|
|
32
22
|
throw new Error(isSingleUrl
|
|
33
23
|
? 'Lighthouse did not produce a result.'
|
|
34
24
|
: 'Lighthouse failed to produce results for all URLs.');
|
|
35
25
|
}
|
|
36
|
-
|
|
26
|
+
logResultsForAllUrls(collectedResults);
|
|
27
|
+
const auditOutputs = collectedResults.flatMap(res => res.auditOutputs);
|
|
28
|
+
return filterAuditOutputs(auditOutputs, normalizationFlags);
|
|
37
29
|
});
|
|
38
30
|
}
|
|
39
|
-
async function runLighthouseForUrl(url, flags, config) {
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
async function runLighthouseForUrl(url, flags, config, step) {
|
|
32
|
+
const { urlIndex, urlsCount } = step;
|
|
33
|
+
const prefix = ansis.gray(`[${step.urlIndex + 1}/${step.urlsCount}]`);
|
|
34
|
+
try {
|
|
35
|
+
if (flags.outputPath) {
|
|
36
|
+
await ensureDirectoryExists(path.dirname(flags.outputPath));
|
|
37
|
+
}
|
|
38
|
+
const lhr = await logger.task(`${prefix} Running lighthouse on ${url}`, async () => {
|
|
39
|
+
const runnerResult = await runLighthouse(url, flags, config);
|
|
40
|
+
if (runnerResult == null) {
|
|
41
|
+
throw new Error('Lighthouse did not produce a result');
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
message: `${prefix} Completed lighthouse run on ${url}`,
|
|
45
|
+
result: runnerResult.lhr,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
const auditOutputs = toAuditOutputs(Object.values(lhr.audits), flags);
|
|
49
|
+
if (shouldExpandForUrls(urlsCount)) {
|
|
50
|
+
return {
|
|
51
|
+
url,
|
|
52
|
+
lhr,
|
|
53
|
+
auditOutputs: auditOutputs.map(audit => ({
|
|
54
|
+
...audit,
|
|
55
|
+
slug: addIndex(audit.slug, urlIndex),
|
|
56
|
+
})),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return { url, lhr, auditOutputs };
|
|
42
60
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.warn(`Lighthouse run failed for ${url} - ${stringifyError(error)}`);
|
|
63
|
+
return null;
|
|
46
64
|
}
|
|
47
|
-
|
|
48
|
-
|
|
65
|
+
}
|
|
66
|
+
function logResultsForAllUrls(results) {
|
|
67
|
+
const categoryNames = Object.fromEntries(results
|
|
68
|
+
.flatMap(res => Object.values(res.lhr.categories))
|
|
69
|
+
.map(category => [category.id, category.title]));
|
|
70
|
+
logger.info(formatAsciiTable({
|
|
71
|
+
columns: [
|
|
72
|
+
{ key: 'url', label: 'URL', align: 'left' },
|
|
73
|
+
...Object.entries(categoryNames).map(([key, label]) => ({ key, label, align: 'right' })),
|
|
74
|
+
],
|
|
75
|
+
rows: results.map(({ url, lhr }) => ({
|
|
76
|
+
url,
|
|
77
|
+
...Object.fromEntries(Object.values(lhr.categories).map(category => [
|
|
78
|
+
category.id,
|
|
79
|
+
category.score == null ? '-' : formatReportScore(category.score),
|
|
80
|
+
])),
|
|
81
|
+
})),
|
|
82
|
+
}));
|
|
49
83
|
}
|
|
50
84
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import type { Result } from 'lighthouse/types/lhr/audit-result';
|
|
|
3
3
|
import type { AuditOutputs } from '@code-pushup/models';
|
|
4
4
|
import type { LighthouseOptions } from '../types.js';
|
|
5
5
|
import type { LighthouseCliFlags } from './types.js';
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function filterAuditOutputs(auditOutputs: AuditOutputs, flags?: LighthouseOptions): AuditOutputs;
|
|
7
7
|
export declare class LighthouseAuditParsingError extends Error {
|
|
8
8
|
constructor(slug: string, error: unknown);
|
|
9
9
|
}
|
package/src/lib/runner/utils.js
CHANGED
|
@@ -8,13 +8,13 @@ import path from 'node:path';
|
|
|
8
8
|
import { formatReportScore, importModule, logger, pluginWorkDir, readJsonFile, stringifyError, } from '@code-pushup/utils';
|
|
9
9
|
import { LIGHTHOUSE_PLUGIN_SLUG } from '../constants.js';
|
|
10
10
|
import { logUnsupportedDetails, toAuditDetails } from './details/details.js';
|
|
11
|
-
export function
|
|
11
|
+
export function filterAuditOutputs(auditOutputs, flags = { skipAudits: [] }) {
|
|
12
12
|
const toSkip = new Set(flags.skipAudits ?? []);
|
|
13
13
|
return auditOutputs.filter(({ slug }) => !toSkip.has(slug));
|
|
14
14
|
}
|
|
15
15
|
export class LighthouseAuditParsingError extends Error {
|
|
16
16
|
constructor(slug, error) {
|
|
17
|
-
super(
|
|
17
|
+
super(`Failed to parse ${ansis.bold(slug)} audit's details - ${stringifyError(error)}`);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
function formatBaseAuditOutput(lhrAudit) {
|
|
@@ -69,31 +69,40 @@ export function determineAndSetLogLevel({ verbose, quiet, } = {}) {
|
|
|
69
69
|
return logLevel;
|
|
70
70
|
}
|
|
71
71
|
export async function getConfig(options = {}) {
|
|
72
|
-
const { configPath
|
|
73
|
-
if (
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
const { configPath, preset } = options;
|
|
73
|
+
if (configPath != null) {
|
|
74
|
+
// Resolve the config file path relative to where cli was called.
|
|
75
|
+
return logger.task(`Loading lighthouse config from ${configPath}`, async () => {
|
|
76
|
+
const message = `Loaded lighthouse config from ${configPath}`;
|
|
77
|
+
if (configPath.endsWith('.json')) {
|
|
78
|
+
return { message, result: await readJsonFile(configPath) };
|
|
79
|
+
}
|
|
80
|
+
if (/\.(ts|js|mjs)$/.test(configPath)) {
|
|
81
|
+
return {
|
|
82
|
+
message,
|
|
83
|
+
result: await importModule({
|
|
84
|
+
filepath: configPath,
|
|
85
|
+
format: 'esm',
|
|
86
|
+
}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
throw new Error(`Unknown Lighthouse config file extension in ${configPath}`);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (preset != null) {
|
|
93
|
+
const supportedPresets = {
|
|
94
|
+
desktop: desktopConfig,
|
|
95
|
+
perf: perfConfig,
|
|
96
|
+
experimental: experimentalConfig,
|
|
97
|
+
};
|
|
98
|
+
// in reality, the preset could be a string not included in the type definition
|
|
99
|
+
const config = supportedPresets[preset];
|
|
100
|
+
if (config) {
|
|
101
|
+
logger.info(`Loaded config from ${ansis.bold(preset)} preset`);
|
|
102
|
+
return config;
|
|
80
103
|
}
|
|
81
104
|
else {
|
|
82
|
-
logger.warn(`
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
else if (preset != null) {
|
|
86
|
-
switch (preset) {
|
|
87
|
-
case 'desktop':
|
|
88
|
-
return desktopConfig;
|
|
89
|
-
case 'perf':
|
|
90
|
-
return perfConfig;
|
|
91
|
-
case 'experimental':
|
|
92
|
-
return experimentalConfig;
|
|
93
|
-
default:
|
|
94
|
-
// as preset is a string literal the default case here is normally caught by TS and not possible to happen. Now in reality it can happen and preset could be a string not included in the literal.
|
|
95
|
-
// Therefore, we have to use `as string`. Otherwise, it will consider preset as type never
|
|
96
|
-
logger.warn(`Preset "${preset}" is not supported`);
|
|
105
|
+
logger.warn(`Preset "${preset}" is not supported`);
|
|
97
106
|
}
|
|
98
107
|
}
|
|
99
108
|
return undefined;
|
|
@@ -124,14 +133,17 @@ export function withLocalTmpDir(fn) {
|
|
|
124
133
|
}
|
|
125
134
|
return async () => {
|
|
126
135
|
const originalTmpDir = process.env['TEMP'];
|
|
136
|
+
const localPath = path.join(pluginWorkDir(LIGHTHOUSE_PLUGIN_SLUG), 'tmp');
|
|
127
137
|
// eslint-disable-next-line functional/immutable-data
|
|
128
|
-
process.env['TEMP'] =
|
|
138
|
+
process.env['TEMP'] = localPath;
|
|
139
|
+
logger.debug(`Temporarily overwriting TEMP environment variable with ${localPath} to prevent permissions error on cleanup`);
|
|
129
140
|
try {
|
|
130
141
|
return await fn();
|
|
131
142
|
}
|
|
132
143
|
finally {
|
|
133
144
|
// eslint-disable-next-line functional/immutable-data
|
|
134
145
|
process.env['TEMP'] = originalTmpDir;
|
|
146
|
+
logger.debug(`Restored TEMP environment variable to original value ${originalTmpDir}`);
|
|
135
147
|
}
|
|
136
148
|
};
|
|
137
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/lib/runner/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,aAAa,MAAM,0CAA0C,CAAC;AACrE,OAAO,kBAAkB,MAAM,+CAA+C,CAAC;AAC/E,OAAO,UAAU,MAAM,uCAAuC,CAAC;AAG/D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG7E,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/lib/runner/utils.ts"],"names":[],"mappings":"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"}
|
package/src/lib/utils.d.ts
CHANGED
|
@@ -3,13 +3,7 @@ import type { LighthouseCliFlags } from './runner/types.js';
|
|
|
3
3
|
import type { LighthouseGroupSlug } from './types.js';
|
|
4
4
|
export declare function lighthouseGroupRef(groupSlug: LighthouseGroupSlug, weight?: number): CategoryRef;
|
|
5
5
|
export declare function lighthouseAuditRef(auditSlug: string, weight?: number): CategoryRef;
|
|
6
|
-
export declare class AuditsNotImplementedError extends Error {
|
|
7
|
-
constructor(auditSlugs: string[]);
|
|
8
|
-
}
|
|
9
6
|
export declare function validateAudits(audits: Audit[], onlyAudits: string[]): boolean;
|
|
10
|
-
export declare class CategoriesNotImplementedError extends Error {
|
|
11
|
-
constructor(categorySlugs: string[]);
|
|
12
|
-
}
|
|
13
7
|
export declare function validateOnlyCategories(groups: Group[], onlyCategories: string | string[]): boolean;
|
|
14
8
|
export type FilterOptions = Partial<Pick<LighthouseCliFlags, 'onlyAudits' | 'onlyCategories' | 'skipAudits'>>;
|
|
15
9
|
export declare function markSkippedAuditsAndGroups(audits: Audit[], groups: Group[], options?: FilterOptions): {
|
package/src/lib/utils.js
CHANGED
|
@@ -16,27 +16,23 @@ export function lighthouseAuditRef(auditSlug, weight = 1) {
|
|
|
16
16
|
weight,
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
constructor(
|
|
21
|
-
|
|
19
|
+
class NotImplementedError extends Error {
|
|
20
|
+
constructor(plural, slugs) {
|
|
21
|
+
const formattedSlugs = slugs.map(slug => `"${slug}"`).join(', ');
|
|
22
|
+
super(`${plural} not implemented: ${formattedSlugs}`);
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
export function validateAudits(audits, onlyAudits) {
|
|
25
26
|
const missingAudtis = toArray(onlyAudits).filter(slug => !audits.some(audit => audit.slug === slug));
|
|
26
27
|
if (missingAudtis.length > 0) {
|
|
27
|
-
throw new
|
|
28
|
+
throw new NotImplementedError('Audits', missingAudtis);
|
|
28
29
|
}
|
|
29
30
|
return true;
|
|
30
31
|
}
|
|
31
|
-
export class CategoriesNotImplementedError extends Error {
|
|
32
|
-
constructor(categorySlugs) {
|
|
33
|
-
super(`categories: "${categorySlugs.join(', ')}" not implemented`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
32
|
export function validateOnlyCategories(groups, onlyCategories) {
|
|
37
33
|
const missingCategories = toArray(onlyCategories).filter(slug => groups.every(group => group.slug !== slug));
|
|
38
34
|
if (missingCategories.length > 0) {
|
|
39
|
-
throw new
|
|
35
|
+
throw new NotImplementedError('Categories', missingCategories);
|
|
40
36
|
}
|
|
41
37
|
return true;
|
|
42
38
|
}
|
package/src/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAIhF,MAAM,UAAU,kBAAkB,CAChC,SAA8B,EAC9B,MAAM,GAAG,CAAC;IAEV,OAAO;QACL,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,MAAM,GAAG,CAAC;IAC9D,OAAO;QACL,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
|