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
@@ -1,91 +1,26 @@
1
1
  /**
2
2
  * @license
3
- * Copyright 2019 Google LLC
3
+ * Copyright 2018 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
7
  import {makeComputedArtifact} from '../computed-artifact.js';
8
- import {LanternMetric} from './lantern-metric.js';
9
- import {LighthouseError} from '../../lib/lh-error.js';
8
+ import {LargestContentfulPaint} from '../../lib/lantern/metrics/largest-contentful-paint.js';
9
+ import {getComputationDataParams, lanternErrorAdapter} from './lantern-metric.js';
10
10
  import {LanternFirstContentfulPaint} from './lantern-first-contentful-paint.js';
11
11
 
12
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
12
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
13
13
 
14
- class LanternLargestContentfulPaint extends LanternMetric {
14
+ class LanternLargestContentfulPaint extends LargestContentfulPaint {
15
15
  /**
16
- * @return {LH.Gatherer.Simulation.MetricCoefficients}
17
- */
18
- static get COEFFICIENTS() {
19
- return {
20
- intercept: 0,
21
- optimistic: 0.5,
22
- pessimistic: 0.5,
23
- };
24
- }
25
-
26
- /**
27
- * Low priority image nodes are usually offscreen and very unlikely to be the
28
- * resource that is required for LCP. Our LCP graphs include everything except for these images.
29
- *
30
- * @param {Node} node
31
- * @return {boolean}
32
- */
33
- static isNotLowPriorityImageNode(node) {
34
- if (node.type !== 'network') return true;
35
- const isImage = node.record.resourceType === 'Image';
36
- const isLowPriority = node.record.priority === 'Low' || node.record.priority === 'VeryLow';
37
- return !isImage || !isLowPriority;
38
- }
39
-
40
- /**
41
- * @param {Node} dependencyGraph
42
- * @param {LH.Artifacts.ProcessedNavigation} processedNavigation
43
- * @return {Node}
44
- */
45
- static getOptimisticGraph(dependencyGraph, processedNavigation) {
46
- const lcp = processedNavigation.timestamps.largestContentfulPaint;
47
- if (!lcp) {
48
- throw new LighthouseError(LighthouseError.errors.NO_LCP);
49
- }
50
-
51
- return LanternFirstContentfulPaint.getFirstPaintBasedGraph(dependencyGraph, {
52
- cutoffTimestamp: lcp,
53
- treatNodeAsRenderBlocking: LanternLargestContentfulPaint.isNotLowPriorityImageNode,
54
- });
55
- }
56
-
57
- /**
58
- * @param {Node} dependencyGraph
59
- * @param {LH.Artifacts.ProcessedNavigation} processedNavigation
60
- * @return {Node}
61
- */
62
- static getPessimisticGraph(dependencyGraph, processedNavigation) {
63
- const lcp = processedNavigation.timestamps.largestContentfulPaint;
64
- if (!lcp) {
65
- throw new LighthouseError(LighthouseError.errors.NO_LCP);
66
- }
67
-
68
- return LanternFirstContentfulPaint.getFirstPaintBasedGraph(dependencyGraph, {
69
- cutoffTimestamp: lcp,
70
- treatNodeAsRenderBlocking: _ => true,
71
- // For pessimistic LCP we'll include *all* layout nodes
72
- additionalCpuNodesToTreatAsRenderBlocking: node => node.didPerformLayout(),
73
- });
74
- }
75
-
76
- /**
77
- * @param {LH.Gatherer.Simulation.Result} simulationResult
78
- * @return {LH.Gatherer.Simulation.Result}
16
+ * @param {LH.Artifacts.MetricComputationDataInput} data
17
+ * @param {LH.Artifacts.ComputedContext} context
18
+ * @param {Omit<Extras, 'optimistic'>=} extras
19
+ * @return {Promise<LH.Artifacts.LanternMetric>}
79
20
  */
