lighthouse 12.4.0-dev.20250317 → 12.4.0-dev.20250319

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 (149) hide show
  1. package/core/audits/audit.js +2 -1
  2. package/core/audits/bootup-time.js +1 -1
  3. package/core/audits/byte-efficiency/efficient-animated-content.js +1 -1
  4. package/core/audits/byte-efficiency/legacy-javascript.d.ts +0 -62
  5. package/core/audits/byte-efficiency/legacy-javascript.js +9 -357
  6. package/core/audits/byte-efficiency/modern-image-formats.js +1 -1
  7. package/core/audits/byte-efficiency/offscreen-images.js +3 -3
  8. package/core/audits/byte-efficiency/render-blocking-resources.js +5 -3
  9. package/core/audits/byte-efficiency/unminified-css.js +2 -1
  10. package/core/audits/byte-efficiency/unminified-javascript.js +2 -1
  11. package/core/audits/byte-efficiency/unused-css-rules.js +1 -1
  12. package/core/audits/byte-efficiency/unused-javascript.js +1 -1
  13. package/core/audits/byte-efficiency/uses-long-cache-ttl.js +1 -1
  14. package/core/audits/byte-efficiency/uses-optimized-images.js +1 -1
  15. package/core/audits/byte-efficiency/uses-responsive-images.js +1 -1
  16. package/core/audits/byte-efficiency/uses-text-compression.js +2 -1
  17. package/core/audits/critical-request-chains.js +4 -3
  18. package/core/audits/dobetterweb/dom-size.js +1 -1
  19. package/core/audits/dobetterweb/uses-http2.js +1 -1
  20. package/core/audits/insights/cls-culprits-insight.js +1 -1
  21. package/core/audits/insights/document-latency-insight.js +1 -1
  22. package/core/audits/insights/dom-size-insight.js +1 -1
  23. package/core/audits/insights/duplicated-javascript-insight.d.ts +11 -0
  24. package/core/audits/insights/duplicated-javascript-insight.js +54 -0
  25. package/core/audits/insights/font-display-insight.js +1 -1
  26. package/core/audits/insights/forced-reflow-insight.d.ts +10 -0
  27. package/core/audits/insights/forced-reflow-insight.js +64 -12
  28. package/core/audits/insights/image-delivery-insight.js +1 -1
  29. package/core/audits/insights/insight-audit.js +2 -1
  30. package/core/audits/insights/interaction-to-next-paint-insight.js +1 -1
  31. package/core/audits/insights/lcp-discovery-insight.js +1 -1
  32. package/core/audits/insights/lcp-phases-insight.js +1 -1
  33. package/core/audits/insights/network-dependency-tree-insight.js +1 -1
  34. package/core/audits/insights/render-blocking-insight.js +1 -1
  35. package/core/audits/insights/slow-css-selector-insight.js +1 -1
  36. package/core/audits/insights/third-parties-insight.js +1 -1
  37. package/core/audits/insights/{duplicate-javascript-insight.d.ts → use-cache-insight.d.ts} +3 -3
  38. package/core/audits/insights/{duplicate-javascript-insight.js → use-cache-insight.js} +6 -6
  39. package/core/audits/insights/viewport-insight.js +1 -1
  40. package/core/audits/largest-contentful-paint-element.js +3 -2
  41. package/core/audits/layout-shifts.js +4 -2
  42. package/core/audits/lcp-lazy-loaded.js +1 -1
  43. package/core/audits/long-tasks.js +4 -4
  44. package/core/audits/mainthread-work-breakdown.js +1 -1
  45. package/core/audits/metrics/first-contentful-paint.js +2 -2
  46. package/core/audits/metrics/interactive.js +2 -2
  47. package/core/audits/metrics/largest-contentful-paint.js +3 -2
  48. package/core/audits/metrics/max-potential-fid.js +2 -2
  49. package/core/audits/metrics/speed-index.js +2 -2
  50. package/core/audits/metrics/total-blocking-time.js +2 -2
  51. package/core/audits/metrics.js +4 -3
  52. package/core/audits/predictive-perf.js +3 -3
  53. package/core/audits/prioritize-lcp-image.js +4 -3
  54. package/core/audits/redirects.js +3 -2
  55. package/core/audits/script-treemap-data.js +1 -1
  56. package/core/audits/third-party-facades.js +1 -1
  57. package/core/audits/third-party-summary.js +1 -1
  58. package/core/audits/uses-rel-preconnect.js +6 -5
  59. package/core/audits/uses-rel-preload.js +3 -3
  60. package/core/computed/critical-request-chains.d.ts +3 -1
  61. package/core/computed/critical-request-chains.js +3 -3
  62. package/core/computed/metrics/first-contentful-paint-all-frames.js +1 -1
  63. package/core/computed/metrics/first-contentful-paint.js +1 -1
  64. package/core/computed/metrics/interactive.js +1 -1
  65. package/core/computed/metrics/lantern-first-contentful-paint.js +1 -1
  66. package/core/computed/metrics/lantern-interactive.js +1 -1
  67. package/core/computed/metrics/lantern-largest-contentful-paint.js +1 -1
  68. package/core/computed/metrics/lantern-max-potential-fid.js +1 -1
  69. package/core/computed/metrics/lantern-speed-index.js +1 -1
  70. package/core/computed/metrics/lantern-total-blocking-time.js +1 -1
  71. package/core/computed/metrics/largest-contentful-paint-all-frames.js +1 -1
  72. package/core/computed/metrics/largest-contentful-paint.js +1 -1
  73. package/core/computed/metrics/lcp-breakdown.js +1 -1
  74. package/core/computed/metrics/max-potential-fid.js +1 -1
  75. package/core/computed/metrics/metric.js +1 -0
  76. package/core/computed/metrics/speed-index.js +1 -1
  77. package/core/computed/metrics/time-to-first-byte.js +1 -1
  78. package/core/computed/metrics/timing-summary.d.ts +5 -2
  79. package/core/computed/metrics/timing-summary.js +6 -4
  80. package/core/computed/metrics/total-blocking-time.js +1 -1
  81. package/core/computed/navigation-insights.d.ts +3 -1
  82. package/core/computed/navigation-insights.js +6 -4
  83. package/core/computed/page-dependency-graph.d.ts +3 -1
  84. package/core/computed/page-dependency-graph.js +5 -4
  85. package/core/computed/tbt-impact-tasks.js +1 -1
  86. package/core/computed/trace-engine-result.d.ts +5 -2
  87. package/core/computed/trace-engine-result.js +18 -4
  88. package/core/config/default-config.js +4 -2
  89. package/core/config/experimental-config.js +2 -1
  90. package/core/gather/gatherers/source-maps.d.ts +1 -0
  91. package/core/gather/gatherers/source-maps.js +3 -0
  92. package/core/gather/gatherers/trace-elements.d.ts +4 -4
  93. package/core/gather/gatherers/trace-elements.js +7 -4
  94. package/core/gather/gatherers/trace.js +5 -0
  95. package/core/lib/legacy-javascript/legacy-javascript.d.ts +29 -0
  96. package/core/lib/legacy-javascript/legacy-javascript.js +351 -0
  97. package/package.json +3 -2
  98. package/shared/localization/locales/ar-XB.json +235 -1
  99. package/shared/localization/locales/ar.json +235 -7
  100. package/shared/localization/locales/bg.json +235 -7
  101. package/shared/localization/locales/ca.json +235 -7
  102. package/shared/localization/locales/cs.json +234 -6
  103. package/shared/localization/locales/da.json +236 -8
  104. package/shared/localization/locales/de.json +234 -6
  105. package/shared/localization/locales/el.json +235 -7
  106. package/shared/localization/locales/en-GB.json +235 -19
  107. package/shared/localization/locales/en-US.json +30 -3
  108. package/shared/localization/locales/en-XA.json +0 -6
  109. package/shared/localization/locales/en-XL.json +30 -3
  110. package/shared/localization/locales/es-419.json +235 -7
  111. package/shared/localization/locales/es.json +234 -6
  112. package/shared/localization/locales/fi.json +235 -7
  113. package/shared/localization/locales/fil.json +237 -3
  114. package/shared/localization/locales/fr.json +236 -8
  115. package/shared/localization/locales/he.json +234 -0
  116. package/shared/localization/locales/hi.json +236 -2
  117. package/shared/localization/locales/hr.json +235 -7
  118. package/shared/localization/locales/hu.json +235 -7
  119. package/shared/localization/locales/id.json +234 -0
  120. package/shared/localization/locales/it.json +238 -10
  121. package/shared/localization/locales/ja.json +234 -6
  122. package/shared/localization/locales/ko.json +235 -16
  123. package/shared/localization/locales/lt.json +235 -7
  124. package/shared/localization/locales/lv.json +236 -8
  125. package/shared/localization/locales/nl.json +235 -4
  126. package/shared/localization/locales/no.json +235 -7
  127. package/shared/localization/locales/pl.json +236 -8
  128. package/shared/localization/locales/pt-PT.json +235 -1
  129. package/shared/localization/locales/pt.json +235 -1
  130. package/shared/localization/locales/ro.json +234 -0
  131. package/shared/localization/locales/ru.json +235 -1
  132. package/shared/localization/locales/sk.json +235 -1
  133. package/shared/localization/locales/sl.json +236 -2
  134. package/shared/localization/locales/sr-Latn.json +235 -1
  135. package/shared/localization/locales/sr.json +235 -1
  136. package/shared/localization/locales/sv.json +235 -1
  137. package/shared/localization/locales/ta.json +235 -1
  138. package/shared/localization/locales/te.json +237 -3
  139. package/shared/localization/locales/th.json +235 -1
  140. package/shared/localization/locales/tr.json +236 -2
  141. package/shared/localization/locales/uk.json +235 -1
  142. package/shared/localization/locales/vi.json +236 -2
  143. package/shared/localization/locales/zh-HK.json +235 -1
  144. package/shared/localization/locales/zh-TW.json +236 -2
  145. package/shared/localization/locales/zh.json +234 -0
  146. package/tsconfig.json +2 -1
  147. package/types/artifacts.d.ts +1 -0
  148. /package/core/{audits/byte-efficiency → lib/legacy-javascript}/polyfill-graph-data.json +0 -0
  149. /package/core/{audits/byte-efficiency → lib/legacy-javascript}/polyfill-module-data.json +0 -0
