lighthouse 11.7.1 → 12.0.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.
Files changed (272) hide show
  1. package/CONTRIBUTING.md +2 -2
  2. package/cli/bin.js +0 -7
  3. package/cli/cli-flags.d.ts +1 -5
  4. package/cli/cli-flags.js +4 -8
  5. package/cli/test/smokehouse/__snapshots__/report-assert-test.js.snap +14 -14
  6. package/cli/test/smokehouse/config/exclusions.js +3 -0
  7. package/cli/test/smokehouse/core-tests.js +6 -20
  8. package/cli/test/smokehouse/frontends/smokehouse-bin.js +2 -2
  9. package/core/audits/accessibility/aria-conditional-attr.d.ts +10 -0
  10. package/core/audits/accessibility/aria-conditional-attr.js +43 -0
  11. package/core/audits/accessibility/{duplicate-id-active.d.ts → aria-deprecated-role.d.ts} +3 -3
  12. package/core/audits/accessibility/aria-deprecated-role.js +43 -0
  13. package/core/audits/accessibility/aria-prohibited-attr.d.ts +10 -0
  14. package/core/audits/accessibility/aria-prohibited-attr.js +44 -0
  15. package/core/audits/accessibility/target-size.js +0 -1
  16. package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +0 -16
  17. package/core/audits/byte-efficiency/byte-efficiency-audit.js +1 -38
  18. package/core/audits/byte-efficiency/offscreen-images.d.ts +0 -11
  19. package/core/audits/byte-efficiency/offscreen-images.js +0 -15
  20. package/core/audits/byte-efficiency/render-blocking-resources.js +27 -26
  21. package/core/audits/byte-efficiency/unminified-css.js +2 -2
  22. package/core/audits/byte-efficiency/unused-css-rules.js +3 -1
  23. package/core/audits/dobetterweb/uses-http2.d.ts +0 -13
  24. package/core/audits/dobetterweb/uses-http2.js +4 -38
  25. package/core/audits/font-display.js +2 -2
  26. package/core/audits/layout-shifts.js +1 -1
  27. package/core/audits/preload-fonts.d.ts +1 -5
  28. package/core/audits/preload-fonts.js +1 -10
  29. package/core/audits/prioritize-lcp-image.js +2 -2
  30. package/core/audits/redirects-http.d.ts +19 -0
  31. package/core/audits/redirects-http.js +75 -0
  32. package/core/audits/resource-summary.d.ts +2 -0
  33. package/core/audits/resource-summary.js +5 -4
  34. package/core/audits/seo/is-crawlable.d.ts +2 -1
  35. package/core/audits/seo/link-text.js +12 -0
  36. package/core/audits/uses-rel-preload.d.ts +1 -5
  37. package/core/audits/uses-rel-preload.js +5 -15
  38. package/core/audits/work-during-interaction.d.ts +2 -2
  39. package/core/audits/work-during-interaction.js +2 -2
  40. package/core/computed/js-bundles.d.ts +1 -1
  41. package/core/computed/metrics/lantern-first-contentful-paint.d.ts +13 -82
  42. package/core/computed/metrics/lantern-first-contentful-paint.js +16 -178
  43. package/core/computed/metrics/lantern-first-meaningful-paint.d.ts +13 -12
  44. package/core/computed/metrics/lantern-first-meaningful-paint.js +11 -49
  45. package/core/computed/metrics/lantern-interactive.d.ts +13 -21
  46. package/core/computed/metrics/lantern-interactive.js +12 -84
  47. package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +13 -25
  48. package/core/computed/metrics/lantern-largest-contentful-paint.js +13 -80
  49. package/core/computed/metrics/lantern-max-potential-fid.d.ts +13 -24
  50. package/core/computed/metrics/lantern-max-potential-fid.js +12 -64
  51. package/core/computed/metrics/lantern-metric.d.ts +14 -18
  52. package/core/computed/metrics/lantern-metric.js +34 -30
  53. package/core/computed/metrics/lantern-speed-index.d.ts +13 -32
  54. package/core/computed/metrics/lantern-speed-index.js +13 -116
  55. package/core/computed/metrics/lantern-total-blocking-time.d.ts +13 -25
  56. package/core/computed/metrics/lantern-total-blocking-time.js +10 -94
  57. package/core/computed/metrics/metric.js +1 -3
  58. package/core/computed/module-duplication.d.ts +1 -1
  59. package/core/computed/navigation-insights.d.ts +36 -0
  60. package/core/computed/navigation-insights.js +35 -0
  61. package/core/computed/page-dependency-graph.js +3 -7
  62. package/core/computed/resource-summary.d.ts +10 -12
  63. package/core/computed/resource-summary.js +12 -19
  64. package/core/computed/trace-engine-result.d.ts +16 -3
  65. package/core/computed/trace-engine-result.js +19 -14
  66. package/core/computed/unused-css.d.ts +3 -1
  67. package/core/computed/unused-css.js +6 -5
  68. package/core/config/config-helpers.js +0 -4
  69. package/core/config/constants.js +0 -1
  70. package/core/config/default-config.js +63 -142
  71. package/core/config/experimental-config.js +11 -0
  72. package/core/config/filters.js +0 -1
  73. package/core/gather/driver/navigation.js +4 -1
  74. package/core/gather/driver/prepare.js +1 -1
  75. package/core/gather/driver/target-manager.js +4 -3
  76. package/core/gather/driver/wait-for-condition.js +2 -3
  77. package/core/gather/driver.d.ts +12 -0
  78. package/core/gather/driver.js +27 -0
  79. package/core/gather/gatherers/accessibility.js +4 -6
  80. package/core/gather/gatherers/css-usage.d.ts +0 -21
  81. package/core/gather/gatherers/css-usage.js +9 -119
  82. package/core/gather/gatherers/root-causes.d.ts +2 -2
  83. package/core/gather/gatherers/root-causes.js +6 -5
  84. package/core/gather/gatherers/stylesheets.d.ts +26 -0
  85. package/core/gather/gatherers/stylesheets.js +138 -0
  86. package/core/gather/gatherers/trace-elements.d.ts +2 -12
  87. package/core/gather/gatherers/trace-elements.js +2 -21
  88. package/core/gather/navigation-runner.js +3 -1
  89. package/core/gather/session.d.ts +8 -0
  90. package/core/gather/session.js +14 -1
  91. package/core/lib/emulation.js +2 -2
  92. package/core/lib/i18n/i18n.d.ts +0 -1
  93. package/core/lib/i18n/i18n.js +0 -2
  94. package/core/lib/lantern/cpu-node.d.ts +7 -1
  95. package/core/lib/lantern/cpu-node.js +12 -2
  96. package/core/lib/lantern/lantern-error.d.ts +8 -0
  97. package/core/lib/lantern/lantern-error.js +9 -0
  98. package/core/lib/lantern/metric.js +2 -6
  99. package/core/lib/lantern/metrics/first-contentful-paint.d.ts +79 -0
  100. package/core/lib/lantern/metrics/first-contentful-paint.js +200 -0
  101. package/core/lib/lantern/metrics/first-meaningful-paint.d.ts +6 -0
  102. package/core/lib/lantern/metrics/first-meaningful-paint.js +64 -0
  103. package/core/lib/lantern/metrics/interactive.d.ts +26 -0
  104. package/core/lib/lantern/metrics/interactive.js +112 -0
  105. package/core/lib/lantern/metrics/largest-contentful-paint.d.ts +19 -0
  106. package/core/lib/lantern/metrics/largest-contentful-paint.js +108 -0
  107. package/core/lib/lantern/metrics/max-potential-fid.d.ts +30 -0
  108. package/core/lib/lantern/metrics/max-potential-fid.js +92 -0
  109. package/core/lib/lantern/metrics/speed-index.d.ts +38 -0
  110. package/core/lib/lantern/metrics/speed-index.js +144 -0
  111. package/core/lib/lantern/metrics/total-blocking-time.d.ts +31 -0
  112. package/core/lib/lantern/metrics/total-blocking-time.js +128 -0
  113. package/core/lib/lantern/network-node.js +28 -4
  114. package/core/lib/lantern/page-dependency-graph.d.ts +4 -4
  115. package/core/lib/lantern/page-dependency-graph.js +19 -7
  116. package/core/lib/lantern/simulator/connection-pool.d.ts +2 -12
  117. package/core/lib/lantern/simulator/connection-pool.js +3 -22
  118. package/core/lib/lantern/simulator/network-analyzer.js +1 -12
  119. package/core/lib/lantern/simulator/simulator.d.ts +2 -4
  120. package/core/lib/lantern/simulator/simulator.js +7 -14
  121. package/core/lib/lantern/types/lantern.d.ts +5 -3
  122. package/core/lib/lantern-trace-saver.js +0 -1
  123. package/core/lib/lh-error.d.ts +9 -0
  124. package/core/lib/lh-error.js +13 -3
  125. package/core/lib/lighthouse-compatibility.js +53 -10
  126. package/core/lib/navigation-error.js +3 -0
  127. package/core/lib/network-request.d.ts +1 -0
  128. package/core/lib/network-request.js +28 -0
  129. package/core/runner.js +18 -25
  130. package/dist/report/bundle.esm.js +11 -112
  131. package/dist/report/flow.js +16 -117
  132. package/dist/report/standalone.js +12 -113
  133. package/flow-report/src/help-dialog.tsx +0 -1
  134. package/flow-report/src/i18n/i18n.d.ts +0 -4
  135. package/flow-report/src/i18n/ui-strings.d.ts +0 -1
  136. package/flow-report/src/i18n/ui-strings.js +0 -2
  137. package/flow-report/src/summary/category.tsx +10 -12
  138. package/package.json +5 -5
  139. package/readme.md +4 -4
  140. package/report/assets/styles.css +1 -60
  141. package/report/assets/templates.html +0 -95
  142. package/report/renderer/category-renderer.js +1 -1
  143. package/report/renderer/components.d.ts +2 -2
  144. package/report/renderer/components.js +2 -103
  145. package/report/renderer/dom.d.ts +1 -1
  146. package/report/renderer/dom.js +1 -1
  147. package/report/renderer/performance-category-renderer.d.ts +0 -7
  148. package/report/renderer/performance-category-renderer.js +1 -32
  149. package/report/renderer/report-renderer.js +3 -13
  150. package/report/renderer/report-ui-features.js +1 -1
  151. package/report/renderer/report-utils.d.ts +0 -1
  152. package/report/renderer/report-utils.js +13 -13
  153. package/shared/localization/locales/ar-XB.json +62 -329
  154. package/shared/localization/locales/ar.json +62 -329
  155. package/shared/localization/locales/bg.json +62 -329
  156. package/shared/localization/locales/ca.json +62 -329
  157. package/shared/localization/locales/cs.json +62 -329
  158. package/shared/localization/locales/da.json +62 -329
  159. package/shared/localization/locales/de.json +62 -329
  160. package/shared/localization/locales/el.json +62 -329
  161. package/shared/localization/locales/en-GB.json +62 -329
  162. package/shared/localization/locales/en-US.json +41 -272
  163. package/shared/localization/locales/en-XA.json +62 -329
  164. package/shared/localization/locales/en-XL.json +41 -272
  165. package/shared/localization/locales/es-419.json +62 -329
  166. package/shared/localization/locales/es.json +62 -329
  167. package/shared/localization/locales/fi.json +62 -329
  168. package/shared/localization/locales/fil.json +61 -328
  169. package/shared/localization/locales/fr.json +62 -329
  170. package/shared/localization/locales/he.json +62 -329
  171. package/shared/localization/locales/hi.json +62 -329
  172. package/shared/localization/locales/hr.json +63 -330
  173. package/shared/localization/locales/hu.json +62 -329
  174. package/shared/localization/locales/id.json +62 -329
  175. package/shared/localization/locales/it.json +62 -329
  176. package/shared/localization/locales/ja.json +62 -329
  177. package/shared/localization/locales/ko.json +62 -329
  178. package/shared/localization/locales/lt.json +62 -329
  179. package/shared/localization/locales/lv.json +62 -329
  180. package/shared/localization/locales/nl.json +62 -329
  181. package/shared/localization/locales/no.json +62 -329
  182. package/shared/localization/locales/pl.json +61 -328
  183. package/shared/localization/locales/pt-PT.json +62 -329
  184. package/shared/localization/locales/pt.json +64 -331
  185. package/shared/localization/locales/ro.json +62 -329
  186. package/shared/localization/locales/ru.json +62 -329
  187. package/shared/localization/locales/sk.json +62 -329
  188. package/shared/localization/locales/sl.json +62 -329
  189. package/shared/localization/locales/sr-Latn.json +62 -329
  190. package/shared/localization/locales/sr.json +62 -329
  191. package/shared/localization/locales/sv.json +62 -329
  192. package/shared/localization/locales/ta.json +61 -328
  193. package/shared/localization/locales/te.json +62 -329
  194. package/shared/localization/locales/th.json +62 -329
  195. package/shared/localization/locales/tr.json +62 -329
  196. package/shared/localization/locales/uk.json +62 -329
  197. package/shared/localization/locales/vi.json +61 -328
  198. package/shared/localization/locales/zh-HK.json +62 -329
  199. package/shared/localization/locales/zh-TW.json +61 -328
  200. package/shared/localization/locales/zh.json +62 -329
  201. package/tsconfig.json +1 -3
  202. package/types/artifacts.d.ts +21 -110
  203. package/types/audit.d.ts +0 -10
  204. package/types/config.d.ts +0 -1
  205. package/types/externs.d.ts +0 -2
  206. package/types/gatherer.d.ts +3 -0
  207. package/types/internal/smokehouse.d.ts +1 -1
  208. package/types/lh.d.ts +0 -2
  209. package/types/lhr/audit-details.d.ts +9 -4
  210. package/types/lhr/lhr.d.ts +0 -4
  211. package/types/lhr/settings.d.ts +0 -4
  212. package/core/audits/accessibility/duplicate-id-active.js +0 -42
  213. package/core/audits/content-width.d.ts +0 -17
  214. package/core/audits/content-width.js +0 -76
  215. package/core/audits/installable-manifest.d.ts +0 -111
  216. package/core/audits/installable-manifest.js +0 -248
  217. package/core/audits/layout-shift-elements.d.ts +0 -16
  218. package/core/audits/layout-shift-elements.js +0 -101
  219. package/core/audits/manual/pwa-cross-browser.d.ts +0 -12
  220. package/core/audits/manual/pwa-cross-browser.js +0 -40
  221. package/core/audits/manual/pwa-each-page-has-url.d.ts +0 -12
  222. package/core/audits/manual/pwa-each-page-has-url.js +0 -38
  223. package/core/audits/manual/pwa-page-transitions.d.ts +0 -12
  224. package/core/audits/manual/pwa-page-transitions.js +0 -38
  225. package/core/audits/maskable-icon.d.ts +0 -25
  226. package/core/audits/maskable-icon.js +0 -70
  227. package/core/audits/multi-check-audit.d.ts +0 -28
  228. package/core/audits/multi-check-audit.js +0 -82
  229. package/core/audits/no-unload-listeners.d.ts +0 -16
  230. package/core/audits/no-unload-listeners.js +0 -86
  231. package/core/audits/performance-budget.d.ts +0 -39
  232. package/core/audits/performance-budget.js +0 -154
  233. package/core/audits/script-elements-test-audit.d.ts +0 -14
  234. package/core/audits/script-elements-test-audit.js +0 -29
  235. package/core/audits/seo/plugins.d.ts +0 -15
  236. package/core/audits/seo/plugins.js +0 -150
  237. package/core/audits/seo/tap-targets.d.ts +0 -50
  238. package/core/audits/seo/tap-targets.js +0 -352
  239. package/core/audits/splash-screen.d.ts +0 -37
  240. package/core/audits/splash-screen.js +0 -98
  241. package/core/audits/themed-omnibox.d.ts +0 -42
  242. package/core/audits/themed-omnibox.js +0 -102
  243. package/core/audits/timing-budget.d.ts +0 -43
  244. package/core/audits/timing-budget.js +0 -175
  245. package/core/computed/manifest-values.d.ts +0 -24
  246. package/core/computed/manifest-values.js +0 -136
  247. package/core/config/budget.d.ts +0 -74
  248. package/core/config/budget.js +0 -340
  249. package/core/config/metrics-to-audits.d.ts +0 -19
  250. package/core/config/metrics-to-audits.js +0 -62
  251. package/core/gather/driver/service-workers.d.ts +0 -16
  252. package/core/gather/driver/service-workers.js +0 -52
  253. package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.d.ts +0 -47
  254. package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.js +0 -233
  255. package/core/gather/gatherers/global-listeners.d.ts +0 -27
  256. package/core/gather/gatherers/global-listeners.js +0 -108
  257. package/core/gather/gatherers/installability-errors.d.ts +0 -17
  258. package/core/gather/gatherers/installability-errors.js +0 -56
  259. package/core/gather/gatherers/script-elements.d.ts +0 -21
  260. package/core/gather/gatherers/script-elements.js +0 -100
  261. package/core/gather/gatherers/seo/embedded-content.d.ts +0 -10
  262. package/core/gather/gatherers/seo/embedded-content.js +0 -63
  263. package/core/gather/gatherers/seo/tap-targets.d.ts +0 -21
  264. package/core/gather/gatherers/seo/tap-targets.js +0 -389
  265. package/core/gather/gatherers/service-worker.d.ts +0 -10
  266. package/core/gather/gatherers/service-worker.js +0 -32
  267. package/core/gather/gatherers/web-app-manifest.d.ts +0 -32
  268. package/core/gather/gatherers/web-app-manifest.js +0 -106
  269. package/report/renderer/pwa-category-renderer.d.ts +0 -55
  270. package/report/renderer/pwa-category-renderer.js +0 -184
  271. package/third-party/chromium-synchronization/installability-errors-test.js +0 -79
  272. package/types/lhr/budget.d.ts +0 -60