80
- static getEstimateFromSimulation(simulationResult) {
81
- const nodeTimesNotOffscreenImages = Array.from(simulationResult.nodeTimings.entries())
82
- .filter(entry => LanternLargestContentfulPaint.isNotLowPriorityImageNode(entry[0]))
83
- .map(entry => entry[1].endTime);
84
-
85
- return {
86
- timeInMs: Math.max(...nodeTimesNotOffscreenImages),
87
- nodeTimings: simulationResult.nodeTimings,
88
- };
21
+ static async computeMetricWithGraphs(data, context, extras) {
22
+ return this.compute(await getComputationDataParams(data, context), extras)
23
+ .catch(lanternErrorAdapter);
89
24
  }
90
25
 
91
26
  /**
@@ -95,9 +30,7 @@ class LanternLargestContentfulPaint extends LanternMetric {
95
30
  */
96
31
  static async compute_(data, context) {
97
32
  const fcpResult = await LanternFirstContentfulPaint.request(data, context);
98
- const metricResult = await this.computeMetricWithGraphs(data, context);
99
- metricResult.timing = Math.max(metricResult.timing, fcpResult.timing);
100
- return metricResult;
33
+ return this.computeMetricWithGraphs(data, context, {fcpResult});
101
34
  }
102
35
  }
103
36
 
@@ -1,36 +1,25 @@
1
1
  export { LanternMaxPotentialFIDComputed as LanternMaxPotentialFID };
2
- export type Node = import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>;
2
+ export type Extras = import('../../lib/lantern/metric.js').Extras;
3
3
  declare const LanternMaxPotentialFIDComputed: typeof LanternMaxPotentialFID & {
4
4
  request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: import("../../../types/utility-types.js").default.ImmutableObject<{
5
5
  computedCache: Map<string, import("../../lib/arbitrary-equality-map.js").ArbitraryEqualityMap>;
6
6
  }>) => Promise<import("../../index.js").Artifacts.LanternMetric>;
7
7
  };