@@ -38,7 +38,8 @@ class ResponsesAreCompressed extends ByteEfficiencyAudit {
38
38
  description: str_(UIStrings.description),
39
39
  scoreDisplayMode: ByteEfficiencyAudit.SCORING_MODES.METRIC_SAVINGS,
40
40
  guidanceLevel: 3,
41
- requiredArtifacts: ['ResponseCompression', 'GatherContext', 'devtoolsLogs', 'traces', 'URL'],
41
+ requiredArtifacts: ['ResponseCompression', 'GatherContext', 'devtoolsLogs', 'traces', 'URL',
42
+ 'SourceMaps'],
42
43
  };
43
44
  }
44
45
 
@@ -38,7 +38,7 @@ class CriticalRequestChains extends Audit {
38
38
  scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
39
39
  supportedModes: ['navigation'],
40
40
  guidanceLevel: 1,
41
- requiredArtifacts: ['traces', 'devtoolsLogs', 'URL'],
41
+ requiredArtifacts: ['traces', 'devtoolsLogs', 'URL', 'SourceMaps'],
42
42
  };
43
43
  }
44
44
 
@@ -171,8 +171,9 @@ class CriticalRequestChains extends Audit {
171
171
  const settings = context.settings;
172
172
  const trace = artifacts.traces[Audit.DEFAULT_PASS];
173
173
  const devtoolsLog = artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
174
- const URL = artifacts.URL;
175
- const chains = await ComputedChains.request({settings, devtoolsLog, trace, URL}, context);
174
+ const {URL, SourceMaps} = artifacts;
175
+ const chains =
176
+ await ComputedChains.request({settings, devtoolsLog, trace, URL, SourceMaps}, context);
176
177
  let chainCount = 0;
177
178
  /**
178
179
  * @param {LH.Audit.Details.SimpleCriticalRequestNode} node
@@ -56,7 +56,7 @@ class DOMSize extends Audit {
56
56
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
57
57
  guidanceLevel: 1,
58
58
  requiredArtifacts: ['DOMStats', 'URL', 'GatherContext'],
59
- __internalOptionalArtifacts: ['traces', 'devtoolsLogs'],
59
+ __internalOptionalArtifacts: ['traces', 'devtoolsLogs', 'SourceMaps'],
60
60
  };
61
61
  }
62
62
 
@@ -58,7 +58,7 @@ class UsesHTTP2Audit extends Audit {
58
58
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
59
59
  guidanceLevel: 3,
60
60
  supportedModes: ['timespan', 'navigation'],
61
- requiredArtifacts: ['URL', 'devtoolsLogs', 'traces', 'GatherContext'],
61
+ requiredArtifacts: ['URL', 'devtoolsLogs', 'traces', 'GatherContext', 'SourceMaps'],
62
62
  };
63
63
  }
64
64
 
@@ -39,7 +39,7 @@ class CLSCulpritsInsight extends Audit {
39
39
  failureTitle: insightStr_(InsightUIStrings.title),
40
40
  description: insightStr_(InsightUIStrings.description),
41
41
  guidanceLevel: 3,
42
- requiredArtifacts: ['traces', 'TraceElements'],
42
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
43
43
  replacesAudits: ['layout-shifts', 'non-composited-animations', 'unsized-images'],
44
44
  };
45
45
  }
@@ -24,7 +24,7 @@ class DocumentLatencyInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
28
28
  replacesAudits: ['redirects', 'server-response-time', 'uses-text-compression'],
29
29
  };
30
30
  }
@@ -24,7 +24,7 @@ class DOMSizeInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
28
28
  replacesAudits: ['dom-size'],
29
29
  };
30
30
  }
@@ -0,0 +1,11 @@
1
+ export default DuplicatedJavaScriptInsight;
2
+ declare class DuplicatedJavaScriptInsight extends Audit {
3
+ /**
4
+ * @param {LH.Artifacts} artifacts
5
+ * @param {LH.Audit.Context} context
6
+ * @return {Promise<LH.Audit.Product>}
7
+ */
8
+ static audit(artifacts: LH.Artifacts, context: LH.Audit.Context): Promise<LH.Audit.Product>;
9
+ }
10
+ import { Audit } from '../audit.js';
11
+ //# sourceMappingURL=duplicated-javascript-insight.d.ts.map
@@ -0,0 +1,54 @@
1
+ /* eslint-disable no-unused-vars */ // TODO: remove once implemented.
2
+
3
+ /**
4
+ * @license
5
+ * Copyright 2025 Google LLC
6
+ * SPDX-License-Identifier: Apache-2.0
7
+ */
8
+
9
+ import {UIStrings} from '@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js';
10
+
11
+ import {Audit} from '../audit.js';
12
+ import * as i18n from '../../lib/i18n/i18n.js';
13
+ import {adaptInsightToAuditProduct, makeNodeItemForNodeId} from './insight-audit.js';
14
+
15
+ // eslint-disable-next-line max-len
16
+ const str_ = i18n.createIcuMessageFn('node_modules/@paulirish/trace_engine/models/trace/insights/DuplicatedJavaScript.js', UIStrings);
17
+
18
+ class DuplicatedJavaScriptInsight extends Audit {
19
+ /**
20
+ * @return {LH.Audit.Meta}
21
+ */
22
+ static get meta() {
23
+ return {
24
+ id: 'duplicated-javascript-insight',
25
+ title: str_(UIStrings.title),
26
+ failureTitle: str_(UIStrings.title),
27
+ description: str_(UIStrings.description),
28
+ guidanceLevel: 3, // TODO: confirm/change.
29
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
30
+ };
31
+ }
32
+
33
+ /**
34
+ * @param {LH.Artifacts} artifacts
35
+ * @param {LH.Audit.Context} context
36
+ * @return {Promise<LH.Audit.Product>}
37
+ */
38
+ static async audit(artifacts, context) {
39
+ // TODO: implement.
40
+ return adaptInsightToAuditProduct(artifacts, context, 'DuplicatedJavaScript', (insight) => {
41
+ /** @type {LH.Audit.Details.Table['headings']} */
42
+ const headings = [
43
+ /* eslint-disable max-len */
44
+ /* eslint-enable max-len */
45
+ ];
46
+ /** @type {LH.Audit.Details.Table['items']} */
47
+ const items = [
48
+ ];
49
+ return Audit.makeTableDetails(headings, items);
50
+ });
51
+ }
52
+ }
53
+
54
+ export default DuplicatedJavaScriptInsight;
@@ -24,7 +24,7 @@ class FontDisplayInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
28
28
  replacesAudits: ['font-display'],
