lighthouse 9.5.0-dev.20230122 → 9.5.0-dev.20230124

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 (131) hide show
  1. package/.codecov.yml +0 -5
  2. package/core/audits/audit.js +1 -1
  3. package/core/audits/bf-cache.js +1 -1
  4. package/core/audits/byte-efficiency/legacy-javascript.d.ts +1 -0
  5. package/core/audits/byte-efficiency/legacy-javascript.js +7 -3
  6. package/core/audits/dobetterweb/uses-http2.d.ts +5 -2
  7. package/core/audits/dobetterweb/uses-http2.js +12 -7
  8. package/core/audits/screenshot-thumbnails.d.ts +2 -1
  9. package/core/audits/screenshot-thumbnails.js +14 -9
  10. package/core/audits/third-party-facades.d.ts +3 -2
  11. package/core/audits/third-party-facades.js +12 -9
  12. package/core/audits/third-party-summary.d.ts +7 -6
  13. package/core/audits/third-party-summary.js +16 -14
  14. package/core/audits/valid-source-maps.d.ts +5 -3
  15. package/core/audits/valid-source-maps.js +11 -9
  16. package/core/computed/entity-classification.d.ts +29 -0
  17. package/core/computed/entity-classification.js +102 -0
  18. package/core/computed/processed-navigation.d.ts +12 -6
  19. package/core/computed/processed-navigation.js +19 -6
  20. package/core/computed/resource-summary.d.ts +4 -2
  21. package/core/computed/resource-summary.js +8 -5
  22. package/core/lib/url-utils.js +1 -1
  23. package/core/runner.d.ts +10 -0
  24. package/core/runner.js +48 -0
  25. package/core/util.cjs +43 -10
  26. package/core/util.d.cts +114 -2
  27. package/dist/report/bundle.esm.js +858 -883
  28. package/dist/report/flow.js +33 -23
  29. package/dist/report/standalone.js +27 -17
  30. package/flow-report/assets/standalone-flow-template.html +1 -1
  31. package/flow-report/src/common.tsx +1 -1
  32. package/flow-report/src/i18n/i18n.d.ts +103 -100
  33. package/flow-report/src/i18n/i18n.tsx +23 -18
  34. package/flow-report/src/sidebar/sidebar.tsx +3 -3
  35. package/flow-report/src/summary/category.tsx +7 -7
  36. package/flow-report/src/summary/summary.tsx +2 -2
  37. package/flow-report/src/topbar.tsx +4 -28
  38. package/package.json +5 -5
  39. package/readme.md +1 -1
  40. package/report/assets/standalone-template.html +1 -1
  41. package/report/assets/styles.css +3 -3
  42. package/report/assets/templates.html +4 -28
  43. package/report/renderer/category-renderer.js +19 -17
  44. package/report/renderer/components.js +119 -202
  45. package/report/renderer/crc-details-renderer.js +7 -6
  46. package/report/renderer/details-renderer.js +7 -6
  47. package/report/renderer/dom.js +1 -1
  48. package/report/renderer/element-screenshot-renderer.js +3 -3
  49. package/report/renderer/{i18n.d.ts → i18n-formatter.d.ts} +3 -9
  50. package/report/renderer/{i18n.js → i18n-formatter.js} +2 -11
  51. package/report/renderer/performance-category-renderer.js +17 -15
  52. package/report/renderer/pwa-category-renderer.js +5 -4
  53. package/report/renderer/report-globals.d.ts +21 -0
  54. package/report/renderer/report-globals.js +49 -0
  55. package/report/renderer/report-renderer.js +22 -24
  56. package/report/renderer/report-ui-features.js +9 -8
  57. package/report/renderer/report-utils.d.ts +116 -0
  58. package/report/renderer/{util.js → report-utils.js} +100 -415
  59. package/report/renderer/snippet-renderer.js +3 -2
  60. package/report/test/renderer/category-renderer-test.js +10 -5
  61. package/report/test/renderer/crc-details-renderer-test.js +8 -4
  62. package/report/test/renderer/details-renderer-test.js +8 -4
  63. package/report/test/renderer/dom-test.js +8 -4
  64. package/report/test/renderer/element-screenshot-renderer-test.js +9 -5
  65. package/report/test/renderer/{i18n-test.js → i18n-formatter-test.js} +15 -21
  66. package/report/test/renderer/performance-category-renderer-test.js +15 -10
  67. package/report/test/renderer/pwa-category-renderer-test.js +11 -6
  68. package/report/test/renderer/report-renderer-test.js +2 -2
  69. package/report/test/renderer/report-ui-features-test.js +3 -3
  70. package/report/test/renderer/{util-test.js → report-utils-test.js} +37 -235
  71. package/report/test/renderer/snippet-renderer-test.js +8 -4
  72. package/report/test-assets/lhr-3.0.0.json +2332 -0
  73. package/report/test-assets/lhr-4.3.0.json +4754 -0
  74. package/report/test-assets/lhr-5.0.0.json +5994 -0
  75. package/report/test-assets/lhr-6.0.0.json +7222 -0
  76. package/report/test-assets/lhr-8.5.0.json +8679 -0
  77. package/shared/localization/format.js +5 -2
  78. package/shared/localization/locales/ar-XB.json +50 -50
  79. package/shared/localization/locales/ar.json +50 -50
  80. package/shared/localization/locales/bg.json +50 -50
  81. package/shared/localization/locales/ca.json +50 -50
  82. package/shared/localization/locales/cs.json +50 -50
  83. package/shared/localization/locales/da.json +50 -50
  84. package/shared/localization/locales/de.json +50 -50
  85. package/shared/localization/locales/el.json +50 -50
  86. package/shared/localization/locales/en-GB.json +50 -50
  87. package/shared/localization/locales/en-US.json +55 -55
  88. package/shared/localization/locales/en-XA.json +50 -50
  89. package/shared/localization/locales/en-XL.json +55 -55
  90. package/shared/localization/locales/es-419.json +50 -50
  91. package/shared/localization/locales/es.json +50 -50
  92. package/shared/localization/locales/fi.json +50 -50
  93. package/shared/localization/locales/fil.json +50 -50
  94. package/shared/localization/locales/fr.json +50 -50
  95. package/shared/localization/locales/he.json +50 -50
  96. package/shared/localization/locales/hi.json +50 -50
  97. package/shared/localization/locales/hr.json +50 -50
  98. package/shared/localization/locales/hu.json +50 -50
  99. package/shared/localization/locales/id.json +50 -50
  100. package/shared/localization/locales/it.json +50 -50
  101. package/shared/localization/locales/ja.json +50 -50
  102. package/shared/localization/locales/ko.json +50 -50
  103. package/shared/localization/locales/lt.json +50 -50
  104. package/shared/localization/locales/lv.json +50 -50
  105. package/shared/localization/locales/nl.json +50 -50
  106. package/shared/localization/locales/no.json +50 -50
  107. package/shared/localization/locales/pl.json +50 -50
  108. package/shared/localization/locales/pt-PT.json +50 -50
  109. package/shared/localization/locales/pt.json +50 -50
  110. package/shared/localization/locales/ro.json +50 -50
  111. package/shared/localization/locales/ru.json +50 -50
  112. package/shared/localization/locales/sk.json +50 -50
  113. package/shared/localization/locales/sl.json +50 -50
  114. package/shared/localization/locales/sr-Latn.json +50 -50
  115. package/shared/localization/locales/sr.json +50 -50
  116. package/shared/localization/locales/sv.json +50 -50
  117. package/shared/localization/locales/ta.json +50 -50
  118. package/shared/localization/locales/te.json +50 -50
  119. package/shared/localization/locales/th.json +50 -50
  120. package/shared/localization/locales/tr.json +50 -50
  121. package/shared/localization/locales/uk.json +50 -50
  122. package/shared/localization/locales/vi.json +50 -50
  123. package/shared/localization/locales/zh-HK.json +50 -50
  124. package/shared/localization/locales/zh-TW.json +50 -50
  125. package/shared/localization/locales/zh.json +50 -50
  126. package/shared/test/util-test.js +214 -0
  127. package/shared/util.d.ts +122 -0
  128. package/shared/util.js +332 -0
  129. package/types/artifacts.d.ts +14 -0
  130. package/types/lhr/lhr.d.ts +33 -0
  131. package/report/renderer/util.d.ts +0 -230
