lighthouse 10.0.2 → 10.1.0-dev.20230324

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 (117) hide show
  1. package/cli/bin.js +1 -1
  2. package/cli/run.js +1 -1
  3. package/cli/test/smokehouse/config/exclusions.js +0 -2
  4. package/cli/test/smokehouse/lighthouse-runners/bundle.js +1 -1
  5. package/core/audits/audit.d.ts +6 -0
  6. package/core/audits/audit.js +16 -4
  7. package/core/audits/bootup-time.js +2 -3
  8. package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +4 -0
  9. package/core/audits/byte-efficiency/byte-efficiency-audit.js +8 -2
  10. package/core/audits/byte-efficiency/legacy-javascript.d.ts +5 -0
  11. package/core/audits/byte-efficiency/legacy-javascript.js +42 -16
  12. package/core/audits/byte-efficiency/polyfill-graph-data.json +50 -50
  13. package/core/audits/byte-efficiency/total-byte-weight.js +1 -1
  14. package/core/audits/byte-efficiency/unminified-javascript.js +2 -1
  15. package/core/audits/byte-efficiency/uses-long-cache-ttl.js +2 -2
  16. package/core/audits/byte-efficiency/uses-responsive-images-snapshot.js +4 -0
  17. package/core/audits/dobetterweb/doctype.js +3 -2
  18. package/core/audits/long-tasks.js +2 -1
  19. package/core/audits/mainthread-work-breakdown.js +2 -1
  20. package/core/audits/network-rtt.js +1 -1
  21. package/core/audits/network-server-latency.js +2 -1
  22. package/core/audits/performance-budget.js +1 -1
  23. package/core/audits/prioritize-lcp-image.js +1 -1
  24. package/core/audits/seo/tap-targets.js +1 -1
  25. package/core/audits/third-party-summary.js +4 -1
  26. package/core/audits/timing-budget.js +2 -1
  27. package/core/audits/uses-rel-preconnect.js +1 -1
  28. package/core/audits/uses-rel-preload.js +1 -1
  29. package/core/audits/valid-source-maps.js +1 -1
  30. package/core/audits/work-during-interaction.js +1 -1
  31. package/core/computed/metrics/cumulative-layout-shift.d.ts +3 -3
  32. package/core/computed/metrics/cumulative-layout-shift.js +21 -9
  33. package/core/computed/unused-css.js +8 -7
  34. package/core/config/lr-mobile-config.js +0 -11
  35. package/core/gather/driver/prepare.js +15 -0
  36. package/core/gather/gatherers/image-elements.js +1 -0
  37. package/core/gather/gatherers/link-elements.js +2 -0
  38. package/core/lib/asset-saver.js +2 -12
  39. package/core/lib/i18n/i18n.d.ts +1 -1
  40. package/core/lib/i18n/i18n.js +1 -1
  41. package/core/lib/lighthouse-compatibility.js +17 -0
  42. package/core/lib/network-request.js +1 -1
  43. package/core/lib/page-functions.d.ts +17 -5
  44. package/core/lib/page-functions.js +41 -22
  45. package/core/lib/tracehouse/trace-processor.d.ts +8 -0
  46. package/core/lib/tracehouse/trace-processor.js +27 -6
  47. package/core/lib/url-utils.js +1 -1
  48. package/core/runner.js +1 -0
  49. package/dist/report/bundle.esm.js +258 -45
  50. package/dist/report/flow.js +18 -18
  51. package/dist/report/standalone.js +17 -17
  52. package/flow-report/src/i18n/i18n.d.ts +6 -0
  53. package/flow-report/src/summary/category.tsx +0 -1
  54. package/package.json +6 -7
  55. package/report/assets/styles.css +89 -5
  56. package/report/renderer/components.js +1 -1
  57. package/report/renderer/details-renderer.d.ts +26 -6
  58. package/report/renderer/details-renderer.js +144 -21
  59. package/report/renderer/performance-category-renderer.js +3 -3
  60. package/report/renderer/report-renderer.js +1 -0
  61. package/report/renderer/report-ui-features.js +18 -9
  62. package/report/renderer/report-utils.d.ts +13 -4
  63. package/report/renderer/report-utils.js +43 -11
  64. package/shared/localization/locales/ar-XB.json +1 -1
  65. package/shared/localization/locales/ar.json +1 -1
  66. package/shared/localization/locales/bg.json +1 -1
  67. package/shared/localization/locales/ca.json +1 -1
  68. package/shared/localization/locales/cs.json +1 -1
  69. package/shared/localization/locales/da.json +1 -1
  70. package/shared/localization/locales/de.json +1 -1
  71. package/shared/localization/locales/el.json +1 -1
  72. package/shared/localization/locales/en-GB.json +1 -1
  73. package/shared/localization/locales/en-US.json +11 -2
  74. package/shared/localization/locales/en-XA.json +1 -1
  75. package/shared/localization/locales/en-XL.json +11 -2
  76. package/shared/localization/locales/es-419.json +1 -1
  77. package/shared/localization/locales/es.json +1 -1
  78. package/shared/localization/locales/fi.json +1 -1
  79. package/shared/localization/locales/fil.json +1 -1
  80. package/shared/localization/locales/fr.json +1 -1
  81. package/shared/localization/locales/he.json +1 -1
  82. package/shared/localization/locales/hi.json +1 -1
  83. package/shared/localization/locales/hr.json +1 -1
  84. package/shared/localization/locales/hu.json +1 -1
  85. package/shared/localization/locales/id.json +1 -1
  86. package/shared/localization/locales/it.json +1 -1
  87. package/shared/localization/locales/ja.json +1 -1
  88. package/shared/localization/locales/ko.json +1 -1
  89. package/shared/localization/locales/lt.json +1 -1
  90. package/shared/localization/locales/lv.json +1 -1
  91. package/shared/localization/locales/nl.json +1 -1
  92. package/shared/localization/locales/no.json +1 -1
  93. package/shared/localization/locales/pl.json +1 -1
  94. package/shared/localization/locales/pt-PT.json +1 -1
  95. package/shared/localization/locales/pt.json +1 -1
  96. package/shared/localization/locales/ro.json +1 -1
  97. package/shared/localization/locales/ru.json +1 -1
  98. package/shared/localization/locales/sk.json +1 -1
  99. package/shared/localization/locales/sl.json +1 -1
  100. package/shared/localization/locales/sr-Latn.json +1 -1
  101. package/shared/localization/locales/sr.json +1 -1
  102. package/shared/localization/locales/sv.json +1 -1
  103. package/shared/localization/locales/ta.json +1 -1
  104. package/shared/localization/locales/te.json +1 -1
  105. package/shared/localization/locales/th.json +1 -1
  106. package/shared/localization/locales/tr.json +1 -1
  107. package/shared/localization/locales/uk.json +1 -1
  108. package/shared/localization/locales/vi.json +1 -1
  109. package/shared/localization/locales/zh-HK.json +1 -1
  110. package/shared/localization/locales/zh-TW.json +1 -1
  111. package/shared/localization/locales/zh.json +1 -1
  112. package/shared/tsconfig.json +1 -1
  113. package/shared/util.d.ts +6 -0
  114. package/shared/util.js +33 -0
  115. package/types/artifacts.d.ts +6 -1
  116. package/types/internal/node.d.ts +15 -2
  117. package/types/lhr/audit-details.d.ts +35 -11