29
29
  };
30
30
  }
@@ -1,5 +1,15 @@
1
1
  export default ForcedReflowInsight;
2
2
  declare class ForcedReflowInsight extends Audit {
3
+ /**
4
+ * @param {import('@paulirish/trace_engine/models/trace/insights/ForcedReflow.js').ForcedReflowAggregatedData} topLevelFunctionCallData
5
+ * @returns {LH.Audit.Details.Table}
6
+ */
7
+ static makeTopFunctionTable(topLevelFunctionCallData: import("@paulirish/trace_engine/models/trace/insights/ForcedReflow.js").ForcedReflowAggregatedData): LH.Audit.Details.Table;
8
+ /**
9
+ * @param {import('@paulirish/trace_engine/models/trace/insights/ForcedReflow.js').ForcedReflowInsightModel} insight
10
+ * @returns {LH.Audit.Details.Table}
11
+ */
12
+ static makeBottomUpTable(insight: import("@paulirish/trace_engine/models/trace/insights/ForcedReflow.js").ForcedReflowInsightModel): LH.Audit.Details.Table;
3
13
  /**
4
14
  * @param {LH.Artifacts} artifacts
5
15
  * @param {LH.Audit.Context} context
@@ -1,5 +1,3 @@
1
- /* eslint-disable no-unused-vars */ // TODO: remove once implemented.
2
-
3
1
  /**
4
2
  * @license
5
3
  * Copyright 2025 Google LLC
@@ -10,7 +8,7 @@ import {UIStrings} from '@paulirish/trace_engine/models/trace/insights/ForcedRef
10
8
 
11
9
  import {Audit} from '../audit.js';
12
10
  import * as i18n from '../../lib/i18n/i18n.js';
13
- import {adaptInsightToAuditProduct, makeNodeItemForNodeId} from './insight-audit.js';
11
+ import {adaptInsightToAuditProduct} from './insight-audit.js';
14
12
 
15
13
  // eslint-disable-next-line max-len
16
14
  const str_ = i18n.createIcuMessageFn('node_modules/@paulirish/trace_engine/models/trace/insights/ForcedReflow.js', UIStrings);
@@ -26,25 +24,79 @@ class ForcedReflowInsight extends Audit {
26
24
  failureTitle: str_(UIStrings.title),
27
25
  description: str_(UIStrings.description),
28
26
  guidanceLevel: 3,
29
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
30
28
  };
31
29
  }
32
30
 
31
+ /**
32
+ * @param {import('@paulirish/trace_engine/models/trace/insights/ForcedReflow.js').ForcedReflowAggregatedData} topLevelFunctionCallData
33
+ * @returns {LH.Audit.Details.Table}
34
+ */
35
+ static makeTopFunctionTable(topLevelFunctionCallData) {
36
+ const {topLevelFunctionCall} = topLevelFunctionCallData;
37
+ /** @type {LH.Audit.Details.Table['headings']} */
38
+ const headings = [
39
+ // eslint-disable-next-line max-len
40
+ {key: 'source', valueType: 'source-location', label: str_(UIStrings.topTimeConsumingFunctionCall)},
41
+ {key: 'reflowTime', valueType: 'ms', granularity: 1, label: str_(UIStrings.totalReflowTime)},
42
+ ];
43
+ /** @type {LH.Audit.Details.Table['items']} */
44
+ const items = [
45
+ {
46
+ source: Audit.makeSourceLocation(
47
+ topLevelFunctionCall.url,
48
+ topLevelFunctionCall.lineNumber,
49
+ topLevelFunctionCall.columnNumber
50
+ ),
51
+ reflowTime: topLevelFunctionCallData.totalReflowTime / 1000,
52
+ },
53
+ ];
54
+ return Audit.makeTableDetails(headings, items);
55
+ }
56
+
57
+ /**
58
+ * @param {import('@paulirish/trace_engine/models/trace/insights/ForcedReflow.js').ForcedReflowInsightModel} insight
59
+ * @returns {LH.Audit.Details.Table}
60
+ */
61
+ static makeBottomUpTable(insight) {
62
+ /** @type {LH.Audit.Details.Table['headings']} */
63
+ const headings = [
64
+ {key: 'source', valueType: 'source-location', label: str_(i18n.UIStrings.columnSource)},
65
+ {key: 'reflowTime', valueType: 'ms', granularity: 1, label: str_(UIStrings.totalReflowTime)},
66
+ ];
67
+ /** @type {LH.Audit.Details.Table['items']} */
68
+ const items = insight.aggregatedBottomUpData.map((data) => {
69
+ const {bottomUpData, totalTime} = data;
70
+
71
+ const source = bottomUpData ? Audit.makeSourceLocation(
72
+ bottomUpData.url,
73
+ bottomUpData.lineNumber,
74
+ bottomUpData.columnNumber
75
+ ) : {
76
+ type: /** @type {const} */ ('text'),
77
+ value: str_(UIStrings.unattributed),
78
+ };
79
+
80
+ return {
81
+ source,
82
+ reflowTime: totalTime / 1000,
83
+ };
84
+ });
85
+ return Audit.makeTableDetails(headings, items);
86
+ }
87
+
33
88
  /**
34
89
  * @param {LH.Artifacts} artifacts
35
90
  * @param {LH.Audit.Context} context
36
91
  * @return {Promise<LH.Audit.Product>}
37
92
  */
38
93
  static async audit(artifacts, context) {
39
- // TODO: implement.
40
94
  return adaptInsightToAuditProduct(artifacts, context, 'ForcedReflow', (insight) => {
41
- /** @type {LH.Audit.Details.Table['headings']} */
42
- const headings = [
43
- ];
44
- /** @type {LH.Audit.Details.Table['items']} */
45
- const items = [
46
- ];
47
- return Audit.makeTableDetails(headings, items);
95
+ const list = [this.makeBottomUpTable(insight)];
96
+ if (insight.topLevelFunctionCallData) {
97
+ list.unshift(this.makeTopFunctionTable(insight.topLevelFunctionCallData));
98
+ }
99
+ return Audit.makeListDetails(list);
48
100
  });
49
101
  }
50
102
  }