@@ -84,7 +84,6 @@ export const HelpDialog: FunctionComponent<{onClose: () => void}> = ({
84
84
  strings.categoryAccessibility,
85
85
  strings.categoryBestPractices,
86
86
  strings.categorySeo,
87
- strings.categoryProgressiveWebApp,
88
87
  ]}
89
88
  />
90
89
  <HelpDialogColumn
@@ -25,7 +25,6 @@ declare function useI18n(): {
25
25
  categoryAccessibility: string;
26
26
  categoryBestPractices: string;
27
27
  categorySeo: string;
28
- categoryProgressiveWebApp: string;
29
28
  desktop: string;
30
29
  mobile: string;
31
30
  ratingPass: string;
@@ -110,7 +109,6 @@ declare function useI18n(): {
110
109
  firstPartyChipLabel: string;
111
110
  openInANewTabTooltip: string;
112
111
  unattributable: string;
113
- pwaRemovalMessage: string;
114
112
  };
115
113
  };
116
114
  declare function useLocalizedStrings(): {
@@ -131,7 +129,6 @@ declare function useLocalizedStrings(): {
131
129
  categoryAccessibility: string;
132
130
  categoryBestPractices: string;
133
131
  categorySeo: string;
134
- categoryProgressiveWebApp: string;
135
132
  desktop: string;
136
133
  mobile: string;
137
134
  ratingPass: string;
@@ -216,7 +213,6 @@ declare function useLocalizedStrings(): {
216
213
  firstPartyChipLabel: string;
217
214
  openInANewTabTooltip: string;
218
215
  unattributable: string;
219
- pwaRemovalMessage: string;
220
216
  };
221
217
  declare function useStringFormatter(): (str: string, values?: Record<string, string | number>) => string;
222
218
  declare const I18nProvider: FunctionComponent;
@@ -16,7 +16,6 @@ export namespace UIStrings {
16
16
  const categoryAccessibility: string;
17
17
  const categoryBestPractices: string;
18
18
  const categorySeo: string;
19
- const categoryProgressiveWebApp: string;
20
19
  const desktop: string;
21
20
  const mobile: string;
22
21
  const ratingPass: string;
@@ -43,8 +43,6 @@ export const UIStrings = {
43
43
  categoryBestPractices: 'Best Practices',
44
44
  /** Title of the Search Engine Optimization (SEO) category of audits. This is displayed at the top of a list of audits focused on topics related to optimizing a website for indexing by search engines. Also used as a label of a score gauge; try to limit to 20 characters. */
45
45
  categorySeo: 'SEO',
46
- /** Title of the Progressive Web Application (PWA) category of audits. This is displayed at the top of a list of audits focused on topics related to whether or not a site is a progressive web app, e.g. responds offline, uses a service worker, is on https, etc. Also used as a label of a score gauge. */
47
- categoryProgressiveWebApp: 'Progressive Web App',
48
46
  /** Label for a report evaluating a web page. Label indicates that the report refers to the desktop version of the site. */
49
47
  desktop: 'Desktop',
50
48
  /** Label for a report evaluating a web page. Label indicates that the report refers to the mobile version of the site. */
@@ -39,13 +39,6 @@ function getScoreToBeGained(audit: ScoredAuditRef): number {
39
39
  return audit.weight * (1 - audit.result.score);
40
40
  }
41
41
 
42
- function getOverallSavings(audit: LH.ReportResult.AuditRef): number {
43
- return (
44
- audit.result.details &&
45
- audit.result.details.overallSavingsMs
46
- ) || 0;
47
- }
48
-
49
42
  const SummaryTooltipAudit: FunctionComponent<{audit: LH.ReportResult.AuditRef}> = ({audit}) => {
50
43
  const rating = ReportUtils.calculateRating(audit.result.score, audit.result.scoreDisplayMode);
51
44
  return (
@@ -63,10 +56,10 @@ const SummaryTooltipAudits: FunctionComponent<{category: LH.ReportResult.Categor
63
56
  return audit.result.score !== null &&
64
57
  // Metrics should not be displayed in this group.
65
58
  audit.group !== 'metrics' &&
66
- // Audits in performance group "hidden" should not be counted.
67
- (audit.group !== 'hidden' || category.id !== 'performance') &&
68
- // We don't want unweighted audits except for opportunities with potential savings.
69
- (audit.weight > 0 || getOverallSavings(audit) > 0) &&
59
+ // Audits in group "hidden" should not be counted.
60
+ audit.group !== 'hidden' &&
61
+ // We don't want unweighted audits except for performance diagnostics.
62
+ (audit.weight > 0 || audit.group === 'diagnostics') &&
70
63
  // Passing audits should never be high impact.
71
64
  !ReportUtils.showAsPassed(audit.result);
72
65
  }
@@ -79,7 +72,12 @@ const SummaryTooltipAudits: FunctionComponent<{category: LH.ReportResult.Categor
79
72
  const remainingScoreA = getScoreToBeGained(a);
80
73
  const remainingScoreB = getScoreToBeGained(b);
81
74
  if (remainingScoreA !== remainingScoreB) return remainingScoreB - remainingScoreA;
82
- return getOverallSavings(b) - getOverallSavings(a);
75
+ if (a.result.score !== b.result.score) return a.result.score - b.result.score;
76
+
77
+ // TODO: Sort using overall impact from metric savings, not just LCP
78
+ const aLcpSavings = a.result.metricSavings?.LCP || 0;
79
+ const bLcpSavings = b.result.metricSavings?.LCP || 0;
80
+ return bLcpSavings - aLcpSavings;
83
81
  })
84
82
  .splice(0, MAX_TOOLTIP_AUDITS);
85
83
  if (!audits.length) return null;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lighthouse",
3
3
  "type": "module",
4
- "version": "11.7.1",
4
+ "version": "12.0.0",
5
5
  "description": "Automated auditing, performance metrics, and best practices for the web.",
6
6
  "main": "./core/index.js",
7
7
  "bin": {
@@ -165,7 +165,7 @@
165
165
  "pako": "^2.0.3",
166
166
  "preact": "^10.7.2",
167
167
  "pretty-json-stringify": "^0.0.2",
168
- "puppeteer": "^22.5.0",
168
+ "puppeteer": "^22.6.5",
169
169
  "resolve": "^1.22.1",
170
170
  "rollup": "^2.52.7",
171
171
  "rollup-plugin-polyfill-node": "^0.12.0",
@@ -199,12 +199,12 @@
199
199
  "open": "^8.4.0",
200
200
  "parse-cache-control": "1.0.1",
201
201
  "ps-list": "^8.0.0",
202
- "puppeteer-core": "^22.5.0",
202
+ "puppeteer-core": "^22.6.5",
203
203
  "robots-parser": "^3.0.1",
204
204
  "semver": "^5.3.0",
205
205
  "speedline-core": "^1.4.3",
206
- "third-party-web": "^0.24.1",
207
- "tldts-icann": "^6.1.0",
206
+ "third-party-web": "^0.24.2",
207
+ "tldts-icann": "^6.1.16",
208
208
  "ws": "^7.0.0",
209
209
  "yargs": "^17.3.1",
210
210
  "yargs-parser": "^21.0.0"
package/readme.md CHANGED
@@ -103,9 +103,8 @@ Configuration:
103
103
  --gather-mode, -G Collect artifacts from a connected browser and save to disk. (Artifacts folder path may optionally be provided). If audit-mode is not also enabled, the run will quit early.
104
104
  --audit-mode, -A Process saved artifacts from disk. (Artifacts folder path may be provided, otherwise defaults to ./latest-run/)
105
105
  --only-audits Only run the specified audits [array]
106
- --only-categories Only run the specified categories. Available categories: accessibility, best-practices, performance, pwa, seo [array]
106
+ --only-categories Only run the specified categories. Available categories: accessibility, best-practices, performance, seo [array]
107
107
  --skip-audits Run everything except these audits [array]
108
- --budget-path The path to the budget.json file for LightWallet. [string]
109
108
  --disable-full-page-screenshot Disables collection of the full page screenshot, which can be quite large [boolean]
110
109
 
111
110
  Output:
@@ -148,7 +147,7 @@ Examples:
148
147
  lighthouse <url> --quiet --chrome-flags="--headless" Launch Headless Chrome, turn off logging
149
148
  lighthouse <url> --extra-headers "{\"Cookie\":\"monster=blue\", \"x-men\":\"wolverine\"}" Stringify'd JSON HTTP Header key/value pairs to send in requests
150
149
  lighthouse <url> --extra-headers=./path/to/file.json Path to JSON file of HTTP Header key/value pairs to send in requests
151
- lighthouse <url> --only-categories=performance,pwa Only run the specified categories. Available categories: accessibility, best-practices, performance, pwa, seo
150
+ lighthouse <url> --only-categories=performance,seo Only run the specified categories. Available categories: accessibility, best-practices, performance, seo
152
151
 
153
152
  For more information on Lighthouse, see https://developers.google.com/web/tools/lighthouse/.
154
153
  ```
@@ -242,7 +241,6 @@ Useful documentation, examples, and recipes to get you started.
242
241
  - [Developing Plugins](./docs/plugins.md)
243
242
  - [Making a New Audit](./docs/new-audits.md)
244
243
  - [Testing on a mobile device](./docs/readme.md#testing-on-a-mobile-device)
245
- - [Setting a performance budget](./docs/performance-budgets.md)
246
244
  - [Lighthouse Architecture](./docs/architecture.md)
247
245
 
248
246
  **Recipes**
@@ -364,6 +362,8 @@ This section details services that have integrated Lighthouse data. If you're wo
364
362
 
365
363
  * **[Lighthouse Metrics China](http://lighthousemetricschina.com)** - The first Lighthouse metrics tool specifically designed for China. Experience unparalleled website monitoring capabilities with Lighthouse. Gain insights into the fluctuations of your scores and metrics within the realm of the [Great Firewall of China](https://www.chinafirewalltest.co), enabling a comprehensive understanding of the factors influencing each change. Lighthouse Metrics China offers both free and paid plans.
366
364
 
365
+ * **[DeploymentHawk](https://deploymenthawk.com)** - DeploymentHawk is an automated site auditing tool powered by Lighthouse. Effortlessly catch performance, accessibility, and SEO issues before they impact your users. DeploymentHawk is a paid product with a free 7-day trial.
366
+
367
367
  ## Lighthouse Integrations in non-Web Perf services
368
368
 
369
369
  * **[PageWatch](https://pagewatch.dev/)** — PageWatch is a tool to find problem pages on your website. It provides insights into spelling errors, layout issues, slow pages (powered by Lighthouse) and more. PageWatch is offered via free and paid plans.
@@ -103,8 +103,6 @@
103
103
  --plugin-badge-size-big: calc(var(--gauge-circle-size-big) / 2.7);
104
104
  --plugin-badge-size: calc(var(--gauge-circle-size) / 2.7);
105
105
  --plugin-icon-size: 65%;
106
- --pwa-icon-margin: 0 var(--default-padding);
107
- --pwa-icon-size: var(--topbar-logo-size);
108
106
  --report-background-color: #fff;
109
107
  --report-border-color-secondary: #ebebeb;
110
108
  --report-font-family-monospace: 'Roboto Mono', 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console', monospace;
@@ -157,15 +155,6 @@
157
155
  --fail-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><title>warn</title><path fill="%23C7221F" d="M2 42h44L24 4 2 42zm24-6h-4v-4h4v4zm0-8h-4v-8h4v8z"/></svg>');
158
156
  --error-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3 15"><title>error</title><path d="M0 15H 3V 12H 0V" fill="%23FF4E42"/><path d="M0 9H 3V 0H 0V" fill="%23FF4E42"/></svg>');
159
157
 
160
- --pwa-installable-gray-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="nonzero"><circle fill="%23DAE0E3" cx="12" cy="12" r="12"/><path d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm3.5 7.7h-2.8v2.8h-1.4v-2.8H8.5v-1.4h2.8V8.5h1.4v2.8h2.8v1.4z" fill="%23FFF"/></g></svg>');
161
- --pwa-optimized-gray-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><rect fill="%23DAE0E3" width="24" height="24" rx="12"/><path fill="%23FFF" d="M12 15.07l3.6 2.18-.95-4.1 3.18-2.76-4.2-.36L12 6.17l-1.64 3.86-4.2.36 3.2 2.76-.96 4.1z"/><path d="M5 5h14v14H5z"/></g></svg>');
162
-
163
- --pwa-installable-gray-url-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="nonzero"><circle fill="%23424242" cx="12" cy="12" r="12"/><path d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm3.5 7.7h-2.8v2.8h-1.4v-2.8H8.5v-1.4h2.8V8.5h1.4v2.8h2.8v1.4z" fill="%23FFF"/></g></svg>');
164
- --pwa-optimized-gray-url-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><rect fill="%23424242" width="24" height="24" rx="12"/><path fill="%23FFF" d="M12 15.07l3.6 2.18-.95-4.1 3.18-2.76-4.2-.36L12 6.17l-1.64 3.86-4.2.36 3.2 2.76-.96 4.1z"/><path d="M5 5h14v14H5z"/></g></svg>');
165
-
166
- --pwa-installable-color-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><circle fill="%230CCE6B" cx="12" cy="12" r="12"/><path d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm3.5 7.7h-2.8v2.8h-1.4v-2.8H8.5v-1.4h2.8V8.5h1.4v2.8h2.8v1.4z" fill="%23FFF"/></g></svg>');
167
- --pwa-optimized-color-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><rect fill="%230CCE6B" width="24" height="24" rx="12"/><path d="M5 5h14v14H5z"/><path fill="%23FFF" d="M12 15.07l3.6 2.18-.95-4.1 3.18-2.76-4.2-.36L12 6.17l-1.64 3.86-4.2.36 3.2 2.76-.96 4.1z"/></g></svg>');
168
-
169
158
  --swap-locale-icon-url: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"/></svg>');
170
159
  }
171
160
 
@@ -207,8 +196,6 @@
207
196
 
208
197
  /* SVGs */
209
198
  --plugin-icon-url: var(--plugin-icon-url-dark);
210
- --pwa-installable-gray-url: var(--pwa-installable-gray-url-dark);
211
- --pwa-optimized-gray-url: var(--pwa-optimized-gray-url-dark);
212
199
  }
213
200
  }
214
201
 
@@ -229,7 +216,6 @@
229
216
  --header-padding: 16px 0 16px 0;
230
217
  --image-preview-size: 24px;
231
218
  --plugin-icon-size: 75%;
232
- --pwa-icon-margin: 0 7px 0 -3px;
233
219
  --report-font-size: 14px;
234
220
  --report-line-height: 20px;
235
221
  --score-icon-margin-left: 2px;
@@ -261,7 +247,6 @@
261
247
  --header-padding: 16px 0 16px 0;
262
248
  --screenshot-overlay-background: transparent;
263
249
  --plugin-icon-size: 75%;
264
- --pwa-icon-margin: 0 7px 0 -3px;
265
250
  --report-font-family-monospace: 'Menlo', 'dejavu sans mono', 'Consolas', 'Lucida Console', monospace;
266
251
  --report-font-family: '.SFNSDisplay-Regular', 'Helvetica Neue', 'Lucida Grande', sans-serif;
267
252
  --report-font-size: 12px;
@@ -931,48 +916,6 @@
931
916
  margin-bottom: calc(var(--audit-group-margin-bottom) / 2);
932
917
  }
933
918
 
934
- .lh-audit-group__header::before {
935
- /* By default, groups don't get an icon */
936
- content: none;
937
- width: var(--pwa-icon-size);
938
- height: var(--pwa-icon-size);
939
- margin: var(--pwa-icon-margin);
940
- display: inline-block;
941
- vertical-align: middle;
942
- }
943
-
944
- /* Style the "over budget" columns red. */
945
- .lh-audit-group--budgets #performance-budget tbody tr td:nth-child(4),
946
- .lh-audit-group--budgets #performance-budget tbody tr td:nth-child(5),
947
- .lh-audit-group--budgets #timing-budget tbody tr td:nth-child(3) {
948
- color: var(--color-red-700);
949
- }
950
-
951
- /* Align the "over budget request count" text to be close to the "over budget bytes" column. */
952
- .lh-audit-group--budgets .lh-table tbody tr td:nth-child(4){
953
- text-align: right;
954
- }
955
-
956
- .lh-audit-group--budgets .lh-details--budget {
957
- width: 100%;
958
- margin: 0 0 var(--default-padding);
959
- }
960
-
961
- .lh-audit-group--pwa-installable .lh-audit-group__header::before {
962
- content: '';
963
- background-image: var(--pwa-installable-gray-url);
964
- }
965
- .lh-audit-group--pwa-optimized .lh-audit-group__header::before {
966
- content: '';
967
- background-image: var(--pwa-optimized-gray-url);
968
- }
969
- .lh-audit-group--pwa-installable.lh-badged .lh-audit-group__header::before {
970
- background-image: var(--pwa-installable-color-url);
971
- }
972
- .lh-audit-group--pwa-optimized.lh-badged .lh-audit-group__header::before {
973
- background-image: var(--pwa-optimized-color-url);
974
- }
975
-
976
919
  .lh-audit-group--metrics .lh-audit-group__summary {
977
920
  margin-top: 0;
978
921
  margin-bottom: 0;
@@ -1323,10 +1266,8 @@
1323
1266
 
1324
1267
  .lh-scores-header .lh-gauge__wrapper,
1325
1268
  .lh-scores-header .lh-fraction__wrapper,
1326
- .lh-scores-header .lh-gauge--pwa__wrapper,
1327
1269
  .lh-sticky-header .lh-gauge__wrapper,
1328
- .lh-sticky-header .lh-fraction__wrapper,
1329
- .lh-sticky-header .lh-gauge--pwa__wrapper {
1270
+ .lh-sticky-header .lh-fraction__wrapper {
1330
1271
  width: var(--gauge-wrapper-width);
1331
1272
  }
1332
1273
 
@@ -514,101 +514,6 @@ SPDX-License-Identifier: Apache-2.0
514
514
  </a>
515
515
  </template>
516
516
 
517
-
518
- <!-- Lighthouse PWA badge gauge -->
519
- <template id="gaugePwa">
520
- <style>
521
- .lh-gauge--pwa .lh-gauge--pwa__component {
522
- display: none;
523
- }
524
- .lh-gauge--pwa__wrapper:not(.lh-badged--all) .lh-gauge--pwa__logo > path {
525
- /* Gray logo unless everything is passing. */
526
- fill: #B0B0B0;
527
- }
528
-
529
- .lh-gauge--pwa__disc {
530
- fill: var(--color-gray-200);
531
- }
532
-
533
- .lh-gauge--pwa__logo--primary-color {
534
- fill: #304FFE;
535
- }
536
-
537
- .lh-gauge--pwa__logo--secondary-color {
538
- fill: #3D3D3D;
539
- }
540
- .lh-dark .lh-gauge--pwa__logo--secondary-color {
541
- fill: #D8B6B6;
542
- }
543
-
544
- /* No passing groups. */
545
- .lh-gauge--pwa__wrapper:not([class*='lh-badged--']) .lh-gauge--pwa__na-line {
546
- display: inline;
547
- }
548
- /* Just optimized. Same n/a line as no passing groups. */
549
- .lh-gauge--pwa__wrapper.lh-badged--pwa-optimized:not(.lh-badged--pwa-installable) .lh-gauge--pwa__na-line {
550
- display: inline;
551
- }
552
-
553
- /* Just installable. */
554
- .lh-gauge--pwa__wrapper.lh-badged--pwa-installable .lh-gauge--pwa__installable-badge {
555
- display: inline;
556
- }
557
-
558
- /* All passing groups. */
559
- .lh-gauge--pwa__wrapper.lh-badged--all .lh-gauge--pwa__check-circle {
560
- display: inline;
561
- }
562
- </style>
563
-
564
- <a class="lh-gauge__wrapper lh-gauge--pwa__wrapper">
565
- <svg viewBox="0 0 60 60" class="lh-gauge lh-gauge--pwa">
566
- <defs>
567
- <linearGradient id="lh-gauge--pwa__check-circle__gradient" x1="50%" y1="0%" x2="50%" y2="100%">
568
- <stop stop-color="#00C852" offset="0%"></stop>
569
- <stop stop-color="#009688" offset="100%"></stop>
570
- </linearGradient>
571
- <linearGradient id="lh-gauge--pwa__installable__shadow-gradient" x1="76.056%" x2="24.111%" y1="82.995%" y2="24.735%">
572
- <stop stop-color="#A5D6A7" offset="0%"></stop>
573
- <stop stop-color="#80CBC4" offset="100%"></stop>
574
- </linearGradient>
575
-
576
- <g id="lh-gauge--pwa__installable-badge">
577
- <circle fill="#FFFFFF" cx="10" cy="10" r="10"></circle>
578
- <path fill="#009688" d="M10 4.167A5.835 5.835 0 0 0 4.167 10 5.835 5.835 0 0 0 10 15.833 5.835 5.835 0 0 0 15.833 10 5.835 5.835 0 0 0 10 4.167zm2.917 6.416h-2.334v2.334H9.417v-2.334H7.083V9.417h2.334V7.083h1.166v2.334h2.334v1.166z"/>
579
- </g>
580
- </defs>
581
-
582
- <g stroke="none" fill-rule="nonzero">
583
- <!-- Background and PWA logo (color by default) -->
584
- <circle class="lh-gauge--pwa__disc" cx="30" cy="30" r="30"></circle>
585
- <g class="lh-gauge--pwa__logo">
586
- <path class="lh-gauge--pwa__logo--secondary-color" d="M35.66 19.39l.7-1.75h2L37.4 15 38.6 12l3.4 9h-2.51l-.58-1.61z"/>
587
- <path class="lh-gauge--pwa__logo--primary-color" d="M33.52 21l3.65-9h-2.42l-2.5 5.82L30.5 12h-1.86l-1.9 5.82-1.35-2.65-1.21 3.72L25.4 21h2.38l1.72-5.2 1.64 5.2z"/>
588
- <path class="lh-gauge--pwa__logo--secondary-color" fill-rule="nonzero" d="M20.3 17.91h1.48c.45 0 .85-.05 1.2-.15l.39-1.18 1.07-3.3a2.64 2.64 0 0 0-.28-.37c-.55-.6-1.36-.91-2.42-.91H18v9h2.3V17.9zm1.96-3.84c.22.22.33.5.33.87 0 .36-.1.65-.29.87-.2.23-.59.35-1.15.35h-.86v-2.41h.87c.52 0 .89.1 1.1.32z"/>
589
- </g>
590
-
591
- <!-- No badges. -->
592
- <rect class="lh-gauge--pwa__component lh-gauge--pwa__na-line" fill="#FFFFFF" x="20" y="32" width="20" height="4" rx="2"></rect>
593
-
594
- <!-- Just installable. -->
595
- <g class="lh-gauge--pwa__component lh-gauge--pwa__installable-badge" transform="translate(20, 29)">
596
- <path fill="url(#lh-gauge--pwa__installable__shadow-gradient)" d="M33.629 19.487c-4.272 5.453-10.391 9.39-17.415 10.869L3 17.142 17.142 3 33.63 19.487z"/>
597
- <use href="#lh-gauge--pwa__installable-badge" />
598
- </g>
599
-
600
- <!-- Full PWA. -->
601
- <g class="lh-gauge--pwa__component lh-gauge--pwa__check-circle" transform="translate(18, 28)">
602
- <circle fill="#FFFFFF" cx="12" cy="12" r="12"></circle>
603
- <path fill="url(#lh-gauge--pwa__check-circle__gradient)" d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path>
604
- </g>
605
- </g>
606
- </svg>
607
-
608
- <div class="lh-gauge__label"></div>
609
- </a>
610
- </template>
611
-
612
517
  <!-- Lighthouse crtiical request chains component -->
613
518
  <template id="crc">
614
519
  <div class="lh-crc-container">
@@ -239,7 +239,6 @@ export class CategoryRenderer {
239
239
 
240
240
  for (const auditRef of auditRefs) {
241
241
  const groupId = auditRef.group || notAGroup;
242
- if (groupId === 'hidden') continue;
243
242
  const groupAuditRefs = grouped.get(groupId) || [];
244
243
  groupAuditRefs.push(auditRef);
245
244
  grouped.set(groupId, groupAuditRefs);
@@ -531,6 +530,7 @@ export class CategoryRenderer {
531
530
 
532
531
  // Sort audits into clumps.
533
532
  for (const auditRef of category.auditRefs) {
533
+ if (auditRef.group === 'hidden') continue;
534
534
  const clumpId = this._getClumpIdForAuditRef(auditRef);
535
535
  const clump = /** @type {Array<LH.ReportResult.AuditRef>} */ (clumps.get(clumpId)); // already defined
536
536
  clump.push(auditRef);
@@ -1,4 +1,4 @@
1
- /** @typedef {'3pFilter'|'audit'|'categoryHeader'|'chevron'|'clump'|'crc'|'crcChain'|'elementScreenshot'|'explodeyGauge'|'footer'|'fraction'|'gauge'|'gaugePwa'|'heading'|'metric'|'scorescale'|'scoresWrapper'|'snippet'|'snippetContent'|'snippetHeader'|'snippetLine'|'styles'|'topbar'|'warningsToplevel'} ComponentName */
1
+ /** @typedef {'3pFilter'|'audit'|'categoryHeader'|'chevron'|'clump'|'crc'|'crcChain'|'elementScreenshot'|'explodeyGauge'|'footer'|'fraction'|'gauge'|'heading'|'metric'|'scorescale'|'scoresWrapper'|'snippet'|'snippetContent'|'snippetHeader'|'snippetLine'|'styles'|'topbar'|'warningsToplevel'} ComponentName */
2
2
  /**
3
3
  * @param {DOM} dom
4
4
  * @param {ComponentName} componentName
@@ -6,5 +6,5 @@
6
6
  */
7
7
  export function createComponent(dom: DOM, componentName: ComponentName): DocumentFragment;
8
8
  export type DOM = import('./dom.js').DOM;
9
- export type ComponentName = '3pFilter' | 'audit' | 'categoryHeader' | 'chevron' | 'clump' | 'crc' | 'crcChain' | 'elementScreenshot' | 'explodeyGauge' | 'footer' | 'fraction' | 'gauge' | 'gaugePwa' | 'heading' | 'metric' | 'scorescale' | 'scoresWrapper' | 'snippet' | 'snippetContent' | 'snippetHeader' | 'snippetLine' | 'styles' | 'topbar' | 'warningsToplevel';
9
+ export type ComponentName = '3pFilter' | 'audit' | 'categoryHeader' | 'chevron' | 'clump' | 'crc' | 'crcChain' | 'elementScreenshot' | 'explodeyGauge' | 'footer' | 'fraction' | 'gauge' | 'heading' | 'metric' | 'scorescale' | 'scoresWrapper' | 'snippet' | 'snippetContent' | 'snippetHeader' | 'snippetLine' | 'styles' | 'topbar' | 'warningsToplevel';
10
10
  //# sourceMappingURL=components.d.ts.map