googlemaps-kit 0.6.0 → 0.7.0
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/README.md +54 -2
- package/dist/books.d.ts +30 -0
- package/dist/books.d.ts.map +1 -0
- package/dist/books.js +77 -0
- package/dist/books.js.map +1 -0
- package/dist/client/http-client.d.ts +3 -1
- package/dist/client/http-client.d.ts.map +1 -1
- package/dist/client/http-client.js +14 -3
- package/dist/client/http-client.js.map +1 -1
- package/dist/client/namespaces.d.ts +1 -4
- package/dist/client/namespaces.d.ts.map +1 -1
- package/dist/client/namespaces.js +1 -5
- package/dist/client/namespaces.js.map +1 -1
- package/dist/finance/client.d.ts +19 -0
- package/dist/finance/client.d.ts.map +1 -0
- package/dist/finance/client.js +75 -0
- package/dist/finance/client.js.map +1 -0
- package/dist/finance/parsers.d.ts +13 -0
- package/dist/finance/parsers.d.ts.map +1 -0
- package/dist/finance/parsers.js +146 -0
- package/dist/finance/parsers.js.map +1 -0
- package/dist/finance/types.d.ts +76 -0
- package/dist/finance/types.d.ts.map +1 -0
- package/dist/finance/types.js +2 -0
- package/dist/finance/types.js.map +1 -0
- package/dist/finance.d.ts +5 -0
- package/dist/finance.d.ts.map +1 -0
- package/dist/finance.js +4 -0
- package/dist/finance.js.map +1 -0
- package/dist/flights/client.d.ts +9 -0
- package/dist/flights/client.d.ts.map +1 -0
- package/dist/flights/client.js +14 -0
- package/dist/flights/client.js.map +1 -0
- package/dist/flights/parsers.d.ts +11 -0
- package/dist/flights/parsers.d.ts.map +1 -0
- package/dist/flights/parsers.js +64 -0
- package/dist/flights/parsers.js.map +1 -0
- package/dist/flights/types.d.ts +52 -0
- package/dist/flights/types.d.ts.map +1 -0
- package/dist/flights/types.js +2 -0
- package/dist/flights/types.js.map +1 -0
- package/dist/flights.d.ts +5 -0
- package/dist/flights.d.ts.map +1 -0
- package/dist/flights.js +4 -0
- package/dist/flights.js.map +1 -0
- package/dist/gemini-web/client.d.ts +16 -0
- package/dist/gemini-web/client.d.ts.map +1 -0
- package/dist/gemini-web/client.js +110 -0
- package/dist/gemini-web/client.js.map +1 -0
- package/dist/gemini-web/parsers.d.ts +5 -0
- package/dist/gemini-web/parsers.d.ts.map +1 -0
- package/dist/gemini-web/parsers.js +62 -0
- package/dist/gemini-web/parsers.js.map +1 -0
- package/dist/gemini-web/types.d.ts +47 -0
- package/dist/gemini-web/types.d.ts.map +1 -0
- package/dist/gemini-web/types.js +2 -0
- package/dist/gemini-web/types.js.map +1 -0
- package/dist/gemini-web.d.ts +5 -0
- package/dist/gemini-web.d.ts.map +1 -0
- package/dist/gemini-web.js +4 -0
- package/dist/gemini-web.js.map +1 -0
- package/dist/google-search/client.d.ts +16 -0
- package/dist/google-search/client.d.ts.map +1 -0
- package/dist/google-search/client.js +117 -0
- package/dist/google-search/client.js.map +1 -0
- package/dist/google-search/errors.d.ts +8 -0
- package/dist/google-search/errors.d.ts.map +1 -0
- package/dist/google-search/errors.js +13 -0
- package/dist/google-search/errors.js.map +1 -0
- package/dist/google-search/html.d.ts +12 -0
- package/dist/google-search/html.d.ts.map +1 -0
- package/dist/google-search/html.js +135 -0
- package/dist/google-search/html.js.map +1 -0
- package/dist/google-search/parsers.d.ts +6 -0
- package/dist/google-search/parsers.d.ts.map +1 -0
- package/dist/google-search/parsers.js +177 -0
- package/dist/google-search/parsers.js.map +1 -0
- package/dist/google-search/types.d.ts +66 -0
- package/dist/google-search/types.d.ts.map +1 -0
- package/dist/google-search/types.js +2 -0
- package/dist/google-search/types.js.map +1 -0
- package/dist/google-search.d.ts +6 -0
- package/dist/google-search.d.ts.map +1 -0
- package/dist/google-search.js +4 -0
- package/dist/google-search.js.map +1 -0
- package/dist/hotels/client.d.ts +9 -0
- package/dist/hotels/client.d.ts.map +1 -0
- package/dist/hotels/client.js +14 -0
- package/dist/hotels/client.js.map +1 -0
- package/dist/hotels/parsers.d.ts +7 -0
- package/dist/hotels/parsers.d.ts.map +1 -0
- package/dist/hotels/parsers.js +74 -0
- package/dist/hotels/parsers.js.map +1 -0
- package/dist/hotels/types.d.ts +55 -0
- package/dist/hotels/types.d.ts.map +1 -0
- package/dist/hotels/types.js +2 -0
- package/dist/hotels/types.js.map +1 -0
- package/dist/hotels.d.ts +4 -0
- package/dist/hotels.d.ts.map +1 -0
- package/dist/hotels.js +3 -0
- package/dist/hotels.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/known-surfaces.d.ts +0 -6
- package/dist/known-surfaces.d.ts.map +1 -1
- package/dist/known-surfaces.js +0 -6
- package/dist/known-surfaces.js.map +1 -1
- package/dist/lens/client.d.ts +14 -0
- package/dist/lens/client.d.ts.map +1 -0
- package/dist/lens/client.js +116 -0
- package/dist/lens/client.js.map +1 -0
- package/dist/lens/errors.d.ts +8 -0
- package/dist/lens/errors.d.ts.map +1 -0
- package/dist/lens/errors.js +13 -0
- package/dist/lens/errors.js.map +1 -0
- package/dist/lens/types.d.ts +27 -0
- package/dist/lens/types.d.ts.map +1 -0
- package/dist/lens/types.js +2 -0
- package/dist/lens/types.js.map +1 -0
- package/dist/lens.d.ts +8 -0
- package/dist/lens.d.ts.map +1 -0
- package/dist/lens.js +5 -0
- package/dist/lens.js.map +1 -0
- package/dist/news.d.ts +46 -0
- package/dist/news.d.ts.map +1 -0
- package/dist/news.js +202 -0
- package/dist/news.js.map +1 -0
- package/dist/pagespeed/client.d.ts +28 -0
- package/dist/pagespeed/client.d.ts.map +1 -0
- package/dist/pagespeed/client.js +222 -0
- package/dist/pagespeed/client.js.map +1 -0
- package/dist/pagespeed/errors.d.ts +9 -0
- package/dist/pagespeed/errors.d.ts.map +1 -0
- package/dist/pagespeed/errors.js +15 -0
- package/dist/pagespeed/errors.js.map +1 -0
- package/dist/pagespeed/parsers.d.ts +7 -0
- package/dist/pagespeed/parsers.d.ts.map +1 -0
- package/dist/pagespeed/parsers.js +236 -0
- package/dist/pagespeed/parsers.js.map +1 -0
- package/dist/pagespeed/types.d.ts +156 -0
- package/dist/pagespeed/types.d.ts.map +1 -0
- package/dist/pagespeed/types.js +2 -0
- package/dist/pagespeed/types.js.map +1 -0
- package/dist/pagespeed/wire.d.ts +10 -0
- package/dist/pagespeed/wire.d.ts.map +1 -0
- package/dist/pagespeed/wire.js +96 -0
- package/dist/pagespeed/wire.js.map +1 -0
- package/dist/pagespeed.d.ts +6 -0
- package/dist/pagespeed.d.ts.map +1 -0
- package/dist/pagespeed.js +4 -0
- package/dist/pagespeed.js.map +1 -0
- package/dist/platform/catalog.d.ts.map +1 -1
- package/dist/platform/catalog.js +0 -9
- package/dist/platform/catalog.js.map +1 -1
- package/dist/services/environment/air-quality.d.ts.map +1 -1
- package/dist/services/environment/air-quality.js +3 -7
- package/dist/services/environment/air-quality.js.map +1 -1
- package/dist/services/environment/weather.d.ts +4 -1
- package/dist/services/environment/weather.d.ts.map +1 -1
- package/dist/services/environment/weather.js +12 -3
- package/dist/services/environment/weather.js.map +1 -1
- package/dist/services/reviews.d.ts.map +1 -1
- package/dist/services/reviews.js +4 -1
- package/dist/services/reviews.js.map +1 -1
- package/dist/translate.d.ts +75 -0
- package/dist/translate.d.ts.map +1 -0
- package/dist/translate.js +126 -0
- package/dist/translate.js.map +1 -0
- package/dist/travel-google/common.d.ts +24 -0
- package/dist/travel-google/common.d.ts.map +1 -0
- package/dist/travel-google/common.js +72 -0
- package/dist/travel-google/common.js.map +1 -0
- package/dist/trends/client.d.ts +17 -0
- package/dist/trends/client.d.ts.map +1 -0
- package/dist/trends/client.js +86 -0
- package/dist/trends/client.js.map +1 -0
- package/dist/trends/errors.d.ts +8 -0
- package/dist/trends/errors.d.ts.map +1 -0
- package/dist/trends/errors.js +13 -0
- package/dist/trends/errors.js.map +1 -0
- package/dist/trends/links.d.ts +8 -0
- package/dist/trends/links.d.ts.map +1 -0
- package/dist/trends/links.js +71 -0
- package/dist/trends/links.js.map +1 -0
- package/dist/trends/parsers.d.ts +5 -0
- package/dist/trends/parsers.d.ts.map +1 -0
- package/dist/trends/parsers.js +126 -0
- package/dist/trends/parsers.js.map +1 -0
- package/dist/trends/types.d.ts +71 -0
- package/dist/trends/types.d.ts.map +1 -0
- package/dist/trends/types.js +2 -0
- package/dist/trends/types.js.map +1 -0
- package/dist/trends.d.ts +9 -0
- package/dist/trends.d.ts.map +1 -0
- package/dist/trends.js +8 -0
- package/dist/trends.js.map +1 -0
- package/dist/types/common.d.ts +0 -2
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js.map +1 -1
- package/dist/utils/google-web.d.ts +24 -0
- package/dist/utils/google-web.d.ts.map +1 -0
- package/dist/utils/google-web.js +150 -0
- package/dist/utils/google-web.js.map +1 -0
- package/dist/youtube/client.d.ts +19 -0
- package/dist/youtube/client.d.ts.map +1 -0
- package/dist/youtube/client.js +115 -0
- package/dist/youtube/client.js.map +1 -0
- package/dist/youtube/errors.d.ts +8 -0
- package/dist/youtube/errors.d.ts.map +1 -0
- package/dist/youtube/errors.js +13 -0
- package/dist/youtube/errors.js.map +1 -0
- package/dist/youtube/parsers.d.ts +9 -0
- package/dist/youtube/parsers.d.ts.map +1 -0
- package/dist/youtube/parsers.js +213 -0
- package/dist/youtube/parsers.js.map +1 -0
- package/dist/youtube/types.d.ts +90 -0
- package/dist/youtube/types.d.ts.map +1 -0
- package/dist/youtube/types.js +2 -0
- package/dist/youtube/types.js.map +1 -0
- package/dist/youtube.d.ts +9 -0
- package/dist/youtube.d.ts.map +1 -0
- package/dist/youtube.js +6 -0
- package/dist/youtube.js.map +1 -0
- package/docs/books.md +18 -0
- package/docs/environment-research.md +65 -0
- package/docs/finance-research.md +153 -0
- package/docs/finance.md +43 -0
- package/docs/gemini-web.md +36 -0
- package/docs/google-ai-books-research.md +53 -0
- package/docs/google-media-research.md +105 -0
- package/docs/google-search-research.md +36 -0
- package/docs/google-search.md +53 -0
- package/docs/google-services-research.md +135 -0
- package/docs/google-travel-research.md +86 -0
- package/docs/internal/reverse-engineering.md +85 -0
- package/docs/lens.md +54 -0
- package/docs/maps-revalidation.md +31 -0
- package/docs/news.md +35 -0
- package/docs/pagespeed-research.md +153 -0
- package/docs/pagespeed.md +135 -0
- package/docs/reviews-research.md +33 -0
- package/docs/translate.md +78 -0
- package/docs/trends-research.md +82 -0
- package/docs/trends.md +75 -0
- package/docs/youtube.md +72 -0
- package/package.json +77 -2
- package/dist/services/aerial-view.d.ts +0 -22
- package/dist/services/aerial-view.d.ts.map +0 -1
- package/dist/services/aerial-view.js +0 -107
- package/dist/services/aerial-view.js.map +0 -1
- package/dist/types/aerial-view.d.ts +0 -39
- package/dist/types/aerial-view.d.ts.map +0 -1
- package/dist/types/aerial-view.js +0 -2
- package/dist/types/aerial-view.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/pagespeed/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,eAAe,EACzE,uBAAuB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAC3F,MAAM,YAAY,CAAC;AAoDpB,2EAA2E;AAC3E,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,OAAO,CAAC,CAAmB;IACnC,OAAO,CAAC,SAAS,CAA6C;gBAElD,MAAM,GAAE,eAAoB;IAOxC,0FAA0F;IACpF,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAUlG,8EAA8E;IACxE,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAK3G,gEAAgE;IAC1D,YAAY,CAAC,YAAY,EAAE,iBAAiB,GAAG,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiB/H,yFAAyF;IACnF,eAAe,CAAC,YAAY,EAAE,iBAAiB,GAAG,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmBjI,mFAAmF;IAC7E,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIpF,sFAAsF;IAChF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,oBAAoB,CAAC;YA0BnF,SAAS;YAUT,GAAG;YAWH,OAAO;CAmBtB;AAED,wBAAgB,SAAS,CAAC,MAAM,GAAE,eAAoB,GAAG,eAAe,CAEvE"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { PageSpeedError } from './errors.js';
|
|
2
|
+
import { parseAnalysis, parseReportId, parseResult } from './parsers.js';
|
|
3
|
+
import { buildRpcBody, decodeRpcResponse, parseSession } from './wire.js';
|
|
4
|
+
const WEB_ORIGIN = 'https://pagespeed.web.dev';
|
|
5
|
+
const API_ENDPOINT = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed';
|
|
6
|
+
const CATEGORIES = new Set(['performance', 'accessibility', 'best-practices', 'seo']);
|
|
7
|
+
function positive(value, name) {
|
|
8
|
+
if (!Number.isFinite(value) || value <= 0 || value > 2_147_483_647)
|
|
9
|
+
throw new RangeError(`${name} must be a positive number no greater than 2147483647`);
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
function targetUrl(value) {
|
|
13
|
+
let url;
|
|
14
|
+
try {
|
|
15
|
+
url = new URL(value);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new TypeError('PageSpeed requires an absolute HTTP or HTTPS URL');
|
|
19
|
+
}
|
|
20
|
+
if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password)
|
|
21
|
+
throw new TypeError('PageSpeed requires an HTTP or HTTPS URL without credentials');
|
|
22
|
+
return url.toString();
|
|
23
|
+
}
|
|
24
|
+
function abortReason(signal) {
|
|
25
|
+
return signal.reason ?? new DOMException('The operation was aborted', 'AbortError');
|
|
26
|
+
}
|
|
27
|
+
function checkAbort(signal) {
|
|
28
|
+
if (signal?.aborted)
|
|
29
|
+
throw abortReason(signal);
|
|
30
|
+
}
|
|
31
|
+
function deadline(timeoutMs, parent) {
|
|
32
|
+
const controller = new AbortController();
|
|
33
|
+
const abort = () => controller.abort(parent ? abortReason(parent) : undefined);
|
|
34
|
+
if (parent?.aborted)
|
|
35
|
+
abort();
|
|
36
|
+
else
|
|
37
|
+
parent?.addEventListener('abort', abort, { once: true });
|
|
38
|
+
const timer = setTimeout(() => controller.abort(new PageSpeedError('PageSpeed operation timed out', 'timeout')), timeoutMs);
|
|
39
|
+
timer.unref?.();
|
|
40
|
+
return { signal: controller.signal, cleanup: () => { clearTimeout(timer); parent?.removeEventListener('abort', abort); } };
|
|
41
|
+
}
|
|
42
|
+
async function sleep(ms, signal) {
|
|
43
|
+
checkAbort(signal);
|
|
44
|
+
await new Promise((resolve, reject) => {
|
|
45
|
+
const abort = () => { clearTimeout(timer); reject(abortReason(signal)); };
|
|
46
|
+
const timer = setTimeout(() => { signal.removeEventListener('abort', abort); resolve(); }, ms);
|
|
47
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function retryAfter(value) {
|
|
51
|
+
if (!value)
|
|
52
|
+
return undefined;
|
|
53
|
+
if (/^\d+(\.\d+)?$/.test(value))
|
|
54
|
+
return Number(value) * 1000;
|
|
55
|
+
const timestamp = Date.parse(value);
|
|
56
|
+
return Number.isFinite(timestamp) ? Math.max(0, timestamp - Date.now()) : undefined;
|
|
57
|
+
}
|
|
58
|
+
/** A keyless PageSpeed web client with an explicit official API method. */
|
|
59
|
+
export class PageSpeedClient {
|
|
60
|
+
fetcher;
|
|
61
|
+
locale;
|
|
62
|
+
requestTimeoutMs;
|
|
63
|
+
apiKey;
|
|
64
|
+
session;
|
|
65
|
+
requestId = Math.floor(Math.random() * 90000) + 10000;
|
|
66
|
+
constructor(config = {}) {
|
|
67
|
+
this.fetcher = config.fetch ?? globalThis.fetch;
|
|
68
|
+
this.locale = config.locale ?? 'en-US';
|
|
69
|
+
this.apiKey = config.apiKey;
|
|
70
|
+
this.requestTimeoutMs = positive(config.timeoutMs ?? 120_000, 'timeoutMs');
|
|
71
|
+
}
|
|
72
|
+
/** Starts the website's mobile and desktop Lighthouse, URL CrUX, and origin CrUX jobs. */
|
|
73
|
+
async createAnalysis(url, options = {}) {
|
|
74
|
+
const normalized = targetUrl(url);
|
|
75
|
+
const session = await this.bootstrap(options.signal);
|
|
76
|
+
const args = [normalized, session.location];
|
|
77
|
+
if (options.useOriginalUrl !== undefined)
|
|
78
|
+
args.push(null, options.useOriginalUrl);
|
|
79
|
+
const raw = await this.rpc('nqfuif', args, options, { 'X-Rawurl': normalized });
|
|
80
|
+
if (!Array.isArray(raw))
|
|
81
|
+
throw new PageSpeedError('Invalid PageSpeed create response', 'parse');
|
|
82
|
+
return parseAnalysis(raw[0]);
|
|
83
|
+
}
|
|
84
|
+
/** Retrieves an existing analysis by ID or a pagespeed.web.dev report URL. */
|
|
85
|
+
async getAnalysis(idOrReportUrl, options = {}) {
|
|
86
|
+
const id = parseReportId(idOrReportUrl);
|
|
87
|
+
return parseAnalysis(await this.rpc('CBayme', [id], options));
|
|
88
|
+
}
|
|
89
|
+
/** Refreshes pending jobs once and merges them by result ID. */
|
|
90
|
+
async pollAnalysis(analysisOrId, options = {}) {
|
|
91
|
+
checkAbort(options.signal);
|
|
92
|
+
const analysis = typeof analysisOrId === 'string' ? await this.getAnalysis(analysisOrId, options) : analysisOrId;
|
|
93
|
+
const pending = analysis.results.filter(result => result.status === 'pending').map(result => result.id);
|
|
94
|
+
if (pending.length === 0)
|
|
95
|
+
return analysis;
|
|
96
|
+
const raw = await this.rpc('LsX2he', [analysis.id, pending], options);
|
|
97
|
+
if (!Array.isArray(raw) || !Array.isArray(raw[0]))
|
|
98
|
+
throw new PageSpeedError('Invalid PageSpeed poll response', 'parse');
|
|
99
|
+
const updates = new Map(raw[0].map(value => { const result = parseResult(value); return [result.id, result]; }));
|
|
100
|
+
const results = analysis.results.map(result => { const update = updates.get(result.id); updates.delete(result.id); return update ?? result; });
|
|
101
|
+
results.push(...updates.values());
|
|
102
|
+
const complete = results.length > 0 && results.every(result => result.status === 'complete');
|
|
103
|
+
const merged = [...analysis.raw];
|
|
104
|
+
merged[2] = complete ? 2 : analysis.statusCode;
|
|
105
|
+
merged[4] = results.map(result => result.raw);
|
|
106
|
+
return parseAnalysis(merged);
|
|
107
|
+
}
|
|
108
|
+
/** Waits for jobs to finish; per-job errors remain available on the returned results. */
|
|
109
|
+
async waitForAnalysis(analysisOrId, options = {}) {
|
|
110
|
+
const timeoutMs = positive(options.timeoutMs ?? 180_000, 'timeoutMs');
|
|
111
|
+
const interval = positive(options.pollIntervalMs ?? 3000, 'pollIntervalMs');
|
|
112
|
+
const operation = deadline(timeoutMs, options.signal);
|
|
113
|
+
try {
|
|
114
|
+
checkAbort(operation.signal);
|
|
115
|
+
let analysis = typeof analysisOrId === 'string' ? await this.getAnalysis(analysisOrId, operation) : analysisOrId;
|
|
116
|
+
options.onProgress?.(analysis);
|
|
117
|
+
while (analysis.status === 'pending' || analysis.results.some(result => result.status === 'pending')) {
|
|
118
|
+
checkAbort(operation.signal);
|
|
119
|
+
await sleep(interval, operation.signal);
|
|
120
|
+
analysis = await this.pollAnalysis(analysis, operation);
|
|
121
|
+
options.onProgress?.(analysis);
|
|
122
|
+
}
|
|
123
|
+
checkAbort(operation.signal);
|
|
124
|
+
return analysis;
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
operation.cleanup();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Creates an analysis and waits for both strategies and their field-data jobs. */
|
|
131
|
+
async analyze(url, options = {}) {
|
|
132
|
+
return this.waitForAnalysis(await this.createAnalysis(url, options), options);
|
|
133
|
+
}
|
|
134
|
+
/** Calls the documented v5 API; categories and API keys apply only to this method. */
|
|
135
|
+
async runPagespeed(url, options = {}) {
|
|
136
|
+
const normalized = targetUrl(url);
|
|
137
|
+
if (options.strategy !== undefined && options.strategy !== 'mobile' && options.strategy !== 'desktop')
|
|
138
|
+
throw new TypeError('strategy must be mobile or desktop');
|
|
139
|
+
const endpoint = new URL(API_ENDPOINT);
|
|
140
|
+
endpoint.searchParams.set('url', normalized);
|
|
141
|
+
endpoint.searchParams.set('strategy', options.strategy ?? 'desktop');
|
|
142
|
+
endpoint.searchParams.set('locale', options.locale ?? this.locale);
|
|
143
|
+
for (const category of options.categories ?? []) {
|
|
144
|
+
if (!CATEGORIES.has(category))
|
|
145
|
+
throw new TypeError(`Unsupported PageSpeed API category: ${category}`);
|
|
146
|
+
endpoint.searchParams.append('category', category);
|
|
147
|
+
}
|
|
148
|
+
if (this.apiKey)
|
|
149
|
+
endpoint.searchParams.set('key', this.apiKey);
|
|
150
|
+
for (const [key, value] of [['captchaToken', options.captchaToken], ['utm_campaign', options.utmCampaign], ['utm_source', options.utmSource]]) {
|
|
151
|
+
if (value !== undefined)
|
|
152
|
+
endpoint.searchParams.set(key, value);
|
|
153
|
+
}
|
|
154
|
+
const body = await this.request(endpoint, { method: 'GET' }, options.signal);
|
|
155
|
+
let data;
|
|
156
|
+
try {
|
|
157
|
+
data = JSON.parse(body);
|
|
158
|
+
}
|
|
159
|
+
catch (cause) {
|
|
160
|
+
throw new PageSpeedError('Invalid PageSpeed API JSON response', 'parse', undefined, undefined, undefined, { cause });
|
|
161
|
+
}
|
|
162
|
+
if (!data || typeof data !== 'object' || Array.isArray(data))
|
|
163
|
+
throw new PageSpeedError('Invalid PageSpeed API response', 'parse');
|
|
164
|
+
const error = data.error;
|
|
165
|
+
if (error)
|
|
166
|
+
throw new PageSpeedError(error.message ?? 'PageSpeed API failed', 'rpc', undefined, error.code);
|
|
167
|
+
return data;
|
|
168
|
+
}
|
|
169
|
+
async bootstrap(signal) {
|
|
170
|
+
checkAbort(signal);
|
|
171
|
+
if (!this.session) {
|
|
172
|
+
const url = new URL(WEB_ORIGIN);
|
|
173
|
+
url.searchParams.set('hl', this.locale);
|
|
174
|
+
this.session = parseSession(await this.request(url, { method: 'GET' }, signal));
|
|
175
|
+
}
|
|
176
|
+
return this.session;
|
|
177
|
+
}
|
|
178
|
+
async rpc(id, args, options, headers = {}) {
|
|
179
|
+
const session = await this.bootstrap(options.signal);
|
|
180
|
+
const url = new URL('/_/PagespeedUi/data/batchexecute', WEB_ORIGIN);
|
|
181
|
+
for (const [key, value] of Object.entries({ rpcids: id, 'source-path': '/analysis', 'f.sid': session.sessionId, bl: session.build, hl: this.locale, _reqid: String(this.requestId += 100000), rt: 'c' }))
|
|
182
|
+
url.searchParams.set(key, value);
|
|
183
|
+
return decodeRpcResponse(await this.request(url, {
|
|
184
|
+
method: 'POST',
|
|
185
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', ...headers },
|
|
186
|
+
body: buildRpcBody(id, args, session.token),
|
|
187
|
+
}, options.signal), id);
|
|
188
|
+
}
|
|
189
|
+
async request(url, init, signal) {
|
|
190
|
+
checkAbort(signal);
|
|
191
|
+
const operation = deadline(this.requestTimeoutMs, signal);
|
|
192
|
+
try {
|
|
193
|
+
const response = await this.fetcher(url.toString(), { ...init, signal: operation.signal });
|
|
194
|
+
const body = await response.text();
|
|
195
|
+
checkAbort(operation.signal);
|
|
196
|
+
if (!response.ok) {
|
|
197
|
+
let message = `PageSpeed HTTP ${response.status}`;
|
|
198
|
+
try {
|
|
199
|
+
const error = JSON.parse(body).error;
|
|
200
|
+
if (typeof error?.message === 'string')
|
|
201
|
+
message += `: ${error.message}`;
|
|
202
|
+
}
|
|
203
|
+
catch { }
|
|
204
|
+
throw new PageSpeedError(message, 'http', response.status, undefined, retryAfter(response.headers.get('Retry-After')));
|
|
205
|
+
}
|
|
206
|
+
return body;
|
|
207
|
+
}
|
|
208
|
+
catch (cause) {
|
|
209
|
+
checkAbort(operation.signal);
|
|
210
|
+
if (cause instanceof PageSpeedError)
|
|
211
|
+
throw cause;
|
|
212
|
+
throw new PageSpeedError('PageSpeed network request failed', 'network', undefined, undefined, undefined, { cause });
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
operation.cleanup();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
export function pageSpeed(config = {}) {
|
|
220
|
+
return new PageSpeedClient(config);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/pagespeed/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type PageSpeedErrorKind = 'http' | 'rpc' | 'parse' | 'timeout' | 'network';
|
|
2
|
+
export declare class PageSpeedError extends Error {
|
|
3
|
+
readonly kind: PageSpeedErrorKind;
|
|
4
|
+
readonly status?: number | undefined;
|
|
5
|
+
readonly rpcCode?: number | undefined;
|
|
6
|
+
readonly retryAfterMs?: number | undefined;
|
|
7
|
+
constructor(message: string, kind: PageSpeedErrorKind, status?: number | undefined, rpcCode?: number | undefined, retryAfterMs?: number | undefined, options?: ErrorOptions);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/pagespeed/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAElF,qBAAa,cAAe,SAAQ,KAAK;IAGrC,QAAQ,CAAC,IAAI,EAAE,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;gBAJ9B,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,kBAAkB,EACxB,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,OAAO,CAAC,EAAE,MAAM,YAAA,EAChB,YAAY,CAAC,EAAE,MAAM,YAAA,EAC9B,OAAO,CAAC,EAAE,YAAY;CAKzB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class PageSpeedError extends Error {
|
|
2
|
+
kind;
|
|
3
|
+
status;
|
|
4
|
+
rpcCode;
|
|
5
|
+
retryAfterMs;
|
|
6
|
+
constructor(message, kind, status, rpcCode, retryAfterMs, options) {
|
|
7
|
+
super(message, options);
|
|
8
|
+
this.kind = kind;
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.rpcCode = rpcCode;
|
|
11
|
+
this.retryAfterMs = retryAfterMs;
|
|
12
|
+
this.name = 'PageSpeedError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/pagespeed/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG5B;IACA;IACA;IACA;IALX,YACE,OAAe,EACN,IAAwB,EACxB,MAAe,EACf,OAAgB,EAChB,YAAqB,EAC9B,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QANf,SAAI,GAAJ,IAAI,CAAoB;QACxB,WAAM,GAAN,MAAM,CAAS;QACf,YAAO,GAAP,OAAO,CAAS;QAChB,iBAAY,GAAZ,YAAY,CAAS;QAI9B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PageSpeedAnalysis, PageSpeedFieldData, PageSpeedResult, PageSpeedStrategy } from './types.js';
|
|
2
|
+
export declare function parseReportId(value: string): string;
|
|
3
|
+
export declare function buildReportUrl(id: string, strategy?: PageSpeedStrategy): string;
|
|
4
|
+
export declare function parseAnalysis(raw: unknown): PageSpeedAnalysis;
|
|
5
|
+
export declare function parseResult(raw: unknown): PageSpeedResult;
|
|
6
|
+
export declare function parseFieldData(raw: unknown): PageSpeedFieldData;
|
|
7
|
+
//# sourceMappingURL=parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/pagespeed/parsers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,iBAAiB,EACjB,kBAAkB,EAGlB,eAAe,EAEf,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAsCpB,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAenD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAO/E;AAWD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CA2B7D;AAiBD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,CA6BzD;AAkED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAsB/D"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { PageSpeedError } from './errors.js';
|
|
2
|
+
const metricThresholds = {
|
|
3
|
+
largest_contentful_paint: [2500, 4000],
|
|
4
|
+
cumulative_layout_shift: [0.1, 0.25],
|
|
5
|
+
interaction_to_next_paint: [200, 500],
|
|
6
|
+
first_contentful_paint: [1800, 3000],
|
|
7
|
+
experimental_time_to_first_byte: [800, 1800],
|
|
8
|
+
};
|
|
9
|
+
function malformed(label) {
|
|
10
|
+
throw new PageSpeedError(`Malformed PageSpeed ${label}`, 'parse');
|
|
11
|
+
}
|
|
12
|
+
function array(value, label) {
|
|
13
|
+
return Array.isArray(value) ? value : malformed(label);
|
|
14
|
+
}
|
|
15
|
+
function string(value, label) {
|
|
16
|
+
return typeof value === 'string' && value.length > 0 ? value : malformed(label);
|
|
17
|
+
}
|
|
18
|
+
function integer(value, label) {
|
|
19
|
+
return typeof value === 'number' && Number.isSafeInteger(value) ? value : malformed(label);
|
|
20
|
+
}
|
|
21
|
+
function record(value) {
|
|
22
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
function parseStrategy(code) {
|
|
25
|
+
return code === 1 ? 'mobile' : code === 2 ? 'desktop' : undefined;
|
|
26
|
+
}
|
|
27
|
+
function status(code) {
|
|
28
|
+
return code === 1 ? 'pending' : code === 2 ? 'complete' : 'unknown';
|
|
29
|
+
}
|
|
30
|
+
export function parseReportId(value) {
|
|
31
|
+
if (typeof value !== 'string')
|
|
32
|
+
return malformed('report ID');
|
|
33
|
+
if (/^[a-zA-Z0-9]+$/.test(value))
|
|
34
|
+
return value;
|
|
35
|
+
let url;
|
|
36
|
+
try {
|
|
37
|
+
url = new URL(value);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return malformed('report URL or ID');
|
|
41
|
+
}
|
|
42
|
+
if (url.protocol !== 'https:' || url.hostname !== 'pagespeed.web.dev' || url.port || url.username || url.password) {
|
|
43
|
+
return malformed('report URL');
|
|
44
|
+
}
|
|
45
|
+
const match = /^\/analysis\/(?:[^/]+\/)?([a-zA-Z0-9]+)\/?$/.exec(url.pathname);
|
|
46
|
+
return match?.[1] ?? malformed('report URL');
|
|
47
|
+
}
|
|
48
|
+
export function buildReportUrl(id, strategy) {
|
|
49
|
+
const url = new URL(`https://pagespeed.web.dev/analysis/${parseReportId(id)}`);
|
|
50
|
+
if (strategy !== undefined) {
|
|
51
|
+
if (strategy !== 'mobile' && strategy !== 'desktop')
|
|
52
|
+
return malformed('report strategy');
|
|
53
|
+
url.searchParams.set('form_factor', strategy);
|
|
54
|
+
}
|
|
55
|
+
return url.toString();
|
|
56
|
+
}
|
|
57
|
+
function timestamp(raw) {
|
|
58
|
+
const value = array(raw, 'creation timestamp');
|
|
59
|
+
const seconds = integer(value[0], 'creation timestamp seconds');
|
|
60
|
+
const nanos = value[1] == null ? 0 : integer(value[1], 'creation timestamp nanoseconds');
|
|
61
|
+
if (nanos < 0 || nanos >= 1_000_000_000)
|
|
62
|
+
return malformed('creation timestamp nanoseconds');
|
|
63
|
+
const date = new Date(seconds * 1000 + Math.floor(nanos / 1_000_000));
|
|
64
|
+
return Number.isFinite(date.getTime()) ? date.toISOString() : malformed('creation timestamp');
|
|
65
|
+
}
|
|
66
|
+
export function parseAnalysis(raw) {
|
|
67
|
+
const data = array(raw, 'analysis');
|
|
68
|
+
const id = string(data[0], 'analysis ID');
|
|
69
|
+
const url = string(data[1], 'analysis URL');
|
|
70
|
+
const statusCode = integer(data[2], 'analysis status');
|
|
71
|
+
const results = data[4] == null ? [] : array(data[4], 'analysis results').map(parseResult);
|
|
72
|
+
const urls = {};
|
|
73
|
+
if (data[5] != null) {
|
|
74
|
+
for (const rawEntry of array(data[5], 'analysis URLs')) {
|
|
75
|
+
const entry = array(rawEntry, 'analysis URL entry');
|
|
76
|
+
const code = integer(entry[0], 'analysis URL strategy');
|
|
77
|
+
const entryUrl = string(entry[1], 'analysis strategy URL');
|
|
78
|
+
const formFactor = parseStrategy(code);
|
|
79
|
+
if (formFactor)
|
|
80
|
+
urls[formFactor] = entryUrl;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
id,
|
|
85
|
+
url,
|
|
86
|
+
status: status(statusCode),
|
|
87
|
+
statusCode,
|
|
88
|
+
results,
|
|
89
|
+
urls,
|
|
90
|
+
...(data[6] == null ? {} : { createdAt: timestamp(data[6]) }),
|
|
91
|
+
reportUrl: buildReportUrl(id),
|
|
92
|
+
raw: data,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function parseLighthouse(raw) {
|
|
96
|
+
if (typeof raw !== 'string')
|
|
97
|
+
return malformed('Lighthouse JSON');
|
|
98
|
+
let value;
|
|
99
|
+
try {
|
|
100
|
+
value = JSON.parse(raw);
|
|
101
|
+
}
|
|
102
|
+
catch (cause) {
|
|
103
|
+
throw new PageSpeedError('Malformed PageSpeed Lighthouse JSON', 'parse', undefined, undefined, undefined, { cause });
|
|
104
|
+
}
|
|
105
|
+
if (!record(value) || !record(value.audits) || !record(value.categories))
|
|
106
|
+
return malformed('Lighthouse report');
|
|
107
|
+
for (const key of ['lighthouseVersion', 'requestedUrl', 'finalUrl', 'fetchTime']) {
|
|
108
|
+
string(value[key], `Lighthouse ${key}`);
|
|
109
|
+
}
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
export function parseResult(raw) {
|
|
113
|
+
const data = array(raw, 'result');
|
|
114
|
+
const strategyCode = integer(data[2], 'result strategy');
|
|
115
|
+
const typeCode = integer(data[3], 'result type');
|
|
116
|
+
const statusCode = integer(data[6], 'result status');
|
|
117
|
+
const result = {
|
|
118
|
+
id: string(data[8], 'result ID'),
|
|
119
|
+
url: string(data[0], 'result URL'),
|
|
120
|
+
strategy: parseStrategy(strategyCode),
|
|
121
|
+
strategyCode,
|
|
122
|
+
type: typeCode === 1 ? 'lighthouse' : typeCode === 2 ? 'origin' : typeCode === 3 ? 'page' : 'unknown',
|
|
123
|
+
typeCode,
|
|
124
|
+
status: status(statusCode),
|
|
125
|
+
statusCode,
|
|
126
|
+
raw: data,
|
|
127
|
+
};
|
|
128
|
+
if (data[1] != null)
|
|
129
|
+
result.finalUrl = string(data[1], 'result final URL');
|
|
130
|
+
if (data[7] != null) {
|
|
131
|
+
const error = array(data[7], 'result error');
|
|
132
|
+
if (error[1] != null && typeof error[1] !== 'string')
|
|
133
|
+
return malformed('result error message');
|
|
134
|
+
result.error = {
|
|
135
|
+
code: integer(error[0], 'result error code'),
|
|
136
|
+
message: error[1] == null ? '' : error[1],
|
|
137
|
+
...(error[2] == null ? {} : { details: array(error[2], 'result error details') }),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (data[5] != null)
|
|
141
|
+
result.fieldData = parseFieldData(data[5]);
|
|
142
|
+
if (data[9] != null && data[9] !== '')
|
|
143
|
+
result.lighthouse = parseLighthouse(data[9]);
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
function typedNumber(value) {
|
|
147
|
+
if (!Array.isArray(value))
|
|
148
|
+
return undefined;
|
|
149
|
+
if (typeof value[1] === 'number' && Number.isFinite(value[1]))
|
|
150
|
+
return value[1];
|
|
151
|
+
if (typeof value[2] === 'string' && /^-?\d+(?:\.\d+)?$/.test(value[2])) {
|
|
152
|
+
const numeric = Number(value[2]);
|
|
153
|
+
if (Number.isFinite(numeric))
|
|
154
|
+
return numeric;
|
|
155
|
+
}
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
function rating(name, percentile) {
|
|
159
|
+
const thresholds = metricThresholds[name];
|
|
160
|
+
if (!thresholds)
|
|
161
|
+
return undefined;
|
|
162
|
+
return percentile <= thresholds[0] ? 'good' : percentile <= thresholds[1] ? 'needs-improvement' : 'poor';
|
|
163
|
+
}
|
|
164
|
+
function parseFieldMetric(raw) {
|
|
165
|
+
const data = array(raw, 'field metric');
|
|
166
|
+
const name = string(data[0], 'field metric name');
|
|
167
|
+
const metric = { name, histogram: [], raw: data };
|
|
168
|
+
// CrUX Metric oneofs: slot 1 contains [unused, [histogram, percentile]], slot 2 contains fractions.
|
|
169
|
+
const distribution = Array.isArray(data[1]) && Array.isArray(data[1][1]) ? data[1][1] : undefined;
|
|
170
|
+
if (distribution) {
|
|
171
|
+
const bins = Array.isArray(distribution[0]) ? distribution[0][0] : undefined;
|
|
172
|
+
if (bins != null) {
|
|
173
|
+
for (const rawBin of array(bins, 'field metric histogram')) {
|
|
174
|
+
const bin = array(rawBin, 'field metric histogram bin');
|
|
175
|
+
const start = typedNumber(bin[0]);
|
|
176
|
+
const end = typedNumber(bin[1]);
|
|
177
|
+
if (start === undefined || (bin[1] != null && end === undefined) || typeof bin[2] !== 'number' || !Number.isFinite(bin[2])) {
|
|
178
|
+
return malformed('field metric histogram bin');
|
|
179
|
+
}
|
|
180
|
+
metric.histogram.push({ start, ...(end === undefined ? {} : { end }), density: bin[2] });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const percentile = typedNumber(Array.isArray(distribution[1]) ? distribution[1][0] : undefined);
|
|
184
|
+
if (percentile !== undefined) {
|
|
185
|
+
metric.percentile = percentile;
|
|
186
|
+
metric.rating = rating(name, percentile);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const fractions = Array.isArray(data[2]) ? data[2][0] : undefined;
|
|
190
|
+
if (fractions != null) {
|
|
191
|
+
metric.fractions = Object.fromEntries(array(fractions, 'field metric fractions').map(rawFraction => {
|
|
192
|
+
const fraction = array(rawFraction, 'field metric fraction');
|
|
193
|
+
const value = Array.isArray(fraction[1]) ? fraction[1][0] : undefined;
|
|
194
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
195
|
+
return malformed('field metric fraction value');
|
|
196
|
+
return [string(fraction[0], 'field metric fraction name'), value];
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
return metric;
|
|
200
|
+
}
|
|
201
|
+
function date(raw) {
|
|
202
|
+
const value = array(raw, 'collection date');
|
|
203
|
+
const year = integer(value[0], 'collection year');
|
|
204
|
+
const month = integer(value[1], 'collection month');
|
|
205
|
+
const day = integer(value[2], 'collection day');
|
|
206
|
+
if (year < 1 || year > 9999 || month < 1 || month > 12 || day < 1 || day > 31)
|
|
207
|
+
return malformed('collection date');
|
|
208
|
+
const formatted = `${String(year).padStart(4, '0')}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
|
|
209
|
+
if (new Date(`${formatted}T00:00:00.000Z`).toISOString().slice(0, 10) !== formatted)
|
|
210
|
+
return malformed('collection date');
|
|
211
|
+
return formatted;
|
|
212
|
+
}
|
|
213
|
+
export function parseFieldData(raw) {
|
|
214
|
+
const data = array(raw, 'field data');
|
|
215
|
+
array(data[0], 'field data key');
|
|
216
|
+
const metrics = Object.fromEntries(array(data[1], 'field data metrics').map(rawMetric => {
|
|
217
|
+
const metric = parseFieldMetric(rawMetric);
|
|
218
|
+
return [metric.name, metric];
|
|
219
|
+
}));
|
|
220
|
+
const eligible = (name) => {
|
|
221
|
+
const metric = metrics[name];
|
|
222
|
+
return metric?.histogram.length === 3 && metric.percentile !== undefined ? metric : undefined;
|
|
223
|
+
};
|
|
224
|
+
const lcp = eligible('largest_contentful_paint');
|
|
225
|
+
const cls = eligible('cumulative_layout_shift');
|
|
226
|
+
const inp = eligible('interaction_to_next_paint');
|
|
227
|
+
// The web UI requires LCP and CLS, but permits origins/pages without eligible INP samples.
|
|
228
|
+
const coreWebVitals = !lcp || !cls ? 'unavailable' : lcp.rating === 'good' && cls.rating === 'good' && (!inp || inp.rating === 'good') ? 'passed' : 'failed';
|
|
229
|
+
const result = { metrics, coreWebVitals, raw: data };
|
|
230
|
+
if (data[3] != null) {
|
|
231
|
+
const period = array(data[3], 'collection period');
|
|
232
|
+
result.collectionPeriod = { firstDate: date(period[0]), lastDate: date(period[1]) };
|
|
233
|
+
}
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/pagespeed/parsers.ts"],"names":[],"mappings":"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"}
|