8
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
9
- declare class LanternMaxPotentialFID extends LanternMetric {
8
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
9
+ declare class LanternMaxPotentialFID extends MaxPotentialFID {
10
10
  /**
11
- * @param {Node} dependencyGraph
12
- * @return {Node}
11
+ * @param {LH.Artifacts.MetricComputationDataInput} data
12
+ * @param {LH.Artifacts.ComputedContext} context
13
+ * @param {Omit<Extras, 'optimistic'>=} extras
14
+ * @return {Promise<LH.Artifacts.LanternMetric>}
13
15
  */
14
- static getOptimisticGraph(dependencyGraph: Node): Node;
16
+ static computeMetricWithGraphs(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext, extras?: Omit<Extras, 'optimistic'> | undefined): Promise<LH.Artifacts.LanternMetric>;
15
17
  /**
16
- * @param {Node} dependencyGraph
17
- * @return {Node}
18
+ * @param {LH.Artifacts.MetricComputationDataInput} data
19
+ * @param {LH.Artifacts.ComputedContext} context
20
+ * @return {Promise<LH.Artifacts.LanternMetric>}
18
21
  */
19
- static getPessimisticGraph(dependencyGraph: Node): Node;
20
- /**
21
- * @param {LH.Gatherer.Simulation.Result} simulation
22
- * @param {import('../../lib/lantern/metric.js').Extras} extras
23
- * @return {LH.Gatherer.Simulation.Result}
24
- */
25
- static getEstimateFromSimulation(simulation: LH.Gatherer.Simulation.Result, extras: import('../../lib/lantern/metric.js').Extras): LH.Gatherer.Simulation.Result;
26
- /**
27
- * @param {LH.Gatherer.Simulation.Result['nodeTimings']} nodeTimings
28
- * @param {number} fcpTimeInMs
29
- * @return {Array<{duration: number}>}
30
- */
31
- static getTimingsAfterFCP(nodeTimings: LH.Gatherer.Simulation.Result['nodeTimings'], fcpTimeInMs: number): Array<{
32
- duration: number;
33
- }>;
22
+ static compute_(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.LanternMetric>;
34
23
  }
35
- import { LanternMetric } from './lantern-metric.js';
24
+ import { MaxPotentialFID } from '../../lib/lantern/metrics/max-potential-fid.js';
36
25
  //# sourceMappingURL=lantern-max-potential-fid.d.ts.map
@@ -5,63 +5,22 @@
5
5
  */
6
6
 
7
7
  import {makeComputedArtifact} from '../computed-artifact.js';
8
- import {LanternMetric} from './lantern-metric.js';
9
- import {BaseNode} from '../../lib/lantern/base-node.js';
8
+ import {MaxPotentialFID} from '../../lib/lantern/metrics/max-potential-fid.js';
9
+ import {getComputationDataParams, lanternErrorAdapter} from './lantern-metric.js';
10
10
  import {LanternFirstContentfulPaint} from './lantern-first-contentful-paint.js';
11
11
 
12
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
12
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
13
13
 
14
- class LanternMaxPotentialFID extends LanternMetric {
14
+ class LanternMaxPotentialFID extends MaxPotentialFID {
15
15
  /**
16
- * @return {LH.Gatherer.Simulation.MetricCoefficients}
17
- */
18
- static get COEFFICIENTS() {
19
- return {
20
- intercept: 0,
21
- optimistic: 0.5,
22
- pessimistic: 0.5,
23
- };
24
- }
25
-
26
- /**
27
- * @param {Node} dependencyGraph
28
- * @return {Node}
29
- */
30
- static getOptimisticGraph(dependencyGraph) {
31
- return dependencyGraph;
32
- }
33
-
34
- /**
35
- * @param {Node} dependencyGraph
36
- * @return {Node}
37
- */
38
- static getPessimisticGraph(dependencyGraph) {
39
- return dependencyGraph;
40
- }
41
-
42
- /**
43
- * @param {LH.Gatherer.Simulation.Result} simulation
44
- * @param {import('../../lib/lantern/metric.js').Extras} extras
45
- * @return {LH.Gatherer.Simulation.Result}
16
+ * @param {LH.Artifacts.MetricComputationDataInput} data
17
+ * @param {LH.Artifacts.ComputedContext} context
18
+ * @param {Omit<Extras, 'optimistic'>=} extras
19
+ * @return {Promise<LH.Artifacts.LanternMetric>}
46
20
  */
47
- static getEstimateFromSimulation(simulation, extras) {
48
- if (!extras.fcpResult) throw new Error('missing fcpResult');
49
-
50
- // Intentionally use the opposite FCP estimate, a more pessimistic FCP means that more tasks
51
- // are excluded from the FID computation, so a higher FCP means lower FID for same work.
52
- const fcpTimeInMs = extras.optimistic
53
- ? extras.fcpResult.pessimisticEstimate.timeInMs
54
- : extras.fcpResult.optimisticEstimate.timeInMs;
55
-
56
- const timings = LanternMaxPotentialFID.getTimingsAfterFCP(
57
- simulation.nodeTimings,
58
- fcpTimeInMs
59
- );
60
-
61
- return {
62
- timeInMs: Math.max(...timings.map(timing => timing.duration), 16),
63
- nodeTimings: simulation.nodeTimings,
64
- };
21
+ static async computeMetricWithGraphs(data, context, extras) {
22
+ return this.compute(await getComputationDataParams(data, context), extras)
23
+ .catch(lanternErrorAdapter);
65
24
  }
66
25
 
67
26
  /**
@@ -71,18 +30,7 @@ class LanternMaxPotentialFID extends LanternMetric {
71
30
  */
72
31
  static async compute_(data, context) {
73
32
  const fcpResult = await LanternFirstContentfulPaint.request(data, context);
74
- return super.computeMetricWithGraphs(data, context, {fcpResult});
75
- }
76
-
77
- /**
78
- * @param {LH.Gatherer.Simulation.Result['nodeTimings']} nodeTimings
79
- * @param {number} fcpTimeInMs
80
- * @return {Array<{duration: number}>}
81
- */
82
- static getTimingsAfterFCP(nodeTimings, fcpTimeInMs) {
83
- return Array.from(nodeTimings.entries())
84
- .filter(([node, timing]) => node.type === BaseNode.TYPES.CPU && timing.endTime > fcpTimeInMs)
85
- .map(([_, timing]) => timing);
33
+ return this.computeMetricWithGraphs(data, context, {fcpResult});
86
34
  }
87
35
  }
88
36
 
@@ -1,19 +1,15 @@
1
- export type Extras = import('../../lib/lantern/metric.js').Extras;
2
- /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
3
- export class LanternMetric extends Metric {
4
- /**
5
- * @param {LH.Artifacts.MetricComputationDataInput} data
6
- * @param {LH.Artifacts.ComputedContext} context
7
- * @param {Omit<Extras, 'optimistic'>=} extras
8
- * @return {Promise<LH.Artifacts.LanternMetric>}
9
- */
10
- static computeMetricWithGraphs(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext, extras?: Omit<Extras, 'optimistic'> | undefined): Promise<LH.Artifacts.LanternMetric>;
11
- /**
12
- * @param {LH.Artifacts.MetricComputationDataInput} data
13
- * @param {LH.Artifacts.ComputedContext} context
14
- * @return {Promise<LH.Artifacts.LanternMetric>}
15
- */
16
- static compute_(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.LanternMetric>;
17
- }
18
- import { Metric } from '../../lib/lantern/metric.js';
1
+ /**
2
+ * @param {LH.Artifacts.MetricComputationDataInput} data
3
+ * @param {LH.Artifacts.ComputedContext} context
4
+ */
5
+ export function getComputationDataParams(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext): Promise<{
6
+ simulator: import("../../lib/lantern/simulator/simulator.js").Simulator<any>;
7
+ graph: import("../page-dependency-graph.js").Node;
8
+ processedNavigation: import("../../index.js").Artifacts.ProcessedNavigation;
9
+ }>;
10
+ /**
11
+ * @param {unknown} err
12
+ * @return {never}
13
+ */
14
+ export function lanternErrorAdapter(err: unknown): never;
19
15
  //# sourceMappingURL=lantern-metric.d.ts.map
@@ -4,42 +4,46 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import {Metric} from '../../lib/lantern/metric.js';
7
+ import {LanternError} from '../../lib/lantern/lantern-error.js';
8
+ import {LighthouseError} from '../../lib/lh-error.js';
8
9
  import {LoadSimulator} from '../load-simulator.js';
9
10
  import {PageDependencyGraph} from '../page-dependency-graph.js';
10
11
  import {ProcessedNavigation} from '../processed-navigation.js';
11
12
 
12
- /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
13
-
14
- class LanternMetric extends Metric {
15
- /**
16
- * @param {LH.Artifacts.MetricComputationDataInput} data
17
- * @param {LH.Artifacts.ComputedContext} context
18
- * @param {Omit<Extras, 'optimistic'>=} extras
19
- * @return {Promise<LH.Artifacts.LanternMetric>}
20
- */
21
- static async computeMetricWithGraphs(data, context, extras) {
22
- // TODO: remove this fallback when lighthouse-pub-ads plugin can update.
23
- const gatherContext = data.gatherContext || {gatherMode: 'navigation'};
24
- if (gatherContext.gatherMode !== 'navigation') {
25
- throw new Error(`Lantern metrics can only be computed on navigations`);
26
- }
27
-
28
- const graph = await PageDependencyGraph.request(data, context);
29
- const processedNavigation = await ProcessedNavigation.request(data.trace, context);
30
- const simulator = data.simulator || (await LoadSimulator.request(data, context));
31
-
32
- return this.compute({simulator, graph, processedNavigation}, extras);
13
+ /**
14
+ * @param {LH.Artifacts.MetricComputationDataInput} data
15
+ * @param {LH.Artifacts.ComputedContext} context
16
+ */
17
+ async function getComputationDataParams(data, context) {
18
+ if (data.gatherContext.gatherMode !== 'navigation') {
19
+ throw new Error(`Lantern metrics can only be computed on navigations`);
20
+ }
21
+
22
+ const graph = await PageDependencyGraph.request(data, context);
23
+ const processedNavigation = await ProcessedNavigation.request(data.trace, context);
24
+ const simulator = data.simulator || (await LoadSimulator.request(data, context));
25
+
26
+ return {simulator, graph, processedNavigation};
27
+ }
28
+
29
+ /**
30
+ * @param {unknown} err
31
+ * @return {never}
32
+ */
33
+ function lanternErrorAdapter(err) {
34
+ if (!(err instanceof LanternError)) {
35
+ throw err;
33
36
  }
34
37
 
35
- /**
36
- * @param {LH.Artifacts.MetricComputationDataInput} data
37
- * @param {LH.Artifacts.ComputedContext} context
38
- * @return {Promise<LH.Artifacts.LanternMetric>}
39
- */
40
- static async compute_(data, context) {
41
- return this.computeMetricWithGraphs(data, context);
38
+ const code = /** @type {keyof LighthouseError.errors} */ (err.message);
39
+ if (LighthouseError.errors[code]) {
40
+ throw new LighthouseError(LighthouseError.errors[code]);
42
41
  }
42
+
43
+ throw err;
43
44
  }
44
45
 
45
- export {LanternMetric};
46
+ export {
47
+ getComputationDataParams,
48
+ lanternErrorAdapter,
49
+ };
@@ -1,44 +1,25 @@
1
1
  export { LanternSpeedIndexComputed as LanternSpeedIndex };
2
- export type Node = import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>;
2
+ export type Extras = import('../../lib/lantern/metric.js').Extras;
3
3
  declare const LanternSpeedIndexComputed: typeof LanternSpeedIndex & {
4
4
  request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: import("../../../types/utility-types.js").default.ImmutableObject<{
5
5
  computedCache: Map<string, import("../../lib/arbitrary-equality-map.js").ArbitraryEqualityMap>;
6
6
  }>) => Promise<import("../../index.js").Artifacts.LanternMetric>;
7
7
  };
8
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
9
- declare class LanternSpeedIndex extends LanternMetric {
8
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
9
+ declare class LanternSpeedIndex extends SpeedIndex {
10
10
  /**
11
- * @param {Node} dependencyGraph
12
- * @return {Node}
11
+ * @param {LH.Artifacts.MetricComputationDataInput} data
12
+ * @param {LH.Artifacts.ComputedContext} context
13
+ * @param {Omit<Extras, 'optimistic'>=} extras
14
+ * @return {Promise<LH.Artifacts.LanternMetric>}
13
15
  */
14
- static getOptimisticGraph(dependencyGraph: Node): Node;
16
+ static computeMetricWithGraphs(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext, extras?: Omit<Extras, 'optimistic'> | undefined): Promise<LH.Artifacts.LanternMetric>;
15
17
  /**
16
- * @param {Node} dependencyGraph
17
- * @return {Node}
18
+ * @param {LH.Artifacts.MetricComputationDataInput} data
19
+ * @param {LH.Artifacts.ComputedContext} context
20
+ * @return {Promise<LH.Artifacts.LanternMetric>}
18
21
  */
19
- static getPessimisticGraph(dependencyGraph: Node): Node;
20
- /**
21
- * @param {LH.Gatherer.Simulation.Result} simulationResult
22
- * @param {import('../../lib/lantern/metric.js').Extras} extras
23
- * @return {LH.Gatherer.Simulation.Result}
24
- */
25
- static getEstimateFromSimulation(simulationResult: LH.Gatherer.Simulation.Result, extras: import('../../lib/lantern/metric.js').Extras): LH.Gatherer.Simulation.Result;
26
- /**
27
- * Approximate speed index using layout events from the simulated node timings.
28
- * The layout-based speed index is the weighted average of the endTime of CPU nodes that contained
29
- * a 'Layout' task. log(duration) is used as the weight to stand for "significance" to the page.
30
- *
31
- * If no layout events can be found or the endTime of a CPU task is too early, FCP is used instead.
32
- *
33
- * This approach was determined after evaluating the accuracy/complexity tradeoff of many
34
- * different methods. Read more in the evaluation doc.
35
- *
36
- * @see https://docs.google.com/document/d/1qJWXwxoyVLVadezIp_Tgdk867G3tDNkkVRvUJSH3K1E/edit#
37
- * @param {LH.Gatherer.Simulation.Result['nodeTimings']} nodeTimings
38
- * @param {number} fcpTimeInMs
39
- * @return {number}
40
- */
41
- static computeLayoutBasedSpeedIndex(nodeTimings: LH.Gatherer.Simulation.Result['nodeTimings'], fcpTimeInMs: number): number;
22
+ static compute_(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.LanternMetric>;
42
23
  }
43
- import { LanternMetric } from './lantern-metric.js';
24
+ import { SpeedIndex } from '../../lib/lantern/metrics/speed-index.js';
44
25
  //# sourceMappingURL=lantern-speed-index.d.ts.map
@@ -5,89 +5,23 @@
5
5
  */
6
6
 
7
7
  import {makeComputedArtifact} from '../computed-artifact.js';
8
- import {LanternMetric} from './lantern-metric.js';
9
- import {BaseNode} from '../../lib/lantern/base-node.js';
8
+ import {getComputationDataParams, lanternErrorAdapter} from './lantern-metric.js';
10
9
  import {Speedline} from '../speedline.js';
11
10
  import {LanternFirstContentfulPaint} from './lantern-first-contentful-paint.js';
12
- import {throttling as defaultThrottling} from '../../config/constants.js';
11
+ import {SpeedIndex} from '../../lib/lantern/metrics/speed-index.js';
13
12
 
14
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
13
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
15
14
 
16
- class LanternSpeedIndex extends LanternMetric {
15
+ class LanternSpeedIndex extends SpeedIndex {
17
16
  /**
18
- * @return {LH.Gatherer.Simulation.MetricCoefficients}
19
- */
20
- static get COEFFICIENTS() {
21
- return {
22
- // Negative intercept is OK because estimate is Math.max(FCP, Speed Index) and
23
- // the optimistic estimate is based on the real observed speed index rather than a real
24
- // lantern graph.
25
- intercept: -250,
26
- optimistic: 1.4,
27
- pessimistic: 0.65,
28
- };
29
- }
30
-
31
- /**
32
- * @param {number} rttMs
33
- * @return {LH.Gatherer.Simulation.MetricCoefficients}
34
- */
35
- static getScaledCoefficients(rttMs) { // eslint-disable-line no-unused-vars
36
- // We want to scale our default coefficients based on the speed of the connection.
37
- // We will linearly interpolate coefficients for the passed-in rttMs based on two pre-determined points:
38
- // 1. Baseline point of 30 ms RTT where Speed Index should be a ~50/50 blend of optimistic/pessimistic.
39
- // 30 ms was based on a typical home WiFi connection's actual RTT.
40
- // Coefficients here follow from the fact that the optimistic estimate should be very close
41
- // to reality at this connection speed and the pessimistic estimate compensates for minor
42
- // connection speed differences.
43
- // 2. Default throttled point of 150 ms RTT where the default coefficients have been determined to be most accurate.
44
- // Coefficients here were determined through thorough analysis and linear regression on the
45
- // lantern test data set. See core/scripts/test-lantern.sh for more detail.
46
- // While the coefficients haven't been analyzed at the interpolated points, it's our current best effort.
47
- const defaultCoefficients = this.COEFFICIENTS;
48
- const defaultRttExcess = defaultThrottling.mobileSlow4G.rttMs - 30;
49
- const multiplier = Math.max((rttMs - 30) / defaultRttExcess, 0);
50
-
51
- return {
52
- intercept: defaultCoefficients.intercept * multiplier,
53
- optimistic: 0.5 + (defaultCoefficients.optimistic - 0.5) * multiplier,
54
- pessimistic: 0.5 + (defaultCoefficients.pessimistic - 0.5) * multiplier,
55
- };
56
- }
57
-
58
- /**
59
- * @param {Node} dependencyGraph
60
- * @return {Node}
61
- */
62
- static getOptimisticGraph(dependencyGraph) {
63
- return dependencyGraph;
64
- }
65
-
66
- /**
67
- * @param {Node} dependencyGraph
68
- * @return {Node}
69
- */
70
- static getPessimisticGraph(dependencyGraph) {
71
- return dependencyGraph;
72
- }
73
-
74
- /**
75
- * @param {LH.Gatherer.Simulation.Result} simulationResult
76
- * @param {import('../../lib/lantern/metric.js').Extras} extras
77
- * @return {LH.Gatherer.Simulation.Result}
17
+ * @param {LH.Artifacts.MetricComputationDataInput} data
18
+ * @param {LH.Artifacts.ComputedContext} context
19
+ * @param {Omit<Extras, 'optimistic'>=} extras
20
+ * @return {Promise<LH.Artifacts.LanternMetric>}
78
21
  */
79
- static getEstimateFromSimulation(simulationResult, extras) {
80
- if (!extras.fcpResult) throw new Error('missing fcpResult');
81
- if (!extras.speedline) throw new Error('missing speedline');
82
-
83
- const fcpTimeInMs = extras.fcpResult.pessimisticEstimate.timeInMs;
84
- const estimate = extras.optimistic
85
- ? extras.speedline.speedIndex
86
- : LanternSpeedIndex.computeLayoutBasedSpeedIndex(simulationResult.nodeTimings, fcpTimeInMs);
87
- return {
88
- timeInMs: estimate,
89
- nodeTimings: simulationResult.nodeTimings,
90
- };
22
+ static async computeMetricWithGraphs(data, context, extras) {
23
+ return this.compute(await getComputationDataParams(data, context), extras)
24
+ .catch(lanternErrorAdapter);
91
25
  }
92
26
 
93
27
  /**
@@ -96,50 +30,13 @@ class LanternSpeedIndex extends LanternMetric {
96
30
  * @return {Promise<LH.Artifacts.LanternMetric>}
97
31
  */
98
32
  static async compute_(data, context) {
33
+ // TODO(15841): lib/lantern should probably run Speedline
99
34
  const speedline = await Speedline.request(data.trace, context);
100
35
  const fcpResult = await LanternFirstContentfulPaint.request(data, context);
101
- const metricResult = await this.computeMetricWithGraphs(data, context, {
36
+ return this.computeMetricWithGraphs(data, context, {
102
37
  speedline,
103
38
  fcpResult,
104
39
  });
105
- metricResult.timing = Math.max(metricResult.timing, fcpResult.timing);
106
- return metricResult;
107
- }
108
-
109
- /**
110
- * Approximate speed index using layout events from the simulated node timings.
111
- * The layout-based speed index is the weighted average of the endTime of CPU nodes that contained
112
- * a 'Layout' task. log(duration) is used as the weight to stand for "significance" to the page.
113
- *
114
- * If no layout events can be found or the endTime of a CPU task is too early, FCP is used instead.
115
- *
116
- * This approach was determined after evaluating the accuracy/complexity tradeoff of many
117
- * different methods. Read more in the evaluation doc.
118
- *
119
- * @see https://docs.google.com/document/d/1qJWXwxoyVLVadezIp_Tgdk867G3tDNkkVRvUJSH3K1E/edit#
120
- * @param {LH.Gatherer.Simulation.Result['nodeTimings']} nodeTimings
121
- * @param {number} fcpTimeInMs
122
- * @return {number}
123
- */
124
- static computeLayoutBasedSpeedIndex(nodeTimings, fcpTimeInMs) {
125
- /** @type {Array<{time: number, weight: number}>} */
126
- const layoutWeights = [];
127
- for (const [node, timing] of nodeTimings.entries()) {
128
- if (node.type !== BaseNode.TYPES.CPU) continue;
129
-
130
- if (node.childEvents.some(x => x.name === 'Layout')) {
131
- const timingWeight = Math.max(Math.log2(timing.endTime - timing.startTime), 0);
132
- layoutWeights.push({time: timing.endTime, weight: timingWeight});
133
- }
134
- }
135
-
136
- const totalWeightedTime = layoutWeights
137
- .map(evt => evt.weight * Math.max(evt.time, fcpTimeInMs))
138
- .reduce((a, b) => a + b, 0);
139
- const totalWeight = layoutWeights.map(evt => evt.weight).reduce((a, b) => a + b, 0);
140
-
141
- if (!totalWeight) return fcpTimeInMs;
142
- return totalWeightedTime / totalWeight;
143
40
  }
144
41
  }
145
42
 
@@ -1,37 +1,25 @@
1
1
  export { LanternTotalBlockingTimeComputed as LanternTotalBlockingTime };
2
- export type Node = import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>;
2
+ export type Extras = import('../../lib/lantern/metric.js').Extras;
3
3
  declare const LanternTotalBlockingTimeComputed: typeof LanternTotalBlockingTime & {
4
4
  request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: import("../../../types/utility-types.js").default.ImmutableObject<{
5
5
  computedCache: Map<string, import("../../lib/arbitrary-equality-map.js").ArbitraryEqualityMap>;
6
6
  }>) => Promise<import("../../index.js").Artifacts.LanternMetric>;
7
7
  };
8
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
9
- declare class LanternTotalBlockingTime extends LanternMetric {
8
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
9
+ declare class LanternTotalBlockingTime extends TotalBlockingTime {
10
10
  /**
11
- * @param {Node} dependencyGraph
12
- * @return {Node}
11
+ * @param {LH.Artifacts.MetricComputationDataInput} data
12
+ * @param {LH.Artifacts.ComputedContext} context
13
+ * @param {Omit<Extras, 'optimistic'>=} extras
14
+ * @return {Promise<LH.Artifacts.LanternMetric>}
13
15
  */
14
- static getOptimisticGraph(dependencyGraph: Node): Node;
16
+ static computeMetricWithGraphs(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext, extras?: Omit<Extras, 'optimistic'> | undefined): Promise<LH.Artifacts.LanternMetric>;
15
17
  /**
16
- * @param {Node} dependencyGraph
17
- * @return {Node}
18
+ * @param {LH.Artifacts.MetricComputationDataInput} data
19
+ * @param {LH.Artifacts.ComputedContext} context
20
+ * @return {Promise<LH.Artifacts.LanternMetric>}
18
21
  */
19
- static getPessimisticGraph(dependencyGraph: Node): Node;
20
- /**
21
- * @param {LH.Gatherer.Simulation.Result} simulation
22
- * @param {import('../../lib/lantern/metric.js').Extras} extras
23
- * @return {LH.Gatherer.Simulation.Result}
24
- */
25
- static getEstimateFromSimulation(simulation: LH.Gatherer.Simulation.Result, extras: import('../../lib/lantern/metric.js').Extras): LH.Gatherer.Simulation.Result;
26
- /**
27
- * @param {LH.Gatherer.Simulation.Result['nodeTimings']} nodeTimings
28
- * @param {number} minDurationMs
29
- */
30
- static getTopLevelEvents(nodeTimings: LH.Gatherer.Simulation.Result['nodeTimings'], minDurationMs: number): {
31
- start: number;
32
- end: number;
33
- duration: number;
34
- }[];
22
+ static compute_(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.LanternMetric>;
35
23
  }
36
- import { LanternMetric } from './lantern-metric.js';
24
+ import { TotalBlockingTime } from '../../lib/lantern/metrics/total-blocking-time.js';
37
25
  //# sourceMappingURL=lantern-total-blocking-time.d.ts.map