@@ -29,7 +29,7 @@ class ImageDeliveryInsight extends Audit {
29
29
  failureTitle: str_(UIStrings.title),
30
30
  description: str_(UIStrings.description),
31
31
  guidanceLevel: 3,
32
- requiredArtifacts: ['traces', 'TraceElements'],
32
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
33
33
  replacesAudits: [
34
34
  'modern-image-formats',
35
35
  'uses-optimized-images',
@@ -19,7 +19,8 @@ async function getInsightSet(artifacts, context) {
19
19
  const settings = context.settings;
20
20
  const trace = artifacts.traces[Audit.DEFAULT_PASS];
21
21
  const processedTrace = await ProcessedTrace.request(trace, context);
22
- const traceEngineResult = await TraceEngineResult.request({trace, settings}, context);
22
+ const SourceMaps = artifacts.SourceMaps;
23
+ const traceEngineResult = await TraceEngineResult.request({trace, settings, SourceMaps}, context);
23
24
 
24
25
  const navigationId = processedTrace.timeOriginEvt.args.data?.navigationId;
25
26
  const key = navigationId ?? NO_NAVIGATION;
@@ -24,7 +24,7 @@ class InteractionToNextPaintInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
28
28
  replacesAudits: ['work-during-interaction'],
29
29
  };
30
30
  }
@@ -24,7 +24,7 @@ class LCPDiscoveryInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
28
28
  replacesAudits: ['prioritize-lcp-image', 'lcp-lazy-loaded'],
29
29
  };
