lighthouse 12.0.0 → 12.1.0-dev.20240618
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/cli/run.js +5 -38
- package/cli/test/smokehouse/lighthouse-runners/bundle.js +1 -1
- package/cli/test/smokehouse/smokehouse.js +11 -1
- package/core/audits/accessibility/aria-allowed-role.js +7 -9
- package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +2 -2
- package/core/audits/byte-efficiency/byte-efficiency-audit.js +3 -3
- package/core/audits/byte-efficiency/offscreen-images.js +1 -1
- package/core/audits/byte-efficiency/render-blocking-resources.d.ts +3 -3
- package/core/audits/byte-efficiency/render-blocking-resources.js +10 -10
- package/core/audits/dobetterweb/uses-http2.d.ts +2 -2
- package/core/audits/dobetterweb/uses-http2.js +5 -5
- package/core/audits/long-tasks.d.ts +7 -6
- package/core/audits/long-tasks.js +5 -4
- package/core/audits/metrics/first-meaningful-paint.d.ts +1 -17
- package/core/audits/metrics/first-meaningful-paint.js +5 -47
- package/core/audits/metrics/interactive.d.ts +1 -1
- package/core/audits/metrics/interactive.js +1 -1
- package/core/audits/predictive-perf.js +0 -6
- package/core/audits/prioritize-lcp-image.d.ts +1 -1
- package/core/audits/prioritize-lcp-image.js +2 -2
- package/core/audits/redirects.js +2 -3
- package/core/audits/third-party-facades.js +1 -1
- package/core/audits/third-party-summary.js +1 -1
- package/core/audits/uses-rel-preconnect.js +2 -2
- package/core/audits/uses-rel-preload.js +9 -9
- package/core/computed/critical-request-chains.js +3 -3
- package/core/computed/document-urls.js +3 -2
- package/core/computed/load-simulator.d.ts +4 -4
- package/core/computed/load-simulator.js +3 -54
- package/core/computed/main-resource.js +3 -2
- package/core/computed/metrics/interactive.d.ts +6 -0
- package/core/computed/metrics/interactive.js +2 -2
- package/core/computed/metrics/lantern-first-contentful-paint.d.ts +4 -4
- package/core/computed/metrics/lantern-first-contentful-paint.js +3 -3
- package/core/computed/metrics/lantern-interactive.d.ts +4 -4
- package/core/computed/metrics/lantern-interactive.js +6 -6
- package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +4 -4
- package/core/computed/metrics/lantern-largest-contentful-paint.js +3 -3
- package/core/computed/metrics/lantern-max-potential-fid.d.ts +4 -4
- package/core/computed/metrics/lantern-max-potential-fid.js +3 -3
- package/core/computed/metrics/lantern-metric.d.ts +21 -2
- package/core/computed/metrics/lantern-metric.js +39 -4
- package/core/computed/metrics/lantern-speed-index.d.ts +4 -4
- package/core/computed/metrics/lantern-speed-index.js +4 -4
- package/core/computed/metrics/lantern-total-blocking-time.d.ts +4 -4
- package/core/computed/metrics/lantern-total-blocking-time.js +3 -3
- package/core/computed/metrics/timing-summary.js +0 -6
- package/core/computed/metrics/total-blocking-time.js +3 -1
- package/core/computed/navigation-insights.d.ts +2 -20
- package/core/computed/network-analysis.d.ts +0 -5
- package/core/computed/network-analysis.js +2 -42
- package/core/computed/page-dependency-graph.d.ts +5 -3
- package/core/computed/page-dependency-graph.js +17 -7
- package/core/computed/processed-navigation.d.ts +1 -1
- package/core/computed/tbt-impact-tasks.js +4 -2
- package/core/computed/trace-engine-result.d.ts +0 -11
- package/core/computed/trace-engine-result.js +5 -19
- package/core/config/constants.d.ts +28 -53
- package/core/config/constants.js +2 -43
- package/core/gather/driver/navigation.js +1 -1
- package/core/gather/driver/network-monitor.d.ts +2 -1
- package/core/gather/driver/network-monitor.js +4 -4
- package/core/gather/driver/target-manager.d.ts +1 -1
- package/core/gather/driver.d.ts +0 -12
- package/core/gather/driver.js +1 -26
- package/core/gather/gatherers/inspector-issues.js +1 -0
- package/core/gather/gatherers/root-causes.js +0 -1
- package/core/gather/session.d.ts +5 -3
- package/core/gather/session.js +22 -1
- package/core/lib/asset-saver.d.ts +13 -9
- package/core/lib/asset-saver.js +77 -30
- package/core/lib/bf-cache-strings.js +2 -2
- package/core/lib/lantern/{base-node.d.ts → BaseNode.d.ts} +7 -9
- package/core/lib/lantern/{base-node.js → BaseNode.js} +6 -6
- package/core/lib/lantern/BaseNode.test.js +385 -0
- package/core/lib/lantern/CpuNode.d.ts +43 -0
- package/core/lib/lantern/{cpu-node.js → CpuNode.js} +8 -9
- package/core/lib/lantern/{lantern-error.d.ts → LanternError.d.ts} +1 -1
- package/core/lib/lantern/{metric.d.ts → Metric.d.ts} +23 -25
- package/core/lib/lantern/{metric.js → Metric.js} +14 -16
- package/core/lib/lantern/{network-node.d.ts → NetworkNode.d.ts} +6 -7
- package/core/lib/lantern/{network-node.js → NetworkNode.js} +7 -9
- package/core/lib/lantern/PageDependencyGraph.d.ts +82 -0
- package/core/lib/lantern/{page-dependency-graph.js → PageDependencyGraph.js} +185 -50
- package/core/lib/lantern/PageDependencyGraph.test.js +654 -0
- package/core/{computed/metrics/tbt-utils.d.ts → lib/lantern/TBTUtils.d.ts} +1 -1
- package/core/lib/lantern/TBTUtils.test.d.ts +2 -0
- package/core/lib/lantern/TBTUtils.test.js +130 -0
- package/core/lib/lantern/TraceEngineComputationData.d.ts +25 -0
- package/core/lib/lantern/TraceEngineComputationData.js +466 -0
- package/core/lib/lantern/lantern.d.ts +19 -7
- package/core/lib/lantern/lantern.js +21 -1
- package/core/lib/lantern/metrics/{first-contentful-paint.d.ts → FirstContentfulPaint.d.ts} +11 -11
- package/core/lib/lantern/metrics/{first-contentful-paint.js → FirstContentfulPaint.js} +11 -13
- package/core/lib/lantern/metrics/FirstContentfulPaint.test.js +54 -0
- package/core/lib/lantern/metrics/Interactive.d.ts +20 -0
- package/core/lib/lantern/metrics/{interactive.js → Interactive.js} +23 -26
- package/core/lib/lantern/metrics/Interactive.test.js +56 -0
- package/core/lib/lantern/metrics/LargestContentfulPaint.d.ts +19 -0
- package/core/lib/lantern/metrics/{largest-contentful-paint.js → LargestContentfulPaint.js} +16 -19
- package/core/lib/lantern/metrics/LargestContentfulPaint.test.js +42 -0
- package/core/lib/lantern/metrics/MaxPotentialFID.d.ts +24 -0
- package/core/lib/lantern/metrics/{max-potential-fid.js → MaxPotentialFID.js} +12 -13
- package/core/lib/lantern/metrics/MetricTestUtils.d.ts +19 -0
- package/core/lib/lantern/metrics/MetricTestUtils.js +48 -0
- package/core/lib/lantern/metrics/{speed-index.d.ts → SpeedIndex.d.ts} +7 -13
- package/core/lib/lantern/metrics/{speed-index.js → SpeedIndex.js} +14 -16
- package/core/lib/lantern/metrics/SpeedIndex.test.js +83 -0
- package/core/lib/lantern/metrics/TotalBlockingTime.d.ts +25 -0
- package/core/lib/lantern/metrics/{total-blocking-time.js → TotalBlockingTime.js} +13 -16
- package/core/lib/lantern/metrics/__snapshots__/FirstContentfulPaint.test.js.snap +11 -0
- package/core/lib/lantern/metrics/__snapshots__/Interactive.test.js.snap +17 -0
- package/core/lib/lantern/metrics/metrics.d.ts +9 -0
- package/core/lib/lantern/metrics/metrics.js +16 -0
- package/core/lib/lantern/{simulator/connection-pool.d.ts → simulation/ConnectionPool.d.ts} +15 -15
- package/core/lib/lantern/{simulator/connection-pool.js → simulation/ConnectionPool.js} +25 -25
- package/core/lib/lantern/simulation/ConnectionPool.test.js +195 -0
- package/core/lib/lantern/simulation/Constants.d.ts +52 -0
- package/core/lib/lantern/simulation/Constants.js +48 -0
- package/core/lib/lantern/{simulator/dns-cache.d.ts → simulation/DNSCache.d.ts} +3 -3
- package/core/lib/lantern/{simulator/dns-cache.js → simulation/DNSCache.js} +2 -2
- package/core/lib/lantern/simulation/DNSCache.test.js +72 -0
- package/core/lib/lantern/{simulator/network-analyzer.d.ts → simulation/NetworkAnalyzer.d.ts} +34 -21
- package/core/lib/lantern/{simulator/network-analyzer.js → simulation/NetworkAnalyzer.js} +106 -57
- package/core/lib/lantern/simulation/NetworkAnalyzer.test.js +475 -0
- package/core/lib/lantern/{simulator/simulator-timing-map.d.ts → simulation/SimulationTimingMap.d.ts} +7 -7
- package/core/lib/lantern/{simulator/simulator-timing-map.js → simulation/SimulationTimingMap.js} +5 -6
- package/core/lib/lantern/{simulator/simulator.d.ts → simulation/Simulator.d.ts} +21 -19
- package/core/lib/lantern/{simulator/simulator.js → simulation/Simulator.js} +100 -45
- package/core/lib/lantern/simulation/Simulator.test.js +434 -0
- package/core/lib/lantern/simulation/TCPConnection.test.d.ts +2 -0
- package/core/lib/lantern/simulation/TCPConnection.test.js +374 -0
- package/core/lib/lantern/{simulator/tcp-connection.d.ts → simulation/TcpConnection.d.ts} +2 -2
- package/core/lib/lantern/{simulator/tcp-connection.js → simulation/TcpConnection.js} +1 -1
- package/core/lib/lantern/simulation/simulation.d.ts +21 -0
- package/core/lib/lantern/simulation/simulation.js +28 -0
- package/core/lib/lantern/types/lantern.d.ts +145 -20
- package/core/lib/lantern-trace-saver.d.ts +4 -4
- package/core/lib/lantern-trace-saver.js +4 -4
- package/core/lib/navigation-error.js +3 -3
- package/core/lib/network-recorder.js +2 -2
- package/core/lib/network-request.d.ts +29 -3
- package/core/lib/network-request.js +20 -13
- package/core/lib/tracehouse/trace-processor.d.ts +0 -2
- package/core/lib/tracehouse/trace-processor.js +1 -31
- package/core/lib/traces/metric-trace-events.js +0 -5
- package/dist/report/bundle.esm.js +1 -1
- package/dist/report/flow.js +1 -1
- package/dist/report/standalone.js +1 -1
- package/package.json +14 -13
- package/report/renderer/performance-category-renderer.js +1 -1
- package/shared/localization/locales/ar-XB.json +43 -4
- package/shared/localization/locales/ar.json +43 -4
- package/shared/localization/locales/bg.json +43 -4
- package/shared/localization/locales/ca.json +44 -5
- package/shared/localization/locales/cs.json +43 -4
- package/shared/localization/locales/da.json +43 -4
- package/shared/localization/locales/de.json +43 -4
- package/shared/localization/locales/el.json +43 -4
- package/shared/localization/locales/en-GB.json +42 -3
- package/shared/localization/locales/en-US.json +4 -4
- package/shared/localization/locales/en-XA.json +43 -4
- package/shared/localization/locales/en-XL.json +4 -4
- package/shared/localization/locales/es-419.json +43 -4
- package/shared/localization/locales/es.json +42 -3
- package/shared/localization/locales/fi.json +43 -4
- package/shared/localization/locales/fil.json +42 -3
- package/shared/localization/locales/fr.json +42 -3
- package/shared/localization/locales/he.json +48 -9
- package/shared/localization/locales/hi.json +43 -4
- package/shared/localization/locales/hr.json +43 -4
- package/shared/localization/locales/hu.json +42 -3
- package/shared/localization/locales/id.json +42 -3
- package/shared/localization/locales/it.json +43 -4
- package/shared/localization/locales/ja.json +42 -3
- package/shared/localization/locales/ko.json +43 -4
- package/shared/localization/locales/lt.json +42 -3
- package/shared/localization/locales/lv.json +43 -4
- package/shared/localization/locales/nl.json +44 -5
- package/shared/localization/locales/no.json +42 -3
- package/shared/localization/locales/pl.json +43 -4
- package/shared/localization/locales/pt-PT.json +43 -4
- package/shared/localization/locales/pt.json +43 -4
- package/shared/localization/locales/ro.json +43 -4
- package/shared/localization/locales/ru.json +43 -4
- package/shared/localization/locales/sk.json +43 -4
- package/shared/localization/locales/sl.json +42 -3
- package/shared/localization/locales/sr-Latn.json +43 -4
- package/shared/localization/locales/sr.json +43 -4
- package/shared/localization/locales/sv.json +42 -3
- package/shared/localization/locales/ta.json +42 -3
- package/shared/localization/locales/te.json +43 -4
- package/shared/localization/locales/th.json +44 -5
- package/shared/localization/locales/tr.json +43 -4
- package/shared/localization/locales/uk.json +43 -4
- package/shared/localization/locales/vi.json +43 -4
- package/shared/localization/locales/zh-HK.json +43 -4
- package/shared/localization/locales/zh-TW.json +43 -4
- package/shared/localization/locales/zh.json +43 -4
- package/third-party/chromium-synchronization/inspector-issueAdded-types-test.js +1 -0
- package/tsconfig-all.json +1 -0
- package/tsconfig.json +11 -7
- package/types/artifacts.d.ts +23 -25
- package/types/gatherer.d.ts +2 -3
- package/types/lhr/lhr.d.ts +2 -0
- package/core/computed/metrics/first-meaningful-paint.d.ts +0 -21
- package/core/computed/metrics/first-meaningful-paint.js +0 -44
- package/core/computed/metrics/lantern-first-meaningful-paint.d.ts +0 -25
- package/core/computed/metrics/lantern-first-meaningful-paint.js +0 -43
- package/core/lib/lantern/cpu-node.d.ts +0 -44
- package/core/lib/lantern/metrics/first-meaningful-paint.d.ts +0 -6
- package/core/lib/lantern/metrics/first-meaningful-paint.js +0 -64
- package/core/lib/lantern/metrics/interactive.d.ts +0 -26
- package/core/lib/lantern/metrics/largest-contentful-paint.d.ts +0 -19
- package/core/lib/lantern/metrics/max-potential-fid.d.ts +0 -30
- package/core/lib/lantern/metrics/total-blocking-time.d.ts +0 -31
- package/core/lib/lantern/page-dependency-graph.d.ts +0 -58
- /package/core/lib/lantern/{lantern-error.js → LanternError.js} +0 -0
- /package/core/{computed/metrics/tbt-utils.js → lib/lantern/TBTUtils.js} +0 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2017 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import assert from 'assert/strict';
|
|
8
|
+
|
|
9
|
+
import * as Lantern from './lantern.js';
|
|
10
|
+
|
|
11
|
+
const {BaseNode, NetworkNode} = Lantern;
|
|
12
|
+
|
|
13
|
+
function sortedById(nodeArray) {
|
|
14
|
+
return nodeArray.sort((node1, node2) => node1.id.localeCompare(node2.id));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function createComplexGraph() {
|
|
18
|
+
// B F
|
|
19
|
+
// / \ /
|
|
20
|
+
// A D - E
|
|
21
|
+
// \ / \
|
|
22
|
+
// C G - H
|
|
23
|
+
|
|
24
|
+
const nodeA = new BaseNode('A');
|
|
25
|
+
const nodeB = new BaseNode('B');
|
|
26
|
+
const nodeC = new BaseNode('C');
|
|
27
|
+
const nodeD = new BaseNode('D');
|
|
28
|
+
const nodeE = new BaseNode('E');
|
|
29
|
+
const nodeF = new BaseNode('F');
|
|
30
|
+
const nodeG = new BaseNode('G');
|
|
31
|
+
const nodeH = new BaseNode('H');
|
|
32
|
+
|
|
33
|
+
nodeA.addDependent(nodeB);
|
|
34
|
+
nodeA.addDependent(nodeC);
|
|
35
|
+
nodeB.addDependent(nodeD);
|
|
36
|
+
nodeC.addDependent(nodeD);
|
|
37
|
+
nodeD.addDependent(nodeE);
|
|
38
|
+
nodeE.addDependent(nodeF);
|
|
39
|
+
nodeE.addDependent(nodeG);
|
|
40
|
+
nodeG.addDependent(nodeH);
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
nodeA,
|
|
44
|
+
nodeB,
|
|
45
|
+
nodeC,
|
|
46
|
+
nodeD,
|
|
47
|
+
nodeE,
|
|
48
|
+
nodeF,
|
|
49
|
+
nodeG,
|
|
50
|
+
nodeH,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
describe('DependencyGraph/Node', () => {
|
|
54
|
+
describe('#constructor', () => {
|
|
55
|
+
it('should set the ID', () => {
|
|
56
|
+
const node = new BaseNode('foo');
|
|
57
|
+
assert.equal(node.id, 'foo');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
describe('.addDependent', () => {
|
|
62
|
+
it('should add the correct edge', () => {
|
|
63
|
+
const nodeA = new BaseNode(1);
|
|
64
|
+
const nodeB = new BaseNode(2);
|
|
65
|
+
nodeA.addDependent(nodeB);
|
|
66
|
+
|
|
67
|
+
assert.deepEqual(nodeA.getDependents(), [nodeB]);
|
|
68
|
+
assert.deepEqual(nodeB.getDependencies(), [nodeA]);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('.addDependency', () => {
|
|
73
|
+
it('should add the correct edge', () => {
|
|
74
|
+
const nodeA = new BaseNode(1);
|
|
75
|
+
const nodeB = new BaseNode(2);
|
|
76
|
+
nodeA.addDependency(nodeB);
|
|
77
|
+
|
|
78
|
+
assert.deepEqual(nodeA.getDependencies(), [nodeB]);
|
|
79
|
+
assert.deepEqual(nodeB.getDependents(), [nodeA]);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('throw when trying to add a dependency on itself', () => {
|
|
83
|
+
const nodeA = new BaseNode(1);
|
|
84
|
+
expect(() => nodeA.addDependency(nodeA)).toThrow();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe('.isDependentOn', () => {
|
|
89
|
+
it('should identify the dependency relationships', () => {
|
|
90
|
+
const graph = createComplexGraph();
|
|
91
|
+
const nodes = Object.values(graph);
|
|
92
|
+
const {nodeA, nodeB, nodeD, nodeF, nodeH} = graph;
|
|
93
|
+
|
|
94
|
+
for (const node of nodes) {
|
|
95
|
+
expect(nodeA.isDependentOn(node)).toBe(node === nodeA);
|
|
96
|
+
expect(nodeB.isDependentOn(node)).toBe(node === nodeA || node === nodeB);
|
|
97
|
+
expect(nodeH.isDependentOn(node)).toBe(node !== nodeF);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
expect(nodeD.isDependentOn(nodeA)).toBe(true);
|
|
101
|
+
expect(nodeD.isDependentOn(nodeB)).toBe(true);
|
|
102
|
+
expect(nodeD.isDependentOn(nodeD)).toBe(true);
|
|
103
|
+
|
|
104
|
+
expect(nodeD.isDependentOn(nodeH)).toBe(false);
|
|
105
|
+
expect(nodeH.isDependentOn(nodeD)).toBe(true);
|
|
106
|
+
|
|
107
|
+
expect(nodeF.isDependentOn(nodeH)).toBe(false);
|
|
108
|
+
expect(nodeH.isDependentOn(nodeF)).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
describe('.getRootNode', () => {
|
|
113
|
+
it('should return the root node', () => {
|
|
114
|
+
const graph = createComplexGraph();
|
|
115
|
+
|
|
116
|
+
assert.equal(graph.nodeA.getRootNode(), graph.nodeA);
|
|
117
|
+
assert.equal(graph.nodeB.getRootNode(), graph.nodeA);
|
|
118
|
+
assert.equal(graph.nodeD.getRootNode(), graph.nodeA);
|
|
119
|
+
assert.equal(graph.nodeF.getRootNode(), graph.nodeA);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('.cloneWithoutRelationships', () => {
|
|
124
|
+
it('should create a copy', () => {
|
|
125
|
+
const node = new BaseNode(1);
|
|
126
|
+
const neighbor = new BaseNode(2);
|
|
127
|
+
node.addDependency(neighbor);
|
|
128
|
+
const clone = node.cloneWithoutRelationships();
|
|
129
|
+
|
|
130
|
+
assert.equal(clone.id, 1);
|
|
131
|
+
assert.notEqual(node, clone);
|
|
132
|
+
assert.equal(clone.getDependencies().length, 0);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('should copy isMainDocument', () => {
|
|
136
|
+
const node = new BaseNode(1);
|
|
137
|
+
node.setIsMainDocument(true);
|
|
138
|
+
const networkNode = new NetworkNode({});
|
|
139
|
+
networkNode.setIsMainDocument(true);
|
|
140
|
+
|
|
141
|
+
assert.ok(node.cloneWithoutRelationships().isMainDocument());
|
|
142
|
+
assert.ok(networkNode.cloneWithoutRelationships().isMainDocument());
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
describe('.cloneWithRelationships', () => {
|
|
147
|
+
it('should create a copy of a basic graph', () => {
|
|
148
|
+
const node = new BaseNode(1);
|
|
149
|
+
const neighbor = new BaseNode(2);
|
|
150
|
+
node.addDependency(neighbor);
|
|
151
|
+
const clone = node.cloneWithRelationships();
|
|
152
|
+
|
|
153
|
+
assert.equal(clone.id, 1);
|
|
154
|
+
assert.notEqual(node, clone);
|
|
155
|
+
|
|
156
|
+
const dependencies = clone.getDependencies();
|
|
157
|
+
assert.equal(dependencies.length, 1);
|
|
158
|
+
|
|
159
|
+
const neighborClone = dependencies[0];
|
|
160
|
+
assert.equal(neighborClone.id, neighbor.id);
|
|
161
|
+
assert.notEqual(neighborClone, neighbor);
|
|
162
|
+
assert.equal(neighborClone.getDependents()[0], clone);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('should create a copy of a complex graph', () => {
|
|
166
|
+
const graph = createComplexGraph();
|
|
167
|
+
const clone = graph.nodeA.cloneWithRelationships();
|
|
168
|
+
|
|
169
|
+
const clonedIdMap = new Map();
|
|
170
|
+
clone.traverse(node => clonedIdMap.set(node.id, node));
|
|
171
|
+
assert.equal(clonedIdMap.size, 8);
|
|
172
|
+
|
|
173
|
+
graph.nodeA.traverse(node => {
|
|
174
|
+
const clone = clonedIdMap.get(node.id);
|
|
175
|
+
assert.equal(clone.id, node.id);
|
|
176
|
+
assert.notEqual(clone, node);
|
|
177
|
+
|
|
178
|
+
const actualDependents = sortedById(clone.getDependents());
|
|
179
|
+
const expectedDependents = sortedById(node.getDependents());
|
|
180
|
+
actualDependents.forEach((cloneDependent, index) => {
|
|
181
|
+
const originalDependent = expectedDependents[index];
|
|
182
|
+
assert.equal(cloneDependent.id, originalDependent.id);
|
|
183
|
+
assert.notEqual(cloneDependent, originalDependent);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('should create a copy of a graph with long dependency chains', () => {
|
|
189
|
+
// C - D - E - F
|
|
190
|
+
// / \
|
|
191
|
+
// A - - - - - - - B
|
|
192
|
+
const nodeA = new BaseNode('A');
|
|
193
|
+
const nodeB = new BaseNode('B');
|
|
194
|
+
const nodeC = new BaseNode('C');
|
|
195
|
+
const nodeD = new BaseNode('D');
|
|
196
|
+
const nodeE = new BaseNode('E');
|
|
197
|
+
const nodeF = new BaseNode('F');
|
|
198
|
+
|
|
199
|
+
nodeA.addDependent(nodeB);
|
|
200
|
+
nodeF.addDependent(nodeB);
|
|
201
|
+
|
|
202
|
+
nodeA.addDependent(nodeC);
|
|
203
|
+
nodeC.addDependent(nodeD);
|
|
204
|
+
nodeD.addDependent(nodeE);
|
|
205
|
+
nodeE.addDependent(nodeF);
|
|
206
|
+
|
|
207
|
+
const clone = nodeA.cloneWithRelationships();
|
|
208
|
+
|
|
209
|
+
const clonedIdMap = new Map();
|
|
210
|
+
clone.traverse(node => clonedIdMap.set(node.id, node));
|
|
211
|
+
assert.equal(clonedIdMap.size, 6);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('should create a copy when not starting at root node', () => {
|
|
215
|
+
const graph = createComplexGraph();
|
|
216
|
+
const cloneD = graph.nodeD.cloneWithRelationships();
|
|
217
|
+
assert.equal(cloneD.id, 'D');
|
|
218
|
+
assert.equal(cloneD.getRootNode().id, 'A');
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it('should create a partial copy of a complex graph', () => {
|
|
222
|
+
const graph = createComplexGraph();
|
|
223
|
+
// create a clone with F and all its dependencies
|
|
224
|
+
const clone = graph.nodeA.cloneWithRelationships(node => node.id === 'F');
|
|
225
|
+
|
|
226
|
+
const clonedIdMap = new Map();
|
|
227
|
+
clone.traverse(node => clonedIdMap.set(node.id, node));
|
|
228
|
+
|
|
229
|
+
assert.equal(clonedIdMap.size, 6);
|
|
230
|
+
assert.ok(clonedIdMap.has('F'), 'did not include target node');
|
|
231
|
+
assert.ok(clonedIdMap.has('E'), 'did not include dependency');
|
|
232
|
+
assert.ok(clonedIdMap.has('B'), 'did not include branched dependency');
|
|
233
|
+
assert.ok(clonedIdMap.has('C'), 'did not include branched dependency');
|
|
234
|
+
assert.equal(clonedIdMap.get('G'), undefined);
|
|
235
|
+
assert.equal(clonedIdMap.get('H'), undefined);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it('should throw if original node is not in cloned graph', () => {
|
|
239
|
+
const graph = createComplexGraph();
|
|
240
|
+
assert.throws(
|
|
241
|
+
// clone from root to nodeB, but called on nodeD
|
|
242
|
+
_ => graph.nodeD.cloneWithRelationships(node => node.id === 'B'),
|
|
243
|
+
/^Error: Cloned graph missing node$/
|
|
244
|
+
);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
describe('.traverse', () => {
|
|
249
|
+
it('should visit every dependent node', () => {
|
|
250
|
+
const graph = createComplexGraph();
|
|
251
|
+
const ids = [];
|
|
252
|
+
graph.nodeA.traverse(node => ids.push(node.id));
|
|
253
|
+
|
|
254
|
+
assert.deepEqual(ids, ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('should include a shortest traversal path to every dependent node', () => {
|
|
258
|
+
const graph = createComplexGraph();
|
|
259
|
+
const paths = [];
|
|
260
|
+
graph.nodeA.traverse((node, traversalPath) => {
|
|
261
|
+
assert.strictEqual(node.id, traversalPath[0].id);
|
|
262
|
+
paths.push(traversalPath.map(node => node.id));
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
assert.deepStrictEqual(paths, [
|
|
266
|
+
['A'],
|
|
267
|
+
['B', 'A'],
|
|
268
|
+
['C', 'A'],
|
|
269
|
+
['D', 'B', 'A'],
|
|
270
|
+
['E', 'D', 'B', 'A'],
|
|
271
|
+
['F', 'E', 'D', 'B', 'A'],
|
|
272
|
+
['G', 'E', 'D', 'B', 'A'],
|
|
273
|
+
['H', 'G', 'E', 'D', 'B', 'A'],
|
|
274
|
+
]);
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it('should respect getNext', () => {
|
|
278
|
+
const graph = createComplexGraph();
|
|
279
|
+
const ids = [];
|
|
280
|
+
graph.nodeF.traverse(
|
|
281
|
+
node => ids.push(node.id),
|
|
282
|
+
node => node.getDependencies()
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
assert.deepEqual(ids, ['F', 'E', 'D', 'B', 'C', 'A']);
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
describe('#hasCycle', () => {
|
|
290
|
+
it('should return false for DAGs', () => {
|
|
291
|
+
const graph = createComplexGraph();
|
|
292
|
+
assert.equal(BaseNode.hasCycle(graph.nodeA), false);
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it('should return false for triangular DAGs', () => {
|
|
296
|
+
// B
|
|
297
|
+
// / \
|
|
298
|
+
// A - C
|
|
299
|
+
const nodeA = new BaseNode('A');
|
|
300
|
+
const nodeB = new BaseNode('B');
|
|
301
|
+
const nodeC = new BaseNode('C');
|
|
302
|
+
|
|
303
|
+
nodeA.addDependent(nodeC);
|
|
304
|
+
nodeA.addDependent(nodeB);
|
|
305
|
+
nodeB.addDependent(nodeC);
|
|
306
|
+
|
|
307
|
+
assert.equal(BaseNode.hasCycle(nodeA), false);
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
it('should return true for basic cycles', () => {
|
|
311
|
+
// A - B - C - A!
|
|
312
|
+
const nodeA = new BaseNode('A');
|
|
313
|
+
const nodeB = new BaseNode('B');
|
|
314
|
+
const nodeC = new BaseNode('C');
|
|
315
|
+
|
|
316
|
+
nodeA.addDependent(nodeB);
|
|
317
|
+
nodeB.addDependent(nodeC);
|
|
318
|
+
nodeC.addDependent(nodeA);
|
|
319
|
+
|
|
320
|
+
assert.equal(BaseNode.hasCycle(nodeA), true);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('should return true for children', () => {
|
|
324
|
+
// A!
|
|
325
|
+
// /
|
|
326
|
+
// A - B - C
|
|
327
|
+
const nodeA = new BaseNode('A');
|
|
328
|
+
const nodeB = new BaseNode('B');
|
|
329
|
+
const nodeC = new BaseNode('C');
|
|
330
|
+
|
|
331
|
+
nodeA.addDependent(nodeB);
|
|
332
|
+
nodeB.addDependent(nodeC);
|
|
333
|
+
nodeB.addDependent(nodeA);
|
|
334
|
+
|
|
335
|
+
assert.equal(BaseNode.hasCycle(nodeC), true);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('should return true for complex cycles', () => {
|
|
339
|
+
// B - D - F - G - C!
|
|
340
|
+
// / /
|
|
341
|
+
// A - - C - E - H
|
|
342
|
+
const nodeA = new BaseNode('A');
|
|
343
|
+
const nodeB = new BaseNode('B');
|
|
344
|
+
const nodeC = new BaseNode('C');
|
|
345
|
+
const nodeD = new BaseNode('D');
|
|
346
|
+
const nodeE = new BaseNode('E');
|
|
347
|
+
const nodeF = new BaseNode('F');
|
|
348
|
+
const nodeG = new BaseNode('G');
|
|
349
|
+
const nodeH = new BaseNode('H');
|
|
350
|
+
|
|
351
|
+
nodeA.addDependent(nodeB);
|
|
352
|
+
nodeA.addDependent(nodeC);
|
|
353
|
+
nodeB.addDependent(nodeD);
|
|
354
|
+
nodeC.addDependent(nodeE);
|
|
355
|
+
nodeC.addDependent(nodeF);
|
|
356
|
+
nodeD.addDependent(nodeF);
|
|
357
|
+
nodeE.addDependent(nodeH);
|
|
358
|
+
nodeF.addDependent(nodeG);
|
|
359
|
+
nodeG.addDependent(nodeC);
|
|
360
|
+
|
|
361
|
+
assert.equal(BaseNode.hasCycle(nodeA), true);
|
|
362
|
+
assert.equal(BaseNode.hasCycle(nodeB), true);
|
|
363
|
+
assert.equal(BaseNode.hasCycle(nodeC), true);
|
|
364
|
+
assert.equal(BaseNode.hasCycle(nodeD), true);
|
|
365
|
+
assert.equal(BaseNode.hasCycle(nodeE), true);
|
|
366
|
+
assert.equal(BaseNode.hasCycle(nodeF), true);
|
|
367
|
+
assert.equal(BaseNode.hasCycle(nodeG), true);
|
|
368
|
+
assert.equal(BaseNode.hasCycle(nodeH), true);
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
it('works for very large graphs', () => {
|
|
372
|
+
const root = new BaseNode('root');
|
|
373
|
+
|
|
374
|
+
let lastNode = root;
|
|
375
|
+
for (let i = 0; i < 10000; i++) {
|
|
376
|
+
const nextNode = new BaseNode(`child${i}`);
|
|
377
|
+
lastNode.addDependent(nextNode);
|
|
378
|
+
lastNode = nextNode;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
lastNode.addDependent(root);
|
|
382
|
+
assert.equal(BaseNode.hasCycle(root), true);
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @template [T=any]
|
|
3
|
+
* @extends {Lantern.BaseNode<T>}
|
|
4
|
+
*/
|
|
5
|
+
export class CPUNode<T = any> extends Lantern.BaseNode<T> {
|
|
6
|
+
/**
|
|
7
|
+
* @param {Lantern.TraceEvent} parentEvent
|
|
8
|
+
* @param {Lantern.TraceEvent[]=} childEvents
|
|
9
|
+
* @param {number=} correctedEndTs
|
|
10
|
+
*/
|
|
11
|
+
constructor(parentEvent: Lantern.TraceEvent, childEvents?: Lantern.TraceEvent[] | undefined, correctedEndTs?: number | undefined);
|
|
12
|
+
_event: import("./types/lantern.js").TraceEvent;
|
|
13
|
+
_childEvents: import("./types/lantern.js").TraceEvent[];
|
|
14
|
+
_correctedEndTs: number | undefined;
|
|
15
|
+
get type(): "cpu";
|
|
16
|
+
/**
|
|
17
|
+
* @return {number}
|
|
18
|
+
*/
|
|
19
|
+
get duration(): number;
|
|
20
|
+
/**
|
|
21
|
+
* @return {Lantern.TraceEvent}
|
|
22
|
+
*/
|
|
23
|
+
get event(): import("./types/lantern.js").TraceEvent;
|
|
24
|
+
/**
|
|
25
|
+
* @return {Lantern.TraceEvent[]}
|
|
26
|
+
*/
|
|
27
|
+
get childEvents(): import("./types/lantern.js").TraceEvent[];
|
|
28
|
+
/**
|
|
29
|
+
* Returns true if this node contains a Layout task.
|
|
30
|
+
* @return {boolean}
|
|
31
|
+
*/
|
|
32
|
+
didPerformLayout(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Returns the script URLs that had their EvaluateScript events occur in this task.
|
|
35
|
+
*/
|
|
36
|
+
getEvaluateScriptURLs(): Set<string>;
|
|
37
|
+
/**
|
|
38
|
+
* @return {CPUNode}
|
|
39
|
+
*/
|
|
40
|
+
cloneWithoutRelationships(): CPUNode;
|
|
41
|
+
}
|
|
42
|
+
import * as Lantern from './lantern.js';
|
|
43
|
+
//# sourceMappingURL=CpuNode.d.ts.map
|
|
@@ -4,17 +4,16 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import * as
|
|
8
|
-
import {BaseNode} from './base-node.js';
|
|
7
|
+
import * as Lantern from './lantern.js';
|
|
9
8
|
|
|
10
9
|
/**
|
|
11
10
|
* @template [T=any]
|
|
12
|
-
* @extends {BaseNode<T>}
|
|
11
|
+
* @extends {Lantern.BaseNode<T>}
|
|
13
12
|
*/
|
|
14
|
-
class CPUNode extends BaseNode {
|
|
13
|
+
class CPUNode extends Lantern.BaseNode {
|
|
15
14
|
/**
|
|
16
|
-
* @param {
|
|
17
|
-
* @param {
|
|
15
|
+
* @param {Lantern.TraceEvent} parentEvent
|
|
16
|
+
* @param {Lantern.TraceEvent[]=} childEvents
|
|
18
17
|
* @param {number=} correctedEndTs
|
|
19
18
|
*/
|
|
20
19
|
constructor(parentEvent, childEvents = [], correctedEndTs) {
|
|
@@ -27,7 +26,7 @@ class CPUNode extends BaseNode {
|
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
get type() {
|
|
30
|
-
return BaseNode.TYPES.CPU;
|
|
29
|
+
return Lantern.BaseNode.TYPES.CPU;
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
/**
|
|
@@ -53,14 +52,14 @@ class CPUNode extends BaseNode {
|
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
/**
|
|
56
|
-
* @return {
|
|
55
|
+
* @return {Lantern.TraceEvent}
|
|
57
56
|
*/
|
|
58
57
|
get event() {
|
|
59
58
|
return this._event;
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
/**
|
|
63
|
-
* @return {
|
|
62
|
+
* @return {Lantern.TraceEvent[]}
|
|
64
63
|
*/
|
|
65
64
|
get childEvents() {
|
|
66
65
|
return this._childEvents;
|
|
@@ -1,25 +1,23 @@
|
|
|
1
|
-
export type Node = import('./
|
|
2
|
-
export type NetworkNode = import('./
|
|
3
|
-
export type Simulator = import('./
|
|
1
|
+
export type Node = import('./BaseNode.js').Node;
|
|
2
|
+
export type NetworkNode = import('./NetworkNode.js').NetworkNode;
|
|
3
|
+
export type Simulator = import('./simulation/Simulator.js').Simulator;
|
|
4
4
|
export type Extras = {
|
|
5
5
|
optimistic: boolean;
|
|
6
|
-
fcpResult?:
|
|
7
|
-
|
|
8
|
-
interactiveResult?:
|
|
9
|
-
|
|
10
|
-
speedIndex: number;
|
|
11
|
-
} | undefined;
|
|
6
|
+
fcpResult?: Lantern.Metrics.Result | undefined;
|
|
7
|
+
lcpResult?: Lantern.Metrics.Result | undefined;
|
|
8
|
+
interactiveResult?: Lantern.Metrics.Result | undefined;
|
|
9
|
+
observedSpeedIndex?: number | undefined;
|
|
12
10
|
};
|
|
13
|
-
/** @typedef {import('./
|
|
14
|
-
/** @typedef {import('./
|
|
15
|
-
/** @typedef {import('./
|
|
11
|
+
/** @typedef {import('./BaseNode.js').Node} Node */
|
|
12
|
+
/** @typedef {import('./NetworkNode.js').NetworkNode} NetworkNode */
|
|
13
|
+
/** @typedef {import('./simulation/Simulator.js').Simulator} Simulator */
|
|
16
14
|
/**
|
|
17
15
|
* @typedef Extras
|
|
18
16
|
* @property {boolean} optimistic
|
|
19
|
-
* @property {
|
|
20
|
-
* @property {
|
|
21
|
-
* @property {
|
|
22
|
-
* @property {
|
|
17
|
+
* @property {Lantern.Metrics.Result=} fcpResult
|
|
18
|
+
* @property {Lantern.Metrics.Result=} lcpResult
|
|
19
|
+
* @property {Lantern.Metrics.Result=} interactiveResult
|
|
20
|
+
* @property {number=} observedSpeedIndex
|
|
23
21
|
*/
|
|
24
22
|
export class Metric {
|
|
25
23
|
/**
|
|
@@ -31,7 +29,7 @@ export class Metric {
|
|
|
31
29
|
/**
|
|
32
30
|
* @return {Lantern.Simulation.MetricCoefficients}
|
|
33
31
|
*/
|
|
34
|
-
static get COEFFICIENTS():
|
|
32
|
+
static get COEFFICIENTS(): import("./types/lantern.js").Simulation.MetricCoefficients;
|
|
35
33
|
/**
|
|
36
34
|
* Returns the coefficients, scaled by the throttling settings if needed by the metric.
|
|
37
35
|
* Some lantern metrics (speed-index) use components in their estimate that are not
|
|
@@ -44,16 +42,16 @@ export class Metric {
|
|
|
44
42
|
static getScaledCoefficients(rttMs: number): Lantern.Simulation.MetricCoefficients;
|
|
45
43
|
/**
|
|
46
44
|
* @param {Node} dependencyGraph
|
|
47
|
-
* @param {
|
|
45
|
+
* @param {Lantern.Simulation.ProcessedNavigation} processedNavigation
|
|
48
46
|
* @return {Node}
|
|
49
47
|
*/
|
|
50
|
-
static getOptimisticGraph(dependencyGraph: Node, processedNavigation:
|
|
48
|
+
static getOptimisticGraph(dependencyGraph: Node, processedNavigation: Lantern.Simulation.ProcessedNavigation): Node;
|
|
51
49
|
/**
|
|
52
50
|
* @param {Node} dependencyGraph
|
|
53
|
-
* @param {
|
|
51
|
+
* @param {Lantern.Simulation.ProcessedNavigation} processedNavigation
|
|
54
52
|
* @return {Node}
|
|
55
53
|
*/
|
|
56
|
-
static getPessimisticGraph(dependencyGraph: Node, processedNavigation:
|
|
54
|
+
static getPessimisticGraph(dependencyGraph: Node, processedNavigation: Lantern.Simulation.ProcessedNavigation): Node;
|
|
57
55
|
/**
|
|
58
56
|
* @param {Lantern.Simulation.Result} simulationResult
|
|
59
57
|
* @param {Extras} extras
|
|
@@ -63,9 +61,9 @@ export class Metric {
|
|
|
63
61
|
/**
|
|
64
62
|
* @param {Lantern.Simulation.MetricComputationDataInput} data
|
|
65
63
|
* @param {Omit<Extras, 'optimistic'>=} extras
|
|
66
|
-
* @return {Promise<
|
|
64
|
+
* @return {Promise<Lantern.Metrics.Result>}
|
|
67
65
|
*/
|
|
68
|
-
static compute(data: Lantern.Simulation.MetricComputationDataInput, extras?: Omit<Extras, 'optimistic'> | undefined): Promise<
|
|
66
|
+
static compute(data: Lantern.Simulation.MetricComputationDataInput, extras?: Omit<Extras, 'optimistic'> | undefined): Promise<Lantern.Metrics.Result>;
|
|
69
67
|
}
|
|
70
|
-
import * as Lantern from './
|
|
71
|
-
//# sourceMappingURL=
|
|
68
|
+
import * as Lantern from './lantern.js';
|
|
69
|
+
//# sourceMappingURL=Metric.d.ts.map
|
|
@@ -4,21 +4,19 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import * as Lantern from './
|
|
8
|
-
import {BaseNode} from '../../lib/lantern/base-node.js';
|
|
9
|
-
import {NetworkRequest} from '../../lib/network-request.js';
|
|
7
|
+
import * as Lantern from './lantern.js';
|
|
10
8
|
|
|
11
|
-
/** @typedef {import('./
|
|
12
|
-
/** @typedef {import('./
|
|
13
|
-
/** @typedef {import('./
|
|
9
|
+
/** @typedef {import('./BaseNode.js').Node} Node */
|
|
10
|
+
/** @typedef {import('./NetworkNode.js').NetworkNode} NetworkNode */
|
|
11
|
+
/** @typedef {import('./simulation/Simulator.js').Simulator} Simulator */
|
|
14
12
|
|
|
15
13
|
/**
|
|
16
14
|
* @typedef Extras
|
|
17
15
|
* @property {boolean} optimistic
|
|
18
|
-
* @property {
|
|
19
|
-
* @property {
|
|
20
|
-
* @property {
|
|
21
|
-
* @property {
|
|
16
|
+
* @property {Lantern.Metrics.Result=} fcpResult
|
|
17
|
+
* @property {Lantern.Metrics.Result=} lcpResult
|
|
18
|
+
* @property {Lantern.Metrics.Result=} interactiveResult
|
|
19
|
+
* @property {number=} observedSpeedIndex
|
|
22
20
|
*/
|
|
23
21
|
|
|
24
22
|
class Metric {
|
|
@@ -32,10 +30,10 @@ class Metric {
|
|
|
32
30
|
const scriptUrls = new Set();
|
|
33
31
|
|
|
34
32
|
dependencyGraph.traverse(node => {
|
|
35
|
-
if (node.type !== BaseNode.TYPES.NETWORK) return;
|
|
36
|
-
if (node.
|
|
33
|
+
if (node.type !== Lantern.BaseNode.TYPES.NETWORK) return;
|
|
34
|
+
if (node.request.resourceType !== Lantern.NetworkRequestTypes.Script) return;
|
|
37
35
|
if (treatNodeAsRenderBlocking?.(node)) {
|
|
38
|
-
scriptUrls.add(node.
|
|
36
|
+
scriptUrls.add(node.request.url);
|
|
39
37
|
}
|
|
40
38
|
});
|
|
41
39
|
|
|
@@ -64,7 +62,7 @@ class Metric {
|
|
|
64
62
|
|
|
65
63
|
/**
|
|
66
64
|
* @param {Node} dependencyGraph
|
|
67
|
-
* @param {
|
|
65
|
+
* @param {Lantern.Simulation.ProcessedNavigation} processedNavigation
|
|
68
66
|
* @return {Node}
|
|
69
67
|
*/
|
|
70
68
|
static getOptimisticGraph(dependencyGraph, processedNavigation) { // eslint-disable-line no-unused-vars
|
|
@@ -73,7 +71,7 @@ class Metric {
|
|
|
73
71
|
|
|
74
72
|
/**
|
|
75
73
|
* @param {Node} dependencyGraph
|
|
76
|
-
* @param {
|
|
74
|
+
* @param {Lantern.Simulation.ProcessedNavigation} processedNavigation
|
|
77
75
|
* @return {Node}
|
|
78
76
|
*/
|
|
79
77
|
static getPessimisticGraph(dependencyGraph, processedNavigation) { // eslint-disable-line no-unused-vars
|
|
@@ -92,7 +90,7 @@ class Metric {
|
|
|
92
90
|
/**
|
|
93
91
|
* @param {Lantern.Simulation.MetricComputationDataInput} data
|
|
94
92
|
* @param {Omit<Extras, 'optimistic'>=} extras
|
|
95
|
-
* @return {Promise<
|
|
93
|
+
* @return {Promise<Lantern.Metrics.Result>}
|
|
96
94
|
*/
|
|
97
95
|
static async compute(data, extras) {
|
|
98
96
|
const {simulator, graph, processedNavigation} = data;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @template [T=any]
|
|
3
|
-
* @extends {BaseNode<T>}
|
|
3
|
+
* @extends {Lantern.BaseNode<T>}
|
|
4
4
|
*/
|
|
5
|
-
export class NetworkNode<T = any> extends BaseNode<T> {
|
|
5
|
+
export class NetworkNode<T = any> extends Lantern.BaseNode<T> {
|
|
6
6
|
/**
|
|
7
7
|
* @param {Lantern.NetworkRequest<T>} networkRequest
|
|
8
8
|
*/
|
|
@@ -13,7 +13,7 @@ export class NetworkNode<T = any> extends BaseNode<T> {
|
|
|
13
13
|
/**
|
|
14
14
|
* @return {Readonly<T>}
|
|
15
15
|
*/
|
|
16
|
-
get
|
|
16
|
+
get rawRequest(): Readonly<T>;
|
|
17
17
|
/**
|
|
18
18
|
* @return {Lantern.NetworkRequest<T>}
|
|
19
19
|
*/
|
|
@@ -31,7 +31,7 @@ export class NetworkNode<T = any> extends BaseNode<T> {
|
|
|
31
31
|
*/
|
|
32
32
|
get isNonNetworkProtocol(): boolean;
|
|
33
33
|
/**
|
|
34
|
-
* Returns whether this network
|
|
34
|
+
* Returns whether this network request can be downloaded without a TCP connection.
|
|
35
35
|
* During simulation we treat data coming in over a network connection separately from on-device data.
|
|
36
36
|
* @return {boolean}
|
|
37
37
|
*/
|
|
@@ -45,6 +45,5 @@ export class NetworkNode<T = any> extends BaseNode<T> {
|
|
|
45
45
|
*/
|
|
46
46
|
cloneWithoutRelationships(): NetworkNode<T>;
|
|
47
47
|
}
|
|
48
|
-
import
|
|
49
|
-
|
|
50
|
-
//# sourceMappingURL=network-node.d.ts.map
|
|
48
|
+
import * as Lantern from './lantern.js';
|
|
49
|
+
//# sourceMappingURL=NetworkNode.d.ts.map
|