@navinjoseph/web-perf-core 1.0.0-beta.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.
Files changed (77) hide show
  1. package/dist/audits/accessibility.d.ts +10 -0
  2. package/dist/audits/accessibility.d.ts.map +1 -0
  3. package/dist/audits/accessibility.js +258 -0
  4. package/dist/audits/accessibility.js.map +1 -0
  5. package/dist/audits/best-practices.d.ts +10 -0
  6. package/dist/audits/best-practices.d.ts.map +1 -0
  7. package/dist/audits/best-practices.js +696 -0
  8. package/dist/audits/best-practices.js.map +1 -0
  9. package/dist/audits/constants.d.ts +8 -0
  10. package/dist/audits/constants.d.ts.map +1 -0
  11. package/dist/audits/constants.js +278 -0
  12. package/dist/audits/constants.js.map +1 -0
  13. package/dist/audits/performance.d.ts +11 -0
  14. package/dist/audits/performance.d.ts.map +1 -0
  15. package/dist/audits/performance.js +497 -0
  16. package/dist/audits/performance.js.map +1 -0
  17. package/dist/audits/pwa.d.ts +10 -0
  18. package/dist/audits/pwa.d.ts.map +1 -0
  19. package/dist/audits/pwa.js +396 -0
  20. package/dist/audits/pwa.js.map +1 -0
  21. package/dist/audits/security.d.ts +10 -0
  22. package/dist/audits/security.d.ts.map +1 -0
  23. package/dist/audits/security.js +249 -0
  24. package/dist/audits/security.js.map +1 -0
  25. package/dist/audits/seo.d.ts +10 -0
  26. package/dist/audits/seo.d.ts.map +1 -0
  27. package/dist/audits/seo.js +471 -0
  28. package/dist/audits/seo.js.map +1 -0
  29. package/dist/browser.d.ts +21 -0
  30. package/dist/browser.d.ts.map +1 -0
  31. package/dist/browser.js +178 -0
  32. package/dist/browser.js.map +1 -0
  33. package/dist/dom-collector.d.ts +45 -0
  34. package/dist/dom-collector.d.ts.map +1 -0
  35. package/dist/dom-collector.js +173 -0
  36. package/dist/dom-collector.js.map +1 -0
  37. package/dist/formatter.d.ts +60 -0
  38. package/dist/formatter.d.ts.map +1 -0
  39. package/dist/formatter.js +164 -0
  40. package/dist/formatter.js.map +1 -0
  41. package/dist/id-generator.d.ts +22 -0
  42. package/dist/id-generator.d.ts.map +1 -0
  43. package/dist/id-generator.js +29 -0
  44. package/dist/id-generator.js.map +1 -0
  45. package/dist/index.d.ts +17 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +23 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/orchestrator.d.ts +41 -0
  50. package/dist/orchestrator.d.ts.map +1 -0
  51. package/dist/orchestrator.js +194 -0
  52. package/dist/orchestrator.js.map +1 -0
  53. package/dist/reporters/html.d.ts +6 -0
  54. package/dist/reporters/html.d.ts.map +1 -0
  55. package/dist/reporters/html.js +688 -0
  56. package/dist/reporters/html.js.map +1 -0
  57. package/dist/reporters/index.d.ts +4 -0
  58. package/dist/reporters/index.d.ts.map +1 -0
  59. package/dist/reporters/index.js +17 -0
  60. package/dist/reporters/index.js.map +1 -0
  61. package/dist/reporters/json.d.ts +6 -0
  62. package/dist/reporters/json.d.ts.map +1 -0
  63. package/dist/reporters/json.js +7 -0
  64. package/dist/reporters/json.js.map +1 -0
  65. package/dist/reporters/terminal.d.ts +6 -0
  66. package/dist/reporters/terminal.d.ts.map +1 -0
  67. package/dist/reporters/terminal.js +180 -0
  68. package/dist/reporters/terminal.js.map +1 -0
  69. package/dist/reporters/types.d.ts +2 -0
  70. package/dist/reporters/types.d.ts.map +1 -0
  71. package/dist/reporters/types.js +2 -0
  72. package/dist/reporters/types.js.map +1 -0
  73. package/dist/types.d.ts +80 -0
  74. package/dist/types.d.ts.map +1 -0
  75. package/dist/types.js +36 -0
  76. package/dist/types.js.map +1 -0
  77. package/package.json +54 -0