30
30
  }
@@ -24,7 +24,7 @@ class LCPPhasesInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
28
28
  replacesAudits: ['largest-contentful-paint-element'],
29
29
  };
30
30
  }
@@ -26,7 +26,7 @@ class NetworkDependencyTreeInsight extends Audit {
26
26
  failureTitle: str_(UIStrings.title),
27
27
  description: str_(UIStrings.description),
28
28
  guidanceLevel: 3,
29
- requiredArtifacts: ['traces', 'TraceElements'],
29
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
30
30
  replacesAudits: ['critical-request-chains'],
31
31
  };
32
32
  }
@@ -24,7 +24,7 @@ class RenderBlockingInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
28
28
  replacesAudits: ['render-blocking-resources'],
29
29
  };
30
30
  }
@@ -26,7 +26,7 @@ class SlowCSSSelectorInsight extends Audit {
26
26
  failureTitle: str_(UIStrings.title),
27
27
  description: str_(UIStrings.description),
28
28
  guidanceLevel: 3,
29
- requiredArtifacts: ['traces', 'TraceElements'],
29
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
30
30
  };
31
31
  }
32
32
 
@@ -31,7 +31,7 @@ class ThirdPartiesInsight extends Audit {
31
31
  failureTitle: str_(UIStrings.title),
32
32
  description: str_(UIStrings.description),
33
33
  guidanceLevel: 3,
34
- requiredArtifacts: ['traces', 'TraceElements'],
34
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
35
35
  replacesAudits: ['third-party-summary'],
36
36
  };