@@ -8,12 +8,13 @@ import assert from 'assert/strict';
8
8
 
9
9
  import jsdom from 'jsdom';
10
10
 
11
- import {Util} from '../../renderer/util.js';
12
- import {I18n} from '../../renderer/i18n.js';
11
+ import {ReportUtils} from '../../renderer/report-utils.js';
12
+ import {I18nFormatter} from '../../renderer/i18n-formatter.js';
13
13
  import {DOM} from '../../renderer/dom.js';
14
14
  import {DetailsRenderer} from '../../renderer/details-renderer.js';
15
15
  import {CategoryRenderer} from '../../renderer/category-renderer.js';
16
16
  import {readJson} from '../../../core/test/test-utils.js';
17
+ import {Globals} from '../../renderer/report-globals.js';
17
18
 
18
19
  const sampleResultsOrig = readJson('../../../core/test/results/sample_v2.json', import.meta);
19
20
 
@@ -22,18 +23,22 @@ describe('CategoryRenderer', () => {
22
23
  let sampleResults;
23
24
 
24
25
  before(() => {
25
- Util.i18n = new I18n('en', {...Util.UIStrings});
26
+ Globals.apply({
27
+ providedStrings: {},
28
+ i18n: new I18nFormatter('en'),
29
+ reportJson: null,
30
+ });
26
31
 
27
32
  const {document} = new jsdom.JSDOM().window;
28
33
  const dom = new DOM(document);
29
34
  const detailsRenderer = new DetailsRenderer(dom);
30
35
  renderer = new CategoryRenderer(dom, detailsRenderer);
31
36
 
32
- sampleResults = Util.prepareReportResult(sampleResultsOrig);
37
+ sampleResults = ReportUtils.prepareReportResult(sampleResultsOrig);
33
38
  });
34
39
 
35
40
  after(() => {
36
- Util.i18n = undefined;
41
+ Globals.i18n = undefined;
37
42
  });
38
43
 
39
44
  it('renders an audit', () => {
@@ -8,11 +8,11 @@ import assert from 'assert/strict';
8
8
 
9
9
  import jsdom from 'jsdom';
10
10
 
11
- import {Util} from '../../renderer/util.js';
12
- import {I18n} from '../../renderer/i18n.js';
11
+ import {I18nFormatter} from '../../renderer/i18n-formatter.js';
13
12
  import {DOM} from '../../renderer/dom.js';
14
13
  import {DetailsRenderer} from '../../renderer/details-renderer.js';
15
14
  import {CriticalRequestChainRenderer} from '../../renderer/crc-details-renderer.js';
15
+ import {Globals} from '../../renderer/report-globals.js';
16
16
 
17
17
  const superLongURL =
18
18
  'https://example.com/thisIsASuperLongURLThatWillTriggerFilenameTruncationWhichWeWantToTest.js';
@@ -73,7 +73,11 @@ describe('DetailsRenderer', () => {
73
73
  let detailsRenderer;
74
74
 
75
75
  before(() => {
76
- Util.i18n = new I18n('en', {...Util.UIStrings});
76
+ Globals.apply({
77
+ providedStrings: {},
78
+ i18n: new I18nFormatter('en'),
79
+ reportJson: null,
80
+ });
77
81
 
78
82
  const {document} = new jsdom.JSDOM().window;
79
83
  dom = new DOM(document);
@@ -81,7 +85,7 @@ describe('DetailsRenderer', () => {
81
85
  });
82
86
 
83
87
  after(() => {
84
- Util.i18n = undefined;
88
+ Globals.i18n = undefined;
85
89
  });
86
90
 
87
91
  it('renders tree structure', () => {
@@ -9,9 +9,9 @@ import assert from 'assert/strict';
9
9
  import jsdom from 'jsdom';
10
10
 
11
11
  import {DOM} from '../../renderer/dom.js';
12
- import {Util} from '../../renderer/util.js';
13
- import {I18n} from '../../renderer/i18n.js';
12
+ import {I18nFormatter} from '../../renderer/i18n-formatter.js';
14
13
  import {DetailsRenderer} from '../../renderer/details-renderer.js';
14
+ import {Globals} from '../../renderer/report-globals.js';
15
15
 
16
16
  describe('DetailsRenderer', () => {
17
17
  let renderer;
@@ -23,12 +23,16 @@ describe('DetailsRenderer', () => {
23
23
  }
24
24
 
25
25
  before(() => {
26
- Util.i18n = new I18n('en', {...Util.UIStrings});
26
+ Globals.apply({
27
+ providedStrings: {},
28
+ i18n: new I18nFormatter('en'),
29
+ reportJson: null,
30
+ });
27
31
  createRenderer();
28
32
  });
29
33
 
30
34
  after(() => {
31
- Util.i18n = undefined;
35
+ Globals.i18n = undefined;
32
36
  });
33
37
 
34
38
  describe('render', () => {
@@ -10,8 +10,8 @@ import jestMock from 'jest-mock';
10
10
  import jsdom from 'jsdom';
11
11
 
12
12
  import {DOM} from '../../renderer/dom.js';
13
- import {Util} from '../../renderer/util.js';
14
- import {I18n} from '../../renderer/i18n.js';
13
+ import {I18nFormatter} from '../../renderer/i18n-formatter.js';
14
+ import {Globals} from '../../renderer/report-globals.js';
15
15
 
16
16
  describe('DOM', () => {
17
17
  /** @type {DOM} */
@@ -20,7 +20,11 @@ describe('DOM', () => {
20
20
  let nativeCreateObjectURL;
21
21
 
22
22
  before(() => {
23
- Util.i18n = new I18n('en', {...Util.UIStrings});
23
+ Globals.apply({
24
+ providedStrings: {},
25
+ i18n: new I18nFormatter('en'),
26
+ reportJson: null,
27
+ });
24
28
  window = new jsdom.JSDOM().window;
25
29
 
26
30
  // The Node version of URL.createObjectURL isn't compatible with the jsdom blob type,
@@ -33,7 +37,7 @@ describe('DOM', () => {
33
37
  });
34
38
 
35
39
  after(() => {
36
- Util.i18n = undefined;
40
+ Globals.i18n = undefined;
37
41
  URL.createObjectURL = nativeCreateObjectURL;
38
42
  });
39
43
 
@@ -7,9 +7,9 @@
7
7
  import jsdom from 'jsdom';
8
8
 
9
9
  import {ElementScreenshotRenderer} from '../../renderer/element-screenshot-renderer.js';
10
- import {Util} from '../../renderer/util.js';
11
- import {I18n} from '../../renderer/i18n.js';
10
+ import {I18nFormatter} from '../../renderer/i18n-formatter.js';
12
11
  import {DOM} from '../../renderer/dom.js';
12
+ import {Globals} from '../../renderer/report-globals.js';
13
13
 
14
14
  /**
15
15
  * @param {{left: number, top: number, width: number, height:number}} opts
@@ -27,15 +27,19 @@ describe('ElementScreenshotRenderer', () => {
27
27
  let dom;
28
28
 
29
29
  before(() => {
30
- Util.i18n = new I18n('en', {...Util.UIStrings});
30
+ Globals.apply({
31
+ providedStrings: {},
32
+ i18n: new I18nFormatter('en'),
33
+ reportJson: null,
34
+ });
31
35
 
32
36
  const {document} = new jsdom.JSDOM().window;
33
37
  dom = new DOM(document);
34
- Util.resetUniqueSuffix();
38
+ Globals.resetUniqueSuffix();
35
39
  });
36
40
 
37
41
  after(() => {
38
- Util.i18n = undefined;
42
+ Globals.i18n = undefined;
39
43
  });
40
44
 
41
45
  it('renders screenshot', () => {
@@ -6,19 +6,13 @@
6
6
 
7
7
  import assert from 'assert/strict';
8
8
 
9
- import {Util} from '../../renderer/util.js';
10
- import {I18n} from '../../renderer/i18n.js';
11
-
12
- // Require i18n to make sure Intl is polyfilled in Node without full-icu for testing.
13
- // When Util is run in a browser, Intl will be supplied natively (IE11+).
14
- // eslint-disable-next-line no-unused-vars
15
- import '../../../core/lib/i18n/i18n.js';
9
+ import {I18nFormatter} from '../../renderer/i18n-formatter.js';
16
10
 
17
11
  const NBSP = '\xa0';
18
12
 
19
- describe('util helpers', () => {
13
+ describe('i18n formatter', () => {
20
14
  it('formats a number', () => {
21
- const i18n = new I18n('en', {...Util.UIStrings});
15
+ const i18n = new I18nFormatter('en');
22
16
  assert.strictEqual(i18n.formatNumber(10), '10');
23
17
  assert.strictEqual(i18n.formatNumber(100.01), '100.01');
24
18
  assert.strictEqual(i18n.formatNumber(13000.456), '13,000.456');
@@ -46,7 +40,7 @@ describe('util helpers', () => {
46
40
  });
47
41
 
48
42
  it('formats a date', () => {
49
- const i18n = new I18n('en', {...Util.UIStrings});
43
+ const i18n = new I18nFormatter('en');
50
44
  const timestamp = i18n.formatDateTime('2017-04-28T23:07:51.189Z');
51
45
  assert.ok(
52
46
  timestamp.includes('Apr 27, 2017') ||
@@ -56,7 +50,7 @@ describe('util helpers', () => {
56
50
  });
57
51
 
58
52
  it('formats bytes', () => {
59
- const i18n = new I18n('en', {...Util.UIStrings});
53
+ const i18n = new I18nFormatter('en');
60
54
  assert.equal(i18n.formatBytesToKiB(100), `0.098${NBSP}KiB`);
61
55
  assert.equal(i18n.formatBytesToKiB(100, 0.1), `0.1${NBSP}KiB`);
62
56
  assert.equal(i18n.formatBytesToKiB(2000, 0.1), `2.0${NBSP}KiB`);
@@ -64,7 +58,7 @@ describe('util helpers', () => {
64
58
  });
65
59
 
66
60
  it('formats bytes with different granularities', () => {
67
- const i18n = new I18n('en', {...Util.UIStrings});
61
+ const i18n = new I18nFormatter('en');
68
62
 
69
63
  let granularity = 10;
70
64
  assert.strictEqual(i18n.formatBytes(15.0, granularity), `20${NBSP}bytes`);
@@ -88,7 +82,7 @@ describe('util helpers', () => {
88
82
  });
89
83
 
90
84
  it('formats bytes with invalid granularity', () => {
91
- const i18n = new I18n('en', {...Util.UIStrings});
85
+ const i18n = new I18nFormatter('en');
92
86
  const granularity = 0.5;
93
87
  const originalWarn = console.warn;
94
88
 
@@ -103,7 +97,7 @@ describe('util helpers', () => {
103
97
  });
104
98
 
105
99
  it('formats kibibytes with different granularities', () => {
106
- const i18n = new I18n('en', {...Util.UIStrings});
100
+ const i18n = new I18nFormatter('en');
107
101
 
108
102
  let granularity = 10;
109
103
  assert.strictEqual(i18n.formatBytesToKiB(5 * 1024, granularity), `10${NBSP}KiB`);
@@ -121,7 +115,7 @@ describe('util helpers', () => {
121
115
  });
122
116
 
123
117
  it('formats ms', () => {
124
- const i18n = new I18n('en', {...Util.UIStrings});
118
+ const i18n = new I18nFormatter('en');
125
119
  assert.equal(i18n.formatMilliseconds(123, 10), `120${NBSP}ms`);
126
120
  assert.equal(i18n.formatMilliseconds(2456.5, 0.1), `2,456.5${NBSP}ms`);
127
121
  assert.equal(i18n.formatMilliseconds(0.000001), `0${NBSP}ms`);
@@ -129,21 +123,21 @@ describe('util helpers', () => {
129
123
  });
130
124
 
131
125
  it('formats a duration', () => {
132
- const i18n = new I18n('en', {...Util.UIStrings});
126
+ const i18n = new I18nFormatter('en');
133
127
  assert.equal(i18n.formatDuration(60 * 1000), '1m');
134
128
  assert.equal(i18n.formatDuration(60 * 60 * 1000 + 5000), '1h 5s');
135
129
  assert.equal(i18n.formatDuration(28 * 60 * 60 * 1000 + 5000), '1d 4h 5s');
136
130
  });
137
131
 
138
132
  it('formats a duration based on locale', () => {
139
- let i18n = new I18n('de', {...Util.UIStrings});
133
+ let i18n = new I18nFormatter('de');
140
134
  assert.equal(i18n.formatDuration(60 * 1000), `1${NBSP}Min.`);
141
135
  assert.equal(i18n.formatDuration(60 * 60 * 1000 + 5000), `1${NBSP}Std. 5${NBSP}Sek.`);
142
136
  assert.equal(
143
137
  i18n.formatDuration(28 * 60 * 60 * 1000 + 5000), `1${NBSP}T 4${NBSP}Std. 5${NBSP}Sek.`);
144
138
 
145
139
  // Yes, this is actually backwards (s h d).
146
- i18n = new I18n('ar', {...Util.UIStrings});
140
+ i18n = new I18nFormatter('ar');
147
141
  /* eslint-disable no-irregular-whitespace */
148
142
  assert.equal(i18n.formatDuration(60 * 1000), `١${NBSP}د`);
149
143
  assert.equal(i18n.formatDuration(60 * 60 * 1000 + 5000), `١${NBSP}س ٥${NBSP}ث`);
@@ -155,7 +149,7 @@ describe('util helpers', () => {
155
149
  // Requires full-icu or Intl polyfill.
156
150
  const number = 12346.858558;
157
151
 
158
- const i18n = new I18n('de', {...Util.UIStrings});
152
+ const i18n = new I18nFormatter('de');
159
153
  assert.strictEqual(i18n.formatNumber(number), '12.346,859');
160
154
  assert.strictEqual(i18n.formatBytesToKiB(number, 0.1), `12,1${NBSP}KiB`);
161
155
  assert.strictEqual(i18n.formatMilliseconds(number, 10), `12.350${NBSP}ms`);
@@ -166,7 +160,7 @@ describe('util helpers', () => {
166
160
  // Requires full-icu or Intl polyfill.
167
161
  const number = 12346.858558;
168
162
 
169
- const i18n = new I18n('en-XA', {...Util.UIStrings});
163
+ const i18n = new I18nFormatter('en-XA');
170
164
  assert.strictEqual(i18n.formatNumber(number), '12.346,859');
171
165
  assert.strictEqual(i18n.formatBytesToKiB(number, 0.1), `12,1${NBSP}KiB`);
172
166
  assert.strictEqual(i18n.formatMilliseconds(number, 100), `12.300${NBSP}ms`);
@@ -174,7 +168,7 @@ describe('util helpers', () => {
174
168
  });
175
169
 
176
170
  it('should not crash on unknown locales', () => {
177
- const i18n = new I18n('unknown-mystery-locale', {...Util.UIStrings});
171
+ const i18n = new I18nFormatter('unknown-mystery-locale');
178
172
  const timestamp = i18n.formatDateTime('2017-04-28T23:07:51.189Z');
179
173
  assert.ok(
180
174
  timestamp.includes('Apr 27, 2017') ||
@@ -8,12 +8,13 @@ import assert from 'assert/strict';
8
8
 
9
9
  import jsdom from 'jsdom';
10
10
 
11
- import {Util} from '../../renderer/util.js';
12
- import {I18n} from '../../renderer/i18n.js';
11
+ import {ReportUtils} from '../../renderer/report-utils.js';
12
+ import {I18nFormatter} from '../../renderer/i18n-formatter.js';
13
13
  import {DOM} from '../../renderer/dom.js';
14
14
  import {DetailsRenderer} from '../../renderer/details-renderer.js';
15
15
  import {PerformanceCategoryRenderer} from '../../renderer/performance-category-renderer.js';
16
16
  import {readJson} from '../../../core/test/test-utils.js';
17
+ import {Globals} from '../../renderer/report-globals.js';
17
18
 
18
19
  const sampleResultsOrig = readJson('../../../core/test/results/sample_v2.json', import.meta);
19
20
 
@@ -23,7 +24,11 @@ describe('PerfCategoryRenderer', () => {
23
24
  let sampleResults;
24
25
 
25
26
  before(() => {
26
- Util.i18n = new I18n('en', {...Util.UIStrings});
27
+ Globals.apply({
28
+ providedStrings: {},
29
+ i18n: new I18nFormatter('en'),
30
+ reportJson: null,
31
+ });
27
32
 
28
33
  const {document} = new jsdom.JSDOM().window;
29
34
  const dom = new DOM(document);
@@ -31,12 +36,12 @@ describe('PerfCategoryRenderer', () => {
31
36
  renderer = new PerformanceCategoryRenderer(dom, detailsRenderer);
32
37
 
33
38
  // TODO: don't call a LH.ReportResult `sampleResults`, which is typically always LH.Result
34
- sampleResults = Util.prepareReportResult(sampleResultsOrig);
39
+ sampleResults = ReportUtils.prepareReportResult(sampleResultsOrig);
35
40
  category = sampleResults.categories.performance;
36
41
  });
37
42
 
38
43
  after(() => {
39
- Util.i18n = undefined;
44
+ Globals.i18n = undefined;
40
45
  });
41
46
 
42
47
  it('renders the category header', () => {
@@ -151,7 +156,7 @@ describe('PerfCategoryRenderer', () => {
151
156
  const oppAudits = category.auditRefs.filter(audit =>
152
157
  audit.result.details &&
153
158
  audit.result.details.type === 'opportunity' &&
154
- !Util.showAsPassed(audit.result));
159
+ !ReportUtils.showAsPassed(audit.result));
155
160
  const oppElements = [...categoryDOM.querySelectorAll('.lh-audit--load-opportunity')];
156
161
  expect(oppElements.map(e => e.id).sort()).toEqual(oppAudits.map(a => a.id).sort());
157
162
  expect(oppElements.length).toBeGreaterThan(0);
@@ -220,7 +225,7 @@ describe('PerfCategoryRenderer', () => {
220
225
  const diagnosticAuditIds = category.auditRefs.filter(audit => {
221
226
  return !audit.group &&
222
227
  !(audit.result.details && audit.result.details.type === 'opportunity') &&
223
- !Util.showAsPassed(audit.result);
228
+ !ReportUtils.showAsPassed(audit.result);
224
229
  }).map(audit => audit.id).sort();
225
230
  assert.ok(diagnosticAuditIds.length > 0);
226
231
 
@@ -235,7 +240,7 @@ describe('PerfCategoryRenderer', () => {
235
240
 
236
241
  const passedAudits = category.auditRefs.filter(audit =>
237
242
  !audit.group &&
238
- Util.showAsPassed(audit.result));
243
+ ReportUtils.showAsPassed(audit.result));
239
244
  const passedElements = passedSection.querySelectorAll('.lh-audit');
240
245
  assert.equal(passedElements.length, passedAudits.length);
241
246
  });
@@ -332,7 +337,7 @@ Array [
332
337
  });
333
338
 
334
339
  it('also appends device and version number', () => {
335
- Util.reportJson = {
340
+ Globals.reportJson = {
336
341
  configSettings: {formFactor: 'mobile'},
337
342
  lighthouseVersion: '6.0.0',
338
343
  };
@@ -353,7 +358,7 @@ Array [
353
358
  ]
354
359
  `);
355
360
  } finally {
356
- Util.reportJson = null;
361
+ Globals.reportJson = null;
357
362
  }
358
363
  });
359
364
 
@@ -8,12 +8,13 @@ import assert from 'assert/strict';
8
8
 
9
9
  import jsdom from 'jsdom';
10
10
 
11
- import {Util} from '../../renderer/util.js';
12
- import {I18n} from '../../renderer/i18n.js';
11
+ import {ReportUtils, UIStrings} from '../../renderer/report-utils.js';
12
+ import {I18nFormatter} from '../../renderer/i18n-formatter.js';
13
13
  import {DOM} from '../../renderer/dom.js';
14
14
  import {DetailsRenderer} from '../../renderer/details-renderer.js';
15
15
  import {PwaCategoryRenderer} from '../../renderer/pwa-category-renderer.js';
16
16
  import {readJson} from '../../../core/test/test-utils.js';
17
+ import {Globals} from '../../renderer/report-globals.js';
17
18
 
18
19
  const sampleResultsOrig = readJson('../../../core/test/results/sample_v2.json', import.meta);
19
20
 
@@ -23,14 +24,18 @@ describe('PwaCategoryRenderer', () => {
23
24
  let sampleResults;
24
25
 
25
26
  before(() => {
26
- Util.i18n = new I18n('en', {...Util.UIStrings});
27
+ Globals.apply({
28
+ providedStrings: {},
29
+ i18n: new I18nFormatter('en'),
30
+ reportJson: null,
31
+ });
27
32
 
28
33
  const {document} = new jsdom.JSDOM().window;
29
34
  const dom = new DOM(document);
30
35
  const detailsRenderer = new DetailsRenderer(dom);
31
36
  pwaRenderer = new PwaCategoryRenderer(dom, detailsRenderer);
32
37
 
33
- sampleResults = Util.prepareReportResult(sampleResultsOrig);
38
+ sampleResults = ReportUtils.prepareReportResult(sampleResultsOrig);
34
39
  });
35
40
 
36
41
  beforeEach(() => {
@@ -40,7 +45,7 @@ describe('PwaCategoryRenderer', () => {
40
45
  });
41
46
 
42
47
  after(() => {
43
- Util.i18n = undefined;
48
+ Globals.i18n = undefined;
44
49
  });
45
50
 
46
51
  it('renders the regular audits', () => {
@@ -258,7 +263,7 @@ describe('PwaCategoryRenderer', () => {
258
263
 
259
264
  const percentageElem = badgeGauge.querySelector('.lh-gauge__percentage');
260
265
  assert.strictEqual(percentageElem.textContent, '?');
261
- assert.strictEqual(percentageElem.title, Util.UIStrings.errorLabel);
266
+ assert.strictEqual(percentageElem.title, UIStrings.errorLabel);
262
267
  });
263
268
 
264
269
  it('renders score gauges with unique ids for items in <defs>', () => {
@@ -9,7 +9,7 @@ import assert from 'assert/strict';
9
9
  import jsdom from 'jsdom';
10
10
  import jestMock from 'jest-mock';
11
11
 
12
- import {Util} from '../../renderer/util.js';
12
+ import {ReportUtils} from '../../renderer/report-utils.js';
13
13
  import {DOM} from '../../renderer/dom.js';
14
14
  import {DetailsRenderer} from '../../renderer/details-renderer.js';
15
15
  import {CategoryRenderer} from '../../renderer/category-renderer.js';
@@ -41,7 +41,7 @@ describe('ReportRenderer', () => {
41
41
  const detailsRenderer = new DetailsRenderer(dom);
42
42
  const categoryRenderer = new CategoryRenderer(dom, detailsRenderer);
43
43
  renderer = new ReportRenderer(dom, categoryRenderer);
44
- sampleResults = Util.prepareReportResult(sampleResultsOrig);
44
+ sampleResults = ReportUtils.prepareReportResult(sampleResultsOrig);
45
45
  });
46
46
 
47
47
  after(() => {
@@ -10,7 +10,7 @@ import jsdom from 'jsdom';
10
10
  import jestMock from 'jest-mock';
11
11
 
12
12
  import {reportAssets} from '../../generator/report-assets.js';
13
- import {Util} from '../../renderer/util.js';
13
+ import {ReportUtils, UIStrings} from '../../renderer/report-utils.js';
14
14
  import {DOM} from '../../renderer/dom.js';
15
15
  import {DetailsRenderer} from '../../renderer/details-renderer.js';
16
16
  import {ReportUIFeatures} from '../../renderer/report-ui-features.js';
@@ -76,7 +76,7 @@ describe('ReportUIFeatures', () => {
76
76
  };
77
77
 
78
78
  dom = new DOM(document.window.document);
79
- sampleResults = Util.prepareReportResult(sampleResultsOrig);
79
+ sampleResults = ReportUtils.prepareReportResult(sampleResultsOrig);
80
80
  render(sampleResults);
81
81
  });
82
82
 
@@ -550,7 +550,7 @@ describe('ReportUIFeatures', () => {
550
550
  const container = render(sampleResults);
551
551
  for (const node of dom.findAll('[data-i18n]', container)) {
552
552
  const val = node.getAttribute('data-i18n');
553
- assert.ok(val in Util.UIStrings, `Invalid data-i18n value of: "${val}" not found.`);
553
+ assert.ok(val in UIStrings, `Invalid data-i18n value of: "${val}" not found.`);
554
554
  }
555
555
  });
556
556
  });