lighthouse-audit-utils 1.0.1 β†’ 1.2.3

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.
@@ -0,0 +1,510 @@
1
+ import { mkdir, writeFile } from 'fs/promises';
2
+ import path from 'path';
3
+ import lighthouse from 'lighthouse';
4
+
5
+ // lighthouse-audit-utils 1.2.3
6
+
7
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/predicate/isPrimitive.mjs
8
+ function isPrimitive(value) {
9
+ return value == null || typeof value !== "object" && typeof value !== "function";
10
+ }
11
+
12
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/predicate/isTypedArray.mjs
13
+ function isTypedArray(x) {
14
+ return ArrayBuffer.isView(x) && !(x instanceof DataView);
15
+ }
16
+
17
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/clone.mjs
18
+ function clone(obj) {
19
+ if (isPrimitive(obj)) return obj;
20
+ if (Array.isArray(obj) || isTypedArray(obj) || obj instanceof ArrayBuffer || typeof SharedArrayBuffer !== "undefined" && obj instanceof SharedArrayBuffer) return obj.slice(0);
21
+ const prototype = Object.getPrototypeOf(obj);
22
+ if (prototype == null) return Object.assign(Object.create(prototype), obj);
23
+ const Constructor = prototype.constructor;
24
+ if (obj instanceof Date || obj instanceof Map || obj instanceof Set) return new Constructor(obj);
25
+ if (obj instanceof RegExp) {
26
+ const newRegExp = new Constructor(obj);
27
+ newRegExp.lastIndex = obj.lastIndex;
28
+ return newRegExp;
29
+ }
30
+ if (obj instanceof DataView) return new Constructor(obj.buffer.slice(0));
31
+ if (obj instanceof Error) {
32
+ let newError;
33
+ if (obj instanceof AggregateError) newError = new Constructor(obj.errors, obj.message, { cause: obj.cause });
34
+ else newError = new Constructor(obj.message, { cause: obj.cause });
35
+ newError.stack = obj.stack;
36
+ Object.assign(newError, obj);
37
+ return newError;
38
+ }
39
+ if (typeof File !== "undefined" && obj instanceof File) return new Constructor([obj], obj.name, {
40
+ type: obj.type,
41
+ lastModified: obj.lastModified
42
+ });
43
+ if (typeof obj === "object") return Object.assign(Object.create(prototype), obj);
44
+ return obj;
45
+ }
46
+
47
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/compat/_internal/getSymbols.mjs
48
+ function getSymbols(object) {
49
+ return Object.getOwnPropertySymbols(object).filter((symbol) => Object.prototype.propertyIsEnumerable.call(object, symbol));
50
+ }
51
+
52
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/compat/_internal/getTag.mjs
53
+ function getTag(value) {
54
+ if (value == null) return value === void 0 ? "[object Undefined]" : "[object Null]";
55
+ return Object.prototype.toString.call(value);
56
+ }
57
+
58
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/compat/_internal/tags.mjs
59
+ var regexpTag = "[object RegExp]";
60
+ var stringTag = "[object String]";
61
+ var numberTag = "[object Number]";
62
+ var booleanTag = "[object Boolean]";
63
+ var argumentsTag = "[object Arguments]";
64
+ var symbolTag = "[object Symbol]";
65
+ var dateTag = "[object Date]";
66
+ var mapTag = "[object Map]";
67
+ var setTag = "[object Set]";
68
+ var arrayTag = "[object Array]";
69
+ var arrayBufferTag = "[object ArrayBuffer]";
70
+ var objectTag = "[object Object]";
71
+ var dataViewTag = "[object DataView]";
72
+ var uint8ArrayTag = "[object Uint8Array]";
73
+ var uint8ClampedArrayTag = "[object Uint8ClampedArray]";
74
+ var uint16ArrayTag = "[object Uint16Array]";
75
+ var uint32ArrayTag = "[object Uint32Array]";
76
+ var int8ArrayTag = "[object Int8Array]";
77
+ var int16ArrayTag = "[object Int16Array]";
78
+ var int32ArrayTag = "[object Int32Array]";
79
+ var float32ArrayTag = "[object Float32Array]";
80
+ var float64ArrayTag = "[object Float64Array]";
81
+
82
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/_internal/globalThis.mjs
83
+ var globalThis_ = typeof globalThis === "object" && globalThis || typeof window === "object" && window || typeof self === "object" && self || typeof global === "object" && global || /* @__PURE__ */ (function() {
84
+ return this;
85
+ })();
86
+
87
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/predicate/isBuffer.mjs
88
+ function isBuffer(x) {
89
+ return typeof globalThis_.Buffer !== "undefined" && globalThis_.Buffer.isBuffer(x);
90
+ }
91
+
92
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/cloneDeepWith.mjs
93
+ function cloneDeepWithImpl(valueToClone, keyToClone, objectToClone, stack = /* @__PURE__ */ new Map(), cloneValue = void 0) {
94
+ const cloned = cloneValue?.(valueToClone, keyToClone, objectToClone, stack);
95
+ if (cloned !== void 0) return cloned;
96
+ if (isPrimitive(valueToClone)) return valueToClone;
97
+ if (stack.has(valueToClone)) return stack.get(valueToClone);
98
+ if (Array.isArray(valueToClone)) {
99
+ const result = new Array(valueToClone.length);
100
+ stack.set(valueToClone, result);
101
+ for (let i = 0; i < valueToClone.length; i++) result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);
102
+ if (Object.hasOwn(valueToClone, "index")) result.index = valueToClone.index;
103
+ if (Object.hasOwn(valueToClone, "input")) result.input = valueToClone.input;
104
+ return result;
105
+ }
106
+ if (valueToClone instanceof Date) return new Date(valueToClone.getTime());
107
+ if (valueToClone instanceof RegExp) {
108
+ const result = new RegExp(valueToClone.source, valueToClone.flags);
109
+ result.lastIndex = valueToClone.lastIndex;
110
+ return result;
111
+ }
112
+ if (valueToClone instanceof Map) {
113
+ const result = /* @__PURE__ */ new Map();
114
+ stack.set(valueToClone, result);
115
+ for (const [key, value] of valueToClone) result.set(key, cloneDeepWithImpl(value, key, objectToClone, stack, cloneValue));
116
+ return result;
117
+ }
118
+ if (valueToClone instanceof Set) {
119
+ const result = /* @__PURE__ */ new Set();
120
+ stack.set(valueToClone, result);
121
+ for (const value of valueToClone) result.add(cloneDeepWithImpl(value, void 0, objectToClone, stack, cloneValue));
122
+ return result;
123
+ }
124
+ if (isBuffer(valueToClone)) return valueToClone.subarray();
125
+ if (isTypedArray(valueToClone)) {
126
+ const result = new (Object.getPrototypeOf(valueToClone)).constructor(valueToClone.length);
127
+ stack.set(valueToClone, result);
128
+ for (let i = 0; i < valueToClone.length; i++) result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);
129
+ return result;
130
+ }
131
+ if (valueToClone instanceof ArrayBuffer || typeof SharedArrayBuffer !== "undefined" && valueToClone instanceof SharedArrayBuffer) return valueToClone.slice(0);
132
+ if (valueToClone instanceof DataView) {
133
+ const result = new DataView(valueToClone.buffer.slice(0), valueToClone.byteOffset, valueToClone.byteLength);
134
+ stack.set(valueToClone, result);
135
+ copyProperties(result, valueToClone, objectToClone, stack, cloneValue);
136
+ return result;
137
+ }
138
+ if (typeof File !== "undefined" && valueToClone instanceof File) {
139
+ const result = new File([valueToClone], valueToClone.name, { type: valueToClone.type });
140
+ stack.set(valueToClone, result);
141
+ copyProperties(result, valueToClone, objectToClone, stack, cloneValue);
142
+ return result;
143
+ }
144
+ if (typeof Blob !== "undefined" && valueToClone instanceof Blob) {
145
+ const result = new Blob([valueToClone], { type: valueToClone.type });
146
+ stack.set(valueToClone, result);
147
+ copyProperties(result, valueToClone, objectToClone, stack, cloneValue);
148
+ return result;
149
+ }
150
+ if (valueToClone instanceof Error) {
151
+ const result = structuredClone(valueToClone);
152
+ stack.set(valueToClone, result);
153
+ result.message = valueToClone.message;
154
+ result.name = valueToClone.name;
155
+ result.stack = valueToClone.stack;
156
+ result.cause = valueToClone.cause;
157
+ result.constructor = valueToClone.constructor;
158
+ copyProperties(result, valueToClone, objectToClone, stack, cloneValue);
159
+ return result;
160
+ }
161
+ if (valueToClone instanceof Boolean) {
162
+ const result = new Boolean(valueToClone.valueOf());
163
+ stack.set(valueToClone, result);
164
+ copyProperties(result, valueToClone, objectToClone, stack, cloneValue);
165
+ return result;
166
+ }
167
+ if (valueToClone instanceof Number) {
168
+ const result = new Number(valueToClone.valueOf());
169
+ stack.set(valueToClone, result);
170
+ copyProperties(result, valueToClone, objectToClone, stack, cloneValue);
171
+ return result;
172
+ }
173
+ if (valueToClone instanceof String) {
174
+ const result = new String(valueToClone.valueOf());
175
+ stack.set(valueToClone, result);
176
+ copyProperties(result, valueToClone, objectToClone, stack, cloneValue);
177
+ return result;
178
+ }
179
+ if (typeof valueToClone === "object" && isCloneableObject(valueToClone)) {
180
+ const result = Object.create(Object.getPrototypeOf(valueToClone));
181
+ stack.set(valueToClone, result);
182
+ copyProperties(result, valueToClone, objectToClone, stack, cloneValue);
183
+ return result;
184
+ }
185
+ return valueToClone;
186
+ }
187
+ function copyProperties(target, source, objectToClone = target, stack, cloneValue) {
188
+ const keys = [...Object.keys(source), ...getSymbols(source)];
189
+ for (let i = 0; i < keys.length; i++) {
190
+ const key = keys[i];
191
+ const descriptor = Object.getOwnPropertyDescriptor(target, key);
192
+ if (descriptor == null || descriptor.writable) target[key] = cloneDeepWithImpl(source[key], key, objectToClone, stack, cloneValue);
193
+ }
194
+ }
195
+ function isCloneableObject(object) {
196
+ switch (getTag(object)) {
197
+ case argumentsTag:
198
+ case arrayTag:
199
+ case arrayBufferTag:
200
+ case dataViewTag:
201
+ case booleanTag:
202
+ case dateTag:
203
+ case float32ArrayTag:
204
+ case float64ArrayTag:
205
+ case int8ArrayTag:
206
+ case int16ArrayTag:
207
+ case int32ArrayTag:
208
+ case mapTag:
209
+ case numberTag:
210
+ case objectTag:
211
+ case regexpTag:
212
+ case setTag:
213
+ case stringTag:
214
+ case symbolTag:
215
+ case uint8ArrayTag:
216
+ case uint8ClampedArrayTag:
217
+ case uint16ArrayTag:
218
+ case uint32ArrayTag:
219
+ return true;
220
+ default:
221
+ return false;
222
+ }
223
+ }
224
+
225
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/cloneDeep.mjs
226
+ function cloneDeep(obj) {
227
+ return cloneDeepWithImpl(obj, void 0, obj, /* @__PURE__ */ new Map(), void 0);
228
+ }
229
+
230
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs
231
+ function isPlainObject(value) {
232
+ if (!value || typeof value !== "object") return false;
233
+ const proto = Object.getPrototypeOf(value);
234
+ if (!(proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null)) return false;
235
+ return Object.prototype.toString.call(value) === "[object Object]";
236
+ }
237
+
238
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs
239
+ function isUnsafeProperty(key) {
240
+ return key === "__proto__";
241
+ }
242
+
243
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/mergeWith.mjs
244
+ function mergeWith(target, source, merge) {
245
+ const sourceKeys = Object.keys(source);
246
+ for (let i = 0; i < sourceKeys.length; i++) {
247
+ const key = sourceKeys[i];
248
+ if (isUnsafeProperty(key)) continue;
249
+ const sourceValue = source[key];
250
+ const targetValue = target[key];
251
+ const merged = merge(targetValue, sourceValue, key, target, source);
252
+ if (merged !== void 0) target[key] = merged;
253
+ else if (Array.isArray(sourceValue)) if (Array.isArray(targetValue)) target[key] = mergeWith(targetValue, sourceValue, merge);
254
+ else target[key] = mergeWith([], sourceValue, merge);
255
+ else if (isPlainObject(sourceValue)) if (isPlainObject(targetValue)) target[key] = mergeWith(targetValue, sourceValue, merge);
256
+ else target[key] = mergeWith({}, sourceValue, merge);
257
+ else if (targetValue === void 0 || sourceValue !== void 0) target[key] = sourceValue;
258
+ }
259
+ return target;
260
+ }
261
+
262
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/toMerged.mjs
263
+ function toMerged(target, source) {
264
+ return mergeWith(cloneDeep(target), source, function mergeRecursively(targetValue, sourceValue) {
265
+ if (Array.isArray(sourceValue)) if (Array.isArray(targetValue)) return mergeWith(clone(targetValue), sourceValue, mergeRecursively);
266
+ else return mergeWith([], sourceValue, mergeRecursively);
267
+ else if (isPlainObject(sourceValue)) if (isPlainObject(targetValue)) return mergeWith(clone(targetValue), sourceValue, mergeRecursively);
268
+ else return mergeWith({}, sourceValue, mergeRecursively);
269
+ });
270
+ }
271
+
272
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/array/compact.mjs
273
+ function compact(arr) {
274
+ const result = [];
275
+ for (let i = 0; i < arr.length; i++) {
276
+ const item = arr[i];
277
+ if (item) result.push(item);
278
+ }
279
+ return result;
280
+ }
281
+
282
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/_internal/compareValues.mjs
283
+ function nullishRank(value) {
284
+ if (value === null) return 1;
285
+ if (value === void 0) return 2;
286
+ return 0;
287
+ }
288
+ function compareAscending(a, b) {
289
+ const aRank = nullishRank(a);
290
+ const bRank = nullishRank(b);
291
+ if (aRank < bRank) return -1;
292
+ if (aRank > bRank) return 1;
293
+ if (aRank !== 0) return 0;
294
+ if (a < b) return -1;
295
+ if (a > b) return 1;
296
+ return 0;
297
+ }
298
+ function compareValues(a, b, order) {
299
+ return order === "asc" ? compareAscending(a, b) : compareAscending(b, a);
300
+ }
301
+
302
+ // node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/array/orderBy.mjs
303
+ function orderBy(arr, criteria, orders) {
304
+ return arr.slice().sort((a, b) => {
305
+ const ordersLength = orders.length;
306
+ for (let i = 0; i < criteria.length; i++) {
307
+ const order = ordersLength > i ? orders[i] : orders[ordersLength - 1];
308
+ const criterion = criteria[i];
309
+ const criterionIsFunction = typeof criterion === "function";
310
+ const result = compareValues(criterionIsFunction ? criterion(a) : a[criterion], criterionIsFunction ? criterion(b) : b[criterion], order);
311
+ if (result !== 0) return result;
312
+ }
313
+ return 0;
314
+ });
315
+ }
316
+
317
+ // src/log-recommendations.ts
318
+ var resolveMetricSavings = (audit) => Object.entries(audit.metricSavings ?? {}).filter(([, ms]) => !!ms);
319
+ var metricValueType = (metric) => metric === "CLS" ? "numeric" : "ms";
320
+ var formatValue = (value, valueType, maxValueLength) => {
321
+ if (value === void 0 || typeof value === "boolean") {
322
+ return "";
323
+ }
324
+ if (typeof value === "number") {
325
+ if (valueType === "bytes") {
326
+ const kib = value / 1024;
327
+ const rounded = kib >= 100 ? Math.round(kib) : Math.round(kib * 10) / 10;
328
+ return `${rounded} KiB`;
329
+ }
330
+ if (valueType === "ms" || valueType === "timespanMs") {
331
+ return `${Math.round(value)} ms`;
332
+ }
333
+ return String(Math.round(value * 100) / 100);
334
+ }
335
+ const text = (() => {
336
+ if (typeof value === "string") {
337
+ return value;
338
+ }
339
+ if (!("type" in value)) {
340
+ return "";
341
+ }
342
+ switch (value.type) {
343
+ case "url":
344
+ return value.value;
345
+ case "link":
346
+ return value.url || value.text;
347
+ case "code":
348
+ return String(value.value);
349
+ case "node":
350
+ return value.nodeLabel ?? value.selector ?? value.snippet ?? "";
351
+ case "source-location":
352
+ return `${value.url}:${value.line}:${value.column}`;
353
+ default:
354
+ return "";
355
+ }
356
+ })();
357
+ const singleLine = text.replace(/\s+/g, " ").trim();
358
+ return singleLine.length > maxValueLength ? `${singleLine.slice(0, maxValueLength)}\u2026` : singleLine;
359
+ };
360
+ var formatItems = (details, { maxItems, maxValueLength }) => {
361
+ if (details?.type !== "opportunity" && details?.type !== "table") {
362
+ return [];
363
+ }
364
+ const [identity, ...measures] = details.headings.filter(({ key }) => !!key);
365
+ if (!identity) {
366
+ return [];
367
+ }
368
+ const MEASURE_TYPES = [
369
+ "bytes",
370
+ "ms",
371
+ "timespanMs",
372
+ "numeric"
373
+ ];
374
+ const lines = details.items.slice(0, maxItems).map((item) => {
375
+ const columns = [
376
+ formatValue(item[identity.key ?? ""], identity.valueType, maxValueLength),
377
+ ...measures.filter(({ valueType }) => MEASURE_TYPES.includes(valueType)).map(
378
+ (heading) => `${heading.label}: ${formatValue(item[heading.key ?? ""], heading.valueType, maxValueLength)}`
379
+ )
380
+ ];
381
+ return ` - ${compact(columns).join(" \xB7 ")}`;
382
+ });
383
+ const remaining = details.items.length - maxItems;
384
+ if (remaining > 0) {
385
+ lines.push(` - \u2026and ${remaining} more`);
386
+ }
387
+ return lines;
388
+ };
389
+ var logRecommendations = (lhr, {
390
+ label,
391
+ maxItems = 5,
392
+ maxValueLength = 120
393
+ }) => {
394
+ const lines = [
395
+ "",
396
+ `\u2500\u2500\u2500\u2500\u2500 Lighthouse recommendations${label ? `: ${label}` : ""} \u2014 ${lhr.finalDisplayedUrl} \u2500\u2500\u2500\u2500\u2500`
397
+ ];
398
+ for (const category of Object.values(lhr.categories)) {
399
+ const categoryScoreValue = category.score === null ? "N/A" : Math.round(category.score * 100);
400
+ const categoryLine = `${category.title}: ${categoryScoreValue}`;
401
+ const failing = orderBy(
402
+ category.auditRefs.map(({ id }) => lhr.audits[id]).filter((audit) => !!audit && audit.score !== null && audit.score < 1),
403
+ [
404
+ (audit) => Math.max(0, ...resolveMetricSavings(audit).map(([, ms]) => ms)),
405
+ ({ score }) => score ?? 0
406
+ ],
407
+ ["desc", "asc"]
408
+ );
409
+ if (!failing.length) {
410
+ lines.push("", `${categoryLine} \u2014 nothing to flag`);
411
+ continue;
412
+ }
413
+ lines.push("", categoryLine);
414
+ for (const audit of failing) {
415
+ const displayValue = audit.displayValue ? ` (${audit.displayValue})` : "";
416
+ const savingsValue = (() => {
417
+ if (audit.displayValue?.toLowerCase().includes("savings")) {
418
+ return "";
419
+ }
420
+ const overallSavingsBytes = audit.details?.type === "opportunity" ? audit.details.overallSavingsBytes : void 0;
421
+ const estSavings = compact([
422
+ ...resolveMetricSavings(audit).map(
423
+ ([metric, value]) => `${metric} ${formatValue(value, metricValueType(metric), maxValueLength)}`
424
+ ),
425
+ formatValue(overallSavingsBytes, "bytes", maxValueLength)
426
+ ]);
427
+ return estSavings.length ? ` \u2014 est. savings: ${estSavings.join(", ")}` : "";
428
+ })();
429
+ const scoreValue = audit.score === null ? "N/A" : Math.round(audit.score * 100);
430
+ lines.push(` \u2022 ${audit.title}${displayValue}${savingsValue}`);
431
+ lines.push(` ${audit.id} \xB7 score ${scoreValue}`);
432
+ lines.push(...formatItems(audit.details, { maxItems, maxValueLength }));
433
+ }
434
+ }
435
+ lines.push("");
436
+ console.log(lines.join("\n"));
437
+ };
438
+
439
+ // src/thresholds.ts
440
+ var thresholdFailureMessage = (failures) => [
441
+ "Lighthouse thresholds not met:",
442
+ ...failures.map(
443
+ ({ category, minimum, score }) => `${category} scored ${score}, below the ${minimum} threshold`
444
+ )
445
+ ].join("\n");
446
+ var checkAgainstThresholds = (lhr, { thresholds = 100, ignoreError }) => {
447
+ const isFlat = typeof thresholds === "number";
448
+ const defaultMinimum = isFlat ? thresholds : 100;
449
+ const minimums = isFlat ? {} : thresholds ?? {};
450
+ const failures = Object.values(lhr.categories).filter((c) => c.score !== null).map(({ id, score }) => ({
451
+ category: id,
452
+ minimum: minimums[id] ?? defaultMinimum,
453
+ score: score * 100
454
+ })).filter(({ score, minimum }) => score < minimum);
455
+ if (!failures.length) {
456
+ return void 0;
457
+ }
458
+ if (!ignoreError) {
459
+ throw new Error(thresholdFailureMessage(failures));
460
+ }
461
+ return failures;
462
+ };
463
+ var writeReports = async (result, { directory, name }) => {
464
+ const formats = [result.lhr.configSettings.output].flat();
465
+ await mkdir(directory, { recursive: true });
466
+ await Promise.all(
467
+ [result.report].flat().map(
468
+ (report, i) => writeFile(path.join(directory, `${name}.${formats[i]}`), report)
469
+ )
470
+ );
471
+ };
472
+
473
+ // src/handle-audit-result.ts
474
+ var handleAuditResult = async ({
475
+ result,
476
+ reports,
477
+ thresholds,
478
+ ignoreError,
479
+ recommendations
480
+ }) => {
481
+ if (reports) {
482
+ await writeReports(result, reports);
483
+ }
484
+ if (recommendations !== false) {
485
+ logRecommendations(result.lhr, {
486
+ label: reports?.name,
487
+ ...recommendations
488
+ });
489
+ }
490
+ const failures = checkAgainstThresholds(result.lhr, {
491
+ thresholds,
492
+ ignoreError
493
+ });
494
+ return failures;
495
+ };
496
+ var runAudit = async ({
497
+ lighthouseArgs: { url, flags, config },
498
+ ...handleArgs
499
+ }) => {
500
+ const result = await lighthouse(url, flags, config);
501
+ if (!result) {
502
+ throw new Error(`Lighthouse returned no result for ${url}`);
503
+ }
504
+ const failures = await handleAuditResult({ result, ...handleArgs });
505
+ return { result, failures };
506
+ };
507
+
508
+ export { checkAgainstThresholds, handleAuditResult, logRecommendations, runAudit, toMerged, writeReports };
509
+ //# sourceMappingURL=chunk-4DICEJP6.js.map
510
+ //# sourceMappingURL=chunk-4DICEJP6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/predicate/isPrimitive.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/predicate/isTypedArray.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/clone.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/compat/_internal/getSymbols.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/compat/_internal/getTag.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/compat/_internal/tags.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/_internal/globalThis.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/predicate/isBuffer.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/cloneDeepWith.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/cloneDeep.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/predicate/isPlainObject.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/mergeWith.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/object/toMerged.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/array/compact.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/_internal/compareValues.mjs","../node_modules/.pnpm/es-toolkit@1.50.0/node_modules/es-toolkit/dist/array/orderBy.mjs","../src/log-recommendations.ts","../src/thresholds.ts","../src/write-reports.ts","../src/handle-audit-result.ts","../src/run-audit.ts"],"names":[],"mappings":"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","file":"chunk-4DICEJP6.js","sourcesContent":["//#region src/predicate/isPrimitive.ts\n/**\n* Checks whether a value is a JavaScript primitive.\n* JavaScript primitives include null, undefined, strings, numbers, booleans, symbols, and bigints.\n*\n* @param value The value to check.\n* @returns Returns true if `value` is a primitive, false otherwise.\n*\n* @example\n* isPrimitive(null); // true\n* isPrimitive(undefined); // true\n* isPrimitive('123'); // true\n* isPrimitive(false); // true\n* isPrimitive(true); // true\n* isPrimitive(Symbol('a')); // true\n* isPrimitive(123n); // true\n* isPrimitive({}); // false\n* isPrimitive(new Date()); // false\n* isPrimitive(new Map()); // false\n* isPrimitive(new Set()); // false\n* isPrimitive([1, 2, 3]); // false\n*/\nfunction isPrimitive(value) {\n\treturn value == null || typeof value !== \"object\" && typeof value !== \"function\";\n}\n//#endregion\nexport { isPrimitive };\n","//#region src/predicate/isTypedArray.ts\n/**\n* Checks if a value is a TypedArray.\n* @param x The value to check.\n* @returns Returns true if `x` is a TypedArray, false otherwise.\n*\n* @example\n* const arr = new Uint8Array([1, 2, 3]);\n* isTypedArray(arr); // true\n*\n* const regularArray = [1, 2, 3];\n* isTypedArray(regularArray); // false\n*\n* const buffer = new ArrayBuffer(16);\n* isTypedArray(buffer); // false\n*/\nfunction isTypedArray(x) {\n\treturn ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n//#endregion\nexport { isTypedArray };\n","import { isPrimitive } from \"../predicate/isPrimitive.mjs\";\nimport { isTypedArray } from \"../predicate/isTypedArray.mjs\";\n//#region src/object/clone.ts\n/**\n* Creates a shallow clone of the given object.\n*\n* @template T - The type of the object.\n* @param obj - The object to clone.\n* @returns A shallow clone of the given object.\n*\n* @example\n* // Clone a primitive value\n* const num = 29;\n* const clonedNum = clone(num);\n* console.log(clonedNum); // 29\n* console.log(clonedNum === num); // true\n*\n* @example\n* // Clone an array\n* const arr = [1, 2, 3];\n* const clonedArr = clone(arr);\n* console.log(clonedArr); // [1, 2, 3]\n* console.log(clonedArr === arr); // false\n*\n* @example\n* // Clone an object\n* const obj = { a: 1, b: 'es-toolkit', c: [1, 2, 3] };\n* const clonedObj = clone(obj);\n* console.log(clonedObj); // { a: 1, b: 'es-toolkit', c: [1, 2, 3] }\n* console.log(clonedObj === obj); // false\n*/\nfunction clone(obj) {\n\tif (isPrimitive(obj)) return obj;\n\tif (Array.isArray(obj) || isTypedArray(obj) || obj instanceof ArrayBuffer || typeof SharedArrayBuffer !== \"undefined\" && obj instanceof SharedArrayBuffer) return obj.slice(0);\n\tconst prototype = Object.getPrototypeOf(obj);\n\tif (prototype == null) return Object.assign(Object.create(prototype), obj);\n\tconst Constructor = prototype.constructor;\n\tif (obj instanceof Date || obj instanceof Map || obj instanceof Set) return new Constructor(obj);\n\tif (obj instanceof RegExp) {\n\t\tconst newRegExp = new Constructor(obj);\n\t\tnewRegExp.lastIndex = obj.lastIndex;\n\t\treturn newRegExp;\n\t}\n\tif (obj instanceof DataView) return new Constructor(obj.buffer.slice(0));\n\tif (obj instanceof Error) {\n\t\tlet newError;\n\t\tif (obj instanceof AggregateError) newError = new Constructor(obj.errors, obj.message, { cause: obj.cause });\n\t\telse newError = new Constructor(obj.message, { cause: obj.cause });\n\t\tnewError.stack = obj.stack;\n\t\tObject.assign(newError, obj);\n\t\treturn newError;\n\t}\n\tif (typeof File !== \"undefined\" && obj instanceof File) return new Constructor([obj], obj.name, {\n\t\ttype: obj.type,\n\t\tlastModified: obj.lastModified\n\t});\n\tif (typeof obj === \"object\") return Object.assign(Object.create(prototype), obj);\n\treturn obj;\n}\n//#endregion\nexport { clone };\n","//#region src/compat/_internal/getSymbols.ts\nfunction getSymbols(object) {\n\treturn Object.getOwnPropertySymbols(object).filter((symbol) => Object.prototype.propertyIsEnumerable.call(object, symbol));\n}\n//#endregion\nexport { getSymbols };\n","//#region src/compat/_internal/getTag.ts\n/**\n* Gets the `toStringTag` of `value`.\n*\n* @private\n* @param {T} value The value to query.\n* @returns {string} Returns the `Object.prototype.toString.call` result.\n*/\nfunction getTag(value) {\n\tif (value == null) return value === void 0 ? \"[object Undefined]\" : \"[object Null]\";\n\treturn Object.prototype.toString.call(value);\n}\n//#endregion\nexport { getTag };\n","//#region src/compat/_internal/tags.ts\nconst regexpTag = \"[object RegExp]\";\nconst stringTag = \"[object String]\";\nconst numberTag = \"[object Number]\";\nconst booleanTag = \"[object Boolean]\";\nconst argumentsTag = \"[object Arguments]\";\nconst symbolTag = \"[object Symbol]\";\nconst dateTag = \"[object Date]\";\nconst mapTag = \"[object Map]\";\nconst setTag = \"[object Set]\";\nconst arrayTag = \"[object Array]\";\nconst functionTag = \"[object Function]\";\nconst arrayBufferTag = \"[object ArrayBuffer]\";\nconst objectTag = \"[object Object]\";\nconst errorTag = \"[object Error]\";\nconst dataViewTag = \"[object DataView]\";\nconst uint8ArrayTag = \"[object Uint8Array]\";\nconst uint8ClampedArrayTag = \"[object Uint8ClampedArray]\";\nconst uint16ArrayTag = \"[object Uint16Array]\";\nconst uint32ArrayTag = \"[object Uint32Array]\";\nconst bigUint64ArrayTag = \"[object BigUint64Array]\";\nconst int8ArrayTag = \"[object Int8Array]\";\nconst int16ArrayTag = \"[object Int16Array]\";\nconst int32ArrayTag = \"[object Int32Array]\";\nconst bigInt64ArrayTag = \"[object BigInt64Array]\";\nconst float32ArrayTag = \"[object Float32Array]\";\nconst float64ArrayTag = \"[object Float64Array]\";\n//#endregion\nexport { argumentsTag, arrayBufferTag, arrayTag, bigInt64ArrayTag, bigUint64ArrayTag, booleanTag, dataViewTag, dateTag, errorTag, float32ArrayTag, float64ArrayTag, functionTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag };\n","//#region src/_internal/globalThis.ts\nconst globalThis_ = typeof globalThis === \"object\" && globalThis || typeof window === \"object\" && window || typeof self === \"object\" && self || typeof global === \"object\" && global || (function() {\n\treturn this;\n})();\n//#endregion\nexport { globalThis_ };\n","import { globalThis_ } from \"../_internal/globalThis.mjs\";\n//#region src/predicate/isBuffer.ts\n/**\n* Checks if the given value is a Buffer instance.\n*\n* This function tests whether the provided value is an instance of Buffer.\n* It returns `true` if the value is a Buffer, and `false` otherwise.\n*\n* This function can also serve as a type predicate in TypeScript, narrowing the type of the argument to `Buffer`.\n*\n* @param x - The value to check if it is a Buffer.\n* @returns Returns `true` if `x` is a Buffer, else `false`.\n*\n* @example\n* const buffer = Buffer.from(\"test\");\n* console.log(isBuffer(buffer)); // true\n*\n* const notBuffer = \"not a buffer\";\n* console.log(isBuffer(notBuffer)); // false\n*/\nfunction isBuffer(x) {\n\treturn typeof globalThis_.Buffer !== \"undefined\" && globalThis_.Buffer.isBuffer(x);\n}\n//#endregion\nexport { isBuffer };\n","import { isPrimitive } from \"../predicate/isPrimitive.mjs\";\nimport { isTypedArray } from \"../predicate/isTypedArray.mjs\";\nimport { getSymbols } from \"../compat/_internal/getSymbols.mjs\";\nimport { getTag } from \"../compat/_internal/getTag.mjs\";\nimport { argumentsTag, arrayBufferTag, arrayTag, booleanTag, dataViewTag, dateTag, float32ArrayTag, float64ArrayTag, int16ArrayTag, int32ArrayTag, int8ArrayTag, mapTag, numberTag, objectTag, regexpTag, setTag, stringTag, symbolTag, uint16ArrayTag, uint32ArrayTag, uint8ArrayTag, uint8ClampedArrayTag } from \"../compat/_internal/tags.mjs\";\nimport { isBuffer } from \"../predicate/isBuffer.mjs\";\n//#region src/object/cloneDeepWith.ts\n/**\n* Deeply clones the given object.\n*\n* You can customize the deep cloning process using the `cloneValue` function.\n* The function takes the current value `value`, the property name `key`, and the entire object `obj` as arguments.\n* If the function returns a value, that value is used;\n* if it returns `undefined`, the default cloning method is used.\n*\n* @template T - The type of the object.\n* @param obj - The object to clone.\n* @param [cloneValue] - A function to customize the cloning process.\n* @returns A deep clone of the given object.\n*\n* @example\n* // Clone a primitive value\n* const num = 29;\n* const clonedNum = cloneDeepWith(num);\n* console.log(clonedNum); // 29\n* console.log(clonedNum === num); // true\n*\n* @example\n* // Clone an object with a customizer\n* const obj = { a: 1, b: 2 };\n* const clonedObj = cloneDeepWith(obj, (value) => {\n* if (typeof value === 'number') {\n* return value * 2; // Double the number\n* }\n* });\n* console.log(clonedObj); // { a: 2, b: 4 }\n* console.log(clonedObj === obj); // false\n*\n* @example\n* // Clone an array with a customizer\n* const arr = [1, 2, 3];\n* const clonedArr = cloneDeepWith(arr, (value) => {\n* return value + 1; // Increment each value\n* });\n* console.log(clonedArr); // [2, 3, 4]\n* console.log(clonedArr === arr); // false\n*/\nfunction cloneDeepWith(obj, cloneValue) {\n\treturn cloneDeepWithImpl(obj, void 0, obj, /* @__PURE__ */ new Map(), cloneValue);\n}\nfunction cloneDeepWithImpl(valueToClone, keyToClone, objectToClone, stack = /* @__PURE__ */ new Map(), cloneValue = void 0) {\n\tconst cloned = cloneValue?.(valueToClone, keyToClone, objectToClone, stack);\n\tif (cloned !== void 0) return cloned;\n\tif (isPrimitive(valueToClone)) return valueToClone;\n\tif (stack.has(valueToClone)) return stack.get(valueToClone);\n\tif (Array.isArray(valueToClone)) {\n\t\tconst result = new Array(valueToClone.length);\n\t\tstack.set(valueToClone, result);\n\t\tfor (let i = 0; i < valueToClone.length; i++) result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n\t\tif (Object.hasOwn(valueToClone, \"index\")) result.index = valueToClone.index;\n\t\tif (Object.hasOwn(valueToClone, \"input\")) result.input = valueToClone.input;\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Date) return new Date(valueToClone.getTime());\n\tif (valueToClone instanceof RegExp) {\n\t\tconst result = new RegExp(valueToClone.source, valueToClone.flags);\n\t\tresult.lastIndex = valueToClone.lastIndex;\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Map) {\n\t\tconst result = /* @__PURE__ */ new Map();\n\t\tstack.set(valueToClone, result);\n\t\tfor (const [key, value] of valueToClone) result.set(key, cloneDeepWithImpl(value, key, objectToClone, stack, cloneValue));\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Set) {\n\t\tconst result = /* @__PURE__ */ new Set();\n\t\tstack.set(valueToClone, result);\n\t\tfor (const value of valueToClone) result.add(cloneDeepWithImpl(value, void 0, objectToClone, stack, cloneValue));\n\t\treturn result;\n\t}\n\tif (isBuffer(valueToClone)) return valueToClone.subarray();\n\tif (isTypedArray(valueToClone)) {\n\t\tconst result = new (Object.getPrototypeOf(valueToClone)).constructor(valueToClone.length);\n\t\tstack.set(valueToClone, result);\n\t\tfor (let i = 0; i < valueToClone.length; i++) result[i] = cloneDeepWithImpl(valueToClone[i], i, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof ArrayBuffer || typeof SharedArrayBuffer !== \"undefined\" && valueToClone instanceof SharedArrayBuffer) return valueToClone.slice(0);\n\tif (valueToClone instanceof DataView) {\n\t\tconst result = new DataView(valueToClone.buffer.slice(0), valueToClone.byteOffset, valueToClone.byteLength);\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (typeof File !== \"undefined\" && valueToClone instanceof File) {\n\t\tconst result = new File([valueToClone], valueToClone.name, { type: valueToClone.type });\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (typeof Blob !== \"undefined\" && valueToClone instanceof Blob) {\n\t\tconst result = new Blob([valueToClone], { type: valueToClone.type });\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Error) {\n\t\tconst result = structuredClone(valueToClone);\n\t\tstack.set(valueToClone, result);\n\t\tresult.message = valueToClone.message;\n\t\tresult.name = valueToClone.name;\n\t\tresult.stack = valueToClone.stack;\n\t\tresult.cause = valueToClone.cause;\n\t\tresult.constructor = valueToClone.constructor;\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Boolean) {\n\t\tconst result = new Boolean(valueToClone.valueOf());\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof Number) {\n\t\tconst result = new Number(valueToClone.valueOf());\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (valueToClone instanceof String) {\n\t\tconst result = new String(valueToClone.valueOf());\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\tif (typeof valueToClone === \"object\" && isCloneableObject(valueToClone)) {\n\t\tconst result = Object.create(Object.getPrototypeOf(valueToClone));\n\t\tstack.set(valueToClone, result);\n\t\tcopyProperties(result, valueToClone, objectToClone, stack, cloneValue);\n\t\treturn result;\n\t}\n\treturn valueToClone;\n}\nfunction copyProperties(target, source, objectToClone = target, stack, cloneValue) {\n\tconst keys = [...Object.keys(source), ...getSymbols(source)];\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key = keys[i];\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(target, key);\n\t\tif (descriptor == null || descriptor.writable) target[key] = cloneDeepWithImpl(source[key], key, objectToClone, stack, cloneValue);\n\t}\n}\nfunction isCloneableObject(object) {\n\tswitch (getTag(object)) {\n\t\tcase argumentsTag:\n\t\tcase arrayTag:\n\t\tcase arrayBufferTag:\n\t\tcase dataViewTag:\n\t\tcase booleanTag:\n\t\tcase dateTag:\n\t\tcase float32ArrayTag:\n\t\tcase float64ArrayTag:\n\t\tcase int8ArrayTag:\n\t\tcase int16ArrayTag:\n\t\tcase int32ArrayTag:\n\t\tcase mapTag:\n\t\tcase numberTag:\n\t\tcase objectTag:\n\t\tcase regexpTag:\n\t\tcase setTag:\n\t\tcase stringTag:\n\t\tcase symbolTag:\n\t\tcase uint8ArrayTag:\n\t\tcase uint8ClampedArrayTag:\n\t\tcase uint16ArrayTag:\n\t\tcase uint32ArrayTag: return true;\n\t\tdefault: return false;\n\t}\n}\n//#endregion\nexport { cloneDeepWith, cloneDeepWithImpl, copyProperties };\n","import { cloneDeepWithImpl } from \"./cloneDeepWith.mjs\";\n//#region src/object/cloneDeep.ts\n/**\n* Creates a deep clone of the given object.\n*\n* @template T - The type of the object.\n* @param obj - The object to clone.\n* @returns A deep clone of the given object.\n*\n* @example\n* // Clone a primitive value\n* const num = 29;\n* const clonedNum = cloneDeep(num);\n* console.log(clonedNum); // 29\n* console.log(clonedNum === num); // true\n*\n* @example\n* // Clone an array\n* const arr = [1, 2, 3];\n* const clonedArr = cloneDeep(arr);\n* console.log(clonedArr); // [1, 2, 3]\n* console.log(clonedArr === arr); // false\n*\n* @example\n* // Clone an array with nested objects\n* const arr = [1, { a: 1 }, [1, 2, 3]];\n* const clonedArr = cloneDeep(arr);\n* arr[1].a = 2;\n* console.log(arr); // [1, { a: 2 }, [1, 2, 3]]\n* console.log(clonedArr); // [1, { a: 1 }, [1, 2, 3]]\n* console.log(clonedArr === arr); // false\n*\n* @example\n* // Clone an object\n* const obj = { a: 1, b: 'es-toolkit', c: [1, 2, 3] };\n* const clonedObj = cloneDeep(obj);\n* console.log(clonedObj); // { a: 1, b: 'es-toolkit', c: [1, 2, 3] }\n* console.log(clonedObj === obj); // false\n*\n* @example\n* // Clone an object with nested objects\n* const obj = { a: 1, b: { c: 1 } };\n* const clonedObj = cloneDeep(obj);\n* obj.b.c = 2;\n* console.log(obj); // { a: 1, b: { c: 2 } }\n* console.log(clonedObj); // { a: 1, b: { c: 1 } }\n* console.log(clonedObj === obj); // false\n*/\nfunction cloneDeep(obj) {\n\treturn cloneDeepWithImpl(obj, void 0, obj, /* @__PURE__ */ new Map(), void 0);\n}\n//#endregion\nexport { cloneDeep };\n","//#region src/predicate/isPlainObject.ts\n/**\n* Checks if a given value is a plain object.\n*\n* @param value - The value to check.\n* @returns True if the value is a plain object, otherwise false.\n*\n* @example\n* ```typescript\n* // βœ…πŸ‘‡ True\n*\n* isPlainObject({ }); // βœ…\n* isPlainObject({ key: 'value' }); // βœ…\n* isPlainObject({ key: new Date() }); // βœ…\n* isPlainObject(new Object()); // βœ…\n* isPlainObject(Object.create(null)); // βœ…\n* isPlainObject({ nested: { key: true} }); // βœ…\n* isPlainObject(new Proxy({}, {})); // βœ…\n* isPlainObject({ [Symbol('tag')]: 'A' }); // βœ…\n*\n* // βœ…πŸ‘‡ (cross-realms, node context, workers, ...)\n* const runInNewContext = await import('node:vm').then(\n* (mod) => mod.runInNewContext\n* );\n* isPlainObject(runInNewContext('({})')); // βœ…\n*\n* // βŒπŸ‘‡ False\n*\n* class Test { };\n* isPlainObject(new Test()) // ❌\n* isPlainObject(10); // ❌\n* isPlainObject(null); // ❌\n* isPlainObject('hello'); // ❌\n* isPlainObject([]); // ❌\n* isPlainObject(new Date()); // ❌\n* isPlainObject(new Uint8Array([1])); // ❌\n* isPlainObject(Buffer.from('ABC')); // ❌\n* isPlainObject(Promise.resolve({})); // ❌\n* isPlainObject(Object.create({})); // ❌\n* isPlainObject(new (class Cls {})); // ❌\n* isPlainObject(globalThis); // ❌,\n* ```\n*/\nfunction isPlainObject(value) {\n\tif (!value || typeof value !== \"object\") return false;\n\tconst proto = Object.getPrototypeOf(value);\n\tif (!(proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null)) return false;\n\treturn Object.prototype.toString.call(value) === \"[object Object]\";\n}\n//#endregion\nexport { isPlainObject };\n","//#region src/_internal/isUnsafeProperty.ts\n/**\n* Checks if a property key is unsafe to modify directly.\n*\n* This function is used in functions like `merge` to prevent prototype pollution attacks\n* by identifying property keys that could modify the object's prototype chain or constructor.\n*\n* @param key - The property key to check\n* @returns `true` if the property is unsafe to modify directly, `false` otherwise\n* @internal\n*/\nfunction isUnsafeProperty(key) {\n\treturn key === \"__proto__\";\n}\n//#endregion\nexport { isUnsafeProperty };\n","import { isPlainObject } from \"../predicate/isPlainObject.mjs\";\nimport { isUnsafeProperty } from \"../_internal/isUnsafeProperty.mjs\";\n//#region src/object/mergeWith.ts\n/**\n* Merges the properties of the source object into the target object.\n*\n* You can provide a custom `merge` function to control how properties are merged. It should return the value to be set in the target object.\n*\n* If it returns `undefined`, a default deep merge will be applied for arrays and objects:\n*\n* - If a property in the source object is an array or an object and the corresponding property in the target object is also an array or object, they will be merged.\n* - If a property in the source object is undefined, it will not overwrite a defined property in the target object.\n*\n* Note that this function mutates the target object.\n*\n* @param target - The target object into which the source object properties will be merged. This object is modified in place.\n* @param source - The source object whose properties will be merged into the target object.\n* @param merge - A custom merge function that defines how properties should be combined. It receives the following arguments:\n* - `targetValue`: The current value of the property in the target object.\n* - `sourceValue`: The value of the property in the source object.\n* - `key`: The key of the property being merged.\n* - `target`: The target object.\n* - `source`: The source object.\n*\n* @returns The updated target object with properties from the source object merged in.\n*\n* @template T - Type of the target object.\n* @template S - Type of the source object.\n*\n* @example\n* const target = { a: 1, b: 2 };\n* const source = { b: 3, c: 4 };\n*\n* mergeWith(target, source, (targetValue, sourceValue) => {\n* if (typeof targetValue === 'number' && typeof sourceValue === 'number') {\n* return targetValue + sourceValue;\n* }\n* });\n* // Returns { a: 1, b: 5, c: 4 }\n* @example\n* const target = { a: [1], b: [2] };\n* const source = { a: [3], b: [4] };\n*\n* const result = mergeWith(target, source, (objValue, srcValue) => {\n* if (Array.isArray(objValue)) {\n* return objValue.concat(srcValue);\n* }\n* });\n*\n* expect(result).toEqual({ a: [1, 3], b: [2, 4] });\n*/\nfunction mergeWith(target, source, merge) {\n\tconst sourceKeys = Object.keys(source);\n\tfor (let i = 0; i < sourceKeys.length; i++) {\n\t\tconst key = sourceKeys[i];\n\t\tif (isUnsafeProperty(key)) continue;\n\t\tconst sourceValue = source[key];\n\t\tconst targetValue = target[key];\n\t\tconst merged = merge(targetValue, sourceValue, key, target, source);\n\t\tif (merged !== void 0) target[key] = merged;\n\t\telse if (Array.isArray(sourceValue)) if (Array.isArray(targetValue)) target[key] = mergeWith(targetValue, sourceValue, merge);\n\t\telse target[key] = mergeWith([], sourceValue, merge);\n\t\telse if (isPlainObject(sourceValue)) if (isPlainObject(targetValue)) target[key] = mergeWith(targetValue, sourceValue, merge);\n\t\telse target[key] = mergeWith({}, sourceValue, merge);\n\t\telse if (targetValue === void 0 || sourceValue !== void 0) target[key] = sourceValue;\n\t}\n\treturn target;\n}\n//#endregion\nexport { mergeWith };\n","import { clone } from \"./clone.mjs\";\nimport { cloneDeep } from \"./cloneDeep.mjs\";\nimport { isPlainObject } from \"../predicate/isPlainObject.mjs\";\nimport { mergeWith } from \"./mergeWith.mjs\";\n//#region src/object/toMerged.ts\n/**\n* Merges the properties of the source object into a deep clone of the target object.\n* Unlike `merge`, This function does not modify the original target object.\n*\n* This function performs a deep merge, meaning nested objects and arrays are merged recursively.\n*\n* - If a property in the source object is an array or object and the corresponding property in the target object is also an array or object, they will be merged.\n* - If a property in the source object is undefined, it will not overwrite a defined property in the target object.\n*\n* Note that this function does not mutate the target object.\n*\n* @param target - The target object to be cloned and merged into. This object is not modified directly.\n* @param source - The source object whose properties will be merged into the cloned target object.\n* @returns A new object with properties from the source object merged into a deep clone of the target object.\n*\n* @template T - Type of the target object.\n* @template S - Type of the source object.\n*\n* @example\n* const target = { a: 1, b: { x: 1, y: 2 } };\n* const source = { b: { y: 3, z: 4 }, c: 5 };\n*\n* const result = toMerged(target, source);\n* console.log(result);\n* // Output: { a: 1, b: { x: 1, y: 3, z: 4 }, c: 5 }\n*\n* @example\n* const target = { a: [1, 2], b: { x: 1 } };\n* const source = { a: [3], b: { y: 2 } };\n*\n* const result = toMerged(target, source);\n* console.log(result);\n* // Output: { a: [3, 2], b: { x: 1, y: 2 } }\n*\n* @example\n* const target = { a: null };\n* const source = { a: [1, 2, 3] };\n*\n* const result = toMerged(target, source);\n* console.log(result);\n* // Output: { a: [1, 2, 3] }\n*/\nfunction toMerged(target, source) {\n\treturn mergeWith(cloneDeep(target), source, function mergeRecursively(targetValue, sourceValue) {\n\t\tif (Array.isArray(sourceValue)) if (Array.isArray(targetValue)) return mergeWith(clone(targetValue), sourceValue, mergeRecursively);\n\t\telse return mergeWith([], sourceValue, mergeRecursively);\n\t\telse if (isPlainObject(sourceValue)) if (isPlainObject(targetValue)) return mergeWith(clone(targetValue), sourceValue, mergeRecursively);\n\t\telse return mergeWith({}, sourceValue, mergeRecursively);\n\t});\n}\n//#endregion\nexport { toMerged };\n","//#region src/array/compact.ts\n/**\n* Removes falsey values (false, null, 0, -0, 0n, '', undefined, NaN) from an array.\n*\n* @template T - The type of elements in the array.\n* @param arr - The input array to remove falsey values.\n* @returns A new array with all falsey values removed.\n*\n* @example\n* compact([0, -0, 0n, 1, false, 2, '', 3, null, undefined, 4, NaN, 5]);\n* Returns: [1, 2, 3, 4, 5]\n*/\nfunction compact(arr) {\n\tconst result = [];\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tconst item = arr[i];\n\t\tif (item) result.push(item);\n\t}\n\treturn result;\n}\n//#endregion\nexport { compact };\n","//#region src/_internal/compareValues.ts\nfunction nullishRank(value) {\n\tif (value === null) return 1;\n\tif (value === void 0) return 2;\n\treturn 0;\n}\nfunction compareAscending(a, b) {\n\tconst aRank = nullishRank(a);\n\tconst bRank = nullishRank(b);\n\tif (aRank < bRank) return -1;\n\tif (aRank > bRank) return 1;\n\tif (aRank !== 0) return 0;\n\tif (a < b) return -1;\n\tif (a > b) return 1;\n\treturn 0;\n}\nfunction compareValues(a, b, order) {\n\treturn order === \"asc\" ? compareAscending(a, b) : compareAscending(b, a);\n}\n//#endregion\nexport { compareValues };\n","import { compareValues } from \"../_internal/compareValues.mjs\";\n//#region src/array/orderBy.ts\n/**\n* Sorts an array of objects based on the given `criteria` and their corresponding order directions.\n*\n* - If you provide keys, it sorts the objects by the values of those keys.\n* - If you provide functions, it sorts based on the values returned by those functions.\n*\n* The function returns the array of objects sorted in corresponding order directions.\n* If two objects have the same value for the current criterion, it uses the next criterion to determine their order.\n* If the number of orders is less than the number of criteria, it uses the last order for the rest of the criteria.\n*\n* @template T - The type of elements in the array.\n* @param arr - The array of objects to be sorted.\n* @param criteria - The criteria for sorting. This can be an array of object keys or functions that return values used for sorting.\n* @param orders - An array of order directions ('asc' for ascending or 'desc' for descending).\n* @returns The sorted array.\n*\n* @example\n* // Sort an array of objects by 'user' in ascending order and 'age' in descending order.\n* const users = [\n* { user: 'fred', age: 48 },\n* { user: 'barney', age: 34 },\n* { user: 'fred', age: 40 },\n* { user: 'barney', age: 36 },\n* ];\n*\n* const result = orderBy(users, [obj => obj.user, 'age'], ['asc', 'desc']);\n* // result will be:\n* // [\n* // { user: 'barney', age: 36 },\n* // { user: 'barney', age: 34 },\n* // { user: 'fred', age: 48 },\n* // { user: 'fred', age: 40 },\n* // ]\n*/\nfunction orderBy(arr, criteria, orders) {\n\treturn arr.slice().sort((a, b) => {\n\t\tconst ordersLength = orders.length;\n\t\tfor (let i = 0; i < criteria.length; i++) {\n\t\t\tconst order = ordersLength > i ? orders[i] : orders[ordersLength - 1];\n\t\t\tconst criterion = criteria[i];\n\t\t\tconst criterionIsFunction = typeof criterion === \"function\";\n\t\t\tconst result = compareValues(criterionIsFunction ? criterion(a) : a[criterion], criterionIsFunction ? criterion(b) : b[criterion], order);\n\t\t\tif (result !== 0) return result;\n\t\t}\n\t\treturn 0;\n\t});\n}\n//#endregion\nexport { orderBy };\n","import { compact, orderBy } from 'es-toolkit'\r\nimport type { RunnerResult } from 'lighthouse'\r\nimport type Details from 'lighthouse/types/lhr/audit-details'\r\n\r\ntype Lhr = RunnerResult['lhr']\r\ntype Audit = Lhr['audits'][string]\r\ntype AuditDetails = NonNullable<Audit['details']>\r\n\r\n/** resolves to values that are only non-zero numbers */\r\nconst resolveMetricSavings = (audit: Audit) =>\r\n Object.entries(audit.metricSavings ?? {}).filter(([, ms]) => !!ms) as [\r\n string,\r\n number,\r\n ][]\r\n\r\n/** CLS savings are a unitless shift score; every other metric is milliseconds. */\r\nconst metricValueType = (metric: string): Details.ItemValueType =>\r\n metric === 'CLS' ? 'numeric' : 'ms'\r\n\r\nexport type FormattingArgs = {\r\n /**\r\n * Rows shown per audit before collapsing to \"…and N more\"\r\n * @default 5\r\n */\r\n maxItems?: number\r\n /**\r\n * Max length of a single value before it's truncated with an \"…\"\r\n * @default 120\r\n */\r\n maxValueLength?: number\r\n}\r\n\r\nconst formatValue = (\r\n value: Details.ItemValue | undefined,\r\n valueType: Details.ItemValueType,\r\n maxValueLength: number\r\n): string => {\r\n if (value === undefined || typeof value === 'boolean') {\r\n return ''\r\n }\r\n\r\n if (typeof value === 'number') {\r\n if (valueType === 'bytes') {\r\n // Keep a decimal on small values so sub-KiB assets don't read as \"0 KiB\".\r\n const kib = value / 1024\r\n const rounded = kib >= 100 ? Math.round(kib) : Math.round(kib * 10) / 10\r\n return `${rounded} KiB`\r\n }\r\n if (valueType === 'ms' || valueType === 'timespanMs') {\r\n return `${Math.round(value)} ms`\r\n }\r\n return String(Math.round(value * 100) / 100)\r\n }\r\n\r\n // `IcuMessage` is the only object value without a `type` tag.\r\n const text = (() => {\r\n if (typeof value === 'string') {\r\n return value\r\n }\r\n if (!('type' in value)) {\r\n return ''\r\n }\r\n switch (value.type) {\r\n case 'url':\r\n return value.value\r\n case 'link':\r\n return value.url || value.text\r\n case 'code':\r\n return String(value.value)\r\n case 'node':\r\n return value.nodeLabel ?? value.selector ?? value.snippet ?? ''\r\n case 'source-location':\r\n return `${value.url}:${value.line}:${value.column}`\r\n default:\r\n return ''\r\n }\r\n })()\r\n\r\n // Node labels and snippets carry the element's own line breaks β€” flatten them\r\n // so one item stays on one line.\r\n const singleLine = text.replace(/\\s+/g, ' ').trim()\r\n\r\n return singleLine.length > maxValueLength\r\n ? `${singleLine.slice(0, maxValueLength)}…`\r\n : singleLine\r\n}\r\n\r\n/**\r\n * The individual offenders the report UI lists under an audit β€” the specific\r\n * render-blocking scripts, oversized images, failing DOM nodes, and so on.\r\n */\r\nconst formatItems = (\r\n details: AuditDetails | undefined,\r\n { maxItems, maxValueLength }: Required<FormattingArgs>\r\n): string[] => {\r\n if (details?.type !== 'opportunity' && details?.type !== 'table') {\r\n return []\r\n }\r\n\r\n const [identity, ...measures] = details.headings.filter(({ key }) => !!key)\r\n if (!identity) {\r\n return []\r\n }\r\n\r\n /** Columns worth repeating alongside an item's identity (URL, node, ...). */\r\n const MEASURE_TYPES: Details.ItemValueType[] = [\r\n 'bytes',\r\n 'ms',\r\n 'timespanMs',\r\n 'numeric',\r\n ]\r\n\r\n const lines = details.items.slice(0, maxItems).map((item) => {\r\n const columns = [\r\n formatValue(item[identity.key ?? ''], identity.valueType, maxValueLength),\r\n ...measures\r\n .filter(({ valueType }) => MEASURE_TYPES.includes(valueType))\r\n .map(\r\n (heading) =>\r\n `${heading.label}: ${formatValue(item[heading.key ?? ''], heading.valueType, maxValueLength)}`\r\n ),\r\n ]\r\n return ` - ${compact(columns).join(' Β· ')}`\r\n })\r\n\r\n const remaining = details.items.length - maxItems\r\n if (remaining > 0) {\r\n lines.push(` - …and ${remaining} more`)\r\n }\r\n return lines\r\n}\r\n\r\n/**\r\n * Print the same recommendations the Lighthouse report UI shows, so a run is\r\n * actionable from the terminal/CI log without opening the HTML report.\r\n */\r\nexport const logRecommendations = (\r\n /** The Lighthouse result object */\r\n lhr: Lhr,\r\n {\r\n label,\r\n maxItems = 5,\r\n maxValueLength = 120,\r\n }: {\r\n /** Distinguishes runs of the same URL in one log (e.g. `desktop`/`mobile`). */\r\n label?: string\r\n } & FormattingArgs\r\n) => {\r\n const lines = [\r\n '',\r\n `───── Lighthouse recommendations${label ? `: ${label}` : ''} β€” ${lhr.finalDisplayedUrl} ─────`,\r\n ]\r\n\r\n for (const category of Object.values(lhr.categories)) {\r\n const categoryScoreValue =\r\n category.score === null ? 'N/A' : Math.round(category.score * 100)\r\n const categoryLine = `${category.title}: ${categoryScoreValue}`\r\n\r\n const failing = orderBy(\r\n category.auditRefs\r\n .map(({ id }) => lhr.audits[id])\r\n .filter((audit) => !!audit && audit.score !== null && audit.score < 1),\r\n [\r\n (audit) =>\r\n Math.max(0, ...resolveMetricSavings(audit).map(([, ms]) => ms)),\r\n ({ score }) => score ?? 0,\r\n ],\r\n ['desc', 'asc']\r\n )\r\n\r\n if (!failing.length) {\r\n lines.push('', `${categoryLine} β€” nothing to flag`)\r\n continue\r\n }\r\n\r\n lines.push('', categoryLine)\r\n\r\n for (const audit of failing) {\r\n const displayValue = audit.displayValue ? ` (${audit.displayValue})` : ''\r\n\r\n const savingsValue: string = (() => {\r\n // Most opportunities already spell out their savings in `displayValue`.\r\n if (audit.displayValue?.toLowerCase().includes('savings')) {\r\n return ''\r\n }\r\n\r\n const overallSavingsBytes =\r\n audit.details?.type === 'opportunity'\r\n ? audit.details.overallSavingsBytes\r\n : undefined\r\n const estSavings = compact([\r\n ...resolveMetricSavings(audit).map(\r\n ([metric, value]) =>\r\n `${metric} ${formatValue(value, metricValueType(metric), maxValueLength)}`\r\n ),\r\n formatValue(overallSavingsBytes, 'bytes', maxValueLength),\r\n ])\r\n\r\n return estSavings.length\r\n ? ` β€” est. savings: ${estSavings.join(', ')}`\r\n : ''\r\n })()\r\n\r\n const scoreValue =\r\n audit.score === null ? 'N/A' : Math.round(audit.score * 100)\r\n\r\n lines.push(` β€’ ${audit.title}${displayValue}${savingsValue}`)\r\n lines.push(` ${audit.id} Β· score ${scoreValue}`)\r\n lines.push(...formatItems(audit.details, { maxItems, maxValueLength }))\r\n }\r\n }\r\n\r\n lines.push('')\r\n console.log(lines.join('\\n'))\r\n}\r\n","import type { RunnerResult } from 'lighthouse'\n\ntype Lhr = RunnerResult['lhr']\ntype CategoryResult = Lhr['categories'][string]\n\nexport type Category =\n | 'performance'\n | 'accessibility'\n | 'best-practices'\n | 'seo'\n | 'agentic-browsing'\n\n/** Per-category minimums, or one number applied to every category. */\nexport type LighthouseThresholds = number | Partial<Record<Category, number>>\n\n/** A category that scored below the minimum it was given. */\nexport type ThresholdFailure = {\n /** The category's id as the run reported it β€” usually a `Category`. */\n category: string\n /** The minimum this category was checked against (0-100). */\n minimum: number\n /** What it actually scored (0-100). */\n score: number\n}\n\nconst thresholdFailureMessage = (failures: ThresholdFailure[]) =>\n [\n 'Lighthouse thresholds not met:',\n ...failures.map(\n ({ category, minimum, score }) =>\n `${category} scored ${score}, below the ${minimum} threshold`\n ),\n ].join('\\n')\n\nexport type ThresholdsArgs = {\n /**\n * Minimum category scores (0-100), either per category or one number for all\n * of them. If per category, any category omitted must score 100.\n */\n thresholds?: LighthouseThresholds\n /** Return the failures rather than throwing them. */\n ignoreError?: boolean\n}\n\n/**\n * Checks every category the run scored, throwing an error describing the ones\n * that fell short. Pass `ignoreError` to get those shortfalls back instead, so\n * the caller can log the recommendations before failing.\n */\nexport const checkAgainstThresholds = (\n /** The Lighthouse result object */\n lhr: Lhr,\n { thresholds = 100, ignoreError }: ThresholdsArgs\n): ThresholdFailure[] | undefined => {\n const isFlat = typeof thresholds === 'number'\n const defaultMinimum = isFlat ? thresholds : 100\n const minimums: Record<string, number | undefined> = isFlat\n ? {}\n : (thresholds ?? {})\n\n const failures = Object.values(lhr.categories)\n .filter((c): c is CategoryResult & { score: number } => c.score !== null)\n .map(({ id, score }) => ({\n category: id,\n minimum: minimums[id] ?? defaultMinimum,\n score: score * 100,\n }))\n .filter(({ score, minimum }) => score < minimum)\n\n if (!failures.length) {\n return undefined\n }\n\n if (!ignoreError) {\n throw new Error(thresholdFailureMessage(failures))\n }\n\n return failures\n}\n","import { mkdir, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\nimport type { RunnerResult } from 'lighthouse'\n\nexport type WriteReportsArgs = { directory: string; name: string }\n\n/**\n * Writes each report to `<directory>/<name>.<format>`, using the formats the\n * run's `output` flag asked for.\n */\nexport const writeReports = async (\n result: RunnerResult,\n { directory, name }: WriteReportsArgs\n) => {\n const formats = [result.lhr.configSettings.output].flat()\n\n await mkdir(directory, { recursive: true })\n await Promise.all(\n [result.report]\n .flat()\n .map((report, i) =>\n writeFile(path.join(directory, `${name}.${formats[i]}`), report)\n )\n )\n}\n","import type { RunnerResult } from 'lighthouse'\n\nimport { type FormattingArgs, logRecommendations } from './log-recommendations'\nimport { checkAgainstThresholds, type ThresholdsArgs } from './thresholds'\nimport { type WriteReportsArgs, writeReports } from './write-reports'\n\nexport type HandleAuditResultArgs = {\n /** The full `RunnerResult` from a Lighthouse run */\n result: RunnerResult\n /** Where to write the reports. Omit to skip writing them. */\n reports?: WriteReportsArgs\n /** Options for recommendations logging. Set to `false` to disable. */\n recommendations?:\n | (FormattingArgs & {\n /** Distinguishes runs of the same URL in one log. Defaults to `reports.name`. */\n label?: string\n })\n | false\n} & ThresholdsArgs\n\n/**\n * Everything you'd do with a finished Lighthouse run:\n * 1. write the reports\n * 2. log the recommendations\n * 3. check the scores against the thresholds (goes last so reporting occurs before throwing).\n *\n * @returns the threshold failures, if `ignoreError` kept them from throwing\n */\nexport const handleAuditResult = async ({\n result,\n reports,\n thresholds,\n ignoreError,\n recommendations,\n}: HandleAuditResultArgs) => {\n if (reports) {\n await writeReports(result, reports)\n }\n\n if (recommendations !== false) {\n logRecommendations(result.lhr, {\n label: reports?.name,\n ...recommendations,\n })\n }\n\n const failures = checkAgainstThresholds(result.lhr, {\n thresholds,\n ignoreError,\n })\n\n return failures\n}\n","import lighthouse, { type Config, type Flags } from 'lighthouse'\n\nimport {\n type HandleAuditResultArgs,\n handleAuditResult,\n} from './handle-audit-result'\n\n/** What `lighthouse()` itself takes, in the order it takes it. */\nexport type LighthouseArgs = {\n /** The URL to audit */\n url: string\n /** Settings for the run, e.g. the `port` Lighthouse connects to */\n flags?: Flags\n /** Overrides the default config, e.g. `desktopConfig` */\n config?: Config\n}\n\n/**\n * Audits a URL and hands the result straight to {@link handleAuditResult}.\n *\n * @returns the run's result, plus the threshold failures if `ignoreError` kept\n * them from throwing\n */\nexport const runAudit = async ({\n lighthouseArgs: { url, flags, config },\n ...handleArgs\n}: {\n /** Passed through to `lighthouse()` */\n lighthouseArgs: LighthouseArgs\n} & Omit<HandleAuditResultArgs, 'result'>) => {\n const result = await lighthouse(url, flags, config)\n if (!result) {\n throw new Error(`Lighthouse returned no result for ${url}`)\n }\n\n const failures = await handleAuditResult({ result, ...handleArgs })\n\n return { result, failures }\n}\n"]}