lighthouse 13.5.0-dev.20261007 → 13.5.0-dev.20261009
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/.agents/skills/update-ard-port/SKILL.md +170 -0
- package/cli/test/smokehouse/config/exclusions.js +1 -1
- package/core/audits/agentic/ard-schema.d.ts +13 -0
- package/core/audits/agentic/ard-schema.js +81 -33
- package/core/audits/agentic/llms-txt.js +5 -2
- package/core/audits/insights/insight-audit.d.ts +9 -0
- package/core/audits/insights/insight-audit.js +2 -1
- package/core/audits/long-tasks.js +2 -1
- package/core/audits/seo/robots-txt.js +3 -8
- package/core/computed/page-dependency-graph.js +0 -4
- package/core/computed/trace-engine-result.js +3 -1
- package/core/config/constants.d.ts +2 -28
- package/core/gather/gatherers/agentic/ard.d.ts +59 -4
- package/core/gather/gatherers/agentic/ard.js +218 -56
- package/core/lib/trace-engine.d.ts +1 -0
- package/core/lib/trace-engine.js +2 -0
- package/package.json +6 -7
- package/shared/localization/locales/ar-XB.json +157 -136
- package/shared/localization/locales/ar.json +157 -136
- package/shared/localization/locales/bg.json +154 -133
- package/shared/localization/locales/ca.json +157 -136
- package/shared/localization/locales/cs.json +148 -127
- package/shared/localization/locales/da.json +153 -132
- package/shared/localization/locales/de.json +152 -131
- package/shared/localization/locales/el.json +153 -132
- package/shared/localization/locales/en-GB.json +160 -139
- package/shared/localization/locales/en-US.json +166 -145
- package/shared/localization/locales/en-XL.json +166 -145
- package/shared/localization/locales/es-419.json +150 -129
- package/shared/localization/locales/es.json +149 -128
- package/shared/localization/locales/fi.json +151 -130
- package/shared/localization/locales/fil.json +154 -133
- package/shared/localization/locales/fr.json +150 -129
- package/shared/localization/locales/he.json +160 -139
- package/shared/localization/locales/hi.json +156 -135
- package/shared/localization/locales/hr.json +154 -133
- package/shared/localization/locales/hu.json +111 -90
- package/shared/localization/locales/id.json +153 -132
- package/shared/localization/locales/it.json +153 -132
- package/shared/localization/locales/ja.json +150 -129
- package/shared/localization/locales/ko.json +42 -21
- package/shared/localization/locales/lt.json +152 -131
- package/shared/localization/locales/lv.json +93 -72
- package/shared/localization/locales/nl.json +149 -128
- package/shared/localization/locales/no.json +152 -131
- package/shared/localization/locales/pl.json +153 -132
- package/shared/localization/locales/pt-PT.json +152 -131
- package/shared/localization/locales/pt.json +157 -136
- package/shared/localization/locales/ro.json +149 -128
- package/shared/localization/locales/ru.json +73 -52
- package/shared/localization/locales/sk.json +153 -132
- package/shared/localization/locales/sl.json +149 -128
- package/shared/localization/locales/sr-Latn.json +151 -130
- package/shared/localization/locales/sr.json +151 -130
- package/shared/localization/locales/sv.json +152 -131
- package/shared/localization/locales/ta.json +156 -135
- package/shared/localization/locales/te.json +157 -136
- package/shared/localization/locales/th.json +111 -90
- package/shared/localization/locales/tr.json +153 -132
- package/shared/localization/locales/uk.json +149 -128
- package/shared/localization/locales/vi.json +162 -141
- package/shared/localization/locales/zh-HK.json +150 -129
- package/shared/localization/locales/zh-TW.json +154 -133
- package/shared/localization/locales/zh.json +152 -131
- package/third-party/ard/README.md +18 -9
- package/third-party/ard/ard-test.js +183 -266
- package/third-party/ard/ard.d.ts +17 -1
- package/third-party/ard/ard.js +276 -45
- package/third-party/ard/schema-validator.d.ts +14 -5
- package/third-party/ard/schema-validator.js +921 -1177
- package/third-party/ard/spec/schemas/ard-entry.schema.json +176 -0
- package/types/artifacts.d.ts +29 -5
- package/build-tracker.config.js +0 -16
- package/third-party/ard/spec/schemas/ai-catalog.schema.json +0 -292
|
@@ -4,17 +4,112 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @fileoverview Gatherer that discovers and fetches a site's Agentic Resource Discovery (ARD)
|
|
9
|
+
* manifest. It follows the discovery mechanisms in ARD §5.1 and also consults the predecessor
|
|
10
|
+
* `ai-catalog` names so that sites that have not yet migrated are still audited.
|
|
11
|
+
* @see https://agenticresourcediscovery.org/spec/
|
|
12
|
+
*/
|
|
13
|
+
|
|
7
14
|
import log from 'lighthouse-logger';
|
|
8
15
|
import LinkHeader from 'http-link-header';
|
|
9
16
|
|
|
10
17
|
import BaseGatherer from '../../base-gatherer.js';
|
|
11
18
|
import RobotsTxt from '../seo/robots-txt.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Link relations for ARD entry sources. `ai-catalog` is the predecessor relation, which
|
|
22
|
+
* consumers MAY consult but are not required to (ARD §5.1).
|
|
23
|
+
*/
|
|
24
|
+
const REL_ARD = 'ard';
|
|
25
|
+
const REL_LEGACY = 'ai-catalog';
|
|
26
|
+
|
|
27
|
+
const WELL_KNOWN_PATH = '/.well-known/ard.json';
|
|
28
|
+
const LEGACY_WELL_KNOWN_PATH = '/.well-known/ai-catalog.json';
|
|
29
|
+
|
|
30
|
+
const HTTP_OK = 200;
|
|
31
|
+
|
|
32
|
+
/** @typedef {{ard: string|null, legacy: string|null}} ArdLinks */
|
|
33
|
+
|
|
34
|
+
/** @typedef {LH.Artifacts['AgentResourceDiscovery']['discoverySignals']} DiscoverySignals */
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @typedef FetchResult
|
|
38
|
+
* @property {number|null} status
|
|
39
|
+
* @property {string|null} content
|
|
40
|
+
* @property {Record<string, string>|null} headers
|
|
41
|
+
* @property {string} [errorMessage]
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* A location to try when resolving the manifest. `advertised` locations are ones the site
|
|
46
|
+
* points at (robots.txt, link tags, Link headers); the well-known paths are probed by
|
|
47
|
+
* Lighthouse, so a failure there is not the site's fault and is not reported.
|
|
48
|
+
* @typedef ManifestCandidate
|
|
49
|
+
* @property {LH.Artifacts.ArdDiscoverySource} source
|
|
50
|
+
* @property {string|null} url
|
|
51
|
+
* @property {boolean} advertised
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
/** @type {ReadonlyArray<LH.Artifacts.ArdDiscoverySource>} */
|
|
55
|
+
const SOURCE_PRIORITY = [
|
|
56
|
+
'robotsTxtAgentmap',
|
|
57
|
+
'htmlLink',
|
|
58
|
+
'httpHeaderLink',
|
|
59
|
+
'wellKnown',
|
|
60
|
+
'legacyHtmlLink',
|
|
61
|
+
'legacyHttpHeaderLink',
|
|
62
|
+
'legacyWellKnown',
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
/** @type {Set<LH.Artifacts.ArdDiscoverySource>} */
|
|
66
|
+
const PROBED_SOURCES = new Set(['wellKnown', 'legacyWellKnown']);
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @param {DiscoverySignals} discoverySignals
|
|
70
|
+
* @return {ManifestCandidate[]}
|
|
71
|
+
*/
|
|
72
|
+
function getManifestCandidates(discoverySignals) {
|
|
73
|
+
return SOURCE_PRIORITY.map(source => ({
|
|
74
|
+
source,
|
|
75
|
+
url: discoverySignals[source],
|
|
76
|
+
advertised: !PROBED_SOURCES.has(source),
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Resolves `href` against `baseUrl`, returning null for empty or unparseable values.
|
|
82
|
+
* @param {string|null|undefined} href
|
|
83
|
+
* @param {string} baseUrl
|
|
84
|
+
* @return {string|null}
|
|
85
|
+
*/
|
|
86
|
+
function resolveUrl(href, baseUrl) {
|
|
87
|
+
if (!href) return null;
|
|
88
|
+
try {
|
|
89
|
+
return new URL(href, baseUrl).href;
|
|
90
|
+
} catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Runs in the page. Returns the `href` of the first `<link>` for each relation, or null.
|
|
97
|
+
* @param {string} relArd
|
|
98
|
+
* @param {string} relLegacy
|
|
99
|
+
* @return {ArdLinks}
|
|
100
|
+
*/
|
|
101
|
+
function getArdLinksInDOM(relArd, relLegacy) {
|
|
102
|
+
/** @param {string} rel */
|
|
103
|
+
const getHref = rel => {
|
|
104
|
+
const link = document.querySelector(`link[rel~="${rel}" i]`);
|
|
105
|
+
return link instanceof HTMLLinkElement ? link.href : null;
|
|
106
|
+
};
|
|
107
|
+
return {ard: getHref(relArd), legacy: getHref(relLegacy)};
|
|
16
108
|
}
|
|
17
109
|
|
|
110
|
+
/** @type {ArdLinks} */
|
|
111
|
+
const NO_LINKS = {ard: null, legacy: null};
|
|
112
|
+
|
|
18
113
|
class AgentResourceDiscovery extends BaseGatherer {
|
|
19
114
|
/** @type {LH.Gatherer.GathererMeta<'RobotsTxt'>} */
|
|
20
115
|
meta = {
|
|
@@ -23,6 +118,7 @@ class AgentResourceDiscovery extends BaseGatherer {
|
|
|
23
118
|
};
|
|
24
119
|
|
|
25
120
|
/**
|
|
121
|
+
* Returns the absolute URL from the first `Agentmap:` directive in robots.txt, if any.
|
|
26
122
|
* @param {LH.Artifacts['RobotsTxt']|null|undefined} robotsTxt
|
|
27
123
|
* @param {string} finalDisplayedUrl
|
|
28
124
|
* @return {string|null}
|
|
@@ -31,93 +127,159 @@ class AgentResourceDiscovery extends BaseGatherer {
|
|
|
31
127
|
if (!robotsTxt?.content) return null;
|
|
32
128
|
const match = robotsTxt.content.match(/^\s*Agentmap:\s*(\S+)/im);
|
|
33
129
|
if (!match) return null;
|
|
34
|
-
|
|
35
|
-
return new URL(match[1], finalDisplayedUrl).href;
|
|
36
|
-
} catch {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
130
|
+
return resolveUrl(match[1], finalDisplayedUrl);
|
|
39
131
|
}
|
|
40
132
|
|
|
41
133
|
/**
|
|
134
|
+
* Finds `<link rel="ard">` and `<link rel="ai-catalog">` in the page.
|
|
42
135
|
* @param {LH.Gatherer.Context} context
|
|
43
136
|
* @param {string} finalDisplayedUrl
|
|
44
|
-
* @return {Promise<
|
|
137
|
+
* @return {Promise<ArdLinks>}
|
|
45
138
|
*/
|
|
46
|
-
static async
|
|
139
|
+
static async getHtmlLinksFromDom(context, finalDisplayedUrl) {
|
|
47
140
|
try {
|
|
48
|
-
const
|
|
49
|
-
args: [],
|
|
141
|
+
const links = await context.driver.executionContext.evaluate(getArdLinksInDOM, {
|
|
142
|
+
args: [REL_ARD, REL_LEGACY],
|
|
50
143
|
useIsolation: true,
|
|
51
|
-
deps: [pageFunctions.getNodeDetails],
|
|
52
144
|
});
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
145
|
+
return {
|
|
146
|
+
ard: resolveUrl(links?.ard, finalDisplayedUrl),
|
|
147
|
+
legacy: resolveUrl(links?.legacy, finalDisplayedUrl),
|
|
148
|
+
};
|
|
149
|
+
} catch (err) {
|
|
150
|
+
log.verbose('AgentResourceDiscovery', `Could not read link tags: ${err.message}`);
|
|
151
|
+
return NO_LINKS;
|
|
57
152
|
}
|
|
58
153
|
}
|
|
59
154
|
|
|
60
155
|
/**
|
|
156
|
+
* Finds `rel="ard"` and `rel="ai-catalog"` in the main document's HTTP `Link` header.
|
|
61
157
|
* @param {LH.Gatherer.Context} context
|
|
62
158
|
* @param {string} finalDisplayedUrl
|
|
63
|
-
* @return {Promise<
|
|
159
|
+
* @return {Promise<ArdLinks>}
|
|
64
160
|
*/
|
|
65
|
-
static async
|
|
66
|
-
|
|
67
|
-
if (context.gatherMode !== 'navigation') return null;
|
|
161
|
+
static async getHttpHeaderLinks(context, finalDisplayedUrl) {
|
|
162
|
+
if (context.gatherMode !== 'navigation') return NO_LINKS;
|
|
68
163
|
|
|
69
164
|
try {
|
|
70
165
|
const mainResourceResponse = await context.driver.fetcher.fetchResource(finalDisplayedUrl);
|
|
71
|
-
const linkHeader = mainResourceResponse.headers?.
|
|
72
|
-
if (!linkHeader) return
|
|
166
|
+
const linkHeader = mainResourceResponse.headers?.link;
|
|
167
|
+
if (!linkHeader) return NO_LINKS;
|
|
168
|
+
|
|
169
|
+
const parsed = LinkHeader.parse(linkHeader.replace(/\n/g, ','));
|
|
170
|
+
/** @param {string} rel */
|
|
171
|
+
const getUri = rel =>
|
|
172
|
+
resolveUrl(parsed.refs.find(ref => ref.rel?.toLowerCase() === rel)?.uri, finalDisplayedUrl);
|
|
173
|
+
return {ard: getUri(REL_ARD), legacy: getUri(REL_LEGACY)};
|
|
174
|
+
} catch (err) {
|
|
175
|
+
log.verbose('AgentResourceDiscovery', `Could not read Link header: ${err.message}`);
|
|
176
|
+
return NO_LINKS;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Fetches a candidate manifest URL. Never throws; network errors are returned as a
|
|
182
|
+
* null status with an `errorMessage`.
|
|
183
|
+
* @param {LH.Gatherer.Context} context
|
|
184
|
+
* @param {string} url
|
|
185
|
+
* @return {Promise<FetchResult>}
|
|
186
|
+
*/
|
|
187
|
+
static async fetchManifest(context, url) {
|
|
188
|
+
try {
|
|
189
|
+
const {status, content, headers} = await context.driver.fetcher.fetchResource(url);
|
|
190
|
+
return {status, content, headers: headers || null};
|
|
191
|
+
} catch (err) {
|
|
192
|
+
log.error('AgentResourceDiscovery', err);
|
|
193
|
+
return {status: null, content: null, headers: null, errorMessage: err.message};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
73
196
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Tries each candidate in order and returns the first that loads. Advertised candidates
|
|
199
|
+
* that fail are recorded in `failedSources` and skipped. If nothing loads, the result
|
|
200
|
+
* describes the first advertised location that failed, or else the `/.well-known/ard.json`
|
|
201
|
+
* path consumers are required to fetch.
|
|
202
|
+
* @param {LH.Gatherer.Context} context
|
|
203
|
+
* @param {ManifestCandidate[]} candidates
|
|
204
|
+
* @return {Promise<{
|
|
205
|
+
* discoverySource: LH.Artifacts.ArdDiscoverySource,
|
|
206
|
+
* catalogUrl: string,
|
|
207
|
+
* fetchResult: FetchResult,
|
|
208
|
+
* failedSources: LH.Artifacts['AgentResourceDiscovery']['failedSources'],
|
|
209
|
+
* }>}
|
|
210
|
+
*/
|
|
211
|
+
static async resolveManifest(context, candidates) {
|
|
212
|
+
/** @type {Array<{source: LH.Artifacts.ArdDiscoverySource, url: string, advertised: boolean, fetchResult: FetchResult}>} */
|
|
213
|
+
const attempts = [];
|
|
214
|
+
const failedSources = () => attempts
|
|
215
|
+
.filter(attempt => attempt.advertised)
|
|
216
|
+
.map(({source, url, fetchResult}) => ({
|
|
217
|
+
source,
|
|
218
|
+
url,
|
|
219
|
+
status: fetchResult.status,
|
|
220
|
+
errorMessage: fetchResult.errorMessage,
|
|
221
|
+
}));
|
|
222
|
+
|
|
223
|
+
for (const {source, url, advertised} of candidates) {
|
|
224
|
+
if (!url || attempts.some(attempt => attempt.url === url)) continue;
|
|
77
225
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
226
|
+
const fetchResult = await AgentResourceDiscovery.fetchManifest(context, url);
|
|
227
|
+
if (fetchResult.status === HTTP_OK && fetchResult.content) {
|
|
228
|
+
return {discoverySource: source, catalogUrl: url, fetchResult,
|
|
229
|
+
failedSources: failedSources()};
|
|
230
|
+
}
|
|
231
|
+
attempts.push({source, url, advertised, fetchResult});
|
|
81
232
|
}
|
|
233
|
+
|
|
234
|
+
const fallback = attempts.find(attempt => attempt.advertised) ||
|
|
235
|
+
attempts.find(attempt => attempt.source === 'wellKnown');
|
|
236
|
+
if (!fallback) throw new Error('ARD discovery attempted no candidates');
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
discoverySource: fallback.source,
|
|
240
|
+
catalogUrl: fallback.url,
|
|
241
|
+
fetchResult: fallback.fetchResult,
|
|
242
|
+
failedSources: failedSources(),
|
|
243
|
+
};
|
|
82
244
|
}
|
|
83
245
|
|
|
84
246
|
/**
|
|
247
|
+
* Resolves the manifest following ARD §5.1: explicit ARD signals first, then the
|
|
248
|
+
* `/.well-known/ard.json` path consumers MUST fetch, and only then the predecessor
|
|
249
|
+
* `ai-catalog` relation and well-known path, which consumers MAY consult.
|
|
85
250
|
* @param {LH.Gatherer.Context<'RobotsTxt'>} context
|
|
86
251
|
* @return {Promise<LH.Artifacts['AgentResourceDiscovery']>}
|
|
87
252
|
*/
|
|
88
253
|
async getArtifact(context) {
|
|
89
254
|
const {finalDisplayedUrl} = context.baseArtifacts.URL;
|
|
90
|
-
const robotsTxt = context.dependencies.RobotsTxt;
|
|
91
255
|
const robotsTxtAgentmap = AgentResourceDiscovery.getRobotsTxtAgentmap(
|
|
92
|
-
|
|
93
|
-
const [
|
|
94
|
-
AgentResourceDiscovery.
|
|
95
|
-
AgentResourceDiscovery.
|
|
256
|
+
context.dependencies.RobotsTxt, finalDisplayedUrl);
|
|
257
|
+
const [htmlLinks, httpHeaderLinks] = await Promise.all([
|
|
258
|
+
AgentResourceDiscovery.getHtmlLinksFromDom(context, finalDisplayedUrl),
|
|
259
|
+
AgentResourceDiscovery.getHttpHeaderLinks(context, finalDisplayedUrl),
|
|
96
260
|
]);
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
261
|
+
|
|
262
|
+
/** @type {DiscoverySignals} */
|
|
263
|
+
const discoverySignals = {
|
|
264
|
+
robotsTxtAgentmap,
|
|
265
|
+
htmlLink: htmlLinks.ard,
|
|
266
|
+
httpHeaderLink: httpHeaderLinks.ard,
|
|
267
|
+
legacyHtmlLink: htmlLinks.legacy,
|
|
268
|
+
legacyHttpHeaderLink: httpHeaderLinks.legacy,
|
|
269
|
+
wellKnown: new URL(WELL_KNOWN_PATH, finalDisplayedUrl).href,
|
|
270
|
+
legacyWellKnown: new URL(LEGACY_WELL_KNOWN_PATH, finalDisplayedUrl).href,
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
const candidates = getManifestCandidates(discoverySignals);
|
|
274
|
+
const {discoverySource, catalogUrl, fetchResult, failedSources} =
|
|
275
|
+
await AgentResourceDiscovery.resolveManifest(context, candidates);
|
|
108
276
|
|
|
109
277
|
return {
|
|
110
|
-
|
|
111
|
-
content: fetchResult.content,
|
|
112
|
-
headers: fetchResult.headers || null,
|
|
278
|
+
...fetchResult,
|
|
113
279
|
catalogUrl,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
httpHeaderLink,
|
|
118
|
-
wellKnown,
|
|
119
|
-
},
|
|
120
|
-
errorMessage,
|
|
280
|
+
discoverySource,
|
|
281
|
+
discoverySignals,
|
|
282
|
+
failedSources,
|
|
121
283
|
};
|
|
122
284
|
}
|
|
123
285
|
}
|
|
@@ -16,5 +16,6 @@ export const TraceProcessor: typeof TraceEngine.Processor.TraceProcessor;
|
|
|
16
16
|
export const TraceHandlers: typeof TraceEngine.Handlers.ModelHandlers;
|
|
17
17
|
export const Insights: typeof TraceEngine.Insights;
|
|
18
18
|
export const Helpers: typeof TraceEngine.Helpers;
|
|
19
|
+
export const Types: typeof TraceEngine.Types;
|
|
19
20
|
import * as TraceEngine from '@paulirish/trace_engine';
|
|
20
21
|
//# sourceMappingURL=trace-engine.d.ts.map
|
package/core/lib/trace-engine.js
CHANGED
|
@@ -12,10 +12,12 @@ const TraceProcessor = TraceEngine.Processor.TraceProcessor;
|
|
|
12
12
|
const TraceHandlers = TraceEngine.Handlers.ModelHandlers;
|
|
13
13
|
const Insights = TraceEngine.Insights;
|
|
14
14
|
const Helpers = TraceEngine.Helpers;
|
|
15
|
+
const Types = TraceEngine.Types;
|
|
15
16
|
|
|
16
17
|
export {
|
|
17
18
|
TraceProcessor,
|
|
18
19
|
TraceHandlers,
|
|
19
20
|
Insights,
|
|
20
21
|
Helpers,
|
|
22
|
+
Types,
|
|
21
23
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lighthouse",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "13.5.0-dev.
|
|
4
|
+
"version": "13.5.0-dev.20261009",
|
|
5
5
|
"description": "Automated auditing, performance metrics, and best practices for the web.",
|
|
6
6
|
"main": "./core/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
"clean": "rm -r dist proto/scripts/*.json proto/scripts/*_pb2.* proto/scripts/*_pb.* proto/scripts/__pycache__ proto/scripts/*.pyc *.report.html *.report.dom.html *.report.json *.devtoolslog.json *.trace.json shared/localization/locales/*.ctc.json || true",
|
|
39
39
|
"clean-types": "git clean -xfq '*.d.ts' '*.d.cts' -e 'node_modules/' -e 'dist/' -e '.tmp/' -e '**/types/'",
|
|
40
40
|
"lint": "[ \"$CI\" = true ] && eslint --quiet -f codeframe . || eslint .",
|
|
41
|
+
"zizmor": "uvx zizmor@1.25.2 --gh-token=\"$(gh auth token)\" .github/workflows",
|
|
41
42
|
"smoke": "node -r source-map-support/register cli/test/smokehouse/frontends/smokehouse-bin.js",
|
|
42
43
|
"debug": "node --inspect-brk ./cli/index.js",
|
|
43
44
|
"start": "yarn build-report --standalone && node ./cli/index.js",
|
|
@@ -53,14 +54,13 @@
|
|
|
53
54
|
"test-proto": "yarn compile-proto && yarn build-proto-roundtrip",
|
|
54
55
|
"unit-core": "yarn mocha core",
|
|
55
56
|
"unit-cli": "yarn mocha --testMatch cli/**/*-test.js",
|
|
56
|
-
"unit-lantern-trace": "INTERNAL_LANTERN_USE_TRACE=1 yarn mocha core/test/computed/metrics core/test/audits",
|
|
57
|
+
"unit-lantern-trace": "INTERNAL_LANTERN_USE_TRACE=1 yarn mocha core/test/computed/metrics core/test/computed/page-dependency-graph-test.js core/test/computed/tbt-impact-tasks-test.js core/test/audits",
|
|
57
58
|
"unit-report": "yarn mocha --testMatch report/**/*-test.js",
|
|
58
59
|
"unit-treemap": "yarn mocha --testMatch treemap/**/*-test.js",
|
|
59
60
|
"unit-viewer": "yarn mocha --testMatch viewer/**/*-test.js",
|
|
60
61
|
"unit-flow": "bash flow-report/test/run-flow-report-tests.sh",
|
|
61
62
|
"unit": "yarn unit-flow && yarn mocha && yarn unit-lantern-trace",
|
|
62
63
|
"unit:ci": "NODE_OPTIONS=--max-old-space-size=8192 npm run unit",
|
|
63
|
-
"unit-lantern-trace:ci": "NODE_OPTIONS=--max-old-space-size=8192 npm run unit-lantern-trace",
|
|
64
64
|
"core-unit": "yarn unit-core",
|
|
65
65
|
"cli-unit": "yarn unit-cli",
|
|
66
66
|
"viewer-unit": "yarn unit-viewer",
|
|
@@ -71,7 +71,6 @@
|
|
|
71
71
|
"deploy-treemap": "yarn build-treemap --deploy",
|
|
72
72
|
"deploy-viewer": "yarn build-viewer --deploy",
|
|
73
73
|
"vercel-build": "yarn build-sample-reports && yarn build-viewer && yarn build-treemap",
|
|
74
|
-
"dogfood-lhci": "./core/scripts/dogfood-lhci.sh",
|
|
75
74
|
"timing-trace": "node core/scripts/generate-timing-trace.js",
|
|
76
75
|
"changelog": "conventional-changelog --config ./build/changelog-generator/index.cjs --infile changelog.md --same-file",
|
|
77
76
|
"type-check": "tsc --build ./tsconfig-all.json",
|
|
@@ -111,7 +110,7 @@
|
|
|
111
110
|
"@jest/fake-timers": "^29.7.0",
|
|
112
111
|
"@testing-library/preact": "^3.1.1",
|
|
113
112
|
"@testing-library/preact-hooks": "^1.1.0",
|
|
114
|
-
"@types/archiver": "^
|
|
113
|
+
"@types/archiver": "^8.0.0",
|
|
115
114
|
"@types/chrome": "^0.1.42",
|
|
116
115
|
"@types/configstore": "^6.0.2",
|
|
117
116
|
"@types/cpy": "^5.1.0",
|
|
@@ -138,7 +137,7 @@
|
|
|
138
137
|
"@typescript-eslint/parser": "^8.60.1",
|
|
139
138
|
"acorn": "^8.5.0",
|
|
140
139
|
"angular": "^1.7.4",
|
|
141
|
-
"archiver": "^
|
|
140
|
+
"archiver": "^8.0.0",
|
|
142
141
|
"builtin-modules": "^3.3.0",
|
|
143
142
|
"chalk": "^2.4.1",
|
|
144
143
|
"chrome-devtools-frontend": "1.0.1705227",
|
|
@@ -183,7 +182,7 @@
|
|
|
183
182
|
"webtreemap-cdt": "^3.2.1"
|
|
184
183
|
},
|
|
185
184
|
"dependencies": {
|
|
186
|
-
"@paulirish/trace_engine": "0.0.
|
|
185
|
+
"@paulirish/trace_engine": "0.0.66",
|
|
187
186
|
"@sentry/node": "^10.0.0",
|
|
188
187
|
"ajv": "^8.20.0",
|
|
189
188
|
"ajv-formats": "^3.0.1",
|