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.
- package/.codecov.yml +0 -5
- package/core/audits/audit.js +1 -1
- package/core/audits/bf-cache.js +1 -1
- package/core/audits/byte-efficiency/legacy-javascript.d.ts +1 -0
- package/core/audits/byte-efficiency/legacy-javascript.js +7 -3
- package/core/audits/dobetterweb/uses-http2.d.ts +5 -2
- package/core/audits/dobetterweb/uses-http2.js +12 -7
- package/core/audits/screenshot-thumbnails.d.ts +2 -1
- package/core/audits/screenshot-thumbnails.js +14 -9
- package/core/audits/third-party-facades.d.ts +3 -2
- package/core/audits/third-party-facades.js +12 -9
- package/core/audits/third-party-summary.d.ts +7 -6
- package/core/audits/third-party-summary.js +16 -14
- package/core/audits/valid-source-maps.d.ts +5 -3
- package/core/audits/valid-source-maps.js +11 -9
- package/core/computed/entity-classification.d.ts +29 -0
- package/core/computed/entity-classification.js +102 -0
- package/core/computed/processed-navigation.d.ts +12 -6
- package/core/computed/processed-navigation.js +19 -6
- package/core/computed/resource-summary.d.ts +4 -2
- package/core/computed/resource-summary.js +8 -5
- package/core/lib/url-utils.js +1 -1
- package/core/runner.d.ts +10 -0
- package/core/runner.js +48 -0
- package/core/util.cjs +43 -10
- package/core/util.d.cts +114 -2
- package/dist/report/bundle.esm.js +858 -883
- package/dist/report/flow.js +33 -23
- package/dist/report/standalone.js +27 -17
- package/flow-report/assets/standalone-flow-template.html +1 -1
- package/flow-report/src/common.tsx +1 -1
- package/flow-report/src/i18n/i18n.d.ts +103 -100
- package/flow-report/src/i18n/i18n.tsx +23 -18
- package/flow-report/src/sidebar/sidebar.tsx +3 -3
- package/flow-report/src/summary/category.tsx +7 -7
- package/flow-report/src/summary/summary.tsx +2 -2
- package/flow-report/src/topbar.tsx +4 -28
- package/package.json +5 -5
- package/readme.md +1 -1
- package/report/assets/standalone-template.html +1 -1
- package/report/assets/styles.css +3 -3
- package/report/assets/templates.html +4 -28
- package/report/renderer/category-renderer.js +19 -17
- package/report/renderer/components.js +119 -202
- package/report/renderer/crc-details-renderer.js +7 -6
- package/report/renderer/details-renderer.js +7 -6
- package/report/renderer/dom.js +1 -1
- package/report/renderer/element-screenshot-renderer.js +3 -3
- package/report/renderer/{i18n.d.ts → i18n-formatter.d.ts} +3 -9
- package/report/renderer/{i18n.js → i18n-formatter.js} +2 -11
- package/report/renderer/performance-category-renderer.js +17 -15
- package/report/renderer/pwa-category-renderer.js +5 -4
- package/report/renderer/report-globals.d.ts +21 -0
- package/report/renderer/report-globals.js +49 -0
- package/report/renderer/report-renderer.js +22 -24
- package/report/renderer/report-ui-features.js +9 -8
- package/report/renderer/report-utils.d.ts +116 -0
- package/report/renderer/{util.js → report-utils.js} +100 -415
- package/report/renderer/snippet-renderer.js +3 -2
- package/report/test/renderer/category-renderer-test.js +10 -5
- package/report/test/renderer/crc-details-renderer-test.js +8 -4
- package/report/test/renderer/details-renderer-test.js +8 -4
- package/report/test/renderer/dom-test.js +8 -4
- package/report/test/renderer/element-screenshot-renderer-test.js +9 -5
- package/report/test/renderer/{i18n-test.js → i18n-formatter-test.js} +15 -21
- package/report/test/renderer/performance-category-renderer-test.js +15 -10
- package/report/test/renderer/pwa-category-renderer-test.js +11 -6
- package/report/test/renderer/report-renderer-test.js +2 -2
- package/report/test/renderer/report-ui-features-test.js +3 -3
- package/report/test/renderer/{util-test.js → report-utils-test.js} +37 -235
- package/report/test/renderer/snippet-renderer-test.js +8 -4
- package/report/test-assets/lhr-3.0.0.json +2332 -0
- package/report/test-assets/lhr-4.3.0.json +4754 -0
- package/report/test-assets/lhr-5.0.0.json +5994 -0
- package/report/test-assets/lhr-6.0.0.json +7222 -0
- package/report/test-assets/lhr-8.5.0.json +8679 -0
- package/shared/localization/format.js +5 -2
- package/shared/localization/locales/ar-XB.json +50 -50
- package/shared/localization/locales/ar.json +50 -50
- package/shared/localization/locales/bg.json +50 -50
- package/shared/localization/locales/ca.json +50 -50
- package/shared/localization/locales/cs.json +50 -50
- package/shared/localization/locales/da.json +50 -50
- package/shared/localization/locales/de.json +50 -50
- package/shared/localization/locales/el.json +50 -50
- package/shared/localization/locales/en-GB.json +50 -50
- package/shared/localization/locales/en-US.json +55 -55
- package/shared/localization/locales/en-XA.json +50 -50
- package/shared/localization/locales/en-XL.json +55 -55
- package/shared/localization/locales/es-419.json +50 -50
- package/shared/localization/locales/es.json +50 -50
- package/shared/localization/locales/fi.json +50 -50
- package/shared/localization/locales/fil.json +50 -50
- package/shared/localization/locales/fr.json +50 -50
- package/shared/localization/locales/he.json +50 -50
- package/shared/localization/locales/hi.json +50 -50
- package/shared/localization/locales/hr.json +50 -50
- package/shared/localization/locales/hu.json +50 -50
- package/shared/localization/locales/id.json +50 -50
- package/shared/localization/locales/it.json +50 -50
- package/shared/localization/locales/ja.json +50 -50
- package/shared/localization/locales/ko.json +50 -50
- package/shared/localization/locales/lt.json +50 -50
- package/shared/localization/locales/lv.json +50 -50
- package/shared/localization/locales/nl.json +50 -50
- package/shared/localization/locales/no.json +50 -50
- package/shared/localization/locales/pl.json +50 -50
- package/shared/localization/locales/pt-PT.json +50 -50
- package/shared/localization/locales/pt.json +50 -50
- package/shared/localization/locales/ro.json +50 -50
- package/shared/localization/locales/ru.json +50 -50
- package/shared/localization/locales/sk.json +50 -50
- package/shared/localization/locales/sl.json +50 -50
- package/shared/localization/locales/sr-Latn.json +50 -50
- package/shared/localization/locales/sr.json +50 -50
- package/shared/localization/locales/sv.json +50 -50
- package/shared/localization/locales/ta.json +50 -50
- package/shared/localization/locales/te.json +50 -50
- package/shared/localization/locales/th.json +50 -50
- package/shared/localization/locales/tr.json +50 -50
- package/shared/localization/locales/uk.json +50 -50
- package/shared/localization/locales/vi.json +50 -50
- package/shared/localization/locales/zh-HK.json +50 -50
- package/shared/localization/locales/zh-TW.json +50 -50
- package/shared/localization/locales/zh.json +50 -50
- package/shared/test/util-test.js +214 -0
- package/shared/util.d.ts +122 -0
- package/shared/util.js +332 -0
- package/types/artifacts.d.ts +14 -0
- package/types/lhr/lhr.d.ts +33 -0
- 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 {
|
|
12
|
-
import {
|
|
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
|
-
|
|
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 =
|
|
37
|
+
sampleResults = ReportUtils.prepareReportResult(sampleResultsOrig);
|
|
33
38
|
});
|
|
34
39
|
|
|
35
40
|
after(() => {
|
|
36
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
14
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
38
|
+
Globals.resetUniqueSuffix();
|
|
35
39
|
});
|
|
36
40
|
|
|
37
41
|
after(() => {
|
|
38
|
-
|
|
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 {
|
|
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('
|
|
13
|
+
describe('i18n formatter', () => {
|
|
20
14
|
it('formats a number', () => {
|
|
21
|
-
const i18n = new
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
12
|
-
import {
|
|
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
|
-
|
|
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 =
|
|
39
|
+
sampleResults = ReportUtils.prepareReportResult(sampleResultsOrig);
|
|
35
40
|
category = sampleResults.categories.performance;
|
|
36
41
|
});
|
|
37
42
|
|
|
38
43
|
after(() => {
|
|
39
|
-
|
|
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
|
-
!
|
|
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
|
-
!
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
12
|
-
import {
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
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 =
|
|
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 {
|
|
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 =
|
|
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
|
|
553
|
+
assert.ok(val in UIStrings, `Invalid data-i18n value of: "${val}" not found.`);
|
|
554
554
|
}
|
|
555
555
|
});
|
|
556
556
|
});
|