@code-pushup/lighthouse-plugin 0.95.2 → 0.96.1

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/README.md CHANGED
@@ -51,66 +51,6 @@ For more infos visit the [official docs](https://developer.chrome.com/docs/light
51
51
 
52
52
  4. Run the CLI with `npx code-pushup collect` and view or upload the report (refer to [CLI docs](../cli/README.md)).
53
53
 
54
- ### Optionally set up categories
55
-
56
- Reference audits (or groups) which you wish to include in custom categories (use `npx code-pushup print-config --onlyPlugins=lighthouse` to list audits and groups).
57
-
58
- Assign weights based on what influence each Lighthouse audit has on the overall category score (assign weight 0 to only include as extra info, without influencing category score).
59
- The plugin exports the helper `lighthouseAuditRef` and `lighthouseGroupRef` to reference Lighthouse category references for audits and groups.
60
-
61
- #### Reference audits directly with `lighthouseGroupRef`
62
-
63
- ```ts
64
- import { lighthouseGroupRef } from './utils';
65
-
66
- export default {
67
- // ...
68
- categories: [
69
- {
70
- slug: 'performance',
71
- title: 'Performance',
72
- refs: [lighthouseGroupRef('performance')],
73
- },
74
- {
75
- slug: 'a11y',
76
- title: 'Accessibility',
77
- refs: [lighthouseGroupRef('accessibility')],
78
- },
79
- {
80
- slug: 'best-practices',
81
- title: 'Best Practices',
82
- refs: [lighthouseGroupRef('best-practices')],
83
- },
84
- {
85
- slug: 'seo',
86
- title: 'SEO',
87
- refs: [lighthouseGroupRef('seo')],
88
- },
89
- ],
90
- };
91
- ```
92
-
93
- #### Reference groups with `lighthouseAuditRef`
94
-
95
- The Lighthouse categories are reflected as groups.
96
- Referencing individual audits offers more granularity. However, keep maintenance costs of a higher number of audits in mind as well.
97
-
98
- ```ts
99
- import { lighthouseAuditRef } from './utils';
100
-
101
- export default {
102
- // ...
103
- categories: [
104
- {
105
- slug: 'core-web-vitals',
106
- title: 'Core Web Vitals',
107
- scoreTarget: 0.9,
108
- refs: [lighthouseAuditRef('largest-contentful-paint', 3), lighthouseAuditRef('first-input-delay', 2), lighthouseAuditRef('cumulative-layout-shift', 2), lighthouseAuditRef('first-contentful-paint', 1)],
109
- },
110
- ],
111
- };
112
- ```
113
-
114
54
  ## Multiple URLs
115
55
 
116
56
  The Lighthouse plugin supports running audits against multiple URLs in a single invocation. To do this, provide an array of URLs as the first argument to the plugin:
@@ -148,63 +88,6 @@ export default {
148
88
  };
149
89
  ```
150
90
 
151
- ### Categories with multiple URLs
152
-
153
- When running Lighthouse against multiple URLs, use the `mergeLighthouseCategories` utility to ensure categories are correctly expanded and results are aggregated per URL.
154
-
155
- #### Basic usage
156
-
157
- ```ts
158
- import lighthousePlugin, { mergeLighthouseCategories } from '@code-pushup/lighthouse-plugin';
159
-
160
- const lhPlugin = await lighthousePlugin(urls);
161
-
162
- export default {
163
- plugins: [
164
- // ...
165
- lhPlugin,
166
- ],
167
- categories: [
168
- // ...
169
- ...mergeLighthouseCategories(lhPlugin),
170
- ],
171
- };
172
- ```
173
-
174
- #### Custom categories
175
-
176
- If you provide custom categories, you can reference both groups and audits as usual. The merging utility will expand each referenced group or audit for every URL, assigning the correct per-URL weight.
177
-
178
- ```ts
179
- import lighthousePlugin, { lighthouseAuditRef, lighthouseGroupRef, mergeLighthouseCategories } from '@code-pushup/lighthouse-plugin';
180
-
181
- const lhPlugin = await lighthousePlugin(urls);
182
-
183
- export default {
184
- // ...
185
- plugins: [
186
- // ...
187
- lhPlugin,
188
- ],
189
- categories: [
190
- // ...
191
- ...mergeLighthouseCategories(lhPlugin, [
192
- {
193
- slug: 'performance',
194
- title: 'Performance',
195
- refs: [lighthouseGroupRef('performance'), lighthouseAuditRef('first-contentful-paint', 2)],
196
- },
197
- ]),
198
- ],
199
- };
200
- ```
201
-
202
- ### Behavior Summary
203
-
204
- - **No categories**: The plugin auto-generates categories from the plugin's default Lighthouse groups.
205
- - **Custom categories**: The plugin expands all referenced audits and groups for each URL, applying appropriate weights.
206
- - **Empty array** (`categories: []`): No categories are created or expanded, which is useful when you only want audit data.
207
-
208
91
  ## Flags
209
92
 
210
93
  The plugin accepts an optional second argument, `flags`.
@@ -324,4 +207,78 @@ For a complete guide on Lighthouse configuration read the [official documentatio
324
207
  > })
325
208
  > ```
326
209
 
210
+ ## Category integration
211
+
212
+ The plugin provides helpers to integrate Lighthouse results into your categories.
213
+
214
+ ### Auto-generate categories
215
+
216
+ Use `lighthouseCategories` to automatically create categories from all plugin groups:
217
+
218
+ ```ts
219
+ import lighthousePlugin, { lighthouseCategories } from '@code-pushup/lighthouse-plugin';
220
+
221
+ const lighthouse = await lighthousePlugin('https://example.com');
222
+
223
+ export default {
224
+ plugins: [lighthouse],
225
+ categories: lighthouseCategories(lighthouse),
226
+ };
227
+ ```
228
+
229
+ The helper creates categories for all four Lighthouse groups: `performance`, `accessibility`, `best-practices`, and `seo`. For multi-URL setups, refs are automatically expanded for each URL with appropriate weights.
230
+
231
+ ### Custom categories
232
+
233
+ For fine-grained control, provide your own categories. You can reference groups (Lighthouse's native categories) or individual audits:
234
+
235
+ ```ts
236
+ import lighthousePlugin, { lighthouseAuditRef, lighthouseCategories, lighthouseGroupRef } from '@code-pushup/lighthouse-plugin';
237
+
238
+ const lighthouse = await lighthousePlugin(['https://example.com', 'https://example.com/about']);
239
+
240
+ export default {
241
+ plugins: [lighthouse],
242
+ categories: lighthouseCategories(lighthouse, [
243
+ {
244
+ slug: 'performance',
245
+ title: 'Performance',
246
+ refs: [lighthouseGroupRef('performance')],
247
+ },
248
+ {
249
+ slug: 'core-web-vitals',
250
+ title: 'Core Web Vitals',
251
+ refs: [lighthouseAuditRef('largest-contentful-paint', 3), lighthouseAuditRef('cumulative-layout-shift', 2), lighthouseAuditRef('first-contentful-paint', 1)],
252
+ },
253
+ ]),
254
+ };
255
+ ```
256
+
257
+ > [!NOTE]
258
+ > Referencing individual audits offers more granularity but increases maintenance costs. Use `npx code-pushup print-config --onlyPlugins=lighthouse` to list all available audits and groups.
259
+
260
+ > [!TIP]
261
+ > Weights determine each ref's influence on the category score. Use weight `0` to include a ref as info only, without affecting the score.
262
+
263
+ > [!TIP]
264
+ > You can use `lighthouseGroupRef` and `lighthouseAuditRef` directly in your categories without the helper. However, wrapping them in `lighthouseCategories` future-proofs your config for multi-URL setups.
265
+
266
+ ### Helper functions
267
+
268
+ | Function | Description |
269
+ | ---------------------- | -------------------------------------------- |
270
+ | `lighthouseCategories` | Auto-generates or expands categories |
271
+ | `lighthouseGroupRef` | Creates a category ref to a Lighthouse group |
272
+ | `lighthouseAuditRef` | Creates a category ref to a Lighthouse audit |
273
+
274
+ ### Type safety
275
+
276
+ The `LighthouseGroupSlug` type is exported for discovering valid group slugs:
277
+
278
+ ```ts
279
+ import type { LighthouseGroupSlug } from '@code-pushup/lighthouse-plugin';
280
+
281
+ const group: LighthouseGroupSlug = 'performance';
282
+ ```
283
+
327
284
  If you want to contribute, please refer to [CONTRIBUTING.md](./CONTRIBUTING.md).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-pushup/lighthouse-plugin",
3
- "version": "0.95.2",
3
+ "version": "0.96.1",
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.95.2",
40
- "@code-pushup/utils": "0.95.2",
39
+ "@code-pushup/models": "0.96.1",
40
+ "@code-pushup/utils": "0.96.1",
41
41
  "ansis": "^3.3.0",
42
42
  "chrome-launcher": "^1.1.1",
43
43
  "lighthouse": "^12.0.0",
package/src/index.d.ts CHANGED
@@ -5,4 +5,4 @@ export { lighthouseAuditRef, lighthouseGroupRef } from './lib/utils.js';
5
5
  export type { LighthouseGroupSlug, LighthouseOptions } from './lib/types.js';
6
6
  export { lighthousePlugin } from './lib/lighthouse-plugin.js';
7
7
  export default lighthousePlugin;
8
- export { mergeLighthouseCategories } from './lib/merge-categories.js';
8
+ export { lighthouseCategories, mergeLighthouseCategories, } from './lib/categories.js';
package/src/index.js CHANGED
@@ -4,5 +4,5 @@ export { DEFAULT_CHROME_FLAGS, LIGHTHOUSE_PLUGIN_SLUG, LIGHTHOUSE_OUTPUT_PATH, }
4
4
  export { lighthouseAuditRef, lighthouseGroupRef } from './lib/utils.js';
5
5
  export { lighthousePlugin } from './lib/lighthouse-plugin.js';
6
6
  export default lighthousePlugin;
7
- export { mergeLighthouseCategories } from './lib/merge-categories.js';
7
+ export { lighthouseCategories, mergeLighthouseCategories, } from './lib/categories.js';
8
8
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,eAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,eAAe,gBAAgB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC"}
@@ -17,10 +17,15 @@ import type { LighthouseGroupSlug } from './types.js';
17
17
  * const lhPlugin = await lighthousePlugin(urls);
18
18
  * const lhCoreConfig = {
19
19
  * plugins: [lhPlugin],
20
- * categories: mergeLighthouseCategories(lhPlugin),
20
+ * categories: lighthouseCategories(lhPlugin),
21
21
  * };
22
22
  */
23
- export declare function mergeLighthouseCategories(plugin: Pick<PluginConfig, 'groups' | 'context'>, categories?: CategoryConfig[]): CategoryConfig[];
23
+ export declare function lighthouseCategories(plugin: Pick<PluginConfig, 'groups' | 'context'>, categories?: CategoryConfig[]): CategoryConfig[];
24
+ /**
25
+ * @deprecated
26
+ * Helper is renamed, please use `lighthouseCategories` function instead.
27
+ */
28
+ export declare const mergeLighthouseCategories: typeof lighthouseCategories;
24
29
  /**
25
30
  * Creates a category config for a Lighthouse group, expanding it for each URL.
26
31
  * Only used when user categories are not provided.
@@ -18,10 +18,10 @@ import { isLighthouseGroupSlug } from './utils.js';
18
18
  * const lhPlugin = await lighthousePlugin(urls);
19
19
  * const lhCoreConfig = {
20
20
  * plugins: [lhPlugin],
21
- * categories: mergeLighthouseCategories(lhPlugin),
21
+ * categories: lighthouseCategories(lhPlugin),
22
22
  * };
23
23
  */
24
- export function mergeLighthouseCategories(plugin, categories) {
24
+ export function lighthouseCategories(plugin, categories) {
25
25
  if (!plugin.groups || plugin.groups.length === 0) {
26
26
  return categories ?? [];
27
27
  }
@@ -31,10 +31,12 @@ export function mergeLighthouseCategories(plugin, categories) {
31
31
  }
32
32
  return expandCategories(categories, plugin.context);
33
33
  }
34
+ /**
35
+ * @deprecated
36
+ * Helper is renamed, please use `lighthouseCategories` function instead.
37
+ */
38
+ export const mergeLighthouseCategories = lighthouseCategories;
34
39
  function createCategories(groups, context) {
35
- if (!shouldExpandForUrls(context.urlCount)) {
36
- return [];
37
- }
38
40
  return extractGroupSlugs(groups).map(slug => createAggregatedCategory(slug, context));
39
41
  }
40
42
  function expandCategories(categories, context) {
@@ -80,4 +82,4 @@ export function extractGroupSlugs(groups) {
80
82
  const slugs = groups.map(({ slug }) => removeIndex(slug));
81
83
  return [...new Set(slugs)].filter(isLighthouseGroupSlug);
82
84
  }
83
- //# sourceMappingURL=merge-categories.js.map
85
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../../src/lib/categories.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"merge-categories.js","sourceRoot":"","sources":["../../../src/lib/merge-categories.ts"],"names":[],"mappings":"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"}