lighthouse 12.4.0-dev.20250311 → 12.4.0-dev.20250313

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.
@@ -57,8 +57,9 @@ class LayoutShifts extends Audit {
57
57
  * @return {Promise<LH.Audit.Product>}
58
58
  */
59
59
  static async audit(artifacts, context) {
60
+ const settings = context.settings;
60
61
  const trace = artifacts.traces[Audit.DEFAULT_PASS];
61
- const traceEngineResult = await TraceEngineResult.request({trace}, context);
62
+ const traceEngineResult = await TraceEngineResult.request({trace, settings}, context);
62
63
  const clusters = traceEngineResult.data.LayoutShifts.clusters ?? [];
63
64
  const {cumulativeLayoutShift: clsSavings, impactByNodeId} =
64
65
  await CumulativeLayoutShiftComputed.request(trace, context);
@@ -192,7 +192,8 @@ class LongTasks extends Audit {
192
192
  taskTimingsByEvent = new Map();
193
193
 
194
194
  const simulatorOptions = {devtoolsLog, settings: context.settings};
195
- const pageGraph = await PageDependencyGraph.request({trace, devtoolsLog, URL}, context);
195
+ const pageGraph =
196
+ await PageDependencyGraph.request({settings, trace, devtoolsLog, URL}, context);
196
197
  const simulator = await LoadSimulator.request(simulatorOptions, context);
197
198
  const simulation = await simulator.simulate(pageGraph, {label: 'long-tasks-diagnostic'});
198
199
  for (const [node, timing] of simulation.nodeTimings.entries()) {
@@ -114,8 +114,12 @@ class ScriptTreemapDataAudit extends Audit {
114
114
  */
115
115
  function collapseAll(node) {
116
116
  while (node.children && node.children.length === 1) {
117
- node.name += '/' + node.children[0].name;
118
- node.children = node.children[0].children;
117
+ const child = node.children[0];
118
+ node.name += '/' + child.name;
119
+ if (child.duplicatedNormalizedModuleName) {
120
+ node.duplicatedNormalizedModuleName = child.duplicatedNormalizedModuleName;
121
+ }
122
+ node.children = child.children;
119
123
  }
120
124
 
121
125
  if (node.children) {
@@ -137,7 +137,7 @@ class UsesRelPreconnectAudit extends Audit {
137
137
  MainResource.request({devtoolsLog, URL: artifacts.URL}, context),
138
138
  LoadSimulator.request({devtoolsLog, settings}, context),
139
139
  ProcessedNavigation.request(trace, context),
140
- PageDependencyGraph.request({trace, devtoolsLog, URL: artifacts.URL}, context),
140
+ PageDependencyGraph.request({settings, trace, devtoolsLog, URL: artifacts.URL}, context),
141
141
  ]);
142
142
 
143
143
  const {rtt, additionalRttByOrigin} = loadSimulator.getOptions();
@@ -212,6 +212,7 @@ class UsesRelPreloadAudit extends Audit {
212
212
  * @return {Promise<LH.Audit.Product>}
213
213
  */
214
214
  static async audit(artifacts, context) {
215
+ const settings = context.settings;
215
216
  const trace = artifacts.traces[UsesRelPreloadAudit.DEFAULT_PASS];
216
217
  const devtoolsLog = artifacts.devtoolsLogs[UsesRelPreloadAudit.DEFAULT_PASS];
217
218
  const URL = artifacts.URL;
@@ -219,7 +220,7 @@ class UsesRelPreloadAudit extends Audit {
219
220
 
220
221
  const [mainResource, graph, simulator] = await Promise.all([
221
222
  MainResource.request({devtoolsLog, URL}, context),
222
- PageDependencyGraph.request({trace, devtoolsLog, URL}, context),
223
+ PageDependencyGraph.request({settings, trace, devtoolsLog, URL}, context),
223
224
  LoadSimulator.request(simulatorOptions, context),
224
225
  ]);
225
226
 
@@ -4,6 +4,7 @@ declare const CriticalRequestChainsComputed: typeof CriticalRequestChains & {
4
4
  URL: LH.Artifacts["URL"];
5
5
  devtoolsLog: LH.DevtoolsLog;
6
6
  trace: LH.Trace;
7
+ settings: LH.Audit.Context["settings"];
7
8
  }, context: LH.Artifacts.ComputedContext) => ReturnType<typeof CriticalRequestChains.compute_>;
8
9
  };
9
10
  declare class CriticalRequestChains {
@@ -24,7 +25,7 @@ declare class CriticalRequestChains {
24
25
  */
25
26
  static extractChainsFromGraph(mainResource: LH.Artifacts.NetworkRequest, graph: LH.Gatherer.Simulation.GraphNode): LH.Artifacts.CriticalRequestNode;
26
27
  /**
27
- * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog, trace: LH.Trace}} data
28
+ * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog, trace: LH.Trace, settings: LH.Audit.Context['settings']}} data
28
29
  * @param {LH.Artifacts.ComputedContext} context
29
30
  * @return {Promise<LH.Artifacts.CriticalRequestNode>}
30
31
  */
@@ -32,6 +33,7 @@ declare class CriticalRequestChains {
32
33
  URL: LH.Artifacts["URL"];
33
34
  devtoolsLog: LH.DevtoolsLog;
34
35
  trace: LH.Trace;
36
+ settings: LH.Audit.Context["settings"];
35
37
  }, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.CriticalRequestNode>;
36
38
  }
37
39
  import * as Lantern from '../lib/lantern/lantern.js';
@@ -126,7 +126,7 @@ class CriticalRequestChains {
126
126
  }
127
127
 
128
128
  /**
129
- * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog, trace: LH.Trace}} data
129
+ * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog, trace: LH.Trace, settings: LH.Audit.Context['settings']}} data
130
130
  * @param {LH.Artifacts.ComputedContext} context
131
131
  * @return {Promise<LH.Artifacts.CriticalRequestNode>}
132
132
  */
@@ -139,5 +139,5 @@ class CriticalRequestChains {
139
139
  }
140
140
 
141
141
  const CriticalRequestChainsComputed =
142
- makeComputedArtifact(CriticalRequestChains, ['URL', 'devtoolsLog', 'trace']);
142
+ makeComputedArtifact(CriticalRequestChains, ['URL', 'devtoolsLog', 'trace', 'settings']);
143
143
  export {CriticalRequestChainsComputed as CriticalRequestChains};
@@ -1,6 +1,9 @@
1
1
  export { NavigationInsightsComputed as NavigationInsights };
2
2
  declare const NavigationInsightsComputed: typeof NavigationInsights & {
3
- request: (dependencies: import("../index.js").Trace, context: LH.Artifacts.ComputedContext) => ReturnType<typeof NavigationInsights.compute_>;
3
+ request: (dependencies: {
4
+ trace: LH.Trace;
5
+ settings: LH.Audit.Context["settings"];
6
+ }, context: LH.Artifacts.ComputedContext) => ReturnType<typeof NavigationInsights.compute_>;
4
7
  };
5
8
  /**
6
9
  * @fileoverview Gets insights from the shared trace engine for the navigation audited by Lighthouse.
@@ -8,9 +11,12 @@ declare const NavigationInsightsComputed: typeof NavigationInsights & {
8
11
  */
9
12
  declare class NavigationInsights {
10
13
  /**
11
- * @param {LH.Trace} trace
14
+ * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings']}} data
12
15
  * @param {LH.Artifacts.ComputedContext} context
13
16
  */
14
- static compute_(trace: LH.Trace, context: LH.Artifacts.ComputedContext): Promise<import("@paulirish/trace_engine/models/trace/insights/types.js").InsightSet>;
17
+ static compute_(data: {
18
+ trace: LH.Trace;
19
+ settings: LH.Audit.Context["settings"];
20
+ }, context: LH.Artifacts.ComputedContext): Promise<import("@paulirish/trace_engine/models/trace/insights/types.js").InsightSet>;
15
21
  }
16
22
  //# sourceMappingURL=navigation-insights.d.ts.map
@@ -14,12 +14,13 @@ import {TraceEngineResult} from './trace-engine-result.js';
14
14
  */
15
15
  class NavigationInsights {
16
16
  /**
17
- * @param {LH.Trace} trace
17
+ * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings']}} data
18
18
  * @param {LH.Artifacts.ComputedContext} context
19
19
  */
20
- static async compute_(trace, context) {
20
+ static async compute_(data, context) {
21
+ const {trace, settings} = data;
21
22
  const processedTrace = await ProcessedTrace.request(trace, context);
22
- const traceEngineResult = await TraceEngineResult.request({trace}, context);
23
+ const traceEngineResult = await TraceEngineResult.request({trace, settings}, context);
23
24
 
24
25
  const navigationId = processedTrace.timeOriginEvt.args.data?.navigationId;
25
26
  if (!navigationId) throw new Error('No navigationId found');
@@ -31,5 +32,5 @@ class NavigationInsights {
31
32
  }
32
33
  }
33
34
 
34
- const NavigationInsightsComputed = makeComputedArtifact(NavigationInsights, null);
35
+ const NavigationInsightsComputed = makeComputedArtifact(NavigationInsights, ['trace', 'settings']);
35
36
  export {NavigationInsightsComputed as NavigationInsights};
@@ -3,19 +3,21 @@ declare const PageDependencyGraphComputed: typeof PageDependencyGraph & {
3
3
  request: (dependencies: {
4
4
  trace: LH.Trace;
5
5
  devtoolsLog: LH.DevtoolsLog;
6
+ settings: LH.Audit.Context["settings"];
6
7
  URL: LH.Artifacts["URL"];
7
8
  fromTrace?: boolean;
8
9
  }, context: LH.Artifacts.ComputedContext) => ReturnType<typeof PageDependencyGraph.compute_>;
9
10
  };
10
11
  declare class PageDependencyGraph {
11
12
  /**
12
- * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, URL: LH.Artifacts['URL'], fromTrace?: boolean}} data
13
+ * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, settings: LH.Audit.Context['settings'], URL: LH.Artifacts['URL'], fromTrace?: boolean}} data
13
14
  * @param {LH.Artifacts.ComputedContext} context
14
15
  * @return {Promise<LH.Gatherer.Simulation.GraphNode>}
15
16
  */
16
17
  static compute_(data: {
17
18
  trace: LH.Trace;
18
19
  devtoolsLog: LH.DevtoolsLog;
20
+ settings: LH.Audit.Context["settings"];
19
21
  URL: LH.Artifacts["URL"];
20
22
  fromTrace?: boolean;
21
23
  }, context: LH.Artifacts.ComputedContext): Promise<LH.Gatherer.Simulation.GraphNode>;
@@ -13,19 +13,19 @@ import {TraceEngineResult} from './trace-engine-result.js';
13
13
 
14
14
  class PageDependencyGraph {
15
15
  /**
16
- * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, URL: LH.Artifacts['URL'], fromTrace?: boolean}} data
16
+ * @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, settings: LH.Audit.Context['settings'], URL: LH.Artifacts['URL'], fromTrace?: boolean}} data
17
17
  * @param {LH.Artifacts.ComputedContext} context
18
18
  * @return {Promise<LH.Gatherer.Simulation.GraphNode>}
19
19
  */
20
20
  static async compute_(data, context) {
21
- const {trace, devtoolsLog, URL} = data;
21
+ const {trace, settings, devtoolsLog, URL} = data;
22
22
  const [{mainThreadEvents}, networkRecords] = await Promise.all([
23
23
  ProcessedTrace.request(trace, context),
24
24
  NetworkRecords.request(devtoolsLog, context),
25
25
  ]);
26
26
 
27
27
  if (data.fromTrace) {
28
- const traceEngineResult = await TraceEngineResult.request({trace}, context);
28
+ const traceEngineResult = await TraceEngineResult.request({trace, settings}, context);
29
29
  const traceEngineData = traceEngineResult.data;
30
30
  const requests =
31
31
  Lantern.TraceEngineComputationData.createNetworkRequests(trace, traceEngineData);
@@ -40,6 +40,6 @@ class PageDependencyGraph {
40
40
  }
41
41
  }
42
42
 
43
- const PageDependencyGraphComputed =
44
- makeComputedArtifact(PageDependencyGraph, ['devtoolsLog', 'trace', 'URL', 'fromTrace']);
43
+ const PageDependencyGraphComputed = makeComputedArtifact(PageDependencyGraph,
44
+ ['devtoolsLog', 'settings', 'trace', 'URL', 'fromTrace']);
45
45
  export {PageDependencyGraphComputed as PageDependencyGraph};
@@ -2,6 +2,7 @@ export { TraceEngineResultComputed as TraceEngineResult };
2
2
  declare const TraceEngineResultComputed: typeof TraceEngineResult & {
3
3
  request: (dependencies: {
4
4
  trace: LH.Trace;
5
+ settings: LH.Audit.Context["settings"];
5
6
  }, context: LH.Artifacts.ComputedContext) => ReturnType<typeof TraceEngineResult.compute_>;
6
7
  };
7
8
  /**
@@ -10,9 +11,10 @@ declare const TraceEngineResultComputed: typeof TraceEngineResult & {
10
11
  declare class TraceEngineResult {
11
12
  /**
12
13
  * @param {LH.TraceEvent[]} traceEvents
14
+ * @param {LH.Audit.Context['settings']} settings
13
15
  * @return {Promise<LH.Artifacts.TraceEngineResult>}
14
16
  */
15
- static runTraceEngine(traceEvents: LH.TraceEvent[]): Promise<LH.Artifacts.TraceEngineResult>;
17
+ static runTraceEngine(traceEvents: LH.TraceEvent[], settings: LH.Audit.Context["settings"]): Promise<LH.Artifacts.TraceEngineResult>;
16
18
  /**
17
19
  * Adapts the given DevTools function that returns a localized string to one
18
20
  * that returns a LH.IcuMessage.
@@ -45,12 +47,13 @@ declare class TraceEngineResult {
45
47
  */
46
48
  static localizeInsights(insightSets: import("@paulirish/trace_engine/models/trace/insights/types.js").TraceInsightSets): void;
47
49
  /**
48
- * @param {{trace: LH.Trace}} data
50
+ * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings']}} data
49
51
  * @param {LH.Artifacts.ComputedContext} context
50
52
  * @return {Promise<LH.Artifacts.TraceEngineResult>}
51
53
  */
52
54
  static compute_(data: {
53
55
  trace: LH.Trace;
56
+ settings: LH.Audit.Context["settings"];
54
57
  }, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.TraceEngineResult>;
55
58
  }
56
59
  import * as LH from '../../types/lh.js';
@@ -4,6 +4,8 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import log from 'lighthouse-logger';
8
+
7
9
  import * as i18n from '../lib/i18n/i18n.js';
8
10
  import * as TraceEngine from '../lib/trace-engine.js';
9
11
  import {makeComputedArtifact} from './computed-artifact.js';
@@ -17,15 +19,35 @@ import * as LH from '../../types/lh.js';
17
19
  class TraceEngineResult {
18
20
  /**
19
21
  * @param {LH.TraceEvent[]} traceEvents
22
+ * @param {LH.Audit.Context['settings']} settings
20
23
  * @return {Promise<LH.Artifacts.TraceEngineResult>}
21
24
  */
22
- static async runTraceEngine(traceEvents) {
25
+ static async runTraceEngine(traceEvents, settings) {
23
26
  const processor = new TraceEngine.TraceProcessor(TraceEngine.TraceHandlers);
24
27
 
28
+ const lanternSettings = {};
29
+ if (settings.throttlingMethod) lanternSettings.throttlingMethod = settings.throttlingMethod;
30
+ if (settings.throttling) lanternSettings.throttling = settings.throttling;
31
+ if (settings.precomputedLanternData) {
32
+ lanternSettings.precomputedLanternData = settings.precomputedLanternData;
33
+ }
34
+
25
35
  // eslint-disable-next-line max-len
26
36
  await processor.parse(/** @type {import('@paulirish/trace_engine').Types.Events.Event[]} */ (
27
37
  traceEvents
28
- ), {});
38
+ ), {
39
+ logger: {
40
+ start(id) {
41
+ const logId = `lh:computed:TraceEngineResult:${id}`;
42
+ log.time({msg: `Trace Engine ${id}`, id: logId});
43
+ },
44
+ end(id) {
45
+ const logId = `lh:computed:TraceEngineResult:${id}`;
46
+ log.timeEnd({msg: `Trace Engine ${id}`, id: logId});
47
+ },
48
+ },
49
+ lanternSettings,
50
+ });
29
51
  if (!processor.parsedTrace) throw new Error('No data');
30
52
  if (!processor.insights) throw new Error('No insights');
31
53
  this.localizeInsights(processor.insights);
@@ -177,7 +199,7 @@ class TraceEngineResult {
177
199
  }
178
200
 
179
201
  /**
180
- * @param {{trace: LH.Trace}} data
202
+ * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings']}} data
181
203
  * @param {LH.Artifacts.ComputedContext} context
182
204
  * @return {Promise<LH.Artifacts.TraceEngineResult>}
183
205
  */
@@ -207,10 +229,10 @@ class TraceEngineResult {
207
229
  }
208
230
  }
209
231
 
210
- const result = await TraceEngineResult.runTraceEngine(traceEvents);
232
+ const result = await TraceEngineResult.runTraceEngine(traceEvents, data.settings);
211
233
  return result;
212
234
  }
213
235
  }
214
236
 
215
- const TraceEngineResultComputed = makeComputedArtifact(TraceEngineResult, ['trace']);
237
+ const TraceEngineResultComputed = makeComputedArtifact(TraceEngineResult, ['trace', 'settings']);
216
238
  export {TraceEngineResultComputed as TraceEngineResult};
@@ -386,7 +386,8 @@ class TraceElements extends BaseGatherer {
386
386
  const session = context.driver.defaultSession;
387
387
 
388
388
  const trace = context.dependencies.Trace;
389
- const traceEngineResult = await TraceEngineResult.request({trace}, context);
389
+ const settings = context.settings;
390
+ const traceEngineResult = await TraceEngineResult.request({trace, settings}, context);
390
391
  const rootCauses = context.dependencies.RootCauses;
391
392
 
392
393
  const processedTrace = await ProcessedTrace.request(trace, context);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lighthouse",
3
3
  "type": "module",
4
- "version": "12.4.0-dev.20250311",
4
+ "version": "12.4.0-dev.20250313",
5
5
  "description": "Automated auditing, performance metrics, and best practices for the web.",
6
6
  "main": "./core/index.js",
7
7
  "bin": {
@@ -141,6 +141,7 @@
141
141
  "chrome-devtools-frontend": "1.0.1418433",
142
142
  "concurrently": "^6.4.0",
143
143
  "conventional-changelog-cli": "^2.1.1",
144
+ "core-js-compat": "^3.41.0",
144
145
  "cpy": "^8.1.2",
145
146
  "cross-env": "^7.0.2",
146
147
  "csv-validator": "^0.0.3",
@@ -183,7 +184,7 @@
183
184
  "webtreemap-cdt": "^3.2.1"
184
185
  },
185
186
  "dependencies": {
186
- "@paulirish/trace_engine": "0.0.47",
187
+ "@paulirish/trace_engine": "0.0.48",
187
188
  "@sentry/node": "^7.0.0",
188
189
  "axe-core": "^4.10.2",
189
190
  "chrome-launcher": "^1.1.2",
@@ -660,7 +660,7 @@
660
660
  "message": "Use video formats for animated content"
661
661
  },
662
662
  "core/audits/byte-efficiency/legacy-javascript.js | description": {
663
- "message": "Polyfills and transforms enable legacy browsers to use new JavaScript features. However, many aren't necessary for modern browsers. For your bundled JavaScript, adopt a modern script deployment strategy using [module/nomodule feature detection](https://philipwalton.com/articles/deploying-es2015-code-in-production-today/) to reduce the amount of code shipped to modern browsers, while retaining support for legacy browsers. [Learn how to serve modern JavaScript](https://web.dev/articles/codelab-serve-modern-code)"
663
+ "message": "Polyfills and transforms enable legacy browsers to use new JavaScript features. However, many aren't necessary for modern browsers. Consider modifying your JavaScript build process to not transpile [Baseline](https://web.dev/baseline) features, unless you know you must support legacy browsers. [Learn why most sites can deploy ES6+ code without transpiling](https://philipwalton.com/articles/the-state-of-es5-on-the-web/)"
664
664
  },
665
665
  "core/audits/byte-efficiency/legacy-javascript.js | detectedCoreJs2Warning": {
666
666
  "message": "Version 2 of core-js was detected on the page. You should upgrade to version 3 for many performance improvements."
@@ -660,7 +660,7 @@
660
660
  "message": "Ûśê v́îd́êó f̂ór̂ḿât́ŝ f́ôŕ âńîḿât́êd́ ĉón̂t́êńt̂"
661
661
  },
662
662
  "core/audits/byte-efficiency/legacy-javascript.js | description": {
663
- "message": "P̂ól̂ýf̂íl̂ĺŝ án̂d́ t̂ŕâńŝf́ôŕm̂ś êńâb́l̂é l̂éĝáĉý b̂ŕôẃŝér̂ś t̂ó ûśê ńêẃ Ĵáv̂áŜćr̂íp̂t́ f̂éât́ûŕêś. Ĥóŵév̂ér̂, ḿâńŷ ár̂én̂'t́ n̂éĉéŝśâŕŷ f́ôŕ m̂ód̂ér̂ń b̂ŕôẃŝér̂ś. F̂ór̂ ýôúr̂ b́ûńd̂ĺêd́ Ĵáv̂áŜćr̂íp̂t́, âd́ôṕt̂ á m̂ód̂ér̂ń ŝćr̂íp̂t́ d̂éĺôýén̂t́ ŝt́r̂át̂éĝý ûśîńĝ [ḿôd́ûĺê/ôḿôd́ûĺê f́êát̂úr̂é d̂ééĉt́îón̂](https://philipwalton.com/articles/deploying-es2015-code-in-production-today/) t́ô ŕêd́ûćê t́ĥé âḿún̂ ôf́ ĉód̂ ŝh́îṕp̂éd̂ ô ḿôd́êŕr̂ŵśêŕŝ, ẃĥíl̂ r̂éáîńńĝ śûṕp̂ór̂t́ f̂ór̂ ĺêǵâć b́r̂óŵśêŕŝ. [Ĺêár̂ń ĥóŵ t́ śêŕv̂é m̂ód̂ér̂ń Ĵv̂áŜćr̂íp̂t́](https://web.dev/articles/codelab-serve-modern-code)"
663
+ "message": "P̂ól̂ýf̂íl̂ĺŝ án̂d́ t̂ŕâńŝf́ôŕm̂ś êńâb́l̂é l̂éĝáĉý b̂ŕôẃŝér̂ś t̂ó ûśê ńêẃ Ĵáv̂áŜćr̂íp̂t́ f̂éât́ûŕêś. Ĥóŵév̂ér̂, ḿâńŷ ár̂én̂'t́ n̂éĉéŝśâŕŷ f́ôŕ m̂ód̂ér̂ń b̂ŕôẃŝér̂ś. Ĉón̂śîd́êŕ m̂ód̂íf̂ýîńĝ ýôúr̂ âv́âŚĉŕîṕ b́ûíl̂d́ p̂ŕôćêśŝ ô ńt́ t̂ŕâńŝṕîĺê [B́âśêĺńê](https://web.dev/baseline) f́êát̂úr̂éŝ, ún̂ĺêśŝ ýôú k̂ńôẃ ŷóû ḿûśt̂ śûṕp̂ór̂t́ l̂éĝáĉý b̂ŕôẃŝér̂ś. [L̂éâŕn̂ ẃĥý m̂óŝt́ ŝít̂éŝ ćâń d̂ép̂ĺôý ÊŚ6+ ĉód̂é ŵít̂h́ôút̂ t́r̂án̂śp̂íl̂ín̂ǵ](https://philipwalton.com/articles/the-state-of-es5-on-the-web/)"
664
664
  },
665
665
  "core/audits/byte-efficiency/legacy-javascript.js | detectedCoreJs2Warning": {
666
666
  "message": "V̂ér̂śîón̂ 2 óf̂ ćôŕê-j́ŝ ẃâś d̂ét̂éĉt́êd́ ôń t̂h́ê ṕâǵê. Ýôú ŝh́ôúl̂d́ ûṕĝŕâd́ê t́ô v́êŕŝíôń 3 f̂ór̂ ḿâńŷ ṕêŕf̂ór̂ḿâńĉé îḿp̂ŕôv́êḿêńt̂ś."