-
Notifications
You must be signed in to change notification settings - Fork 9.4k
/
artifacts.d.ts
481 lines (437 loc) · 19.8 KB
/
artifacts.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
/**
* @license Copyright 2018 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
*/
import parseManifest = require('../lighthouse-core/lib/manifest-parser.js');
import _LanternSimulator = require('../lighthouse-core/lib/dependency-graph/simulator/simulator.js');
import _NetworkRequest = require('../lighthouse-core/lib/network-request.js');
import speedline = require('speedline-core');
type _TaskNode = import('../lighthouse-core/computed/main-thread-tasks.js').TaskNode;
type LanternSimulator = InstanceType<typeof _LanternSimulator>;
declare global {
module LH {
export interface Artifacts extends BaseArtifacts, GathererArtifacts {}
/** Artifacts always created by GatherRunner. */
export interface BaseArtifacts {
/** The ISO-8601 timestamp of when the test page was fetched and artifacts collected. */
fetchTime: string;
/** A set of warnings about unexpected things encountered while loading and testing the page. */
LighthouseRunWarnings: string[];
/** Whether the page was loaded on either a real or emulated mobile device. */
TestedAsMobileDevice: boolean;
/** The user agent string of the version of Chrome used. */
HostUserAgent: string;
/** The user agent string that Lighthouse used to load the page. */
NetworkUserAgent: string;
/** The benchmark index that indicates rough device class. */
BenchmarkIndex: number;
/** Parsed version of the page's Web App Manifest, or null if none found. */
WebAppManifest: Artifacts.Manifest | null;
/** Information on detected tech stacks (e.g. JS libraries) used by the page. */
Stacks: Artifacts.DetectedStack[];
/** A set of page-load traces, keyed by passName. */
traces: {[passName: string]: Trace};
/** A set of DevTools debugger protocol records, keyed by passName. */
devtoolsLogs: {[passName: string]: DevtoolsLog};
/** An object containing information about the testing configuration used by Lighthouse. */
settings: Config.Settings;
/** The URL initially requested and the post-redirects URL that was actually loaded. */
URL: {requestedUrl: string, finalUrl: string};
/** The timing instrumentation of the gather portion of a run. */
Timing: Artifacts.MeasureEntry[];
}
/**
* Artifacts provided by the default gatherers that are exposed to plugins with a hardended API.
* NOTE: any breaking changes here are considered breaking Lighthouse changes that must be done
* on a major version bump.
*/
export interface PublicGathererArtifacts {
/** Console deprecation and intervention warnings logged by Chrome during page load. */
ConsoleMessages: Crdp.Log.EntryAddedEvent[];
/** Information on size and loading for all the images in the page. Natural size information for `picture` and CSS images is only available if the image was one of the largest 50 images. */
ImageElements: Artifacts.ImageElement[];
/** All the link elements on the page or equivalently declared in `Link` headers. @see https://html.spec.whatwg.org/multipage/links.html */
LinkElements: Artifacts.LinkElement[];
/** The values of the <meta> elements in the head. */
MetaElements: Array<{name: string, content?: string}>;
/** Set of exceptions thrown during page load. */
RuntimeExceptions: Crdp.Runtime.ExceptionThrownEvent[];
/** Information on all script elements in the page. Also contains the content of all requested scripts and the networkRecord requestId that contained their content. Note, HTML documents will have one entry per script tag, all with the same requestId. */
ScriptElements: Array<Artifacts.ScriptElement>;
/** The dimensions and devicePixelRatio of the loaded viewport. */
ViewportDimensions: Artifacts.ViewportDimensions;
}
/**
* Artifacts provided by the default gatherers. Augment this interface when adding additional
* gatherers. Changes to these artifacts are not considered a breaking Lighthouse change.
*/
export interface GathererArtifacts extends PublicGathererArtifacts {
/** The results of running the aXe accessibility tests on the page. */
Accessibility: Artifacts.Accessibility;
/** Array of all anchors on the page. */
AnchorElements: Artifacts.AnchorElement[];
/** The value of the page's <html> manifest attribute, or null if not defined */
AppCacheManifest: string | null;
/** Array of all URLs cached in CacheStorage. */
CacheContents: string[];
/** CSS coverage information for styles used by page's final state. */
CSSUsage: {rules: Crdp.CSS.RuleUsage[], stylesheets: Artifacts.CSSStyleSheetInfo[]};
/** Information on the document's doctype(or null if not present), specifically the name, publicId, and systemId.
All properties default to an empty string if not present */
Doctype: Artifacts.Doctype | null;
/** Information on the size of all DOM nodes in the page and the most extreme members. */
DOMStats: Artifacts.DOMStats;
/** Relevant attributes and child properties of all <object>s, <embed>s and <applet>s in the page. */
EmbeddedContent: Artifacts.EmbeddedContentInfo[];
/** Information for font faces used in the page. */
Fonts: Artifacts.Font[];
/** Information on poorly sized font usage and the text affected by it. */
FontSize: Artifacts.FontSize;
/** The page's document body innerText if loaded with JavaScript disabled. */
HTMLWithoutJavaScript: {bodyText: string, hasNoScript: boolean};
/** Whether the page ended up on an HTTPS page after attempting to load the HTTP version. */
HTTPRedirect: {value: boolean};
/** JS coverage information for code used during page load. */
JsUsage: Crdp.Profiler.ScriptCoverage[];
/** Parsed version of the page's Web App Manifest, or null if none found. */
Manifest: Artifacts.Manifest | null;
/** The URL loaded with interception */
MixedContent: {url: string};
/** The status code of the attempted load of the page while network access is disabled. */
Offline: number;
/** Size and compression opportunity information for all the images in the page. */
OptimizedImages: Array<Artifacts.OptimizedImage | Artifacts.OptimizedImageError>;
/** HTML snippets from any password inputs that prevent pasting. */
PasswordInputsWithPreventedPaste: {snippet: string}[];
/** Size info of all network records sent without compression and their size after gzipping. */
ResponseCompression: {requestId: string, url: string, mimeType: string, transferSize: number, resourceSize: number, gzipSize?: number}[];
/** Information on fetching and the content of the /robots.txt file. */
RobotsTxt: {status: number|null, content: string|null};
/** Version information for all ServiceWorkers active after the first page load. */
ServiceWorker: {versions: Crdp.ServiceWorker.ServiceWorkerVersion[], registrations: Crdp.ServiceWorker.ServiceWorkerRegistration[]};
/** The status of an offline fetch of the page's start_url. -1 and a explanation if missing or there was an error. */
StartUrl: {statusCode: number, explanation?: string};
/** Information on <script> and <link> tags blocking first paint. */
TagsBlockingFirstPaint: Artifacts.TagBlockingFirstPaint[];
/** Information about tap targets including their position and size. */
TapTargets: Artifacts.TapTarget[];
}
module Artifacts {
export type NetworkRequest = _NetworkRequest;
export type TaskNode = _TaskNode;
export type MetaElement = LH.Artifacts['MetaElements'][0];
export interface Accessibility {
violations: {
id: string;
impact: string;
tags: string[];
nodes: {
path: string;
html: string;
snippet: string;
target: string[];
failureSummary?: string;
}[];
}[];
notApplicable: {
id: string
}[];
}
export interface CSSStyleSheetInfo {
header: Crdp.CSS.CSSStyleSheetHeader;
content: string;
}
export interface Doctype {
name: string;
publicId: string;
systemId: string;
}
export interface DOMStats {
/** The total number of elements found within the page's body. */
totalBodyElements: number;
width: {max: number, pathToElement: Array<string>, snippet: string};
depth: {max: number, pathToElement: Array<string>, snippet: string};
}
export interface EmbeddedContentInfo {
tagName: string;
type: string | null;
src: string | null;
data: string | null;
code: string | null;
params: {name: string; value: string}[];
}
/** @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#Attributes */
export interface LinkElement {
/** The `rel` attribute of the link, normalized to lower case. @see https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types */
rel: 'alternate'|'canonical'|'dns-prefetch'|'preconnect'|'preload'|'stylesheet'|string;
/** The `href` attribute of the link or `null` if it was invalid in the header. */
href: string | null
/** The raw value of the `href` attribute. Only different from `href` when source is 'header' */
hrefRaw: string
/** The `hreflang` attribute of the link */
hreflang: string
/** The `as` attribute of the link */
as: string
/** The `crossOrigin` attribute of the link */
crossOrigin: 'anonymous'|'use-credentials'|null
/** Where the link was found, either in the DOM or in the headers of the main document */
source: 'head'|'body'|'headers'
}
export interface ScriptElement {
type: string | null
src: string | null
async: boolean
defer: boolean
/** Path that uniquely identifies the node in the DOM */
devtoolsNodePath: string;
/** Where the script was discovered, either in the head, the body, or network records. */
source: 'head'|'body'|'network'
/** The content of the inline script or the network record with the matching URL, null if the script had a src and no network record could be found. */
content: string | null
/** The ID of the network request that matched the URL of the src or the main document if inline, null if no request could be found. */
requestId: string | null
}
/** @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Attributes */
export interface AnchorElement {
rel: string
href: string
text: string
target: string
outerHTML: string
}
export interface Font {
display: string;
family: string;
featureSettings: string;
stretch: string;
style: string;
unicodeRange: string;
variant: string;
weight: string;
src?: string[];
}
export interface FontSize {
totalTextLength: number;
failingTextLength: number;
visitedTextLength: number;
analyzedFailingTextLength: number;
analyzedFailingNodesData: Array<{
fontSize: number;
textLength: number;
node: FontSize.DomNodeWithParent;
cssRule?: {
type: 'Regular' | 'Inline' | 'Attributes';
range?: {startLine: number, startColumn: number};
parentRule?: {origin: Crdp.CSS.StyleSheetOrigin, selectors: {text: string}[]};
styleSheetId?: string;
stylesheet?: Crdp.CSS.CSSStyleSheetHeader;
}
}>
}
export module FontSize {
export interface DomNodeWithParent extends Crdp.DOM.Node {
parentId: number;
parentNode: DomNodeWithParent;
}
export interface DomNodeMaybeWithParent extends Crdp.DOM.Node {
parentNode?: DomNodeMaybeWithParent;
}
}
// TODO(bckenny): real type for parsed manifest.
export type Manifest = ReturnType<typeof parseManifest>;
export interface ImageElement {
src: string;
/** The displayed width of the image, uses img.width when available falling back to clientWidth. See https://codepen.io/patrickhulce/pen/PXvQbM for examples. */
displayedWidth: number;
/** The displayed height of the image, uses img.height when available falling back to clientHeight. See https://codepen.io/patrickhulce/pen/PXvQbM for examples. */
displayedHeight: number;
/** The natural width of the underlying image, uses img.naturalWidth. See https://codepen.io/patrickhulce/pen/PXvQbM for examples. */
naturalWidth: number;
/** The natural height of the underlying image, uses img.naturalHeight. See https://codepen.io/patrickhulce/pen/PXvQbM for examples. */
naturalHeight: number;
/** The BoundingClientRect of the element. */
clientRect: {
top: number;
bottom: number;
left: number;
right: number;
};
/** Flags whether this element was an image via CSS background-image rather than <img> tag. */
isCss: boolean;
/** Flags whether this element was contained within a <picture> tag. */
isPicture: boolean;
/** Flags whether this element was sized using a non-default `object-fit` CSS property. */
usesObjectFit: boolean;
/** The size of the underlying image file in bytes. 0 if the file could not be identified. */
resourceSize: number;
/** The MIME type of the underlying image file. */
mimeType?: string;
}
export interface OptimizedImage {
failed: false;
originalSize: number;
jpegSize?: number;
webpSize?: number;
requestId: string;
url: string;
mimeType: string;
resourceSize: number;
}
export interface OptimizedImageError {
failed: true;
errMsg: string;
requestId: string;
url: string;
mimeType: string;
resourceSize: number;
}
export interface TagBlockingFirstPaint {
startTime: number;
endTime: number;
transferSize: number;
tag: {
tagName: string;
url: string;
};
}
export interface Rect {
width: number;
height: number;
top: number;
right: number;
bottom: number;
left: number;
}
export interface TapTarget {
snippet: string,
selector: string,
path: string,
href: string,
clientRects: Rect[]
}
export interface ViewportDimensions {
innerWidth: number;
innerHeight: number;
outerWidth: number;
outerHeight: number;
devicePixelRatio: number;
}
// Computed artifact types below.
export type CriticalRequestNode = {
[id: string]: {
request: Artifacts.NetworkRequest;
children: CriticalRequestNode;
}
}
export type ManifestValueCheckID = 'hasStartUrl'|'hasIconsAtLeast192px'|'hasIconsAtLeast512px'|'hasPWADisplayValue'|'hasBackgroundColor'|'hasThemeColor'|'hasShortName'|'hasName'|'shortNameLength';
export type ManifestValues = {
isParseFailure: false;
allChecks: {
id: ManifestValueCheckID;
failureText: string;
passing: boolean;
}[];
} | {
isParseFailure: true;
parseFailureReason: string;
allChecks: {
id: ManifestValueCheckID;
failureText: string;
passing: boolean;
}[];
}
export interface MeasureEntry {
// From PerformanceEntry
readonly duration: number;
readonly entryType: string;
readonly name: string;
readonly startTime: number;
/** Whether timing entry was collected during artifact gathering. */
gather?: boolean;
}
export interface MetricComputationDataInput {
devtoolsLog: DevtoolsLog;
trace: Trace;
settings: Config.Settings;
simulator?: LanternSimulator;
}
export interface MetricComputationData extends MetricComputationDataInput {
networkRecords: Array<Artifacts.NetworkRequest>;
traceOfTab: TraceOfTab;
}
export interface Metric {
timing: number;
timestamp?: number;
}
export interface NetworkAnalysis {
rtt: number;
additionalRttByOrigin: Map<string, number>;
serverResponseTimeByOrigin: Map<string, number>;
throughput: number;
}
export interface LanternMetric {
timing: number;
timestamp?: never;
optimisticEstimate: Gatherer.Simulation.Result
pessimisticEstimate: Gatherer.Simulation.Result;
optimisticGraph: Gatherer.Simulation.GraphNode;
pessimisticGraph: Gatherer.Simulation.GraphNode;
}
export type Speedline = speedline.Output<'speedIndex'>;
export interface TraceTimes {
navigationStart: number;
firstPaint?: number;
firstContentfulPaint: number;
firstMeaningfulPaint?: number;
traceEnd: number;
load?: number;
domContentLoaded?: number;
}
export interface TraceOfTab {
/** The raw timestamps of key metric events, in microseconds. */
timestamps: TraceTimes;
/** The relative times from navigationStart to key metric events, in milliseconds. */
timings: TraceTimes;
/** The subset of trace events from the page's process, sorted by timestamp. */
processEvents: Array<TraceEvent>;
/** The subset of trace events from the page's main thread, sorted by timestamp. */
mainThreadEvents: Array<TraceEvent>;
/** IDs for the trace's main frame, process, and thread. */
mainFrameIds: {pid: number, tid: number, frameId: string};
/** The trace event marking navigationStart. */
navigationStartEvt: TraceEvent;
/** The trace event marking firstPaint, if it was found. */
firstPaintEvt?: TraceEvent;
/** The trace event marking firstContentfulPaint, if it was found. */
firstContentfulPaintEvt: TraceEvent;
/** The trace event marking firstMeaningfulPaint, if it was found. */
firstMeaningfulPaintEvt?: TraceEvent;
/** The trace event marking loadEventEnd, if it was found. */
loadEvt?: TraceEvent;
/** The trace event marking domContentLoadedEventEnd, if it was found. */
domContentLoadedEvt?: TraceEvent;
/**
* Whether the firstMeaningfulPaintEvt was the definitive event or a fallback to
* firstMeaningfulPaintCandidate events had to be attempted.
*/
fmpFellBack: boolean;
}
/** Information on a tech stack (e.g. a JS library) used by the page. */
export interface DetectedStack {
/** The identifier for how this stack was detected. */
detector: 'js';
/** The unique string ID for the stack. */
id: string;
/** The name of the stack. */
name: string;
/** The version of the stack, if it could be detected. */
version?: string;
/** The package name on NPM, if it exists. */
npm?: string;
}
}
}
}
// empty export to keep file a module
export {}