@@ -0,0 +1,497 @@
1
+ import { buildSelector } from "../browser.js";
2
+ /**
3
+ * Check resource counts and sizes
4
+ */
5
+ function checkResources(page) {
6
+ const issues = [];
7
+ const document = page.document;
8
+ // Count various resource types
9
+ const scripts = document.querySelectorAll("script[src]");
10
+ const stylesheets = document.querySelectorAll('link[rel="stylesheet"]');
11
+ // Too many scripts
12
+ if (scripts.length > 20) {
13
+ issues.push({
14
+ id: `perf-too-many-scripts-${Date.now()}`,
15
+ ruleId: "excessive-scripts",
16
+ severity: "moderate",
17
+ category: "technical",
18
+ message: `Page loads ${scripts.length} external scripts`,
19
+ description: `The page loads ${scripts.length} external JavaScript files, which can significantly impact performance. Consider bundling and minimizing the number of HTTP requests.`,
20
+ helpUrl: "https://web.dev/reduce-javascript-payloads-with-code-splitting/",
21
+ wcag: {
22
+ id: "N/A",
23
+ level: "AAA",
24
+ name: "Performance Best Practice",
25
+ description: "Minimize HTTP requests and bundle resources",
26
+ },
27
+ element: {
28
+ selector: "script[src]",
29
+ html: `${scripts.length} script tags`,
30
+ failureSummary: `${scripts.length} external scripts found`,
31
+ },
32
+ fix: {
33
+ description: "Bundle JavaScript files and use code splitting",
34
+ code: "// Use webpack, rollup, or vite to bundle\n// Implement dynamic imports for code splitting\nimport('./module.js').then(module => {\n // Use module\n});",
35
+ learnMoreUrl: "https://web.dev/reduce-javascript-payloads-with-code-splitting/",
36
+ },
37
+ });
38
+ }
39
+ // Too many stylesheets
40
+ if (stylesheets.length > 5) {
41
+ issues.push({
42
+ id: `perf-too-many-css-${Date.now()}`,
43
+ ruleId: "excessive-stylesheets",
44
+ severity: "moderate",
45
+ category: "technical",
46
+ message: `Page loads ${stylesheets.length} external stylesheets`,
47
+ description: `The page loads ${stylesheets.length} external CSS files. Each stylesheet requires a separate HTTP request, which can delay rendering.`,
48
+ helpUrl: "https://web.dev/extract-critical-css/",
49
+ wcag: {
50
+ id: "N/A",
51
+ level: "AAA",
52
+ name: "Performance Best Practice",
53
+ description: "Minimize CSS files",
54
+ },
55
+ element: {
56
+ selector: 'link[rel="stylesheet"]',
57
+ html: `${stylesheets.length} stylesheet links`,
58
+ failureSummary: `${stylesheets.length} external stylesheets found`,
59
+ },
60
+ fix: {
61
+ description: "Combine CSS files and inline critical CSS",
62
+ code: '<!-- Inline critical CSS -->\n<style>\n /* Critical above-the-fold styles */\n</style>\n<!-- Load remaining CSS asynchronously -->\n<link rel="preload" href="styles.css" as="style" onload="this.rel=\'stylesheet\'">',
63
+ learnMoreUrl: "https://web.dev/extract-critical-css/",
64
+ },
65
+ });
66
+ }
67
+ return issues;
68
+ }
69
+ /**
70
+ * Check image optimization
71
+ */
72
+ function checkImages(page) {
73
+ const issues = [];
74
+ const document = page.document;
75
+ const images = document.querySelectorAll("img");
76
+ images.forEach((img, index) => {
77
+ const src = img.getAttribute("src") || "";
78
+ const width = img.getAttribute("width");
79
+ const height = img.getAttribute("height");
80
+ const loading = img.getAttribute("loading");
81
+ // Missing dimensions
82
+ if (!width || !height) {
83
+ issues.push({
84
+ id: `perf-img-no-dimensions-${index}`,
85
+ ruleId: "image-missing-dimensions",
86
+ severity: "moderate",
87
+ category: "images",
88
+ message: "Image missing width and height attributes",
89
+ description: "Images without explicit dimensions can cause layout shifts as they load, negatively impacting Cumulative Layout Shift (CLS).",
90
+ helpUrl: "https://web.dev/optimize-cls/#images-without-dimensions",
91
+ wcag: {
92
+ id: "N/A",
93
+ level: "AAA",
94
+ name: "Performance Best Practice",
95
+ description: "Specify image dimensions to prevent layout shifts",
96
+ },
97
+ element: {
98
+ selector: buildSelector(img),
99
+ html: img.outerHTML,
100
+ failureSummary: "Image does not have width and height attributes",
101
+ },
102
+ fix: {
103
+ description: "Add width and height attributes to the image",
104
+ code: `<img src="${src}" width="800" height="600" alt="...">`,
105
+ learnMoreUrl: "https://web.dev/optimize-cls/#images-without-dimensions",
106
+ },
107
+ });
108
+ }
109
+ // Not using lazy loading for below-fold images
110
+ if (!loading && index > 2) {
111
+ issues.push({
112
+ id: `perf-img-no-lazy-${index}`,
113
+ ruleId: "image-no-lazy-loading",
114
+ severity: "minor",
115
+ category: "images",
116
+ message: "Below-fold image not using lazy loading",
117
+ description: "Images that appear below the fold should use lazy loading to improve initial page load performance.",
118
+ helpUrl: "https://web.dev/lazy-loading-images/",
119
+ wcag: {
120
+ id: "N/A",
121
+ level: "AAA",
122
+ name: "Performance Best Practice",
123
+ description: "Use lazy loading for off-screen images",
124
+ },
125
+ element: {
126
+ selector: buildSelector(img),
127
+ html: img.outerHTML,
128
+ failureSummary: "Image does not use loading='lazy' attribute",
129
+ },
130
+ fix: {
131
+ description: "Add loading='lazy' attribute to below-fold images",
132
+ code: `<img src="${src}" loading="lazy" alt="...">`,
133
+ learnMoreUrl: "https://web.dev/lazy-loading-images/",
134
+ },
135
+ });
136
+ }
137
+ // Check for modern image formats
138
+ if (src && /\.(jpe?g|png)$/i.test(src)) {
139
+ issues.push({
140
+ id: `perf-img-format-${index}`,
141
+ ruleId: "image-legacy-format",
142
+ severity: "minor",
143
+ category: "images",
144
+ message: "Image uses legacy format",
145
+ description: "Modern image formats like WebP and AVIF provide better compression than JPEG and PNG, reducing file sizes by 25-35%.",
146
+ helpUrl: "https://web.dev/uses-webp-images/",
147
+ wcag: {
148
+ id: "N/A",
149
+ level: "AAA",
150
+ name: "Performance Best Practice",
151
+ description: "Use modern image formats",
152
+ },
153
+ element: {
154
+ selector: buildSelector(img),
155
+ html: img.outerHTML,
156
+ failureSummary: `Image uses ${src.match(/\.(jpe?g|png)$/i)?.[0]} format`,
157
+ },
158
+ fix: {
159
+ description: "Use WebP or AVIF with fallback to legacy formats",
160
+ code: `<picture>\n <source srcset="image.avif" type="image/avif">\n <source srcset="image.webp" type="image/webp">\n <img src="${src}" alt="...">\n</picture>`,
161
+ learnMoreUrl: "https://web.dev/uses-webp-images/",
162
+ },
163
+ });
164
+ }
165
+ });
166
+ return issues;
167
+ }
168
+ /**
169
+ * Check JavaScript performance
170
+ */
171
+ function checkJavaScript(page) {
172
+ const issues = [];
173
+ const document = page.document;
174
+ const scripts = document.querySelectorAll("script[src]");
175
+ scripts.forEach((script, index) => {
176
+ const src = script.getAttribute("src") || "";
177
+ const async = script.hasAttribute("async");
178
+ const defer = script.hasAttribute("defer");
179
+ const type = script.getAttribute("type");
180
+ // Scripts without async or defer (except module scripts)
181
+ if (!async && !defer && type !== "module") {
182
+ issues.push({
183
+ id: `perf-script-sync-${index}`,
184
+ ruleId: "script-blocking",
185
+ severity: "serious",
186
+ category: "technical",
187
+ message: "Render-blocking JavaScript detected",
188
+ description: "Synchronous scripts block HTML parsing. Use async or defer attributes to load scripts without blocking the page.",
189
+ helpUrl: "https://web.dev/render-blocking-resources/",
190
+ wcag: {
191
+ id: "N/A",
192
+ level: "AAA",
193
+ name: "Performance Best Practice",
194
+ description: "Avoid blocking JavaScript",
195
+ },
196
+ element: {
197
+ selector: buildSelector(script),
198
+ html: script.outerHTML,
199
+ failureSummary: "Script loads synchronously, blocking page rendering",
200
+ },
201
+ fix: {
202
+ description: "Add defer or async attribute to the script tag",
203
+ code: `<!-- Use defer for scripts that need DOM -->\n<script src="${src}" defer></script>\n\n<!-- Use async for independent scripts -->\n<script src="${src}" async></script>`,
204
+ learnMoreUrl: "https://web.dev/render-blocking-resources/",
205
+ },
206
+ });
207
+ }
208
+ });
209
+ // Check for inline scripts in head
210
+ const inlineScripts = document.querySelectorAll("head script:not([src])");
211
+ if (inlineScripts.length > 3) {
212
+ issues.push({
213
+ id: `perf-inline-scripts-${Date.now()}`,
214
+ ruleId: "excessive-inline-scripts",
215
+ severity: "moderate",
216
+ category: "technical",
217
+ message: `${inlineScripts.length} inline scripts in <head>`,
218
+ description: "Excessive inline scripts in the head can delay page rendering. Consider moving scripts to external files or to the end of the body.",
219
+ helpUrl: "https://web.dev/efficiently-load-third-party-javascript/",
220
+ wcag: {
221
+ id: "N/A",
222
+ level: "AAA",
223
+ name: "Performance Best Practice",
224
+ description: "Minimize inline scripts",
225
+ },
226
+ element: {
227
+ selector: "head script:not([src])",
228
+ html: `${inlineScripts.length} inline scripts`,
229
+ failureSummary: `${inlineScripts.length} inline scripts found in head`,
230
+ },
231
+ fix: {
232
+ description: "Move inline scripts to external files or end of body",
233
+ code: "<!-- Move scripts to end of body -->\n</body>\n<script>\n // Your code here\n</script>\n</html>",
234
+ learnMoreUrl: "https://web.dev/efficiently-load-third-party-javascript/",
235
+ },
236
+ });
237
+ }
238
+ return issues;
239
+ }
240
+ /**
241
+ * Check for potential layout shifts
242
+ */
243
+ function checkLayoutShift(page) {
244
+ const issues = [];
245
+ const document = page.document;
246
+ // Ads or iframes without dimensions
247
+ const iframes = document.querySelectorAll("iframe");
248
+ iframes.forEach((iframe, index) => {
249
+ const width = iframe.getAttribute("width");
250
+ const height = iframe.getAttribute("height");
251
+ if (!width || !height) {
252
+ issues.push({
253
+ id: `perf-iframe-no-dimensions-${index}`,
254
+ ruleId: "iframe-missing-dimensions",
255
+ severity: "moderate",
256
+ category: "technical",
257
+ message: "Iframe missing width and height attributes",
258
+ description: "Iframes without explicit dimensions can cause layout shifts when they load, particularly for ads and embeds.",
259
+ helpUrl: "https://web.dev/optimize-cls/",
260
+ wcag: {
261
+ id: "N/A",
262
+ level: "AAA",
263
+ name: "Performance Best Practice",
264
+ description: "Specify iframe dimensions",
265
+ },
266
+ element: {
267
+ selector: buildSelector(iframe),
268
+ html: iframe.outerHTML,
269
+ failureSummary: "Iframe does not have width and height attributes",
270
+ },
271
+ fix: {
272
+ description: "Add width and height attributes or use aspect-ratio CSS",
273
+ code: `<iframe src="..." width="560" height="315"></iframe>\n\n<!-- Or use CSS -->\n<style>\n .video-container {\n aspect-ratio: 16/9;\n }\n</style>`,
274
+ learnMoreUrl: "https://web.dev/optimize-cls/",
275
+ },
276
+ });
277
+ }
278
+ });
279
+ // Fonts without font-display
280
+ const fontLinks = document.querySelectorAll('link[rel="stylesheet"][href*="fonts"]');
281
+ if (fontLinks.length > 0) {
282
+ issues.push({
283
+ id: `perf-font-display-${Date.now()}`,
284
+ ruleId: "font-no-display",
285
+ severity: "minor",
286
+ category: "technical",
287
+ message: "Web fonts may cause layout shifts",
288
+ description: "Web fonts should use font-display: swap to prevent invisible text and reduce layout shifts.",
289
+ helpUrl: "https://web.dev/font-display/",
290
+ wcag: {
291
+ id: "N/A",
292
+ level: "AAA",
293
+ name: "Performance Best Practice",
294
+ description: "Use font-display for web fonts",
295
+ },
296
+ element: {
297
+ selector: 'link[rel="stylesheet"][href*="fonts"]',
298
+ html: fontLinks[0].outerHTML,
299
+ failureSummary: "Font loading may block rendering",
300
+ },
301
+ fix: {
302
+ description: "Add font-display: swap to @font-face rules",
303
+ code: "@font-face {\n font-family: 'MyFont';\n src: url('font.woff2');\n font-display: swap; /* Show fallback font immediately */\n}",
304
+ learnMoreUrl: "https://web.dev/font-display/",
305
+ },
306
+ });
307
+ }
308
+ return issues;
309
+ }
310
+ /**
311
+ * Check for render-blocking resources
312
+ */
313
+ function checkRenderBlocking(page) {
314
+ const issues = [];
315
+ const document = page.document;
316
+ // CSS in head without media or disabled
317
+ const blockingCSS = Array.from(document.querySelectorAll('head link[rel="stylesheet"]')).filter((link) => {
318
+ const media = link.getAttribute("media");
319
+ const disabled = link.hasAttribute("disabled");
320
+ // Blocking if no media attribute (or media="all") and not disabled
321
+ return !disabled && (!media || media === "all" || media === "screen");
322
+ });
323
+ if (blockingCSS.length > 2) {
324
+ issues.push({
325
+ id: `perf-blocking-css-${Date.now()}`,
326
+ ruleId: "render-blocking-css",
327
+ severity: "serious",
328
+ category: "technical",
329
+ message: `${blockingCSS.length} render-blocking stylesheets detected`,
330
+ description: "Multiple render-blocking CSS files delay the First Contentful Paint (FCP). Consider inlining critical CSS and loading non-critical CSS asynchronously.",
331
+ helpUrl: "https://web.dev/render-blocking-resources/",
332
+ wcag: {
333
+ id: "N/A",
334
+ level: "AAA",
335
+ name: "Performance Best Practice",
336
+ description: "Eliminate render-blocking CSS",
337
+ },
338
+ element: {
339
+ selector: 'head link[rel="stylesheet"]',
340
+ html: `${blockingCSS.length} blocking stylesheets`,
341
+ failureSummary: `${blockingCSS.length} CSS files block rendering`,
342
+ },
343
+ fix: {
344
+ description: "Inline critical CSS and defer non-critical styles",
345
+ code: '<!-- Inline critical CSS -->\n<style>\n /* Critical styles */\n</style>\n\n<!-- Preload non-critical CSS -->\n<link rel="preload" href="styles.css" as="style" onload="this.rel=\'stylesheet\'">\n<noscript><link rel="stylesheet" href="styles.css"></noscript>',
346
+ learnMoreUrl: "https://web.dev/render-blocking-resources/",
347
+ },
348
+ });
349
+ }
350
+ return issues;
351
+ }
352
+ /**
353
+ * Check font loading optimization
354
+ */
355
+ function checkFonts(page) {
356
+ const issues = [];
357
+ const document = page.document;
358
+ // Check for font preloading
359
+ const fontLinks = document.querySelectorAll('link[rel="stylesheet"][href*="font"]');
360
+ const fontPreloads = document.querySelectorAll('link[rel="preload"][as="font"]');
361
+ if (fontLinks.length > 0 && fontPreloads.length === 0) {
362
+ issues.push({
363
+ id: `perf-no-font-preload-${Date.now()}`,
364
+ ruleId: "font-no-preload",
365
+ severity: "minor",
366
+ category: "technical",
367
+ message: "Web fonts not preloaded",
368
+ description: "Preloading critical fonts ensures they're discovered early in the page load, reducing font-loading delays.",
369
+ helpUrl: "https://web.dev/codelab-preload-web-fonts/",
370
+ wcag: {
371
+ id: "N/A",
372
+ level: "AAA",
373
+ name: "Performance Best Practice",
374
+ description: "Preload critical fonts",
375
+ },
376
+ element: {
377
+ selector: 'link[href*="font"]',
378
+ html: fontLinks[0].outerHTML,
379
+ failureSummary: "Fonts are not preloaded",
380
+ },
381
+ fix: {
382
+ description: "Add preload links for critical fonts",
383
+ code: '<link rel="preload" href="/fonts/main.woff2" as="font" type="font/woff2" crossorigin>',
384
+ learnMoreUrl: "https://web.dev/codelab-preload-web-fonts/",
385
+ },
386
+ });
387
+ }
388
+ // Check for Google Fonts without optimization
389
+ const googleFonts = document.querySelectorAll('link[href*="fonts.googleapis.com"]');
390
+ if (googleFonts.length > 0) {
391
+ const hasPreconnect = document.querySelector('link[rel="preconnect"][href*="fonts.googleapis.com"]');
392
+ if (!hasPreconnect) {
393
+ issues.push({
394
+ id: `perf-google-fonts-no-preconnect-${Date.now()}`,
395
+ ruleId: "google-fonts-no-preconnect",
396
+ severity: "minor",
397
+ category: "technical",
398
+ message: "Google Fonts not optimized with preconnect",
399
+ description: "Adding preconnect hints for Google Fonts establishes early connections, reducing font loading time.",
400
+ helpUrl: "https://web.dev/optimize-webfont-loading/",
401
+ wcag: {
402
+ id: "N/A",
403
+ level: "AAA",
404
+ name: "Performance Best Practice",
405
+ description: "Preconnect to Google Fonts",
406
+ },
407
+ element: {
408
+ selector: 'link[href*="fonts.googleapis.com"]',
409
+ html: googleFonts[0].outerHTML,
410
+ failureSummary: "Google Fonts link without preconnect",
411
+ },
412
+ fix: {
413
+ description: "Add preconnect links before Google Fonts stylesheet",
414
+ code: '<link rel="preconnect" href="https://fonts.googleapis.com">\n<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>\n<link href="https://fonts.googleapis.com/css2?family=..." rel="stylesheet">',
415
+ learnMoreUrl: "https://web.dev/optimize-webfont-loading/",
416
+ },
417
+ });
418
+ }
419
+ }
420
+ return issues;
421
+ }
422
+ /**
423
+ * Run performance audit
424
+ * Note: Uses heuristic-based checks since we're using jsdom, not a real browser
425
+ */
426
+ export async function auditPerformance(page) {
427
+ const issues = [];
428
+ const passed = [];
429
+ // Resource analysis
430
+ const resourceIssues = checkResources(page);
431
+ resourceIssues.forEach((issue) => issues.push(issue));
432
+ if (resourceIssues.length === 0) {
433
+ passed.push({
434
+ id: "perf-resources",
435
+ name: "Resource Efficiency",
436
+ category: "technical",
437
+ description: "Resource count and sizes are reasonable",
438
+ });
439
+ }
440
+ // Image optimization
441
+ const imageIssues = checkImages(page);
442
+ imageIssues.forEach((issue) => issues.push(issue));
443
+ if (imageIssues.length === 0) {
444
+ passed.push({
445
+ id: "perf-images",
446
+ name: "Image Optimization",
447
+ category: "images",
448
+ description: "Images are optimally configured",
449
+ });
450
+ }
451
+ // JavaScript efficiency
452
+ const jsIssues = checkJavaScript(page);
453
+ jsIssues.forEach((issue) => issues.push(issue));
454
+ if (jsIssues.length === 0) {
455
+ passed.push({
456
+ id: "perf-javascript",
457
+ name: "JavaScript Efficiency",
458
+ category: "technical",
459
+ description: "JavaScript is efficiently loaded",
460
+ });
461
+ }
462
+ // Layout shift potential
463
+ const clsIssues = checkLayoutShift(page);
464
+ clsIssues.forEach((issue) => issues.push(issue));
465
+ if (clsIssues.length === 0) {
466
+ passed.push({
467
+ id: "perf-cls",
468
+ name: "Layout Stability",
469
+ category: "technical",
470
+ description: "No elements likely to cause layout shifts",
471
+ });
472
+ }
473
+ // Render-blocking resources
474
+ const renderBlockIssues = checkRenderBlocking(page);
475
+ renderBlockIssues.forEach((issue) => issues.push(issue));
476
+ if (renderBlockIssues.length === 0) {
477
+ passed.push({
478
+ id: "perf-render-blocking",
479
+ name: "Render-Blocking Resources",
480
+ category: "technical",
481
+ description: "No render-blocking resources detected",
482
+ });
483
+ }
484
+ // Font optimization
485
+ const fontIssues = checkFonts(page);
486
+ fontIssues.forEach((issue) => issues.push(issue));
487
+ if (fontIssues.length === 0) {
488
+ passed.push({
489
+ id: "perf-fonts",
490
+ name: "Font Loading",
491
+ category: "technical",
492
+ description: "Fonts are efficiently loaded",
493
+ });
494
+ }
495
+ return { issues, passed };
496
+ }
497
+ //# sourceMappingURL=performance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.js","sourceRoot":"","sources":["../../src/audits/performance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Issue, PendingCheck } from "../types.js";
2
+ import { BrowserPage } from "../browser.js";
3
+ /**
4
+ * Run PWA (Progressive Web App) audit
5
+ */
6
+ export declare function auditPWA(page: BrowserPage): Promise<{
7
+ issues: Issue[];
8
+ passed: PendingCheck[];
9
+ }>;
10
+ //# sourceMappingURL=pwa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pwa.d.ts","sourceRoot":"","sources":["../../src/audits/pwa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA4V5C;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC,CAkFD"}