37
37
  }
@@ -1,5 +1,5 @@
1
- export default DuplicateJavaScriptInsight;
2
- declare class DuplicateJavaScriptInsight extends Audit {
1
+ export default UseCacheInsight;
2
+ declare class UseCacheInsight extends Audit {
3
3
  /**
4
4
  * @param {LH.Artifacts} artifacts
5
5
  * @param {LH.Audit.Context} context
@@ -8,4 +8,4 @@ declare class DuplicateJavaScriptInsight extends Audit {
8
8
  static audit(artifacts: LH.Artifacts, context: LH.Audit.Context): Promise<LH.Audit.Product>;
9
9
  }
10
10
  import { Audit } from '../audit.js';
11
- //# sourceMappingURL=duplicate-javascript-insight.d.ts.map
11
+ //# sourceMappingURL=use-cache-insight.d.ts.map
@@ -6,22 +6,22 @@
6
6
  * SPDX-License-Identifier: Apache-2.0
7
7
  */
8
8
 
9
- import {UIStrings} from '@paulirish/trace_engine/models/trace/insights/DuplicateJavaScript.js';
9
+ import {UIStrings} from '@paulirish/trace_engine/models/trace/insights/UseCache.js';
10
10
 
11
11
  import {Audit} from '../audit.js';
12
12
  import * as i18n from '../../lib/i18n/i18n.js';
13
13
  import {adaptInsightToAuditProduct, makeNodeItemForNodeId} from './insight-audit.js';
14
14
 
15
15
  // eslint-disable-next-line max-len
16
- const str_ = i18n.createIcuMessageFn('node_modules/@paulirish/trace_engine/models/trace/insights/DuplicateJavaScript.js', UIStrings);
16
+ const str_ = i18n.createIcuMessageFn('node_modules/@paulirish/trace_engine/models/trace/insights/UseCache.js', UIStrings);
17
17
 
18
- class DuplicateJavaScriptInsight extends Audit {
18
+ class UseCacheInsight extends Audit {
19
19
  /**
20
20
  * @return {LH.Audit.Meta}
21
21
  */
22
22
  static get meta() {
23
23
  return {
24
- id: 'duplicate-javascript-insight',
24
+ id: 'use-cache-insight',
25
25
  title: str_(UIStrings.title),
26
26
  failureTitle: str_(UIStrings.title),
27
27
  description: str_(UIStrings.description),
@@ -37,7 +37,7 @@ class DuplicateJavaScriptInsight extends Audit {
37
37
  */
38
38
  static async audit(artifacts, context) {
39
39
  // TODO: implement.
40
- return adaptInsightToAuditProduct(artifacts, context, 'DuplicateJavaScript', (insight) => {
40
+ return adaptInsightToAuditProduct(artifacts, context, 'UseCache', (insight) => {
41
41
  /** @type {LH.Audit.Details.Table['headings']} */
42
42
  const headings = [
43
43
  /* eslint-disable max-len */
@@ -51,4 +51,4 @@ class DuplicateJavaScriptInsight extends Audit {
51
51
  }
52
52
  }
53
53
 
54
- export default DuplicateJavaScriptInsight;
54
+ export default UseCacheInsight;
@@ -24,7 +24,7 @@ class ViewportInsight extends Audit {
24
24
  failureTitle: str_(UIStrings.title),
25
25
  description: str_(UIStrings.description),
26
26
  guidanceLevel: 3,
27
- requiredArtifacts: ['traces', 'TraceElements'],
27
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
28
28
  replacesAudits: ['viewport'],
29
29
  };
30
30
  }
@@ -50,7 +50,8 @@ class LargestContentfulPaintElement extends Audit {
50
50
  guidanceLevel: 1,
51
51
  supportedModes: ['navigation'],
52
52
  requiredArtifacts:
53
- ['traces', 'TraceElements', 'devtoolsLogs', 'GatherContext', 'settings', 'URL'],
53
+ ['traces', 'TraceElements', 'devtoolsLogs', 'GatherContext', 'settings', 'URL',
54
+ 'SourceMaps'],
54
55
  };
55
56
  }
56
57
 
@@ -123,7 +124,7 @@ class LargestContentfulPaintElement extends Audit {
123
124
  const devtoolsLog = artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
124
125
  const gatherContext = artifacts.GatherContext;
125
126
  const metricComputationData = {trace, devtoolsLog, gatherContext,
126
- settings: context.settings, URL: artifacts.URL};
127
+ settings: context.settings, URL: artifacts.URL, SourceMaps: artifacts.SourceMaps};
127
128
 
128
129
  const elementTable = this.makeElementTable(artifacts);
129
130
  if (!elementTable) {
@@ -47,7 +47,7 @@ class LayoutShifts extends Audit {
47
47
  description: str_(UIStrings.description),
48
48
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
49
49
  guidanceLevel: 2,
50
- requiredArtifacts: ['traces', 'TraceElements'],
50
+ requiredArtifacts: ['traces', 'TraceElements', 'SourceMaps'],
51
51
  };
52
52
  }
53
53
 
@@ -59,7 +59,9 @@ class LayoutShifts extends Audit {
59
59
  static async audit(artifacts, context) {
60
60
  const settings = context.settings;
61
61
  const trace = artifacts.traces[Audit.DEFAULT_PASS];
62
- const traceEngineResult = await TraceEngineResult.request({trace, settings}, context);
62
+ const SourceMaps = artifacts.SourceMaps;
63
+ const traceEngineResult =
64
+ await TraceEngineResult.request({trace, settings, SourceMaps}, context);
63
65
  const clusters = traceEngineResult.data.LayoutShifts.clusters ?? [];
64
66
  const {cumulativeLayoutShift: clsSavings, impactByNodeId} =
65
67
  await CumulativeLayoutShiftComputed.request(trace, context);
@@ -36,7 +36,7 @@ class LargestContentfulPaintLazyLoaded extends Audit {
36
36
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
37
37
  guidanceLevel: 3,
38
38
  requiredArtifacts: ['TraceElements', 'ViewportDimensions', 'ImageElements',
39
- 'traces', 'devtoolsLogs', 'GatherContext', 'URL'],
39
+ 'traces', 'devtoolsLogs', 'GatherContext', 'URL', 'SourceMaps'],
40
40
  };
41
41
  }
42
42
 
@@ -68,7 +68,7 @@ class LongTasks extends Audit {
68
68
  scoreDisplayMode: Audit.SCORING_MODES.INFORMATIVE,
69
69
  title: str_(UIStrings.title),
70
70
  description: str_(UIStrings.description),
71
- requiredArtifacts: ['traces', 'devtoolsLogs', 'URL', 'GatherContext'],
71
+ requiredArtifacts: ['traces', 'devtoolsLogs', 'URL', 'GatherContext', 'SourceMaps'],
72
72
  guidanceLevel: 1,
73
73
  };
74
74
  }
@@ -176,7 +176,7 @@ class LongTasks extends Audit {
176
176
  */
177
177
  static async audit(artifacts, context) {
178
178
  const settings = context.settings || {};
179
- const URL = artifacts.URL;
179
+ const {URL, SourceMaps} = artifacts;
180
180
  const trace = artifacts.traces[Audit.DEFAULT_PASS];
181
181
  const tasks = await MainThreadTasks.request(trace, context);
182
182
  const devtoolsLog = artifacts.devtoolsLogs[LongTasks.DEFAULT_PASS];
@@ -193,9 +193,9 @@ class LongTasks extends Audit {
193
193
 
194
194
  const simulatorOptions = {devtoolsLog, settings: context.settings};
195
195
  const pageGraph =
196
- await PageDependencyGraph.request({settings, trace, devtoolsLog, URL}, context);
196
+ await PageDependencyGraph.request({settings, trace, devtoolsLog, URL, SourceMaps}, context);
197
197
  const simulator = await LoadSimulator.request(simulatorOptions, context);
198
- const simulation = await simulator.simulate(pageGraph, {label: 'long-tasks-diagnostic'});
198
+ const simulation = simulator.simulate(pageGraph, {label: 'long-tasks-diagnostic'});
199
199
  for (const [node, timing] of simulation.nodeTimings.entries()) {
200
200
  if (node.type !== 'cpu') continue;
201
201
  taskTimingsByEvent.set(node.event, timing);
@@ -46,7 +46,7 @@ class MainThreadWorkBreakdown extends Audit {
46
46
  description: str_(UIStrings.description),
47
47
  scoreDisplayMode: Audit.SCORING_MODES.METRIC_SAVINGS,
48
48
  guidanceLevel: 1,
49
- requiredArtifacts: ['traces', 'devtoolsLogs', 'URL', 'GatherContext'],
49
+ requiredArtifacts: ['traces', 'devtoolsLogs', 'URL', 'GatherContext', 'SourceMaps'],
50
50
  };
51
51
  }
52
52
 
@@ -27,7 +27,7 @@ class FirstContentfulPaint extends Audit {
27
27
  description: str_(UIStrings.description),
28
28
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
29
29
  supportedModes: ['navigation'],
30
- requiredArtifacts: ['traces', 'devtoolsLogs', 'GatherContext', 'URL'],
30
+ requiredArtifacts: ['traces', 'devtoolsLogs', 'GatherContext', 'URL', 'SourceMaps'],
31
31
  };
32
32
  }
33
33
 
@@ -65,7 +65,7 @@ class FirstContentfulPaint extends Audit {
65
65
  const devtoolsLog = artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
66
66
  const gatherContext = artifacts.GatherContext;
67
67
  const metricComputationData = {trace, devtoolsLog, gatherContext,
68
- settings: context.settings, URL: artifacts.URL};
68
+ settings: context.settings, URL: artifacts.URL, SourceMaps: artifacts.SourceMaps};
69
69
  const metricResult = await ComputedFcp.request(metricComputationData, context);
70
70
  const options = context.options[context.settings.formFactor];
71
71
 
@@ -33,7 +33,7 @@ class InteractiveMetric extends Audit {
33
33
  description: str_(UIStrings.description),
34
34
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
35
35
  supportedModes: ['navigation'],
36
- requiredArtifacts: ['traces', 'devtoolsLogs', 'GatherContext', 'URL'],
36
+ requiredArtifacts: ['traces', 'devtoolsLogs', 'GatherContext', 'URL', 'SourceMaps'],
37
37
  };
38
38
  }
39
39
 
@@ -71,7 +71,7 @@ class InteractiveMetric extends Audit {
71
71
  const devtoolsLog = artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
72
72
  const gatherContext = artifacts.GatherContext;
73
73
  const metricComputationData = {trace, devtoolsLog, gatherContext,
74
- settings: context.settings, URL: artifacts.URL};
74
+ settings: context.settings, URL: artifacts.URL, SourceMaps: artifacts.SourceMaps};
75
75
  const metricResult = await Interactive.request(metricComputationData, context);
76
76
  const timeInMs = metricResult.timing;
77
77
  const options = context.options[context.settings.formFactor];
@@ -27,7 +27,8 @@ class LargestContentfulPaint extends Audit {
27
27
  description: str_(UIStrings.description),
28
28
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
29
29
  supportedModes: ['navigation'],
30
- requiredArtifacts: ['HostUserAgent', 'traces', 'devtoolsLogs', 'GatherContext', 'URL'],
30
+ requiredArtifacts: ['HostUserAgent', 'traces', 'devtoolsLogs', 'GatherContext', 'URL',
31
+ 'SourceMaps'],
31
32
  };
32
33
  }
33
34
 
@@ -73,7 +74,7 @@ class LargestContentfulPaint extends Audit {
73
74
  const devtoolsLog = artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
74
75
  const gatherContext = artifacts.GatherContext;
75
76
  const metricComputationData = {trace, devtoolsLog, gatherContext,
76
- settings: context.settings, URL: artifacts.URL};
77
+ settings: context.settings, URL: artifacts.URL, SourceMaps: artifacts.SourceMaps};
77
78
 
78
79
  const metricResult = await ComputedLcp.request(metricComputationData, context);
79
80
  const options = context.options[context.settings.formFactor];
@@ -43,7 +43,7 @@ class MaxPotentialFID extends Audit {
43
43
  description: str_(UIStrings.description),
44
44
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
45
45
  supportedModes: ['navigation'],
46
- requiredArtifacts: ['traces', 'devtoolsLogs', 'GatherContext', 'URL'],
46
+ requiredArtifacts: ['traces', 'devtoolsLogs', 'GatherContext', 'URL', 'SourceMaps'],
47
47
  };
48
48
  }
49
49
 
@@ -121,7 +121,7 @@ class MaxPotentialFID extends Audit {
121
121
  const devtoolsLog = artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
122
122
  const gatherContext = artifacts.GatherContext;
123
123
  const metricComputationData = {trace, devtoolsLog, gatherContext,
124
- settings: context.settings, URL: artifacts.URL};
124
+ settings: context.settings, URL: artifacts.URL, SourceMaps: artifacts.SourceMaps};
125
125
  const metricResult = await ComputedFid.request(metricComputationData, context);
126
126
 
127
127
  const processedTrace = await ProcessedTrace.request(trace, context);
@@ -27,7 +27,7 @@ class SpeedIndex extends Audit {
27
27
  description: str_(UIStrings.description),
28
28
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
29
29
  supportedModes: ['navigation'],
30
- requiredArtifacts: ['traces', 'devtoolsLogs', 'GatherContext', 'URL'],
30
+ requiredArtifacts: ['traces', 'devtoolsLogs', 'GatherContext', 'URL', 'SourceMaps'],
31
31
  };
32
32
  }
33
33
 
@@ -67,7 +67,7 @@ class SpeedIndex extends Audit {
67
67
  const devtoolsLog = artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
68
68
  const gatherContext = artifacts.GatherContext;
69
69
  const metricComputationData = {trace, devtoolsLog, gatherContext,
70
- settings: context.settings, URL: artifacts.URL};
70
+ settings: context.settings, URL: artifacts.URL, SourceMaps: artifacts.SourceMaps};
71
71
  const metricResult = await ComputedSi.request(metricComputationData, context);
72
72
  const options = context.options[context.settings.formFactor];
73
73