package/cli/bin.js CHANGED
@@ -115,7 +115,7 @@ async function begin() {
115
115
  }
116
116
 
117
117
  // By default, cliFlags.enableErrorReporting is undefined so the user is
118
- // prompted. This can be overriden with an explicit flag or by the cached
118
+ // prompted. This can be overridden with an explicit flag or by the cached
119
119
  // answer returned by askPermission().
120
120
  if (typeof cliFlags.enableErrorReporting === 'undefined') {
121
121
  cliFlags.enableErrorReporting = await askPermission();
package/cli/run.js CHANGED
@@ -241,7 +241,7 @@ async function runLighthouse(url, flags, config) {
241
241
  if (flags.legacyNavigation) {
242
242
  log.warn('CLI', 'Legacy navigation CLI is deprecated');
243
243
  flags.channel = 'legacy-navigation-cli';
244
- } else {
244
+ } else if (!flags.channel) {
245
245
  flags.channel = 'cli';
246
246
  }
247
247
 
@@ -25,8 +25,6 @@ const exclusions = {
25
25
  'metrics-tricky-tti', 'metrics-tricky-tti-late-fcp', 'screenshot',
26
26
  // Disabled because of differences that need further investigation
27
27
  'byte-efficiency', 'byte-gzip', 'perf-preload',
28
- // https://bugs.chromium.org/p/chromium/issues/detail?id=1420418
29
- 'issues-mixed-content',
30
28
  ],
31
29
  };
32
30
 
@@ -63,7 +63,7 @@ async function runBundledLighthouse(url, config, testRunnerOptions) {
63
63
  }
64
64
 
65
65
  // Load bundle, which creates a `global.runBundledLighthouse`.
66
- eval(fs.readFileSync(LH_ROOT + '/dist/lighthouse-dt-bundle.js', 'utf-8'));
66
+ await import(LH_ROOT + '/dist/lighthouse-dt-bundle.js');
67
67
 
68
68
  global.require = originalRequire;
69
69
  global.Buffer = originalBuffer;
@@ -1,10 +1,16 @@
1
1
  export type TableOptions = {
2
2
  wastedMs?: number | undefined;
3
3
  wastedBytes?: number | undefined;
4
+ sortedBy?: LH.Audit.Details.Table['sortedBy'] | undefined;
5
+ skipSumming?: LH.Audit.Details.Table['skipSumming'] | undefined;
6
+ isEntityGrouped?: LH.Audit.Details.Table['isEntityGrouped'] | undefined;
4
7
  };
5
8
  export type OpportunityOptions = {
6
9
  overallSavingsMs: number;
7
10
  overallSavingsBytes?: number | undefined;
11
+ sortedBy?: LH.Audit.Details.Opportunity['sortedBy'] | undefined;
12
+ skipSumming?: LH.Audit.Details.Opportunity['skipSumming'] | undefined;
13
+ isEntityGrouped?: LH.Audit.Details.Opportunity['isEntityGrouped'] | undefined;
8
14
  };
9
15
  export class Audit {
10
16
  /**
@@ -15,12 +15,18 @@ const DEFAULT_PASS = 'defaultPass';
15
15
  * @typedef TableOptions
16
16
  * @property {number=} wastedMs
17
17
  * @property {number=} wastedBytes
18
+ * @property {LH.Audit.Details.Table['sortedBy']=} sortedBy
19
+ * @property {LH.Audit.Details.Table['skipSumming']=} skipSumming
20
+ * @property {LH.Audit.Details.Table['isEntityGrouped']=} isEntityGrouped
18
21
  */
19
22
 
20
23
  /**
21
24
  * @typedef OpportunityOptions
22
25
  * @property {number} overallSavingsMs
23
26
  * @property {number=} overallSavingsBytes
27
+ * @property {LH.Audit.Details.Opportunity['sortedBy']=} sortedBy
28
+ * @property {LH.Audit.Details.Opportunity['skipSumming']=} skipSumming
29
+ * @property {LH.Audit.Details.Opportunity['isEntityGrouped']=} isEntityGrouped
24
30
  */
25
31
 
26
32
  /**
@@ -75,7 +81,7 @@ class Audit {
75
81
  * @return {LH.Audit.Product|Promise<LH.Audit.Product>}
76
82
  */
77
83
  static audit(artifacts, context) {
78
- throw new Error('audit() method must be overriden');
84
+ throw new Error('audit() method must be overridden');
79
85
  }
80
86
 
81
87
  /* eslint-enable no-unused-vars */
@@ -139,7 +145,7 @@ class Audit {
139
145
  * @return {LH.Audit.Details.Table}
140
146
  */
141
147
  static makeTableDetails(headings, results, options = {}) {
142
- const {wastedBytes, wastedMs} = options;
148
+ const {wastedBytes, wastedMs, sortedBy, skipSumming, isEntityGrouped} = options;
143
149
  const summary = (wastedBytes || wastedMs) ? {wastedBytes, wastedMs} : undefined;
144
150
  if (results.length === 0) {
145
151
  return {
@@ -157,6 +163,9 @@ class Audit {
157
163
  headings: headings,
158
164
  items: results,
159
165
  summary,
166
+ sortedBy,
167
+ skipSumming,
168
+ isEntityGrouped,
160
169
  };
161
170
  }
162
171
 
@@ -216,7 +225,7 @@ class Audit {
216
225
  const lineNumber = lineIndex + 1;
217
226
  /** @type LH.Audit.Details.SnippetValue['lines'][0] */
218
227
  const lineDetail = {
219
- content: line.slice(0, maxLineLength),
228
+ content: Util.truncate(line, maxLineLength),
220
229
  lineNumber,
221
230
  };
222
231
  if (line.length > maxLineLength) {
@@ -234,7 +243,7 @@ class Audit {
234
243
  */
235
244
  static makeOpportunityDetails(headings, items, options) {
236
245
  Audit.assertHeadingKeysExist(headings, items);
237
- const {overallSavingsMs, overallSavingsBytes} = options;
246
+ const {overallSavingsMs, overallSavingsBytes, sortedBy, skipSumming, isEntityGrouped} = options;
238
247
 
239
248
  return {
240
249
  type: 'opportunity',
@@ -242,6 +251,9 @@ class Audit {
242
251
  items,
243
252
  overallSavingsMs,
244
253
  overallSavingsBytes,
254
+ sortedBy,
255
+ skipSumming,
256
+ isEntityGrouped,
245
257
  };
246
258
  }
247
259
 
@@ -117,8 +117,6 @@ class BootupTime extends Audit {
117
117
  runWarnings = [str_(UIStrings.chromeExtensionsWarning)];
118
118
  }
119
119
 
120
- const summary = {wastedMs: totalBootupTime};
121
-
122
120
  /** @type {LH.Audit.Details.Table['headings']} */
123
121
  const headings = [
124
122
  {key: 'url', valueType: 'url', label: str_(i18n.UIStrings.columnURL)},
@@ -128,7 +126,8 @@ class BootupTime extends Audit {
128
126
  label: str_(UIStrings.columnScriptParse)},
129
127
  ];
130
128
 
131
- const details = BootupTime.makeTableDetails(headings, results, summary);
129
+ const details = BootupTime.makeTableDetails(headings, results,
130
+ {wastedMs: totalBootupTime, sortedBy: ['total']});
132
131
 
133
132
  const score = Audit.computeLogNormalScore(
134
133
  {p10: context.options.p10, median: context.options.median},
@@ -7,6 +7,7 @@ export type ByteEfficiencyProduct = {
7
7
  displayValue?: import("../../index.js").IcuMessage | undefined;
8
8
  explanation?: import("../../index.js").IcuMessage | undefined;
9
9
  warnings?: (string | import("../../index.js").IcuMessage)[] | undefined;
10
+ sortedBy?: string[] | undefined;
10
11
  };
11
12
  /**
12
13
  * @typedef {object} ByteEfficiencyProduct
@@ -16,6 +17,7 @@ export type ByteEfficiencyProduct = {
16
17
  * @property {LH.IcuMessage} [displayValue]
17
18
  * @property {LH.IcuMessage} [explanation]
18
19
  * @property {Array<string | LH.IcuMessage>} [warnings]
20
+ * @property {Array<string>} [sortedBy]
19
21
  */
20
22
  /**
21
23
  * @overview Used as the base for all byte efficiency audits. Computes total bytes
@@ -24,6 +26,8 @@ export type ByteEfficiencyProduct = {
24
26
  export class ByteEfficiencyAudit extends Audit {
25
27
  /**
26
28
  * Creates a score based on the wastedMs value using linear interpolation between control points.
29
+ * A negative wastedMs is scored as 1, assuming time is not being wasted with respect to the
30
+ * opportunity being measured.
27
31
  *
28
32
  * @param {number} wastedMs
29
33
  * @return {number}
@@ -29,6 +29,7 @@ const WASTED_MS_FOR_SCORE_OF_ZERO = 5000;
29
29
  * @property {LH.IcuMessage} [displayValue]
30
30
  * @property {LH.IcuMessage} [explanation]
31
31
  * @property {Array<string | LH.IcuMessage>} [warnings]
32
+ * @property {Array<string>} [sortedBy]
32
33
  */
33
34
 
34
35
  /**
@@ -38,12 +39,14 @@ const WASTED_MS_FOR_SCORE_OF_ZERO = 5000;
38
39
  class ByteEfficiencyAudit extends Audit {
39
40
  /**
40
41
  * Creates a score based on the wastedMs value using linear interpolation between control points.
42
+ * A negative wastedMs is scored as 1, assuming time is not being wasted with respect to the
43
+ * opportunity being measured.
41
44
  *
42
45
  * @param {number} wastedMs
43
46
  * @return {number}
44
47
  */
45
48
  static scoreForWastedMs(wastedMs) {
46
- if (wastedMs === 0) {
49
+ if (wastedMs <= 0) {
47
50
  return 1;
48
51
  } else if (wastedMs < WASTED_MS_FOR_AVERAGE) {
49
52
  return linearInterpolation(0, 1, WASTED_MS_FOR_AVERAGE, 0.75, wastedMs);
@@ -213,6 +216,8 @@ class ByteEfficiencyAudit extends Audit {
213
216
 
214
217
  const wastedBytes = results.reduce((sum, item) => sum + item.wastedBytes, 0);
215
218
 
219
+ // `wastedMs` may be negative, if making the opportunity change could be detrimental.
220
+ // This is useful information in the LHR and should be preserved.
216
221
  let wastedMs;
217
222
  if (gatherContext.gatherMode === 'navigation') {
218
223
  if (!graph) throw Error('Page dependency graph should always be computed in navigation mode');
@@ -228,8 +233,9 @@ class ByteEfficiencyAudit extends Audit {
228
233
  displayValue = str_(i18n.UIStrings.displayValueByteSavings, {wastedBytes});
229
234
  }
230
235
 
236
+ const sortedBy = result.sortedBy || ['wastedBytes'];
231
237
  const details = Audit.makeOpportunityDetails(result.headings, results,
232
- {overallSavingsMs: wastedMs, overallSavingsBytes: wastedBytes});
238
+ {overallSavingsMs: wastedMs, overallSavingsBytes: wastedBytes, sortedBy});
233
239
 
234
240
  return {
235
241
  explanation: result.explanation,
@@ -28,6 +28,11 @@ declare class LegacyJavascript extends ByteEfficiencyAudit {
28
28
  */
29
29
  static buildPolyfillExpression(object: string | null, property: string): string;
30
30
  static getPolyfillData(): {
31
+ name: string;
32
+ modules: string[];
33
+ corejs?: boolean | undefined;
34
+ }[];
35
+ static getCoreJsPolyfillData(): {
31
36
  name: string;
32
37
  coreJs2Module: string;
33
38
  coreJs3Module: string;
@@ -177,7 +177,12 @@ class LegacyJavascript extends ByteEfficiencyAudit {
177
177
  }
178
178
 
179
179
  static getPolyfillData() {
180
- return [
180
+ /** @type {Array<{name: string, modules: string[], corejs?: boolean}>} */
181
+ const data = [
182
+ {name: 'focus-visible', modules: ['focus-visible']},
183
+ ];
184
+
185
+ const coreJsPolyfills = [
181
186
  ['Array.prototype.fill', 'es6.array.fill'],
182
187
  ['Array.prototype.filter', 'es6.array.filter'],
183
188
  ['Array.prototype.find', 'es6.array.find'],
@@ -225,15 +230,32 @@ class LegacyJavascript extends ByteEfficiencyAudit {
225
230
  ['Object.entries', 'es7.object.entries'],
226
231
  ['Object.getOwnPropertyDescriptors', 'es7.object.get-own-property-descriptors'],
227
232
  ['Object.values', 'es7.object.values'],
228
- ].map(data => {
229
- const [name, coreJs2Module] = data;
230
- return {
233
+ ];
234
+
235
+ for (const [name, coreJs2Module] of coreJsPolyfills) {
236
+ data.push({
231
237
  name,
232
- coreJs2Module,
233
- coreJs3Module: coreJs2Module
234
- .replace('es6.', 'es.')
235
- .replace('es7.', 'es.')
236
- .replace('typed.', 'typed-array.'),
238
+ modules: [
239
+ coreJs2Module,
240
+ // corejs 3 module name
241
+ coreJs2Module
242
+ .replace('es6.', 'es.')
243
+ .replace('es7.', 'es.')
244
+ .replace('typed.', 'typed-array.'),
245
+ ],
246
+ corejs: true,
247
+ });
248
+ }
249
+
250
+ return data;
251
+ }
252
+
253
+ static getCoreJsPolyfillData() {
254
+ return this.getPolyfillData().filter(d => d.corejs).map(d => {
255
+ return {
256
+ name: d.name,
257
+ coreJs2Module: d.modules[0],
258
+ coreJs3Module: d.modules[1],
237
259
  };
238
260
  });
239
261
  }
@@ -242,15 +264,20 @@ class LegacyJavascript extends ByteEfficiencyAudit {
242
264
  * @return {Pattern[]}
243
265
  */
244
266
  static getPolyfillPatterns() {
245
- return this.getPolyfillData().map(({name}) => {
267
+ /** @type {Pattern[]} */
268
+ const patterns = [];
269
+
270
+ for (const {name} of this.getCoreJsPolyfillData()) {
246
271
  const parts = name.split('.');
247
272
  const object = parts.length > 1 ? parts.slice(0, parts.length - 1).join('.') : null;
248
273
  const property = parts[parts.length - 1];
249
- return {
274
+ patterns.push({
250
275
  name,
251
276
  expression: this.buildPolyfillExpression(object, property),
252
- };
253
- });
277
+ });
278
+ }
279
+
280
+ return patterns;
254
281
  }
255
282
 
256
283
  /**
@@ -301,12 +328,12 @@ class LegacyJavascript extends ByteEfficiencyAudit {
301
328
  // If it's a bundle with source maps, add in the polyfill modules by name too.
302
329
  const bundle = bundles.find(b => b.script.scriptId === script.scriptId);
303
330
  if (bundle) {
304
- for (const {coreJs2Module, coreJs3Module, name} of polyfillData) {
331
+ for (const {name, modules} of polyfillData) {
305
332
  // Skip if the pattern matching found a match for this polyfill.
306
333
  if (matches.some(m => m.name === name)) continue;
307
334
 
308
335
  const source = bundle.rawMap.sources.find(source =>
309
- source.endsWith(`${coreJs2Module}.js`) || source.endsWith(`${coreJs3Module}.js`));
336
+ modules.some(module => source.endsWith(`${module}.js`)));
310
337
  if (!source) continue;
311
338
 
312
339
  const mapping = bundle.map.mappings().find(m => m.sourceURL === source);
@@ -344,7 +371,6 @@ class LegacyJavascript extends ByteEfficiencyAudit {
344
371
  }
345
372
  }
346
373
 
347
- if (polyfillResults.length > 0) estimatedWastedBytesFromPolyfills += graph.baseSize;
348
374
  estimatedWastedBytesFromPolyfills += [...modulesSeen].reduce((acc, moduleIndex) => {
349
375
  return acc + graph.moduleSizes[moduleIndex];
350
376
  }, 0);
@@ -1,54 +1,54 @@
1
1
  {
2
- "moduleSizes": [498, 265, 277, 263, 453, 219, 216, 546, 339, 1608, 671, 1525, 420, 214, 504, 98, 524, 196, 268, 642, 204, 742, 618, 169, 394, 127, 433, 1473, 779, 239, 144, 182, 254, 77, 508, 124, 1388, 75, 133, 301, 362, 170, 1078, 182, 490, 195, 321, 316, 447, 551, 216, 284, 253, 17, 107, 295, 356, 345, 1939, 1596, 291, 139, 259, 1291, 179, 528, 174, 61, 326, 20, 444, 522, 104, 1945, 120, 1943, 680, 1409, 850, 630, 288, 38, 695, 569, 106, 587, 208, 370, 606, 766, 535, 616, 200, 170, 224, 422, 970, 978, 498, 284, 241, 210, 151, 194, 178, 814, 205, 189, 215, 111, 236, 147, 237, 191, 691, 212, 432, 499, 445, 176, 333, 129, 414, 617, 380, 251, 199, 524, 515, 681, 160, 259, 295, 283, 178, 472, 786, 520, 202, 575, 575, 349, 549, 458, 166, 173, 508, 1522, 743, 414, 431, 393, 899, 137, 270, 131, 472, 457, 205, 778, 801, 133],
2
+ "moduleSizes": [11897, 498, 265, 277, 263, 453, 219, 216, 546, 339, 1608, 671, 1525, 420, 214, 504, 98, 524, 196, 268, 642, 204, 742, 618, 169, 394, 127, 433, 1473, 779, 239, 144, 182, 254, 77, 508, 124, 1388, 75, 133, 301, 362, 170, 1078, 182, 490, 195, 321, 316, 447, 551, 216, 284, 253, 17, 107, 295, 356, 345, 1939, 1596, 291, 139, 259, 1291, 179, 528, 174, 61, 326, 20, 444, 522, 104, 1945, 120, 1943, 680, 1409, 850, 630, 288, 38, 695, 569, 106, 587, 208, 370, 606, 766, 535, 616, 200, 170, 224, 422, 970, 978, 498, 284, 241, 210, 151, 194, 178, 814, 205, 189, 215, 111, 236, 147, 237, 191, 691, 212, 432, 499, 445, 176, 333, 129, 414, 617, 380, 251, 199, 524, 515, 681, 160, 259, 295, 283, 178, 472, 786, 520, 202, 575, 575, 349, 549, 458, 166, 173, 508, 1522, 743, 414, 431, 393, 899, 137, 270, 131, 472, 457, 205, 778, 801, 133, 3000],
3
3
  "dependencies": {
4
- "Array.prototype.fill": [4, 7, 10, 20, 22, 24, 25, 28, 35, 36, 53, 54, 56, 57, 59, 65, 72, 73, 74, 75, 76, 78, 80, 81, 85, 86, 87, 91, 93, 100, 101, 102, 103, 113, 115],
5
- "Array.prototype.filter": [10, 11, 12, 16, 17, 20, 21, 22, 24, 25, 28, 35, 36, 40, 45, 53, 56, 57, 59, 61, 63, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 107, 113, 116],
6
- "Array.prototype.find": [4, 10, 11, 16, 17, 20, 21, 22, 24, 25, 28, 35, 36, 40, 45, 53, 54, 56, 57, 59, 61, 63, 65, 72, 73, 74, 75, 76, 78, 80, 81, 85, 86, 87, 91, 93, 100, 101, 102, 103, 107, 113, 118],
7
- "Array.prototype.findIndex": [4, 10, 11, 16, 17, 20, 21, 22, 24, 25, 28, 35, 36, 40, 45, 53, 54, 56, 57, 59, 61, 63, 65, 72, 73, 74, 75, 76, 78, 80, 81, 85, 86, 87, 91, 93, 100, 101, 102, 103, 107, 113, 117],
8
- "Array.prototype.forEach": [8, 10, 11, 13, 16, 17, 20, 21, 22, 24, 25, 28, 35, 36, 40, 45, 53, 56, 57, 59, 61, 63, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 107, 113, 119],
9
- "Array.from": [9, 10, 18, 19, 20, 21, 22, 24, 25, 26, 28, 35, 36, 40, 45, 48, 49, 53, 56, 57, 59, 60, 63, 65, 71, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 107, 113, 120],
10
- "Array.isArray": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 61, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 121],
11
- "Array.prototype.map": [10, 11, 12, 16, 17, 20, 21, 22, 24, 25, 28, 35, 36, 40, 45, 53, 56, 57, 59, 61, 63, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 107, 113, 122],
12
- "Array.of": [10, 20, 21, 22, 24, 25, 26, 28, 35, 36, 53, 56, 57, 59, 63, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 107, 113, 123],
13
- "Array.prototype.some": [10, 11, 13, 16, 17, 20, 21, 22, 24, 25, 28, 35, 36, 40, 45, 53, 56, 57, 59, 61, 63, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 107, 113, 124],
14
- "Date.now": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 125],
15
- "Date.prototype.toISOString": [10, 20, 21, 22, 24, 25, 27, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 97, 98, 100, 101, 102, 103, 107, 108, 113, 126],
16
- "Date.prototype.toJSON": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 127],
17
- "Date.prototype.toString": [24, 25, 28, 53, 57, 59, 73, 93, 113, 128],
18
- "Function.prototype.name": [129],
19
- "Number.isInteger": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 66, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 130],
20
- "Number.isSafeInteger": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 66, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 131],
21
- "Object.defineProperties": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 76, 78, 80, 81, 85, 86, 87, 91, 93, 100, 101, 102, 103, 113, 132],
22
- "Object.defineProperty": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 133],
23
- "Object.freeze": [6, 10, 14, 20, 22, 24, 25, 26, 28, 35, 36, 38, 53, 56, 57, 58, 59, 65, 72, 73, 74, 78, 79, 80, 81, 83, 85, 87, 91, 93, 100, 101, 102, 103, 113, 135],
24
- "Object.getPrototypeOf": [10, 20, 22, 23, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 82, 85, 87, 91, 93, 100, 101, 102, 103, 113, 137],
25
- "Object.isExtensible": [6, 10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 83, 85, 87, 91, 93, 100, 101, 102, 103, 113, 138],
26
- "Object.isFrozen": [6, 10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 139],
27
- "Object.isSealed": [6, 10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 140],
28
- "Object.keys": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 86, 87, 91, 93, 100, 101, 102, 103, 113, 141],
29
- "Object.preventExtensions": [6, 10, 14, 20, 22, 24, 25, 26, 28, 35, 36, 38, 53, 56, 57, 58, 59, 65, 72, 73, 74, 78, 79, 80, 81, 83, 85, 87, 91, 93, 100, 101, 102, 103, 113, 142],
30
- "Object.seal": [6, 10, 14, 20, 22, 24, 25, 26, 28, 35, 36, 38, 53, 56, 57, 58, 59, 65, 72, 73, 74, 78, 79, 80, 81, 83, 85, 87, 91, 93, 100, 101, 102, 103, 113, 143],
31
- "Object.setPrototypeOf": [3, 10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 88, 91, 93, 100, 101, 102, 103, 113, 144],
32
- "Reflect.apply": [10, 20, 22, 24, 25, 28, 35, 36, 39, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 146],
33
- "Reflect.construct": [2, 10, 15, 20, 21, 22, 24, 25, 28, 35, 36, 39, 42, 53, 54, 56, 57, 59, 63, 65, 72, 73, 74, 75, 76, 78, 80, 81, 85, 86, 87, 91, 93, 100, 101, 102, 103, 107, 113, 147],
34
- "Reflect.defineProperty": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 148],
35
- "Reflect.deleteProperty": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 149],
36
- "Reflect.get": [10, 20, 22, 23, 24, 25, 28, 35, 36, 53, 56, 57, 59, 64, 65, 72, 73, 74, 78, 80, 81, 82, 85, 87, 91, 93, 100, 101, 102, 103, 113, 152],
37
- "Reflect.getOwnPropertyDescriptor": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 150],
38
- "Reflect.getPrototypeOf": [10, 20, 22, 23, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 82, 85, 87, 91, 93, 100, 101, 102, 103, 113, 151],
39
- "Reflect.has": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 153],
40
- "Reflect.isExtensible": [6, 10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 83, 85, 87, 91, 93, 100, 101, 102, 103, 113, 154],
41
- "Reflect.ownKeys": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 155],
42
- "Reflect.preventExtensions": [10, 20, 22, 24, 25, 28, 35, 36, 38, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 156],
43
- "Reflect.setPrototypeOf": [3, 10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 88, 91, 93, 100, 101, 102, 103, 113, 157],
44
- "String.prototype.codePointAt": [10, 20, 21, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 96, 100, 101, 102, 103, 107, 108, 113, 158],
45
- "String.fromCodePoint": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 159],
46
- "String.raw": [10, 20, 21, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 107, 108, 113, 160],
47
- "String.prototype.repeat": [10, 20, 21, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 98, 100, 101, 102, 103, 107, 108, 113, 161],
48
- "Object.entries": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 86, 87, 89, 91, 93, 100, 101, 102, 103, 113, 134],
49
- "Object.getOwnPropertyDescriptors": [10, 20, 22, 24, 25, 26, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 87, 91, 93, 100, 101, 102, 103, 113, 136],
50
- "Object.values": [10, 20, 22, 24, 25, 28, 35, 36, 53, 56, 57, 59, 65, 72, 73, 74, 78, 80, 81, 85, 86, 87, 89, 91, 93, 100, 101, 102, 103, 113, 145]
4
+ "Array.prototype.fill": [0, 5, 8, 11, 21, 23, 25, 26, 29, 36, 37, 54, 55, 57, 58, 60, 66, 73, 74, 75, 76, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 114, 116],
5
+ "Array.prototype.filter": [0, 11, 12, 13, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 57, 58, 60, 62, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 117],
6
+ "Array.prototype.find": [0, 5, 11, 12, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 55, 57, 58, 60, 62, 64, 66, 73, 74, 75, 76, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 108, 114, 119],
7
+ "Array.prototype.findIndex": [0, 5, 11, 12, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 55, 57, 58, 60, 62, 64, 66, 73, 74, 75, 76, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 108, 114, 118],
8
+ "Array.prototype.forEach": [0, 9, 11, 12, 14, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 57, 58, 60, 62, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 120],
9
+ "Array.from": [0, 10, 11, 19, 20, 21, 22, 23, 25, 26, 27, 29, 36, 37, 41, 46, 49, 50, 54, 57, 58, 60, 61, 64, 66, 72, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 121],
10
+ "Array.isArray": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 62, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 122],
11
+ "Array.prototype.map": [0, 11, 12, 13, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 57, 58, 60, 62, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 123],
12
+ "Array.of": [0, 11, 21, 22, 23, 25, 26, 27, 29, 36, 37, 54, 57, 58, 60, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 124],
13
+ "Array.prototype.some": [0, 11, 12, 14, 17, 18, 21, 22, 23, 25, 26, 29, 36, 37, 41, 46, 54, 57, 58, 60, 62, 64, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 114, 125],
14
+ "Date.now": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 126],
15
+ "Date.prototype.toISOString": [0, 11, 21, 22, 23, 25, 26, 28, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 98, 99, 101, 102, 103, 104, 108, 109, 114, 127],
16
+ "Date.prototype.toJSON": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 128],
17
+ "Date.prototype.toString": [0, 25, 26, 29, 54, 58, 60, 74, 94, 114, 129],
18
+ "Function.prototype.name": [0, 130],
19
+ "Number.isInteger": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 67, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 131],
20
+ "Number.isSafeInteger": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 67, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 132],
21
+ "Object.defineProperties": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 114, 133],
22
+ "Object.defineProperty": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 134],
23
+ "Object.freeze": [0, 7, 11, 15, 21, 23, 25, 26, 27, 29, 36, 37, 39, 54, 57, 58, 59, 60, 66, 73, 74, 75, 79, 80, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 136],
24
+ "Object.getPrototypeOf": [0, 11, 21, 23, 24, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 83, 86, 88, 92, 94, 101, 102, 103, 104, 114, 138],
25
+ "Object.isExtensible": [0, 7, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 139],
26
+ "Object.isFrozen": [0, 7, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 140],
27
+ "Object.isSealed": [0, 7, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 141],
28
+ "Object.keys": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 114, 142],
29
+ "Object.preventExtensions": [0, 7, 11, 15, 21, 23, 25, 26, 27, 29, 36, 37, 39, 54, 57, 58, 59, 60, 66, 73, 74, 75, 79, 80, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 143],
30
+ "Object.seal": [0, 7, 11, 15, 21, 23, 25, 26, 27, 29, 36, 37, 39, 54, 57, 58, 59, 60, 66, 73, 74, 75, 79, 80, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 144],
31
+ "Object.setPrototypeOf": [0, 4, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 89, 92, 94, 101, 102, 103, 104, 114, 145],
32
+ "Reflect.apply": [0, 11, 21, 23, 25, 26, 29, 36, 37, 40, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 147],
33
+ "Reflect.construct": [0, 3, 11, 16, 21, 22, 23, 25, 26, 29, 36, 37, 40, 43, 54, 55, 57, 58, 60, 64, 66, 73, 74, 75, 76, 77, 79, 81, 82, 86, 87, 88, 92, 94, 101, 102, 103, 104, 108, 114, 148],
34
+ "Reflect.defineProperty": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 149],
35
+ "Reflect.deleteProperty": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 150],
36
+ "Reflect.get": [0, 11, 21, 23, 24, 25, 26, 29, 36, 37, 54, 57, 58, 60, 65, 66, 73, 74, 75, 79, 81, 82, 83, 86, 88, 92, 94, 101, 102, 103, 104, 114, 153],
37
+ "Reflect.getOwnPropertyDescriptor": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 151],
38
+ "Reflect.getPrototypeOf": [0, 11, 21, 23, 24, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 83, 86, 88, 92, 94, 101, 102, 103, 104, 114, 152],
39
+ "Reflect.has": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 154],
40
+ "Reflect.isExtensible": [0, 7, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 84, 86, 88, 92, 94, 101, 102, 103, 104, 114, 155],
41
+ "Reflect.ownKeys": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 156],
42
+ "Reflect.preventExtensions": [0, 11, 21, 23, 25, 26, 29, 36, 37, 39, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 157],
43
+ "Reflect.setPrototypeOf": [0, 4, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 89, 92, 94, 101, 102, 103, 104, 114, 158],
44
+ "String.prototype.codePointAt": [0, 11, 21, 22, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 97, 101, 102, 103, 104, 108, 109, 114, 159],
45
+ "String.fromCodePoint": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 160],
46
+ "String.raw": [0, 11, 21, 22, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 108, 109, 114, 161],
47
+ "String.prototype.repeat": [0, 11, 21, 22, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 99, 101, 102, 103, 104, 108, 109, 114, 162],
48
+ "Object.entries": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 87, 88, 90, 92, 94, 101, 102, 103, 104, 114, 135],
49
+ "Object.getOwnPropertyDescriptors": [0, 11, 21, 23, 25, 26, 27, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 88, 92, 94, 101, 102, 103, 104, 114, 137],
50
+ "Object.values": [0, 11, 21, 23, 25, 26, 29, 36, 37, 54, 57, 58, 60, 66, 73, 74, 75, 79, 81, 82, 86, 87, 88, 90, 92, 94, 101, 102, 103, 104, 114, 146],
51
+ "focus-visible": [163]
51
52
  },
52
- "maxSize": 72786,
53
- "baseSize": 11897
53
+ "maxSize": 87683
54
54
  }
@@ -93,7 +93,7 @@ class TotalByteWeight extends Audit {
93
93
  {key: 'totalBytes', valueType: 'bytes', label: str_(i18n.UIStrings.columnTransferSize)},
94
94
  ];
95
95
 
96
- const tableDetails = Audit.makeTableDetails(headings, results);
96
+ const tableDetails = Audit.makeTableDetails(headings, results, {sortedBy: ['totalBytes']});
97
97
 
98
98
  return {
99
99
  score,
@@ -8,6 +8,7 @@ import {ByteEfficiencyAudit} from './byte-efficiency-audit.js';
8
8
  import * as i18n from '../../lib/i18n/i18n.js';
9
9
  import {computeJSTokenLength as computeTokenLength} from '../../lib/minification-estimator.js';
10
10
  import {getRequestForScript, isInline} from '../../lib/script-helpers.js';
11
+ import {Util} from '../../../shared/util.js';
11
12
 
12
13
  const UIStrings = {
13
14
  /** Imperative title of a Lighthouse audit that tells the user to minify the page’s JS code to reduce file size. This is displayed in a list of audit titles that Lighthouse generates. */
@@ -84,7 +85,7 @@ class UnminifiedJavaScript extends ByteEfficiencyAudit {
84
85
  const networkRecord = getRequestForScript(networkRecords, script);
85
86
 
86
87
  const displayUrl = isInline(script) ?
87
- `inline: ${script.content.substring(0, 40)}...` :
88
+ `inline: ${Util.truncate(script.content, 40)}` :
88
89
  script.url;
89
90
  try {
90
91
  const result = UnminifiedJavaScript.computeWaste(script.content, displayUrl, networkRecord);
@@ -280,8 +280,8 @@ class CacheHeaders extends Audit {
280
280
  displayUnit: 'kb', granularity: 1},
281
281
  ];
282
282
 
283
- const summary = {wastedBytes: totalWastedBytes};
284
- const details = Audit.makeTableDetails(headings, results, summary);
283
+ const details = Audit.makeTableDetails(headings, results,
284
+ {wastedBytes: totalWastedBytes, sortedBy: ['totalBytes'], skipSumming: ['cacheLifetimeMs']});
285
285
 
286
286
  return {
287
287
  score,
@@ -56,6 +56,10 @@ class UsesResponsiveImagesSnapshot extends Audit {
56
56
  /** @type {LH.Audit.Details.TableItem[]} */
57
57
  const items = [];
58
58
  for (const image of artifacts.ImageElements) {
59
+ // Ignore CSS images because it's difficult to determine what is a spritesheet,
60
+ // and the reward-to-effort ratio for responsive CSS images is quite low https://css-tricks.com/responsive-images-css/.
61
+ if (image.isCss) continue;
62
+
59
63
  if (!image.naturalDimensions) continue;
60
64
  const actual = image.naturalDimensions;
61
65
  const displayed = UsesResponsiveImages.default.getDisplayedDimensions(
@@ -67,10 +67,11 @@ class Doctype extends Audit {
67
67
  const doctypeSystemId = artifacts.Doctype.systemId;
68
68
  const compatMode = artifacts.Doctype.documentCompatMode;
69
69
 
70
+ const trace = artifacts.traces?.[Audit.DEFAULT_PASS];
71
+
70
72
  /** @type {LH.Crdp.Audits.QuirksModeIssueDetails[]} */
71
73
  let quirksModeIssues = [];
72
- if (artifacts.traces && artifacts.InspectorIssues) {
73
- const trace = artifacts.traces[Audit.DEFAULT_PASS];
74
+ if (trace && artifacts.InspectorIssues) {
74
75
  const processedTrace = await ProcessedTrace.request(trace, context);
75
76
  const mainFrameId = processedTrace.mainFrameInfo.frameId;
76
77
  quirksModeIssues =
@@ -104,7 +104,8 @@ class LongTasks extends Audit {
104
104
  /* eslint-enable max-len */
105
105
  ];
106
106
 
107
- const tableDetails = Audit.makeTableDetails(headings, results);
107
+ const tableDetails = Audit.makeTableDetails(headings, results,
108
+ {sortedBy: ['duration'], skipSumming: ['startTime']});
108
109
 
109
110
  let displayValue;
110
111
  if (results.length > 0) {
@@ -114,7 +114,8 @@ class MainThreadWorkBreakdown extends Audit {
114
114
  ];
115
115
 
116
116
  results.sort((a, b) => categoryTotals[b.group] - categoryTotals[a.group]);
117
- const tableDetails = MainThreadWorkBreakdown.makeTableDetails(headings, results);
117
+ const tableDetails = MainThreadWorkBreakdown.makeTableDetails(headings, results,
118
+ {sortedBy: ['duration']});
118
119
 
119
120
  const score = Audit.computeLogNormalScore(
120
121
  {p10: context.options.p10, median: context.options.median},
@@ -73,7 +73,7 @@ class NetworkRTT extends Audit {
73
73
  {key: 'rtt', valueType: 'ms', granularity: 1, label: str_(i18n.UIStrings.columnTimeSpent)},
74
74
  ];
75
75
 
76
- const tableDetails = Audit.makeTableDetails(headings, results);
76
+ const tableDetails = Audit.makeTableDetails(headings, results, {sortedBy: ['rtt']});
77
77
 
78
78
  return {
79
79
  score: 1,
@@ -72,7 +72,8 @@ class NetworkServerLatency extends Audit {
72
72
  label: str_(i18n.UIStrings.columnTimeSpent)},
73
73
  ];
74
74
 
75
- const tableDetails = Audit.makeTableDetails(headings, results);
75
+ const tableDetails = Audit.makeTableDetails(headings, results,
76
+ {sortedBy: ['serverResponseTime']});
76
77
 
77
78
  return {
78
79
  score: Math.max(1 - (maxLatency / 500), 0),
@@ -144,7 +144,7 @@ class ResourceBudget extends Audit {
144
144
 
145
145
  return {
146
146
  details: Audit.makeTableDetails(headers,
147
- this.tableItems(budget, summary)),
147
+ this.tableItems(budget, summary), {sortedBy: ['sizeOverBudget']}),
148
148
  score: 1,
149
149
  };
150
150
  }