lighthouse 12.1.0 → 12.2.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 (436) hide show
  1. package/cli/cli-flags.d.ts +2 -2
  2. package/cli/cli-flags.js +1 -1
  3. package/cli/sentry-prompt.js +2 -2
  4. package/cli/test/smokehouse/frontends/lib.d.ts +1 -1
  5. package/cli/test/smokehouse/lib/concurrent-mapper.d.ts +6 -6
  6. package/cli/test/smokehouse/lighthouse-runners/bundle.d.ts +1 -1
  7. package/cli/test/smokehouse/lighthouse-runners/cli.d.ts +1 -2
  8. package/cli/test/smokehouse/lighthouse-runners/devtools.d.ts +1 -1
  9. package/cli/test/smokehouse/report-assert.d.ts +0 -1
  10. package/cli/test/smokehouse/version-check.d.ts +3 -3
  11. package/core/audits/accessibility/accesskeys.d.ts +3 -3
  12. package/core/audits/accessibility/aria-allowed-attr.d.ts +3 -3
  13. package/core/audits/accessibility/aria-allowed-role.d.ts +3 -3
  14. package/core/audits/accessibility/aria-command-name.d.ts +3 -3
  15. package/core/audits/accessibility/aria-conditional-attr.d.ts +3 -3
  16. package/core/audits/accessibility/aria-deprecated-role.d.ts +3 -3
  17. package/core/audits/accessibility/aria-dialog-name.d.ts +3 -3
  18. package/core/audits/accessibility/aria-hidden-body.d.ts +3 -3
  19. package/core/audits/accessibility/aria-hidden-focus.d.ts +3 -3
  20. package/core/audits/accessibility/aria-input-field-name.d.ts +3 -3
  21. package/core/audits/accessibility/aria-meter-name.d.ts +3 -3
  22. package/core/audits/accessibility/aria-progressbar-name.d.ts +3 -3
  23. package/core/audits/accessibility/aria-prohibited-attr.d.ts +3 -3
  24. package/core/audits/accessibility/aria-required-attr.d.ts +3 -3
  25. package/core/audits/accessibility/aria-required-children.d.ts +3 -3
  26. package/core/audits/accessibility/aria-required-parent.d.ts +3 -3
  27. package/core/audits/accessibility/aria-roles.d.ts +3 -3
  28. package/core/audits/accessibility/aria-text.d.ts +3 -3
  29. package/core/audits/accessibility/aria-toggle-field-name.d.ts +3 -3
  30. package/core/audits/accessibility/aria-tooltip-name.d.ts +3 -3
  31. package/core/audits/accessibility/aria-treeitem-name.d.ts +3 -3
  32. package/core/audits/accessibility/aria-valid-attr-value.d.ts +3 -3
  33. package/core/audits/accessibility/aria-valid-attr.d.ts +3 -3
  34. package/core/audits/accessibility/axe-audit.d.ts +1 -1
  35. package/core/audits/accessibility/button-name.d.ts +3 -3
  36. package/core/audits/accessibility/bypass.d.ts +3 -3
  37. package/core/audits/accessibility/color-contrast.d.ts +3 -3
  38. package/core/audits/accessibility/definition-list.d.ts +3 -3
  39. package/core/audits/accessibility/dlitem.d.ts +3 -3
  40. package/core/audits/accessibility/document-title.d.ts +3 -3
  41. package/core/audits/accessibility/duplicate-id-aria.d.ts +3 -3
  42. package/core/audits/accessibility/empty-heading.d.ts +3 -3
  43. package/core/audits/accessibility/form-field-multiple-labels.d.ts +3 -3
  44. package/core/audits/accessibility/frame-title.d.ts +3 -3
  45. package/core/audits/accessibility/heading-order.d.ts +3 -3
  46. package/core/audits/accessibility/html-has-lang.d.ts +3 -3
  47. package/core/audits/accessibility/html-lang-valid.d.ts +3 -3
  48. package/core/audits/accessibility/html-xml-lang-mismatch.d.ts +3 -3
  49. package/core/audits/accessibility/identical-links-same-purpose.d.ts +3 -3
  50. package/core/audits/accessibility/image-alt.d.ts +3 -3
  51. package/core/audits/accessibility/image-redundant-alt.d.ts +3 -3
  52. package/core/audits/accessibility/input-button-name.d.ts +3 -3
  53. package/core/audits/accessibility/input-image-alt.d.ts +3 -3
  54. package/core/audits/accessibility/label-content-name-mismatch.d.ts +3 -3
  55. package/core/audits/accessibility/label.d.ts +3 -3
  56. package/core/audits/accessibility/landmark-one-main.d.ts +3 -3
  57. package/core/audits/accessibility/link-in-text-block.d.ts +3 -3
  58. package/core/audits/accessibility/link-name.d.ts +3 -3
  59. package/core/audits/accessibility/list.d.ts +3 -3
  60. package/core/audits/accessibility/listitem.d.ts +3 -3
  61. package/core/audits/accessibility/meta-refresh.d.ts +3 -3
  62. package/core/audits/accessibility/meta-viewport.d.ts +3 -3
  63. package/core/audits/accessibility/object-alt.d.ts +3 -3
  64. package/core/audits/accessibility/select-name.d.ts +3 -3
  65. package/core/audits/accessibility/skip-link.d.ts +3 -3
  66. package/core/audits/accessibility/tabindex.d.ts +3 -3
  67. package/core/audits/accessibility/table-duplicate-name.d.ts +3 -3
  68. package/core/audits/accessibility/table-fake-caption.d.ts +3 -3
  69. package/core/audits/accessibility/target-size.d.ts +3 -3
  70. package/core/audits/accessibility/td-has-header.d.ts +3 -3
  71. package/core/audits/accessibility/td-headers-attr.d.ts +3 -3
  72. package/core/audits/accessibility/th-has-data-cells.d.ts +3 -3
  73. package/core/audits/accessibility/valid-lang.d.ts +3 -3
  74. package/core/audits/accessibility/video-caption.d.ts +3 -3
  75. package/core/audits/audit.d.ts +17 -17
  76. package/core/audits/autocomplete.d.ts +9 -9
  77. package/core/audits/bf-cache.d.ts +10 -10
  78. package/core/audits/bootup-time.d.ts +7 -7
  79. package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +6 -8
  80. package/core/audits/byte-efficiency/byte-efficiency-audit.js +3 -6
  81. package/core/audits/byte-efficiency/duplicated-javascript.d.ts +4 -4
  82. package/core/audits/byte-efficiency/efficient-animated-content.d.ts +3 -4
  83. package/core/audits/byte-efficiency/legacy-javascript.d.ts +7 -8
  84. package/core/audits/byte-efficiency/modern-image-formats.d.ts +3 -3
  85. package/core/audits/byte-efficiency/offscreen-images.d.ts +3 -4
  86. package/core/audits/byte-efficiency/render-blocking-resources.d.ts +5 -9
  87. package/core/audits/byte-efficiency/render-blocking-resources.js +10 -16
  88. package/core/audits/byte-efficiency/total-byte-weight.d.ts +4 -4
  89. package/core/audits/byte-efficiency/unminified-css.d.ts +3 -3
  90. package/core/audits/byte-efficiency/unminified-javascript.d.ts +3 -3
  91. package/core/audits/byte-efficiency/unused-css-rules.d.ts +3 -3
  92. package/core/audits/byte-efficiency/unused-javascript.d.ts +3 -3
  93. package/core/audits/byte-efficiency/uses-long-cache-ttl.d.ts +4 -6
  94. package/core/audits/byte-efficiency/uses-optimized-images.d.ts +3 -3
  95. package/core/audits/byte-efficiency/uses-responsive-images-snapshot.d.ts +4 -4
  96. package/core/audits/byte-efficiency/uses-responsive-images.d.ts +4 -5
  97. package/core/audits/byte-efficiency/uses-text-compression.d.ts +3 -3
  98. package/core/audits/critical-request-chains.d.ts +3 -3
  99. package/core/audits/csp-xss.d.ts +8 -8
  100. package/core/audits/deprecations.d.ts +6 -6
  101. package/core/audits/dobetterweb/charset.d.ts +3 -3
  102. package/core/audits/dobetterweb/doctype.d.ts +9 -9
  103. package/core/audits/dobetterweb/dom-size.d.ts +9 -9
  104. package/core/audits/dobetterweb/geolocation-on-start.d.ts +3 -3
  105. package/core/audits/dobetterweb/inspector-issues.d.ts +6 -6
  106. package/core/audits/dobetterweb/js-libraries.d.ts +3 -3
  107. package/core/audits/dobetterweb/no-document-write.d.ts +3 -3
  108. package/core/audits/dobetterweb/notification-on-start.d.ts +3 -3
  109. package/core/audits/dobetterweb/paste-preventing-inputs.d.ts +3 -3
  110. package/core/audits/dobetterweb/uses-http2.d.ts +7 -11
  111. package/core/audits/dobetterweb/uses-http2.js +2 -5
  112. package/core/audits/dobetterweb/uses-passive-event-listeners.d.ts +3 -3
  113. package/core/audits/errors-in-console.d.ts +4 -4
  114. package/core/audits/font-display.d.ts +4 -4
  115. package/core/audits/image-aspect-ratio.d.ts +5 -5
  116. package/core/audits/image-size-responsive.d.ts +7 -7
  117. package/core/audits/is-on-https.d.ts +10 -10
  118. package/core/audits/largest-contentful-paint-element.d.ts +9 -9
  119. package/core/audits/layout-shifts.d.ts +9 -9
  120. package/core/audits/lcp-lazy-loaded.d.ts +3 -3
  121. package/core/audits/long-tasks.d.ts +11 -11
  122. package/core/audits/long-tasks.js +5 -5
  123. package/core/audits/mainthread-work-breakdown.d.ts +5 -5
  124. package/core/audits/metrics/cumulative-layout-shift.d.ts +1 -1
  125. package/core/audits/metrics/first-contentful-paint.d.ts +1 -1
  126. package/core/audits/metrics/first-meaningful-paint.d.ts +1 -1
  127. package/core/audits/metrics/interaction-to-next-paint.d.ts +1 -1
  128. package/core/audits/metrics/interactive.d.ts +1 -1
  129. package/core/audits/metrics/largest-contentful-paint.d.ts +1 -1
  130. package/core/audits/metrics/max-potential-fid.d.ts +2 -4
  131. package/core/audits/metrics/speed-index.d.ts +1 -1
  132. package/core/audits/metrics/total-blocking-time.d.ts +1 -1
  133. package/core/audits/network-rtt.d.ts +2 -2
  134. package/core/audits/network-server-latency.d.ts +2 -2
  135. package/core/audits/non-composited-animations.d.ts +9 -9
  136. package/core/audits/oopif-iframe-test-audit.d.ts +5 -5
  137. package/core/audits/preload-fonts.d.ts +3 -3
  138. package/core/audits/prioritize-lcp-image.d.ts +7 -7
  139. package/core/audits/redirects-http.d.ts +3 -3
  140. package/core/audits/redirects.d.ts +2 -3
  141. package/core/audits/resource-summary.d.ts +1 -1
  142. package/core/audits/screenshot-thumbnails.d.ts +2 -3
  143. package/core/audits/script-treemap-data.d.ts +1 -1
  144. package/core/audits/seo/canonical.d.ts +8 -8
  145. package/core/audits/seo/crawlable-anchors.d.ts +4 -4
  146. package/core/audits/seo/font-size.d.ts +11 -11
  147. package/core/audits/seo/hreflang.d.ts +6 -6
  148. package/core/audits/seo/http-status-code.d.ts +3 -3
  149. package/core/audits/seo/is-crawlable.d.ts +9 -10
  150. package/core/audits/seo/link-text.d.ts +4 -4
  151. package/core/audits/seo/manual/structured-data.d.ts +2 -2
  152. package/core/audits/seo/meta-description.d.ts +4 -4
  153. package/core/audits/seo/robots-txt.d.ts +6 -6
  154. package/core/audits/server-response-time.d.ts +4 -4
  155. package/core/audits/third-party-cookies.d.ts +4 -4
  156. package/core/audits/third-party-facades.d.ts +11 -12
  157. package/core/audits/third-party-summary.d.ts +5 -6
  158. package/core/audits/third-party-summary.js +7 -4
  159. package/core/audits/unsized-images.d.ts +3 -3
  160. package/core/audits/user-timings.d.ts +6 -6
  161. package/core/audits/uses-rel-preconnect.d.ts +5 -5
  162. package/core/audits/uses-rel-preload.d.ts +7 -7
  163. package/core/audits/uses-rel-preload.js +8 -6
  164. package/core/audits/valid-source-maps.d.ts +6 -7
  165. package/core/audits/viewport.d.ts +4 -4
  166. package/core/audits/work-during-interaction.d.ts +11 -12
  167. package/core/computed/computed-artifact.d.ts +2 -2
  168. package/core/computed/critical-request-chains.d.ts +9 -11
  169. package/core/computed/critical-request-chains.js +6 -6
  170. package/core/computed/document-urls.d.ts +3 -8
  171. package/core/computed/document-urls.js +1 -1
  172. package/core/computed/entity-classification.d.ts +6 -8
  173. package/core/computed/image-records.d.ts +3 -5
  174. package/core/computed/js-bundles.d.ts +2 -4
  175. package/core/computed/lcp-image-record.d.ts +3 -5
  176. package/core/computed/load-simulator.d.ts +7 -11
  177. package/core/computed/load-simulator.js +1 -1
  178. package/core/computed/main-resource.d.ts +5 -7
  179. package/core/computed/main-resource.js +1 -1
  180. package/core/computed/main-thread-tasks.d.ts +1 -3
  181. package/core/computed/metrics/cumulative-layout-shift.d.ts +2 -14
  182. package/core/computed/metrics/first-contentful-paint-all-frames.d.ts +1 -3
  183. package/core/computed/metrics/first-contentful-paint.d.ts +1 -3
  184. package/core/computed/metrics/interactive.d.ts +1 -3
  185. package/core/computed/metrics/lantern-first-contentful-paint.d.ts +3 -7
  186. package/core/computed/metrics/lantern-first-contentful-paint.js +3 -5
  187. package/core/computed/metrics/lantern-interactive.d.ts +3 -7
  188. package/core/computed/metrics/lantern-interactive.js +3 -5
  189. package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +3 -7
  190. package/core/computed/metrics/lantern-largest-contentful-paint.js +3 -5
  191. package/core/computed/metrics/lantern-max-potential-fid.d.ts +3 -7
  192. package/core/computed/metrics/lantern-max-potential-fid.js +3 -5
  193. package/core/computed/metrics/lantern-metric.d.ts +8 -8
  194. package/core/computed/metrics/lantern-metric.js +1 -1
  195. package/core/computed/metrics/lantern-speed-index.d.ts +3 -7
  196. package/core/computed/metrics/lantern-speed-index.js +3 -5
  197. package/core/computed/metrics/lantern-total-blocking-time.d.ts +3 -7
  198. package/core/computed/metrics/lantern-total-blocking-time.js +1 -3
  199. package/core/computed/metrics/largest-contentful-paint-all-frames.d.ts +1 -3
  200. package/core/computed/metrics/largest-contentful-paint.d.ts +1 -3
  201. package/core/computed/metrics/lcp-breakdown.d.ts +3 -9
  202. package/core/computed/metrics/max-potential-fid.d.ts +1 -3
  203. package/core/computed/metrics/responsiveness.d.ts +7 -10
  204. package/core/computed/metrics/speed-index.d.ts +1 -3
  205. package/core/computed/metrics/time-to-first-byte.d.ts +1 -3
  206. package/core/computed/metrics/timing-summary.d.ts +8 -13
  207. package/core/computed/metrics/total-blocking-time.d.ts +1 -3
  208. package/core/computed/metrics/total-blocking-time.js +1 -1
  209. package/core/computed/module-duplication.d.ts +2 -8
  210. package/core/computed/navigation-insights.d.ts +2 -4
  211. package/core/computed/network-analysis.d.ts +2 -4
  212. package/core/computed/network-analysis.js +1 -1
  213. package/core/computed/network-records.d.ts +1 -3
  214. package/core/computed/page-dependency-graph.d.ts +9 -14
  215. package/core/computed/page-dependency-graph.js +3 -4
  216. package/core/computed/processed-navigation.d.ts +2 -5
  217. package/core/computed/processed-trace.d.ts +1 -3
  218. package/core/computed/resource-summary.d.ts +6 -10
  219. package/core/computed/screenshots.d.ts +1 -6
  220. package/core/computed/speedline.d.ts +1 -3
  221. package/core/computed/tbt-impact-tasks.d.ts +4 -5
  222. package/core/computed/tbt-impact-tasks.js +31 -8
  223. package/core/computed/trace-engine-result.d.ts +1 -3
  224. package/core/computed/trace-engine-result.js +10 -1
  225. package/core/computed/unused-css.d.ts +7 -9
  226. package/core/computed/unused-javascript-summary.d.ts +3 -5
  227. package/core/computed/user-timings.d.ts +3 -5
  228. package/core/computed/viewport-meta.d.ts +7 -9
  229. package/core/config/config-helpers.d.ts +5 -5
  230. package/core/config/config.d.ts +3 -3
  231. package/core/config/constants.d.ts +6 -6
  232. package/core/config/filters.d.ts +8 -8
  233. package/core/config/validation.d.ts +1 -1
  234. package/core/gather/driver/environment.d.ts +5 -5
  235. package/core/gather/driver/environment.js +1 -1
  236. package/core/gather/driver/execution-context.d.ts +6 -6
  237. package/core/gather/driver/navigation.d.ts +3 -3
  238. package/core/gather/driver/network-monitor.d.ts +6 -6
  239. package/core/gather/driver/storage.d.ts +4 -4
  240. package/core/gather/driver/target-manager.d.ts +4 -5
  241. package/core/gather/driver/target-manager.js +1 -1
  242. package/core/gather/driver/wait-for-condition.d.ts +3 -3
  243. package/core/gather/driver/wait-for-condition.js +4 -4
  244. package/core/gather/driver.d.ts +1 -1
  245. package/core/gather/gatherers/accessibility.d.ts +1 -1
  246. package/core/gather/gatherers/anchor-elements.d.ts +1 -1
  247. package/core/gather/gatherers/bf-cache-failures.d.ts +3 -3
  248. package/core/gather/gatherers/cache-contents.d.ts +1 -1
  249. package/core/gather/gatherers/console-messages.d.ts +1 -1
  250. package/core/gather/gatherers/css-usage.d.ts +1 -1
  251. package/core/gather/gatherers/devtools-log-compat.d.ts +3 -3
  252. package/core/gather/gatherers/devtools-log.d.ts +3 -3
  253. package/core/gather/gatherers/dobetterweb/doctype.d.ts +1 -1
  254. package/core/gather/gatherers/dobetterweb/domstats.d.ts +1 -1
  255. package/core/gather/gatherers/dobetterweb/optimized-images.d.ts +6 -7
  256. package/core/gather/gatherers/dobetterweb/response-compression.d.ts +4 -5
  257. package/core/gather/gatherers/full-page-screenshot.d.ts +3 -3
  258. package/core/gather/gatherers/iframe-elements.d.ts +1 -1
  259. package/core/gather/gatherers/image-elements.d.ts +1 -1
  260. package/core/gather/gatherers/inputs.d.ts +1 -1
  261. package/core/gather/gatherers/inspector-issues.d.ts +2 -2
  262. package/core/gather/gatherers/js-usage.d.ts +1 -1
  263. package/core/gather/gatherers/link-elements.d.ts +6 -10
  264. package/core/gather/gatherers/link-elements.js +5 -12
  265. package/core/gather/gatherers/main-document-content.d.ts +2 -2
  266. package/core/gather/gatherers/meta-elements.d.ts +1 -1
  267. package/core/gather/gatherers/network-user-agent.d.ts +4 -4
  268. package/core/gather/gatherers/root-causes.d.ts +3 -4
  269. package/core/gather/gatherers/seo/font-size.d.ts +19 -19
  270. package/core/gather/gatherers/seo/robots-txt.d.ts +1 -1
  271. package/core/gather/gatherers/source-maps.d.ts +2 -2
  272. package/core/gather/gatherers/stacks.d.ts +2 -2
  273. package/core/gather/gatherers/stylesheets.d.ts +1 -9
  274. package/core/gather/gatherers/stylesheets.js +8 -39
  275. package/core/gather/gatherers/trace-compat.d.ts +3 -3
  276. package/core/gather/gatherers/trace-elements.d.ts +4 -6
  277. package/core/gather/navigation-runner.d.ts +3 -4
  278. package/core/gather/runner-helpers.d.ts +3 -3
  279. package/core/gather/session.d.ts +4 -4
  280. package/core/gather/session.js +1 -1
  281. package/core/gather/snapshot-runner.d.ts +2 -2
  282. package/core/gather/timespan-runner.d.ts +3 -3
  283. package/core/index.d.cts +1 -7
  284. package/core/index.d.ts +6 -6
  285. package/core/lib/arbitrary-equality-map.d.ts +2 -2
  286. package/core/lib/asset-saver.d.ts +3 -3
  287. package/core/lib/asset-saver.js +1 -1
  288. package/core/lib/bf-cache-strings.d.ts +117 -117
  289. package/core/lib/cdt/Platform.d.ts +1 -1
  290. package/core/lib/cdt/SDK.d.ts +1 -1
  291. package/core/lib/cdt/generated/ParsedURL.js +2 -2
  292. package/core/lib/cdt/generated/SourceMap.d.ts +11 -11
  293. package/core/lib/cdt/generated/SourceMap.js +3 -3
  294. package/core/lib/csp-evaluator.d.ts +20 -20
  295. package/core/lib/deprecation-description.d.ts +3 -3
  296. package/core/lib/deprecations-strings.d.ts +112 -112
  297. package/core/lib/i18n/i18n.d.ts +48 -48
  298. package/core/lib/icons.d.ts +3 -3
  299. package/core/lib/lantern/lantern.d.ts +2 -19
  300. package/core/lib/lantern/lantern.js +2 -45
  301. package/core/lib/lantern-trace-saver.d.ts +5 -7
  302. package/core/lib/lantern-trace-saver.js +2 -3
  303. package/core/lib/lh-error.d.ts +87 -87
  304. package/core/lib/lighthouse-compatibility.d.ts +1 -1
  305. package/core/lib/manifest-parser.d.ts +1 -1
  306. package/core/lib/minify-devtoolslog.d.ts +1 -1
  307. package/core/lib/navigation-error.d.ts +4 -6
  308. package/core/lib/navigation-error.js +2 -2
  309. package/core/lib/network-recorder.js +1 -1
  310. package/core/lib/network-request.d.ts +5 -5
  311. package/core/lib/network-request.js +2 -2
  312. package/core/lib/page-functions.d.ts +2 -2
  313. package/core/lib/script-helpers.d.ts +0 -1
  314. package/core/lib/sentry.d.ts +8 -8
  315. package/core/lib/stack-packs.d.ts +1 -1
  316. package/core/lib/trace-engine.d.ts +2 -2
  317. package/core/lib/tracehouse/cpu-profile-model.d.ts +8 -8
  318. package/core/lib/tracehouse/cpu-profile-model.js +2 -2
  319. package/core/lib/tracehouse/main-thread-tasks.d.ts +5 -5
  320. package/core/lib/tracehouse/task-groups.d.ts +6 -38
  321. package/core/lib/tracehouse/task-summary.d.ts +0 -1
  322. package/core/lib/tracehouse/trace-processor.d.ts +9 -9
  323. package/core/lib/traces/metric-trace-events.d.ts +1 -1
  324. package/core/lib/url-utils.d.ts +4 -4
  325. package/core/runner.d.ts +3 -4
  326. package/core/runner.js +0 -1
  327. package/core/scoring.d.ts +0 -1
  328. package/core/user-flow.d.ts +5 -5
  329. package/dist/report/bundle.esm.js +1 -1
  330. package/dist/report/flow.js +1 -1
  331. package/dist/report/standalone.js +1 -1
  332. package/eslint-local-rules.d.cts +4 -1
  333. package/flow-report/src/i18n/localized-strings.d.ts +1 -1
  334. package/flow-report/src/i18n/ui-strings.d.ts +43 -43
  335. package/package.json +7 -7
  336. package/readme.md +0 -2
  337. package/report/generator/file-namer.d.ts +2 -2
  338. package/report/generator/flow-report-assets.d.ts +1 -1
  339. package/report/generator/report-generator.d.ts +4 -4
  340. package/report/renderer/api.d.ts +2 -5
  341. package/report/renderer/category-renderer.d.ts +8 -8
  342. package/report/renderer/components.d.ts +2 -2
  343. package/report/renderer/crc-details-renderer.d.ts +2 -2
  344. package/report/renderer/details-renderer.d.ts +7 -7
  345. package/report/renderer/dom.d.ts +7 -7
  346. package/report/renderer/drop-down-menu.d.ts +1 -1
  347. package/report/renderer/drop-down-menu.js +15 -17
  348. package/report/renderer/element-screenshot-renderer.d.ts +3 -3
  349. package/report/renderer/explodey-gauge.d.ts +2 -2
  350. package/report/renderer/features-util.d.ts +1 -1
  351. package/report/renderer/performance-category-renderer.d.ts +1 -1
  352. package/report/renderer/report-globals.d.ts +1 -1
  353. package/report/renderer/report-renderer.d.ts +1 -1
  354. package/report/renderer/report-ui-features.d.ts +1 -1
  355. package/report/renderer/report-utils.d.ts +62 -62
  356. package/report/renderer/snippet-renderer.d.ts +9 -9
  357. package/report/renderer/swap-locale-feature.d.ts +2 -2
  358. package/report/renderer/topbar-features.d.ts +2 -2
  359. package/report/types/augment-dom.d.ts +0 -11
  360. package/shared/localization/format.d.ts +3 -3
  361. package/shared/localization/locales/en-US.json +1 -1
  362. package/shared/localization/locales/en-XL.json +1 -1
  363. package/shared/localization/locales.d.ts +1 -1
  364. package/shared/type-verifiers.d.ts +1 -1
  365. package/shared/util.d.ts +6 -6
  366. package/tsconfig.json +1 -11
  367. package/types/artifacts.d.ts +4 -4
  368. package/types/gatherer.d.ts +4 -5
  369. package/types/internal/node.d.ts +0 -6
  370. package/types/internal/query-selector.d.ts +2 -2
  371. package/core/lib/lantern/BaseNode.d.ts +0 -163
  372. package/core/lib/lantern/BaseNode.js +0 -369
  373. package/core/lib/lantern/BaseNode.test.js +0 -385
  374. package/core/lib/lantern/CpuNode.d.ts +0 -43
  375. package/core/lib/lantern/CpuNode.js +0 -99
  376. package/core/lib/lantern/LanternError.d.ts +0 -8
  377. package/core/lib/lantern/LanternError.js +0 -9
  378. package/core/lib/lantern/Metric.d.ts +0 -69
  379. package/core/lib/lantern/Metric.js +0 -137
  380. package/core/lib/lantern/NetworkNode.d.ts +0 -49
  381. package/core/lib/lantern/NetworkNode.js +0 -136
  382. package/core/lib/lantern/PageDependencyGraph.d.ts +0 -82
  383. package/core/lib/lantern/PageDependencyGraph.js +0 -610
  384. package/core/lib/lantern/PageDependencyGraph.test.js +0 -654
  385. package/core/lib/lantern/TBTUtils.d.ts +0 -44
  386. package/core/lib/lantern/TBTUtils.js +0 -76
  387. package/core/lib/lantern/TBTUtils.test.d.ts +0 -2
  388. package/core/lib/lantern/TBTUtils.test.js +0 -130
  389. package/core/lib/lantern/TraceEngineComputationData.d.ts +0 -25
  390. package/core/lib/lantern/TraceEngineComputationData.js +0 -466
  391. package/core/lib/lantern/metrics/FirstContentfulPaint.d.ts +0 -79
  392. package/core/lib/lantern/metrics/FirstContentfulPaint.js +0 -198
  393. package/core/lib/lantern/metrics/FirstContentfulPaint.test.js +0 -54
  394. package/core/lib/lantern/metrics/Interactive.d.ts +0 -20
  395. package/core/lib/lantern/metrics/Interactive.js +0 -109
  396. package/core/lib/lantern/metrics/Interactive.test.js +0 -56
  397. package/core/lib/lantern/metrics/LargestContentfulPaint.d.ts +0 -19
  398. package/core/lib/lantern/metrics/LargestContentfulPaint.js +0 -105
  399. package/core/lib/lantern/metrics/LargestContentfulPaint.test.js +0 -42
  400. package/core/lib/lantern/metrics/MaxPotentialFID.d.ts +0 -24
  401. package/core/lib/lantern/metrics/MaxPotentialFID.js +0 -91
  402. package/core/lib/lantern/metrics/MetricTestUtils.d.ts +0 -19
  403. package/core/lib/lantern/metrics/MetricTestUtils.js +0 -48
  404. package/core/lib/lantern/metrics/SpeedIndex.d.ts +0 -32
  405. package/core/lib/lantern/metrics/SpeedIndex.js +0 -142
  406. package/core/lib/lantern/metrics/SpeedIndex.test.js +0 -83
  407. package/core/lib/lantern/metrics/TotalBlockingTime.d.ts +0 -25
  408. package/core/lib/lantern/metrics/TotalBlockingTime.js +0 -125
  409. package/core/lib/lantern/metrics/__snapshots__/FirstContentfulPaint.test.js.snap +0 -11
  410. package/core/lib/lantern/metrics/__snapshots__/Interactive.test.js.snap +0 -17
  411. package/core/lib/lantern/metrics/metrics.d.ts +0 -9
  412. package/core/lib/lantern/metrics/metrics.js +0 -16
  413. package/core/lib/lantern/simulation/ConnectionPool.d.ts +0 -48
  414. package/core/lib/lantern/simulation/ConnectionPool.js +0 -152
  415. package/core/lib/lantern/simulation/ConnectionPool.test.js +0 -195
  416. package/core/lib/lantern/simulation/Constants.d.ts +0 -52
  417. package/core/lib/lantern/simulation/Constants.js +0 -48
  418. package/core/lib/lantern/simulation/DNSCache.d.ts +0 -42
  419. package/core/lib/lantern/simulation/DNSCache.js +0 -74
  420. package/core/lib/lantern/simulation/DNSCache.test.js +0 -72
  421. package/core/lib/lantern/simulation/NetworkAnalyzer.d.ts +0 -209
  422. package/core/lib/lantern/simulation/NetworkAnalyzer.js +0 -597
  423. package/core/lib/lantern/simulation/NetworkAnalyzer.test.js +0 -475
  424. package/core/lib/lantern/simulation/SimulationTimingMap.d.ts +0 -153
  425. package/core/lib/lantern/simulation/SimulationTimingMap.js +0 -219
  426. package/core/lib/lantern/simulation/Simulator.d.ts +0 -157
  427. package/core/lib/lantern/simulation/Simulator.js +0 -593
  428. package/core/lib/lantern/simulation/Simulator.test.js +0 -434
  429. package/core/lib/lantern/simulation/TCPConnection.test.d.ts +0 -2
  430. package/core/lib/lantern/simulation/TCPConnection.test.js +0 -374
  431. package/core/lib/lantern/simulation/TcpConnection.d.ts +0 -89
  432. package/core/lib/lantern/simulation/TcpConnection.js +0 -230
  433. package/core/lib/lantern/simulation/simulation.d.ts +0 -21
  434. package/core/lib/lantern/simulation/simulation.js +0 -28
  435. package/core/lib/lantern/types/lantern.d.ts +0 -256
  436. package/core/lib/lantern/types/lantern.js +0 -7
@@ -1,198 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2024 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import * as Lantern from '../lantern.js';
8
-
9
- /** @typedef {import('../BaseNode.js').Node} Node */
10
- /** @template T @typedef {import('../NetworkNode.js').NetworkNode<T>} NetworkNode */
11
- /** @typedef {import('../CpuNode.js').CPUNode} CpuNode */
12
-
13
- class FirstContentfulPaint extends Lantern.Metric {
14
- /**
15
- * @return {Lantern.Simulation.MetricCoefficients}
16
- */
17
- static get COEFFICIENTS() {
18
- return {
19
- intercept: 0,
20
- optimistic: 0.5,
21
- pessimistic: 0.5,
22
- };
23
- }
24
-
25
- /**
26
- * @template T
27
- * @typedef FirstPaintBasedGraphOpts
28
- * @property {number} cutoffTimestamp The timestamp used to filter out tasks that occured after
29
- * our paint of interest. Typically this is First Contentful Paint or First Meaningful Paint.
30
- * @property {function(NetworkNode<T>):boolean} treatNodeAsRenderBlocking The function that determines
31
- * which resources should be considered *possibly* render-blocking.
32
- * @property {(function(CpuNode):boolean)=} additionalCpuNodesToTreatAsRenderBlocking The function that
33
- * determines which CPU nodes should also be included in our blocking node IDs set,
34
- * beyond what getRenderBlockingNodeData() already includes.
35
- */
36
-
37
- /**
38
- * This function computes the set of URLs that *appeared* to be render-blocking based on our filter,
39
- * *but definitely were not* render-blocking based on the timing of their EvaluateScript task.
40
- * It also computes the set of corresponding CPU node ids that were needed for the paint at the
41
- * given timestamp.
42
- *
43
- * @template [T=unknown]
44
- * @param {Node} graph
45
- * @param {FirstPaintBasedGraphOpts<T>} opts
46
- * @return {{definitelyNotRenderBlockingScriptUrls: Set<string>, renderBlockingCpuNodeIds: Set<string>}}
47
- */
48
- static getRenderBlockingNodeData(
49
- graph,
50
- {cutoffTimestamp, treatNodeAsRenderBlocking, additionalCpuNodesToTreatAsRenderBlocking}
51
- ) {
52
- /** @type {Map<string, CpuNode>} A map of blocking script URLs to the earliest EvaluateScript task node that executed them. */
53
- const scriptUrlToNodeMap = new Map();
54
-
55
- /** @type {Array<CpuNode>} */
56
- const cpuNodes = [];
57
- graph.traverse(node => {
58
- if (node.type === Lantern.BaseNode.TYPES.CPU) {
59
- // A task is *possibly* render blocking if it *started* before cutoffTimestamp.
60
- // We use startTime here because the paint event can be *inside* the task that was render blocking.
61
- if (node.startTime <= cutoffTimestamp) cpuNodes.push(node);
62
-
63
- // Build our script URL map to find the earliest EvaluateScript task node.
64
- const scriptUrls = node.getEvaluateScriptURLs();
65
- for (const url of scriptUrls) {
66
- // Use the earliest CPU node we find.
67
- const existing = scriptUrlToNodeMap.get(url) || node;
68
- scriptUrlToNodeMap.set(url, node.startTime < existing.startTime ? node : existing);
69
- }
70
- }
71
- });
72
-
73
- cpuNodes.sort((a, b) => a.startTime - b.startTime);
74
-
75
- // A script is *possibly* render blocking if it finished loading before cutoffTimestamp.
76
- const possiblyRenderBlockingScriptUrls = Lantern.Metric.getScriptUrls(graph, node => {
77
- // The optimistic LCP treatNodeAsRenderBlocking fn wants to exclude some images in the graph,
78
- // but here it only receives scripts to evaluate. It's a no-op in this case, but it will
79
- // matter below in the getFirstPaintBasedGraph clone operation.
80
- return node.endTime <= cutoffTimestamp && treatNodeAsRenderBlocking(node);
81
- });
82
-
83
- // A script is *definitely not* render blocking if its EvaluateScript task started after cutoffTimestamp.
84
- /** @type {Set<string>} */
85
- const definitelyNotRenderBlockingScriptUrls = new Set();
86
- /** @type {Set<string>} */
87
- const renderBlockingCpuNodeIds = new Set();
88
- for (const url of possiblyRenderBlockingScriptUrls) {
89
- // Lookup the CPU node that had the earliest EvaluateScript for this URL.
90
- const cpuNodeForUrl = scriptUrlToNodeMap.get(url);
91
-
92
- // If we can't find it at all, we can't conclude anything, so just skip it.
93
- if (!cpuNodeForUrl) continue;
94
-
95
- // If we found it and it was in our `cpuNodes` set that means it finished before cutoffTimestamp, so it really is render-blocking.
96
- if (cpuNodes.includes(cpuNodeForUrl)) {
97
- renderBlockingCpuNodeIds.add(cpuNodeForUrl.id);
98
- continue;
99
- }
100
-
101
- // We couldn't find the evaluate script in the set of CPU nodes that ran before our paint, so
102
- // it must not have been necessary for the paint.
103
- definitelyNotRenderBlockingScriptUrls.add(url);
104
- }
105
-
106
- // The first layout, first paint, and first ParseHTML are almost always necessary for first paint,
107
- // so we always include those CPU nodes.
108
- const firstLayout = cpuNodes.find(node => node.didPerformLayout());
109
- if (firstLayout) renderBlockingCpuNodeIds.add(firstLayout.id);
110
- const firstPaint = cpuNodes.find(node => node.childEvents.some(e => e.name === 'Paint'));
111
- if (firstPaint) renderBlockingCpuNodeIds.add(firstPaint.id);
112
- const firstParse = cpuNodes.find(node => node.childEvents.some(e => e.name === 'ParseHTML'));
113
- if (firstParse) renderBlockingCpuNodeIds.add(firstParse.id);
114
-
115
- // If a CPU filter was passed in, we also want to include those extra nodes.
116
- if (additionalCpuNodesToTreatAsRenderBlocking) {
117
- cpuNodes
118
- .filter(additionalCpuNodesToTreatAsRenderBlocking)
119
- .forEach(node => renderBlockingCpuNodeIds.add(node.id));
120
- }
121
-
122
- return {
123
- definitelyNotRenderBlockingScriptUrls,
124
- renderBlockingCpuNodeIds,
125
- };
126
- }
127
-
128
- /**
129
- * This function computes the graph required for the first paint of interest.
130
- *
131
- * @template [T=unknown]
132
- * @param {Node} dependencyGraph
133
- * @param {FirstPaintBasedGraphOpts<T>} opts
134
- * @return {Node}
135
- */
136
- static getFirstPaintBasedGraph(
137
- dependencyGraph,
138
- {cutoffTimestamp, treatNodeAsRenderBlocking, additionalCpuNodesToTreatAsRenderBlocking}
139
- ) {
140
- const rbData = this.getRenderBlockingNodeData(dependencyGraph, {
141
- cutoffTimestamp,
142
- treatNodeAsRenderBlocking,
143
- additionalCpuNodesToTreatAsRenderBlocking,
144
- });
145
- const {definitelyNotRenderBlockingScriptUrls, renderBlockingCpuNodeIds} = rbData;
146
-
147
- return dependencyGraph.cloneWithRelationships(node => {
148
- if (node.type === Lantern.BaseNode.TYPES.NETWORK) {
149
- // Exclude all nodes that ended after cutoffTimestamp (except for the main document which we always consider necessary)
150
- // endTime is negative if request does not finish, make sure startTime isn't after cutoffTimestamp in this case.
151
- const endedAfterPaint = node.endTime > cutoffTimestamp || node.startTime > cutoffTimestamp;
152
- if (endedAfterPaint && !node.isMainDocument()) return false;
153
-
154
- const url = node.request.url;
155
- // If the URL definitely wasn't render-blocking then we filter it out.
156
- if (definitelyNotRenderBlockingScriptUrls.has(url)) {
157
- return false;
158
- }
159
-
160
- // Lastly, build up the FCP graph of all nodes we consider render blocking
161
- return treatNodeAsRenderBlocking(node);
162
- } else {
163
- // If it's a CPU node, just check if it was blocking.
164
- return renderBlockingCpuNodeIds.has(node.id);
165
- }
166
- });
167
- }
168
-
169
- /**
170
- * @param {Node} dependencyGraph
171
- * @param {Lantern.Simulation.ProcessedNavigation} processedNavigation
172
- * @return {Node}
173
- */
174
- static getOptimisticGraph(dependencyGraph, processedNavigation) {
175
- return this.getFirstPaintBasedGraph(dependencyGraph, {
176
- cutoffTimestamp: processedNavigation.timestamps.firstContentfulPaint,
177
- // In the optimistic graph we exclude resources that appeared to be render blocking but were
178
- // initiated by a script. While they typically have a very high importance and tend to have a
179
- // significant impact on the page's content, these resources don't technically block rendering.
180
- treatNodeAsRenderBlocking: node =>
181
- node.hasRenderBlockingPriority() && node.initiatorType !== 'script',
182
- });
183
- }
184
-
185
- /**
186
- * @param {Node} dependencyGraph
187
- * @param {Lantern.Simulation.ProcessedNavigation} processedNavigation
188
- * @return {Node}
189
- */
190
- static getPessimisticGraph(dependencyGraph, processedNavigation) {
191
- return this.getFirstPaintBasedGraph(dependencyGraph, {
192
- cutoffTimestamp: processedNavigation.timestamps.firstContentfulPaint,
193
- treatNodeAsRenderBlocking: node => node.hasRenderBlockingPriority(),
194
- });
195
- }
196
- }
197
-
198
- export {FirstContentfulPaint};
@@ -1,54 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2024 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import assert from 'assert/strict';
8
-
9
- import * as Lantern from '../lantern.js';
10
- import {readJson} from '../../../test/test-utils.js';
11
- import {getComputationDataFromFixture} from './MetricTestUtils.js';
12
-
13
- const {FirstContentfulPaint} = Lantern.Metrics;
14
-
15
- const trace = readJson('../../../test/fixtures/artifacts/progressive-app/trace.json', import.meta);
16
-
17
- describe('Metrics: Lantern FCP', () => {
18
- it('should compute predicted value', async () => {
19
- const data = await getComputationDataFromFixture({trace});
20
- const result = await FirstContentfulPaint.compute(data);
21
-
22
- expect({
23
- timing: Math.round(result.timing),
24
- optimistic: Math.round(result.optimisticEstimate.timeInMs),
25
- pessimistic: Math.round(result.pessimisticEstimate.timeInMs),
26
- optimisticNodeTimings: result.optimisticEstimate.nodeTimings.size,
27
- pessimisticNodeTimings: result.pessimisticEstimate.nodeTimings.size,
28
- }).toMatchSnapshot();
29
- assert.ok(result.optimisticGraph, 'should have created optimistic graph');
30
- assert.ok(result.pessimisticGraph, 'should have created pessimistic graph');
31
- });
32
-
33
- it('should handle negative request networkEndTime', async () => {
34
- const data = await getComputationDataFromFixture({trace});
35
- data.graph.request.networkEndTime = -1;
36
- const result = await FirstContentfulPaint.compute(data);
37
-
38
- const optimisticNodes = [];
39
- result.optimisticGraph.traverse(node => {
40
- if (node.type === 'network') {
41
- optimisticNodes.push(node);
42
- }
43
- });
44
- expect(optimisticNodes.map(node => node.request.url)).toEqual(['https://squoosh.app/']);
45
-
46
- const pessimisticNodes = [];
47
- result.pessimisticGraph.traverse(node => {
48
- if (node.type === 'network') {
49
- pessimisticNodes.push(node);
50
- }
51
- });
52
- expect(pessimisticNodes.map(node => node.request.url)).toEqual(['https://squoosh.app/']);
53
- });
54
- });
@@ -1,20 +0,0 @@
1
- export type Node = import('../BaseNode.js').Node;
2
- export class Interactive extends Lantern.Metric {
3
- /**
4
- * @param {Node} dependencyGraph
5
- * @return {Node}
6
- */
7
- static getOptimisticGraph(dependencyGraph: Node): Node;
8
- /**
9
- * @param {Node} dependencyGraph
10
- * @return {Node}
11
- */
12
- static getPessimisticGraph(dependencyGraph: Node): Node;
13
- /**
14
- * @param {Lantern.Simulation.Result['nodeTimings']} nodeTimings
15
- * @return {number}
16
- */
17
- static getLastLongTaskEndTime(nodeTimings: Lantern.Simulation.Result['nodeTimings'], duration?: number): number;
18
- }
19
- import * as Lantern from '../lantern.js';
20
- //# sourceMappingURL=Interactive.d.ts.map
@@ -1,109 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2024 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import * as Lantern from '../lantern.js';
8
-
9
- /** @typedef {import('../BaseNode.js').Node} Node */
10
-
11
- // Any CPU task of 20 ms or more will end up being a critical long task on mobile
12
- const CRITICAL_LONG_TASK_THRESHOLD = 20;
13
-
14
- class Interactive extends Lantern.Metric {
15
- /**
16
- * @return {Lantern.Simulation.MetricCoefficients}
17
- */
18
- static get COEFFICIENTS() {
19
- return {
20
- intercept: 0,
21
- optimistic: 0.45,
22
- pessimistic: 0.55,
23
- };
24
- }
25
-
26
- /**
27
- * @param {Node} dependencyGraph
28
- * @return {Node}
29
- */
30
- static getOptimisticGraph(dependencyGraph) {
31
- // Adjust the critical long task threshold for microseconds
32
- const minimumCpuTaskDuration = CRITICAL_LONG_TASK_THRESHOLD * 1000;
33
-
34
- return dependencyGraph.cloneWithRelationships(node => {
35
- // Include everything that might be a long task
36
- if (node.type === Lantern.BaseNode.TYPES.CPU) {
37
- return node.duration > minimumCpuTaskDuration;
38
- }
39
-
40
- // Include all scripts and high priority requests, exclude all images
41
- const isImage = node.request.resourceType === Lantern.NetworkRequestTypes.Image;
42
- const isScript = node.request.resourceType === Lantern.NetworkRequestTypes.Script;
43
- return (
44
- !isImage &&
45
- (isScript ||
46
- node.request.priority === 'High' ||
47
- node.request.priority === 'VeryHigh')
48
- );
49
- });
50
- }
51
-
52
- /**
53
- * @param {Node} dependencyGraph
54
- * @return {Node}
55
- */
56
- static getPessimisticGraph(dependencyGraph) {
57
- return dependencyGraph;
58
- }
59
-
60
- /**
61
- * @param {Lantern.Simulation.Result} simulationResult
62
- * @param {import('../Metric.js').Extras} extras
63
- * @return {Lantern.Simulation.Result}
64
- */
65
- static getEstimateFromSimulation(simulationResult, extras) {
66
- if (!extras.lcpResult) throw new Error('missing lcpResult');
67
-
68
- const lastTaskAt = Interactive.getLastLongTaskEndTime(simulationResult.nodeTimings);
69
- const minimumTime = extras.optimistic
70
- ? extras.lcpResult.optimisticEstimate.timeInMs
71
- : extras.lcpResult.pessimisticEstimate.timeInMs;
72
- return {
73
- timeInMs: Math.max(minimumTime, lastTaskAt),
74
- nodeTimings: simulationResult.nodeTimings,
75
- };
76
- }
77
-
78
- /**
79
- * @param {Lantern.Simulation.MetricComputationDataInput} data
80
- * @param {Omit<import('../Metric.js').Extras, 'optimistic'>=} extras
81
- * @return {Promise<Lantern.Metrics.Result>}
82
- */
83
- static async compute(data, extras) {
84
- const lcpResult = extras?.lcpResult;
85
- if (!lcpResult) {
86
- throw new Error('LCP is required to calculate the Interactive metric');
87
- }
88
-
89
- const metricResult = await super.compute(data, extras);
90
- metricResult.timing = Math.max(metricResult.timing, lcpResult.timing);
91
- return metricResult;
92
- }
93
-
94
- /**
95
- * @param {Lantern.Simulation.Result['nodeTimings']} nodeTimings
96
- * @return {number}
97
- */
98
- static getLastLongTaskEndTime(nodeTimings, duration = 50) {
99
- return Array.from(nodeTimings.entries())
100
- .filter(([node, timing]) => {
101
- if (node.type !== Lantern.BaseNode.TYPES.CPU) return false;
102
- return timing.duration > duration;
103
- })
104
- .map(([_, timing]) => timing.endTime)
105
- .reduce((max, x) => Math.max(max || 0, x || 0), 0);
106
- }
107
- }
108
-
109
- export {Interactive};
@@ -1,56 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2024 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import assert from 'assert/strict';
8
-
9
- import * as Lantern from '../lantern.js';
10
- import {getComputationDataFromFixture} from './MetricTestUtils.js';
11
- import {readJson} from '../../../test/test-utils.js';
12
-
13
- const {Interactive, FirstContentfulPaint, LargestContentfulPaint} = Lantern.Metrics;
14
-
15
- const trace = readJson('../../../test/fixtures/artifacts/progressive-app/trace.json', import.meta);
16
- const iframeTrace = readJson('../../../test/fixtures/artifacts/iframe/trace.json', import.meta);
17
-
18
- describe('Metrics: Lantern TTI', () => {
19
- it('should compute predicted value', async () => {
20
- const data = await getComputationDataFromFixture({trace});
21
- const result = await Interactive.compute(data, {
22
- lcpResult: await LargestContentfulPaint.compute(data, {
23
- fcpResult: await FirstContentfulPaint.compute(data),
24
- }),
25
- });
26
-
27
- expect({
28
- timing: Math.round(result.timing),
29
- optimistic: Math.round(result.optimisticEstimate.timeInMs),
30
- pessimistic: Math.round(result.pessimisticEstimate.timeInMs),
31
- }).toMatchSnapshot();
32
- assert.equal(result.optimisticEstimate.nodeTimings.size, 14);
33
- assert.equal(result.pessimisticEstimate.nodeTimings.size, 31);
34
- assert.ok(result.optimisticGraph, 'should have created optimistic graph');
35
- assert.ok(result.pessimisticGraph, 'should have created pessimistic graph');
36
- });
37
-
38
- it('should compute predicted value on iframes with substantial layout', async () => {
39
- const data = await getComputationDataFromFixture({
40
- trace: iframeTrace,
41
- });
42
- const result = await Interactive.compute(data, {
43
- lcpResult: await LargestContentfulPaint.compute(data, {
44
- fcpResult: await FirstContentfulPaint.compute(data),
45
- }),
46
- });
47
-
48
- expect({
49
- timing: Math.round(result.timing),
50
- optimistic: Math.round(result.optimisticEstimate.timeInMs),
51
- pessimistic: Math.round(result.pessimisticEstimate.timeInMs),
52
- }).toMatchSnapshot();
53
- assert.ok(result.optimisticGraph, 'should have created optimistic graph');
54
- assert.ok(result.pessimisticGraph, 'should have created pessimistic graph');
55
- });
56
- });
@@ -1,19 +0,0 @@
1
- export type Node = import('../BaseNode.js').Node;
2
- /** @typedef {import('../BaseNode.js').Node} Node */
3
- export class LargestContentfulPaint extends Lantern.Metric {
4
- /**
5
- * Low priority image nodes are usually offscreen and very unlikely to be the
6
- * resource that is required for LCP. Our LCP graphs include everything except for these images.
7
- *
8
- * @param {Node} node
9
- * @return {boolean}
10
- */
11
- static isNotLowPriorityImageNode(node: Node): boolean;
12
- /**
13
- * @param {Lantern.Simulation.Result} simulationResult
14
- * @return {Lantern.Simulation.Result}
15
- */
16
- static getEstimateFromSimulation(simulationResult: Lantern.Simulation.Result): Lantern.Simulation.Result;
17
- }
18
- import * as Lantern from '../lantern.js';
19
- //# sourceMappingURL=LargestContentfulPaint.d.ts.map
@@ -1,105 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2024 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import * as Lantern from '../lantern.js';
8
-
9
- /** @typedef {import('../BaseNode.js').Node} Node */
10
-
11
- class LargestContentfulPaint extends Lantern.Metric {
12
- /**
13
- * @return {Lantern.Simulation.MetricCoefficients}
14
- */
15
- static get COEFFICIENTS() {
16
- return {
17
- intercept: 0,
18
- optimistic: 0.5,
19
- pessimistic: 0.5,
20
- };
21
- }
22
-
23
- /**
24
- * Low priority image nodes are usually offscreen and very unlikely to be the
25
- * resource that is required for LCP. Our LCP graphs include everything except for these images.
26
- *
27
- * @param {Node} node
28
- * @return {boolean}
29
- */
30
- static isNotLowPriorityImageNode(node) {
31
- if (node.type !== 'network') return true;
32
- const isImage = node.request.resourceType === 'Image';
33
- const isLowPriority = node.request.priority === 'Low' || node.request.priority === 'VeryLow';
34
- return !isImage || !isLowPriority;
35
- }
36
-
37
- /**
38
- * @param {Node} dependencyGraph
39
- * @param {Lantern.Simulation.ProcessedNavigation} processedNavigation
40
- * @return {Node}
41
- */
42
- static getOptimisticGraph(dependencyGraph, processedNavigation) {
43
- const lcp = processedNavigation.timestamps.largestContentfulPaint;
44
- if (!lcp) {
45
- throw new Lantern.Error('NO_LCP');
46
- }
47
-
48
- return Lantern.Metrics.FirstContentfulPaint.getFirstPaintBasedGraph(dependencyGraph, {
49
- cutoffTimestamp: lcp,
50
- treatNodeAsRenderBlocking: LargestContentfulPaint.isNotLowPriorityImageNode,
51
- });
52
- }
53
-
54
- /**
55
- * @param {Node} dependencyGraph
56
- * @param {Lantern.Simulation.ProcessedNavigation} processedNavigation
57
- * @return {Node}
58
- */
59
- static getPessimisticGraph(dependencyGraph, processedNavigation) {
60
- const lcp = processedNavigation.timestamps.largestContentfulPaint;
61
- if (!lcp) {
62
- throw new Lantern.Error('NO_LCP');
63
- }
64
-
65
- return Lantern.Metrics.FirstContentfulPaint.getFirstPaintBasedGraph(dependencyGraph, {
66
- cutoffTimestamp: lcp,
67
- treatNodeAsRenderBlocking: _ => true,
68
- // For pessimistic LCP we'll include *all* layout nodes
69
- additionalCpuNodesToTreatAsRenderBlocking: node => node.didPerformLayout(),
70
- });
71
- }
72
-
73
- /**
74
- * @param {Lantern.Simulation.Result} simulationResult
75
- * @return {Lantern.Simulation.Result}
76
- */
77
- static getEstimateFromSimulation(simulationResult) {
78
- const nodeTimesNotOffscreenImages = Array.from(simulationResult.nodeTimings.entries())
79
- .filter(entry => LargestContentfulPaint.isNotLowPriorityImageNode(entry[0]))
80
- .map(entry => entry[1].endTime);
81
-
82
- return {
83
- timeInMs: Math.max(...nodeTimesNotOffscreenImages),
84
- nodeTimings: simulationResult.nodeTimings,
85
- };
86
- }
87
-
88
- /**
89
- * @param {Lantern.Simulation.MetricComputationDataInput} data
90
- * @param {Omit<import('../Metric.js').Extras, 'optimistic'>=} extras
91
- * @return {Promise<Lantern.Metrics.Result>}
92
- */
93
- static async compute(data, extras) {
94
- const fcpResult = extras?.fcpResult;
95
- if (!fcpResult) {
96
- throw new Error('FCP is required to calculate the LCP metric');
97
- }
98
-
99
- const metricResult = await super.compute(data, extras);
100
- metricResult.timing = Math.max(metricResult.timing, fcpResult.timing);
101
- return metricResult;
102
- }
103
- }
104
-
105
- export {LargestContentfulPaint};
@@ -1,42 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2024 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import assert from 'assert/strict';
8
-
9
- import * as Lantern from '../lantern.js';
10
- import {getComputationDataFromFixture} from './MetricTestUtils.js';
11
- import {readJson} from '../../../test/test-utils.js';
12
-
13
- const {FirstContentfulPaint, LargestContentfulPaint} = Lantern.Metrics;
14
-
15
- const trace = readJson('../../../test/fixtures/artifacts/paul/trace.json', import.meta);
16
-
17
- describe('Metrics: Lantern LCP', () => {
18
- it('should compute predicted value', async () => {
19
- const data = await getComputationDataFromFixture({trace});
20
- const result = await LargestContentfulPaint.compute(data, {
21
- fcpResult: await FirstContentfulPaint.compute(data),
22
- });
23
-
24
- expect({
25
- timing: Math.round(result.timing),
26
- optimistic: Math.round(result.optimisticEstimate.timeInMs),
27
- pessimistic: Math.round(result.pessimisticEstimate.timeInMs),
28
- optimisticNodeTimings: result.optimisticEstimate.nodeTimings.size,
29
- pessimisticNodeTimings: result.pessimisticEstimate.nodeTimings.size}).
30
- toMatchInlineSnapshot(`
31
- Object {
32
- "optimistic": 1457,
33
- "optimisticNodeTimings": 8,
34
- "pessimistic": 1616,
35
- "pessimisticNodeTimings": 9,
36
- "timing": 1536,
37
- }
38
- `);
39
- assert.ok(result.optimisticGraph, 'should have created optimistic graph');
40
- assert.ok(result.pessimisticGraph, 'should have created pessimistic graph');
41
- });
42
- });
@@ -1,24 +0,0 @@
1
- export type Node = import('../BaseNode.js').Node;
2
- /** @typedef {import('../BaseNode.js').Node} Node */
3
- export class MaxPotentialFID extends Lantern.Metric {
4
- /**
5
- * @param {Node} dependencyGraph
6
- * @return {Node}
7
- */
8
- static getOptimisticGraph(dependencyGraph: Node): Node;
9
- /**
10
- * @param {Node} dependencyGraph
11
- * @return {Node}
12
- */
13
- static getPessimisticGraph(dependencyGraph: Node): Node;
14
- /**
15
- * @param {Lantern.Simulation.Result['nodeTimings']} nodeTimings
16
- * @param {number} fcpTimeInMs
17
- * @return {Array<{duration: number}>}
18
- */
19
- static getTimingsAfterFCP(nodeTimings: Lantern.Simulation.Result['nodeTimings'], fcpTimeInMs: number): Array<{
20
- duration: number;
21
- }>;
22
- }
23
- import * as Lantern from '../lantern.js';
24
- //# sourceMappingURL=MaxPotentialFID.d.ts.map