@pixelated-tech/components 3.9.3 → 3.9.6
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/dist/components/admin/site-health/google.api.integration.js +11 -1
- package/dist/components/admin/site-health/site-health-axe-core.integration.js +78 -16
- package/dist/components/admin/site-health/site-health-cloudwatch.integration.js +10 -1
- package/dist/components/admin/site-health/site-health-core-web-vitals.integration.js +11 -0
- package/dist/components/admin/site-health/site-health-github.integration.js +83 -53
- package/dist/components/admin/site-health/site-health-github.js +2 -3
- package/dist/components/admin/site-health/site-health-on-site-seo.integration.js +59 -23
- package/dist/components/admin/site-health/site-health-security.integration.js +32 -5
- package/dist/components/config/config.types.js +11 -3
- package/dist/components/general/sitemap.js +14 -0
- package/dist/components/general/sitemap.test.js +19 -0
- package/dist/test/run-analyzeGitHealth.js +50 -0
- package/dist/types/components/admin/site-health/google.api.integration.d.ts +2 -0
- package/dist/types/components/admin/site-health/google.api.integration.d.ts.map +1 -1
- package/dist/types/components/admin/site-health/site-health-axe-core.integration.d.ts +1 -1
- package/dist/types/components/admin/site-health/site-health-axe-core.integration.d.ts.map +1 -1
- package/dist/types/components/admin/site-health/site-health-cloudwatch.integration.d.ts.map +1 -1
- package/dist/types/components/admin/site-health/site-health-core-web-vitals.integration.d.ts.map +1 -1
- package/dist/types/components/admin/site-health/site-health-github.d.ts.map +1 -1
- package/dist/types/components/admin/site-health/site-health-github.integration.d.ts +11 -8
- package/dist/types/components/admin/site-health/site-health-github.integration.d.ts.map +1 -1
- package/dist/types/components/admin/site-health/site-health-on-site-seo.integration.d.ts.map +1 -1
- package/dist/types/components/admin/site-health/site-health-security.integration.d.ts +1 -1
- package/dist/types/components/admin/site-health/site-health-security.integration.d.ts.map +1 -1
- package/dist/types/components/config/config.types.d.ts +25 -1
- package/dist/types/components/config/config.types.d.ts.map +1 -1
- package/dist/types/components/general/sitemap.d.ts +10 -0
- package/dist/types/components/general/sitemap.d.ts.map +1 -1
- package/dist/types/components/general/sitemap.test.d.ts +2 -0
- package/dist/types/components/general/sitemap.test.d.ts.map +1 -0
- package/dist/types/test/run-analyzeGitHealth.d.ts +2 -0
- package/dist/types/test/run-analyzeGitHealth.d.ts.map +1 -0
- package/dist/types/test/test-utils.d.ts +3 -0
- package/dist/types/test/test-utils.d.ts.map +1 -1
- package/dist/types/tests/site-health-axe-core.integration.test.d.ts.map +1 -0
- package/dist/types/tests/site-health-core-web-vitals.integration.test.d.ts.map +1 -0
- package/dist/types/tests/site-health-github.integration.test.d.ts +2 -0
- package/dist/types/tests/site-health-github.integration.test.d.ts.map +1 -0
- package/package.json +14 -14
- package/dist/components/admin/site-health/site-health-axe-core.integration.test.js +0 -79
- package/dist/components/admin/site-health/site-health-core-web-vitals.integration.test.js +0 -33
- package/dist/types/components/admin/site-health/site-health-axe-core.integration.test.d.ts.map +0 -1
- package/dist/types/components/admin/site-health/site-health-core-web-vitals.integration.test.d.ts.map +0 -1
- /package/dist/types/{components/admin/site-health → tests}/site-health-axe-core.integration.test.d.ts +0 -0
- /package/dist/types/{components/admin/site-health → tests}/site-health-core-web-vitals.integration.test.d.ts +0 -0
|
@@ -250,9 +250,19 @@ export async function getSearchConsoleData(config, siteName, startDate, endDate)
|
|
|
250
250
|
}
|
|
251
251
|
catch (error) {
|
|
252
252
|
console.error('Google Search Console error:', error);
|
|
253
|
+
const errMessage = error?.message || String(error);
|
|
254
|
+
// Detect common permission message from Search Console (service account / property access)
|
|
255
|
+
if (errMessage.includes('User does not have sufficient permission') || error?.code === 403 || error?.statusCode === 403) {
|
|
256
|
+
return {
|
|
257
|
+
success: false,
|
|
258
|
+
error: 'insufficient_permission',
|
|
259
|
+
code: 403,
|
|
260
|
+
details: errMessage
|
|
261
|
+
};
|
|
262
|
+
}
|
|
253
263
|
return {
|
|
254
264
|
success: false,
|
|
255
|
-
error:
|
|
265
|
+
error: errMessage
|
|
256
266
|
};
|
|
257
267
|
}
|
|
258
268
|
}
|
|
@@ -3,10 +3,12 @@ import puppeteer from 'puppeteer';
|
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
const debug = false;
|
|
6
|
-
export async function performAxeCoreAnalysis(url) {
|
|
6
|
+
export async function performAxeCoreAnalysis(url, runtime_env = 'auto') {
|
|
7
7
|
try {
|
|
8
|
+
if (debug)
|
|
9
|
+
console.info('Axe-core performAxeCoreAnalysis called with runtime_env:', runtime_env);
|
|
8
10
|
// Run axe-core analysis
|
|
9
|
-
const { result: axeResult, injectionSource } = await runAxeCoreAnalysis(url);
|
|
11
|
+
const { result: axeResult, injectionSource } = await runAxeCoreAnalysis(url, runtime_env);
|
|
10
12
|
// Calculate summary
|
|
11
13
|
const summary = {
|
|
12
14
|
violations: axeResult.violations.length,
|
|
@@ -64,23 +66,83 @@ export async function performAxeCoreAnalysis(url) {
|
|
|
64
66
|
};
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
|
-
|
|
69
|
+
import { getFullPixelatedConfig } from '../../config/config';
|
|
70
|
+
/**
|
|
71
|
+
* runAxeCoreAnalysis(url, runtime_env)
|
|
72
|
+
*
|
|
73
|
+
* Puppeteer runtime modes:
|
|
74
|
+
* - 'local': intended for local development. Uses lighter launch args and prefers
|
|
75
|
+
* the `PUPPETEER_EXECUTABLE_PATH` environment variable so developers can use
|
|
76
|
+
* their local Chrome/Chromium installation.
|
|
77
|
+
* - 'prod': intended for production (e.g., Amplify). Uses conservative sandboxing
|
|
78
|
+
* args and prefers the build-time configured executable path at
|
|
79
|
+
* `cfg.puppeteer.executable_path`.
|
|
80
|
+
*
|
|
81
|
+
* Recommended Amplify preBuild steps (examples):
|
|
82
|
+
* - PUPPETEER_CACHE_DIR=./.puppeteer-cache npx puppeteer browsers install chrome
|
|
83
|
+
* - mkdir -p ./puppeteer-binary && ln -s <installed_chrome_path> ./puppeteer-binary/chrome
|
|
84
|
+
* - Patch decrypted `pixelated.config.json` with `puppeteer.executable_path: './puppeteer-binary/chrome'`
|
|
85
|
+
*
|
|
86
|
+
* The function selects executable path and args based on `runtime_env` and will
|
|
87
|
+
* log additional diagnostics when `debug` is enabled.
|
|
88
|
+
*/
|
|
89
|
+
async function runAxeCoreAnalysis(url, runtime_env = 'auto') {
|
|
68
90
|
let browser;
|
|
69
91
|
try {
|
|
70
|
-
//
|
|
71
|
-
|
|
92
|
+
// Build launch options for Puppeteer and prefer configured executable path when available
|
|
93
|
+
const cfg = getFullPixelatedConfig();
|
|
94
|
+
let execPath;
|
|
95
|
+
if (runtime_env === 'local') {
|
|
96
|
+
// In local mode, prefer environment overrides but do not force config-provided executable
|
|
97
|
+
execPath = process.env.PUPPETEER_EXECUTABLE_PATH;
|
|
98
|
+
}
|
|
99
|
+
else if (runtime_env === 'prod') {
|
|
100
|
+
// In production, prefer the build-time configured executable path, fall back to env
|
|
101
|
+
execPath = cfg?.puppeteer?.executable_path || process.env.PUPPETEER_EXECUTABLE_PATH;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// auto: prefer config if present, otherwise env
|
|
105
|
+
execPath = cfg?.puppeteer?.executable_path || process.env.PUPPETEER_EXECUTABLE_PATH;
|
|
106
|
+
}
|
|
107
|
+
// Build launch options for Puppeteer. Use conservative/sandboxed args in prod, but keep local runs lighter to avoid sandbox permission issues during local dev
|
|
108
|
+
const prodArgs = [
|
|
109
|
+
'--no-sandbox',
|
|
110
|
+
'--disable-setuid-sandbox',
|
|
111
|
+
'--disable-dev-shm-usage',
|
|
112
|
+
'--disable-accelerated-2d-canvas',
|
|
113
|
+
'--no-first-run',
|
|
114
|
+
'--no-zygote',
|
|
115
|
+
'--single-process', // <- this one doesn't work in Windows
|
|
116
|
+
'--disable-gpu'
|
|
117
|
+
];
|
|
118
|
+
const localArgs = [
|
|
119
|
+
'--disable-accelerated-2d-canvas',
|
|
120
|
+
'--disable-gpu'
|
|
121
|
+
];
|
|
122
|
+
const launchOpts = {
|
|
72
123
|
headless: true,
|
|
73
|
-
args:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
'
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
124
|
+
args: runtime_env === 'local' ? localArgs : prodArgs
|
|
125
|
+
};
|
|
126
|
+
if (execPath && fs.existsSync(execPath)) {
|
|
127
|
+
launchOpts.executablePath = execPath;
|
|
128
|
+
if (debug)
|
|
129
|
+
console.info('Using Puppeteer executablePath from config/env:', execPath);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
if (debug)
|
|
133
|
+
console.info('No Puppeteer executablePath found for runtime_env:', runtime_env, 'resolved execPath:', execPath);
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
browser = await puppeteer.launch(launchOpts);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
// Provide a clearer error message for missing Chrome/Chromium binaries
|
|
140
|
+
const original = err instanceof Error ? err.message : String(err);
|
|
141
|
+
const hint = `Could not launch Chrome/Chromium. Ensure Puppeteer browsers are installed (run 'npx puppeteer browsers install chrome') and that the browser binary is accessible. You can also set PUPPETEER_EXECUTABLE_PATH to the installed browser binary or adjust PUPPETEER_CACHE_DIR to point to a writable cache directory. Original error: ${original}`;
|
|
142
|
+
if (debug)
|
|
143
|
+
console.error('Puppeteer launch failed:', err);
|
|
144
|
+
throw new Error(hint);
|
|
145
|
+
}
|
|
84
146
|
const page = await browser.newPage();
|
|
85
147
|
// Set viewport for consistent results
|
|
86
148
|
await page.setViewport({ width: 1280, height: 720 });
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"use server";
|
|
6
6
|
import { CloudWatchClient, GetMetricDataCommand } from '@aws-sdk/client-cloudwatch';
|
|
7
7
|
import { RouteCache } from './site-health-cache';
|
|
8
|
+
import { getFullPixelatedConfig } from '../../config/config';
|
|
8
9
|
// Cache for health check data (15 minutes)
|
|
9
10
|
const healthCheckCache = new RouteCache(15 * 60 * 1000);
|
|
10
11
|
/**
|
|
@@ -19,8 +20,16 @@ export async function getCloudwatchHealthCheckData(config, siteName, startDate,
|
|
|
19
20
|
return { success: true, data: cached };
|
|
20
21
|
}
|
|
21
22
|
// Use CloudWatch to get historical health check data
|
|
23
|
+
// Prefer credentials from unified config (pixelated.config.json) when present (avoids env vars)
|
|
24
|
+
const fullCfg = getFullPixelatedConfig();
|
|
25
|
+
const awsCfg = fullCfg?.aws;
|
|
22
26
|
const cloudWatchClient = new CloudWatchClient({
|
|
23
|
-
region: config.region || 'us-east-1'
|
|
27
|
+
region: config.region || awsCfg?.region || 'us-east-1',
|
|
28
|
+
credentials: (awsCfg?.access_key_id && awsCfg?.secret_access_key) ? {
|
|
29
|
+
accessKeyId: awsCfg.access_key_id,
|
|
30
|
+
secretAccessKey: awsCfg.secret_access_key,
|
|
31
|
+
sessionToken: awsCfg.session_token
|
|
32
|
+
} : undefined
|
|
24
33
|
});
|
|
25
34
|
// Set up date range
|
|
26
35
|
const endTime = endDate ? new Date(endDate) : new Date();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use server";
|
|
2
|
+
const debug = false;
|
|
2
3
|
import { getFullPixelatedConfig } from '../../config/config';
|
|
3
4
|
const psiCache = new Map();
|
|
4
5
|
const CACHE_TTL_SUCCESS = 60 * 60 * 1000; // 1 hour for successful results
|
|
@@ -94,14 +95,20 @@ export async function fetchPSIData(url) {
|
|
|
94
95
|
const fetchWithRetry = async (url, maxRetries = 2) => {
|
|
95
96
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
96
97
|
try {
|
|
98
|
+
if (debug)
|
|
99
|
+
console.info(`PSI request attempt=${attempt} url=${url}`);
|
|
97
100
|
const controller = new AbortController();
|
|
98
101
|
const timeoutId = setTimeout(() => controller.abort(), 60000); // 60 second timeout
|
|
102
|
+
const start = Date.now();
|
|
99
103
|
const response = await fetch(url, {
|
|
100
104
|
signal: controller.signal,
|
|
101
105
|
headers: {
|
|
102
106
|
'User-Agent': 'Mozilla/5.0 (compatible; SiteHealthMonitor/1.0)'
|
|
103
107
|
}
|
|
104
108
|
});
|
|
109
|
+
const elapsed = Date.now() - start;
|
|
110
|
+
if (debug)
|
|
111
|
+
console.info(`PSI response: url=${url} status=${response.status} elapsed_ms=${elapsed}`);
|
|
105
112
|
clearTimeout(timeoutId);
|
|
106
113
|
return response;
|
|
107
114
|
}
|
|
@@ -110,9 +117,13 @@ export async function fetchPSIData(url) {
|
|
|
110
117
|
const errorMessage = error instanceof Error && error.name === 'AbortError'
|
|
111
118
|
? 'PSI API request timed out after 60 seconds'
|
|
112
119
|
: `PSI API request failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
120
|
+
if (debug)
|
|
121
|
+
console.error('PSI request error (final):', { url, error });
|
|
113
122
|
throw new Error(errorMessage);
|
|
114
123
|
}
|
|
115
124
|
// Wait before retry (exponential backoff) - retry on both network errors and timeouts
|
|
125
|
+
if (debug)
|
|
126
|
+
console.info(`PSI retrying after failure, attempt=${attempt} url=${url}`);
|
|
116
127
|
await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));
|
|
117
128
|
}
|
|
118
129
|
}
|
|
@@ -1,69 +1,99 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Server-side utilities for analyzing git repository health
|
|
4
|
-
*/
|
|
5
|
-
import { exec } from 'child_process';
|
|
6
|
-
import { promisify } from 'util';
|
|
7
|
-
import fs from 'fs';
|
|
1
|
+
"use server";
|
|
2
|
+
import { getFullPixelatedConfig } from '../../config/config';
|
|
8
3
|
import path from 'path';
|
|
9
|
-
|
|
4
|
+
// Version extraction: we derive a version from commit messages (e.g., v1.2.3) instead of fetching tags and fuzzy-matching.
|
|
5
|
+
// Debug logging is off by default. Set to true/false here (do not use env vars).
|
|
6
|
+
const debug = false;
|
|
10
7
|
/**
|
|
11
|
-
* Analyze git repository health for a site
|
|
8
|
+
* Analyze git repository health for a site using the GitHub REST API.
|
|
9
|
+
* Expects a GitHub token to be present in the master config under `github.token`.
|
|
12
10
|
*/
|
|
13
|
-
export async function analyzeGitHealth(siteConfig, startDate, endDate) {
|
|
11
|
+
export async function analyzeGitHealth(siteConfig, startDate, endDate, httpFetch) {
|
|
14
12
|
try {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
const cfg = getFullPixelatedConfig();
|
|
14
|
+
const token = cfg?.github?.token;
|
|
15
|
+
const defaultOwner = cfg?.github?.defaultOwner;
|
|
16
|
+
if (!token) {
|
|
17
|
+
throw new Error('GitHub token not configured in pixelated.config.json under "github.token"');
|
|
18
|
+
}
|
|
19
|
+
// Determine owner and repo
|
|
20
|
+
let owner;
|
|
21
|
+
let repo;
|
|
22
|
+
// Priority: explicit `repo` field (supports "owner/repo" or just "repo"), then remote (if owner/repo),
|
|
23
|
+
// then remote/name fallback, then derive from localPath basename.
|
|
24
|
+
if (siteConfig.repo) {
|
|
25
|
+
if (siteConfig.repo.includes('/')) {
|
|
26
|
+
[owner, repo] = siteConfig.repo.split('/', 2);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
repo = siteConfig.repo;
|
|
30
|
+
owner = siteConfig.owner || defaultOwner;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (siteConfig.remote && siteConfig.remote.includes('/')) {
|
|
34
|
+
[owner, repo] = siteConfig.remote.split('/', 2);
|
|
19
35
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
36
|
+
else {
|
|
37
|
+
repo = siteConfig.remote || (siteConfig.localPath ? path.basename(siteConfig.localPath) : siteConfig.name);
|
|
38
|
+
owner = siteConfig.owner || defaultOwner;
|
|
39
|
+
if (!repo || !owner) {
|
|
40
|
+
throw new Error('Repository owner or name not provided. Set site.remote to "owner/repo" or configure github.defaultOwner in pixelated.config.json');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Build query params
|
|
44
|
+
let since;
|
|
45
|
+
let until;
|
|
46
|
+
if (startDate)
|
|
47
|
+
since = new Date(startDate).toISOString();
|
|
48
|
+
if (endDate) {
|
|
49
|
+
// include full end day by adding one day and using until
|
|
50
|
+
const d = new Date(endDate);
|
|
51
|
+
d.setDate(d.getDate() + 1);
|
|
52
|
+
until = d.toISOString();
|
|
23
53
|
}
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
54
|
+
// Default to last 30 days if not specified
|
|
55
|
+
if (!since && !until) {
|
|
56
|
+
const end = new Date();
|
|
57
|
+
const start = new Date(end.getTime() - (30 * 24 * 60 * 60 * 1000));
|
|
58
|
+
since = start.toISOString();
|
|
59
|
+
until = end.toISOString();
|
|
28
60
|
}
|
|
29
|
-
|
|
30
|
-
|
|
61
|
+
const headers = {
|
|
62
|
+
'Accept': 'application/vnd.github+json',
|
|
63
|
+
'Authorization': `token ${token}`
|
|
64
|
+
};
|
|
65
|
+
const params = new URLSearchParams();
|
|
66
|
+
if (since)
|
|
67
|
+
params.set('since', since);
|
|
68
|
+
if (until)
|
|
69
|
+
params.set('until', until);
|
|
70
|
+
const commitsUrl = `https://api.github.com/repos/${owner}/${repo}/commits?${params.toString()}`;
|
|
71
|
+
const fetcher = httpFetch || globalThis.fetch;
|
|
72
|
+
const commitsRes = await fetcher(commitsUrl, { headers });
|
|
73
|
+
if (!commitsRes.ok) {
|
|
74
|
+
const text = await commitsRes.text().catch(() => '');
|
|
75
|
+
throw new Error(`GitHub API returned ${commitsRes.status}: ${commitsRes.statusText} ${text}`);
|
|
31
76
|
}
|
|
32
|
-
|
|
33
|
-
|
|
77
|
+
const commitsJson = await commitsRes.json();
|
|
78
|
+
if (debug) {
|
|
79
|
+
const totalCommits = Array.isArray(commitsJson) ? commitsJson.length : 0;
|
|
80
|
+
console.info(`Commits fetched: ${totalCommits}`);
|
|
34
81
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
.
|
|
40
|
-
.
|
|
41
|
-
.
|
|
42
|
-
.map(line => {
|
|
43
|
-
const [hash, date, ...messageParts] = line.split('|');
|
|
44
|
-
const message = messageParts.slice(0, -1).join('|');
|
|
45
|
-
const author = messageParts[messageParts.length - 1];
|
|
82
|
+
const commits = (Array.isArray(commitsJson) ? commitsJson : [])
|
|
83
|
+
.map((c) => {
|
|
84
|
+
const sha = c.sha;
|
|
85
|
+
const commitObj = c.commit || {};
|
|
86
|
+
const author = (commitObj.author && commitObj.author.name) || (c.author && c.author.login) || 'unknown';
|
|
87
|
+
const date = (commitObj.author && commitObj.author.date) || new Date().toISOString();
|
|
88
|
+
const message = commitObj.message || '';
|
|
46
89
|
return {
|
|
47
|
-
hash,
|
|
90
|
+
hash: sha,
|
|
48
91
|
date,
|
|
49
92
|
message,
|
|
50
|
-
author
|
|
93
|
+
author,
|
|
51
94
|
};
|
|
52
95
|
})
|
|
53
|
-
.filter(
|
|
54
|
-
.slice(0, (startDate && endDate) ? 100 : 20); // Limit to more commits when date range is specified
|
|
55
|
-
// Try to associate commits with versions
|
|
56
|
-
for (const commit of commits) {
|
|
57
|
-
try {
|
|
58
|
-
const { stdout: tagOutput } = await execAsync(`git describe --tags --contains ${commit.hash} 2>/dev/null || echo ""`, { cwd: localPath });
|
|
59
|
-
if (tagOutput.trim()) {
|
|
60
|
-
commit.version = tagOutput.trim();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
// Ignore errors for commits not associated with tags
|
|
65
|
-
}
|
|
66
|
-
}
|
|
96
|
+
.filter(Boolean);
|
|
67
97
|
return {
|
|
68
98
|
commits,
|
|
69
99
|
timestamp: new Date().toISOString(),
|
|
@@ -75,7 +105,7 @@ export async function analyzeGitHealth(siteConfig, startDate, endDate) {
|
|
|
75
105
|
commits: [],
|
|
76
106
|
timestamp: new Date().toISOString(),
|
|
77
107
|
status: 'error',
|
|
78
|
-
error: error instanceof Error ? error.message
|
|
108
|
+
error: error instanceof Error ? `${error.message}${error.stack ? '\n' + error.stack : ''}` : String(error)
|
|
79
109
|
};
|
|
80
110
|
}
|
|
81
111
|
}
|
|
@@ -25,9 +25,8 @@ export function SiteHealthGit({ siteName, startDate, endDate }) {
|
|
|
25
25
|
}
|
|
26
26
|
// Prepare table data
|
|
27
27
|
const tableData = (data.commits || []).map((commit) => ({
|
|
28
|
-
Date: new Date(commit.date).
|
|
29
|
-
Message: _jsx("span", { title: commit.message, children: commit.message })
|
|
30
|
-
Version: commit.version ? (_jsx("span", { className: "health-version-tag", children: commit.version.split('~')[0] })) : (_jsx("span", { className: "health-text-muted", children: "-" }))
|
|
28
|
+
Date: new Date(commit.date).toLocaleString(),
|
|
29
|
+
Message: _jsx("span", { title: commit.message, children: commit.message })
|
|
31
30
|
}));
|
|
32
31
|
return (_jsxs(_Fragment, { children: [_jsx("h4", { className: "health-site-name", children: siteName.replace('-', ' ') }), _jsx("div", { className: "health-section-list", children: tableData.length === 0 ? (_jsx("p", { className: "health-empty-state", children: "No recent commits found" })) : (_jsx(Table, { id: "git-table", data: tableData, altRowColor: "#DDD" })) }), _jsxs("p", { className: "health-timestamp", children: ["Last checked: ", new Date(data.timestamp).toLocaleString()] })] }));
|
|
33
32
|
} }));
|
|
@@ -1116,41 +1116,77 @@ async function performSiteWideAudits(baseUrl) {
|
|
|
1116
1116
|
}
|
|
1117
1117
|
/**
|
|
1118
1118
|
* Fetch and parse sitemap.xml to get all site URLs
|
|
1119
|
+
*
|
|
1120
|
+
* Enhanced behavior:
|
|
1121
|
+
* - Try common sitemap locations (/sitemap.xml, /sitemap_index.xml)
|
|
1122
|
+
* - Parse /robots.txt for Sitemap: directives
|
|
1123
|
+
* - Log attempted locations and continue on non-OK responses instead of throwing
|
|
1119
1124
|
*/
|
|
1120
1125
|
async function getUrlsFromSitemap(baseUrl) {
|
|
1126
|
+
const triedUrls = [];
|
|
1127
|
+
const urls = [];
|
|
1121
1128
|
try {
|
|
1122
|
-
const
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1129
|
+
const candidates = [`${baseUrl}/sitemap.xml`, `${baseUrl}/sitemap_index.xml`];
|
|
1130
|
+
// Attempt to parse robots.txt for sitemap directives
|
|
1131
|
+
try {
|
|
1132
|
+
const robotsResp = await fetch(`${baseUrl}/robots.txt`);
|
|
1133
|
+
if (robotsResp.ok) {
|
|
1134
|
+
const robotsText = await robotsResp.text();
|
|
1135
|
+
const sitemapRegex = /^sitemap:\s*(.+)$/gim;
|
|
1136
|
+
let m;
|
|
1137
|
+
while ((m = sitemapRegex.exec(robotsText)) !== null) {
|
|
1138
|
+
const sitemapUrl = m[1].trim();
|
|
1139
|
+
if (sitemapUrl)
|
|
1140
|
+
candidates.push(sitemapUrl);
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
catch (e) {
|
|
1145
|
+
// Non-fatal: ignore robots parsing errors
|
|
1146
|
+
console.debug('robots.txt unavailable or parse failed:', e);
|
|
1126
1147
|
}
|
|
1127
|
-
const xmlText = await response.text();
|
|
1128
1148
|
const baseUrlObj = new URL(baseUrl);
|
|
1129
|
-
// Simple XML parsing to extract URLs
|
|
1130
1149
|
const urlRegex = /<loc>([^<]+)<\/loc>/g;
|
|
1131
|
-
const
|
|
1132
|
-
|
|
1133
|
-
while ((match = urlRegex.exec(xmlText)) !== null) {
|
|
1134
|
-
const url = match[1].trim();
|
|
1135
|
-
// Only include URLs from the same domain and that look like valid page URLs
|
|
1150
|
+
for (const sitemapUrl of candidates) {
|
|
1151
|
+
triedUrls.push(sitemapUrl);
|
|
1136
1152
|
try {
|
|
1137
|
-
const
|
|
1138
|
-
if (
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1153
|
+
const response = await fetch(sitemapUrl);
|
|
1154
|
+
if (!response.ok) {
|
|
1155
|
+
console.warn(`Sitemap URL ${sitemapUrl} returned status ${response.status}`);
|
|
1156
|
+
continue;
|
|
1157
|
+
}
|
|
1158
|
+
const xmlText = await response.text();
|
|
1159
|
+
let match;
|
|
1160
|
+
while ((match = urlRegex.exec(xmlText)) !== null) {
|
|
1161
|
+
const url = match[1].trim();
|
|
1162
|
+
try {
|
|
1163
|
+
const urlObj = new URL(url);
|
|
1164
|
+
if (urlObj.hostname === baseUrlObj.hostname) {
|
|
1165
|
+
const pathname = urlObj.pathname.toLowerCase();
|
|
1166
|
+
const isExcluded = EXCLUDED_URL_PATTERNS.some(pattern => pathname.includes(pattern)) ||
|
|
1167
|
+
pathname.match(EXCLUDED_FILE_EXTENSIONS) ||
|
|
1168
|
+
EXCLUDED_DIRECTORY_NAMES.some(dir => pathname.endsWith(`/${dir}`));
|
|
1169
|
+
if (!isExcluded) {
|
|
1170
|
+
urls.push(url);
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
catch {
|
|
1175
|
+
// Invalid URL, skip
|
|
1146
1176
|
}
|
|
1147
1177
|
}
|
|
1148
1178
|
}
|
|
1149
|
-
catch {
|
|
1150
|
-
|
|
1179
|
+
catch (error) {
|
|
1180
|
+
console.warn(`Failed to fetch sitemap at ${sitemapUrl}:`, error);
|
|
1181
|
+
continue;
|
|
1151
1182
|
}
|
|
1183
|
+
if (urls.length > 0)
|
|
1184
|
+
break; // stop after finding the first valid sitemap
|
|
1185
|
+
}
|
|
1186
|
+
if (urls.length === 0) {
|
|
1187
|
+
console.warn('No sitemap URLs found at tried locations:', triedUrls);
|
|
1152
1188
|
}
|
|
1153
|
-
return urls.slice(0, 20);
|
|
1189
|
+
return urls.slice(0, 20);
|
|
1154
1190
|
}
|
|
1155
1191
|
catch (error) {
|
|
1156
1192
|
console.warn('Failed to fetch sitemap:', error);
|
|
@@ -3,16 +3,43 @@ import { promisify } from 'util';
|
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
const execAsync = promisify(exec);
|
|
6
|
-
export async function analyzeSecurityHealth(localPath) {
|
|
6
|
+
export async function analyzeSecurityHealth(localPath, siteName, repoName) {
|
|
7
7
|
try {
|
|
8
|
-
//
|
|
9
|
-
|
|
8
|
+
// Helper: try to resolve a usable existing path for a site
|
|
9
|
+
function findExistingLocalPath(candidatePath, siteName, repoName) {
|
|
10
|
+
// direct candidate
|
|
11
|
+
if (candidatePath && fs.existsSync(candidatePath))
|
|
12
|
+
return candidatePath;
|
|
13
|
+
// check obvious workspace parent (one level up from current package)
|
|
14
|
+
const workspaceParent = path.resolve(process.cwd(), '..');
|
|
15
|
+
const candidates = [];
|
|
16
|
+
if (siteName)
|
|
17
|
+
candidates.push(path.join(workspaceParent, siteName));
|
|
18
|
+
if (repoName)
|
|
19
|
+
candidates.push(path.join(workspaceParent, repoName));
|
|
20
|
+
// also check common external volume used on this machine
|
|
21
|
+
const externalBase = path.join('/Volumes', 'btw_x10_pro', 'Git');
|
|
22
|
+
if (siteName)
|
|
23
|
+
candidates.push(path.join(externalBase, siteName));
|
|
24
|
+
if (repoName)
|
|
25
|
+
candidates.push(path.join(externalBase, repoName));
|
|
26
|
+
for (const c of candidates) {
|
|
27
|
+
if (fs.existsSync(c)) {
|
|
28
|
+
console.info(`Security scan: using fallback path for site '${siteName}': ${c}`);
|
|
29
|
+
return c;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const resolvedPath = findExistingLocalPath(localPath, siteName, repoName) || null;
|
|
35
|
+
// Check if the resolved path exists and has package.json
|
|
36
|
+
if (!resolvedPath) {
|
|
10
37
|
return {
|
|
11
38
|
status: 'error',
|
|
12
39
|
error: 'Site directory not found'
|
|
13
40
|
};
|
|
14
41
|
}
|
|
15
|
-
const packageJsonPath = path.join(
|
|
42
|
+
const packageJsonPath = path.join(resolvedPath, 'package.json');
|
|
16
43
|
if (!fs.existsSync(packageJsonPath)) {
|
|
17
44
|
return {
|
|
18
45
|
status: 'success',
|
|
@@ -89,7 +116,7 @@ async function runNpmAudit(localPath) {
|
|
|
89
116
|
try {
|
|
90
117
|
const { stdout } = await execAsync('npm audit --json', {
|
|
91
118
|
cwd: localPath,
|
|
92
|
-
timeout:
|
|
119
|
+
timeout: 120000 // 2 minute timeout (audits can take longer)
|
|
93
120
|
});
|
|
94
121
|
return JSON.parse(stdout);
|
|
95
122
|
}
|
|
@@ -10,6 +10,11 @@ export const SECRET_CONFIG_KEYS = {
|
|
|
10
10
|
],
|
|
11
11
|
// Keys found within specific service configuration blocks
|
|
12
12
|
services: {
|
|
13
|
+
aws: [
|
|
14
|
+
'access_key_id',
|
|
15
|
+
'secret_access_key',
|
|
16
|
+
'session_token'
|
|
17
|
+
],
|
|
13
18
|
cloudinary: [
|
|
14
19
|
'api_key',
|
|
15
20
|
'api_secret'
|
|
@@ -21,14 +26,17 @@ export const SECRET_CONFIG_KEYS = {
|
|
|
21
26
|
ebay: [
|
|
22
27
|
'sbxAppId'
|
|
23
28
|
],
|
|
29
|
+
github: [
|
|
30
|
+
'token'
|
|
31
|
+
],
|
|
32
|
+
instagram: [
|
|
33
|
+
'accessToken'
|
|
34
|
+
],
|
|
24
35
|
paypal: [
|
|
25
36
|
'sandboxPayPalApiKey',
|
|
26
37
|
'sandboxPayPalSecret',
|
|
27
38
|
'payPalApiKey',
|
|
28
39
|
'payPalSecret'
|
|
29
|
-
],
|
|
30
|
-
instagram: [
|
|
31
|
-
'accessToken'
|
|
32
40
|
]
|
|
33
41
|
}
|
|
34
42
|
};
|
|
@@ -22,6 +22,20 @@ export function getOriginFromHeaders(headersLike, fallbackOrigin = 'http://local
|
|
|
22
22
|
return fallbackOrigin;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Infer a runtime environment from headers/origin.
|
|
27
|
+
* - 'local' when origin indicates localhost/127.0.0.1
|
|
28
|
+
* - 'prod' for any other host
|
|
29
|
+
* - 'auto' when no origin could be determined
|
|
30
|
+
*/
|
|
31
|
+
export function getRuntimeEnvFromHeaders(headersLike, fallbackOrigin) {
|
|
32
|
+
const origin = getOriginFromHeaders(headersLike, fallbackOrigin ?? '');
|
|
33
|
+
if (!origin)
|
|
34
|
+
return 'auto';
|
|
35
|
+
if (origin.includes('localhost') || origin.includes('127.0.0.1'))
|
|
36
|
+
return 'local';
|
|
37
|
+
return 'prod';
|
|
38
|
+
}
|
|
25
39
|
/**
|
|
26
40
|
* Next-specific async helper: getOriginFromNextHeaders
|
|
27
41
|
* - Convenience wrapper that dynamically imports `next/headers` and calls our `getOriginFromHeaders` function
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { getRuntimeEnvFromHeaders } from './sitemap';
|
|
3
|
+
describe('getRuntimeEnvFromHeaders', () => {
|
|
4
|
+
it('returns "local" for localhost host header', () => {
|
|
5
|
+
const hdrs = { get: (k) => (k === 'host' ? 'localhost:3000' : null) };
|
|
6
|
+
expect(getRuntimeEnvFromHeaders(hdrs)).toBe('local');
|
|
7
|
+
});
|
|
8
|
+
it('returns "local" for 127.0.0.1 host header', () => {
|
|
9
|
+
const hdrs = { get: (k) => (k === 'host' ? '127.0.0.1:3000' : null) };
|
|
10
|
+
expect(getRuntimeEnvFromHeaders(hdrs)).toBe('local');
|
|
11
|
+
});
|
|
12
|
+
it('returns "prod" for production host', () => {
|
|
13
|
+
const hdrs = { get: (k) => (k === 'host' ? 'example.com' : null) };
|
|
14
|
+
expect(getRuntimeEnvFromHeaders(hdrs)).toBe('prod');
|
|
15
|
+
});
|
|
16
|
+
it('returns "auto" when headers not present', () => {
|
|
17
|
+
expect(getRuntimeEnvFromHeaders(undefined)).toBe('auto');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { getFullPixelatedConfig } from '../components/config/config';
|
|
4
|
+
import { analyzeGitHealth } from '../components/admin/site-health/site-health-github.integration';
|
|
5
|
+
// Usage:
|
|
6
|
+
// 1) With a siteName: `tsx src/tests/harness/run-analyzeGitHealth.ts <siteName> [startDate] [endDate]`
|
|
7
|
+
// - Uses sites.json to find site and performs real GitHub fetches (requires token in pixelated.config.json)
|
|
8
|
+
// 2) Without args: runs a quick stubbed run that can reproduce pagination behavior locally
|
|
9
|
+
async function runWithSite(siteName, startDate, endDate) {
|
|
10
|
+
const cfg = getFullPixelatedConfig();
|
|
11
|
+
const token = cfg?.github?.token;
|
|
12
|
+
if (!token) {
|
|
13
|
+
console.error('No github token available in config. Add github.token to pixelated.config.json or run without args to do a stub run.');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const sitesPath = path.join(process.cwd(), 'src', 'app', 'data', 'sites.json');
|
|
17
|
+
const sitesData = fs.readFileSync(sitesPath, 'utf8');
|
|
18
|
+
const sites = JSON.parse(sitesData);
|
|
19
|
+
const site = sites.find((s) => s.name === siteName);
|
|
20
|
+
if (!site) {
|
|
21
|
+
console.error('Site not found in sites.json');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
// Use real fetch for this run
|
|
25
|
+
const res = await analyzeGitHealth(site, startDate, endDate);
|
|
26
|
+
console.log('Result:', JSON.stringify(res, null, 2));
|
|
27
|
+
}
|
|
28
|
+
async function runStubbed() {
|
|
29
|
+
// Provide a global fetch that simulates commits only (no tag pagination)
|
|
30
|
+
globalThis.fetch = async (input, init) => {
|
|
31
|
+
const url = typeof input === 'string' ? input : input.url;
|
|
32
|
+
if (url.includes('/commits'))
|
|
33
|
+
return { ok: true, json: async () => [] };
|
|
34
|
+
return { ok: false, status: 404, statusText: 'Not Found', text: async () => 'not found' };
|
|
35
|
+
};
|
|
36
|
+
const res = await analyzeGitHealth({ name: 'foo', remote: 'owner/repo' });
|
|
37
|
+
console.log('Result (stubbed):', JSON.stringify(res, null, 2));
|
|
38
|
+
}
|
|
39
|
+
(async () => {
|
|
40
|
+
const [, , siteName, startDate, endDate] = process.argv;
|
|
41
|
+
if (siteName) {
|
|
42
|
+
await runWithSite(siteName, startDate, endDate);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
await runStubbed();
|
|
46
|
+
}
|
|
47
|
+
})().catch(err => {
|
|
48
|
+
console.error('Error running analyze:', err);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.api.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/google.api.integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,GAAG,CAAC;CACb;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC3C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EAAE,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmC3D;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAS/F;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CASnG;AAKD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAKD;;GAEG;AACH,wBAAsB,sBAAsB,CAC3C,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC,CAmGlC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;
|
|
1
|
+
{"version":3,"file":"google.api.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/google.api.integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,GAAG,CAAC;CACb;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC3C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EAAE,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmC3D;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAS/F;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CASnG;AAKD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAKD;;GAEG;AACH,wBAAsB,sBAAsB,CAC3C,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC,CAmGlC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD;;GAEG;AACH,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,CAAC,CAoHhC"}
|
|
@@ -60,6 +60,6 @@ export interface AxeCoreData {
|
|
|
60
60
|
error?: string;
|
|
61
61
|
injectionSource?: string;
|
|
62
62
|
}
|
|
63
|
-
export declare function performAxeCoreAnalysis(url: string): Promise<AxeCoreData>;
|
|
63
|
+
export declare function performAxeCoreAnalysis(url: string, runtime_env?: 'auto' | 'local' | 'prod'): Promise<AxeCoreData>;
|
|
64
64
|
export {};
|
|
65
65
|
//# sourceMappingURL=site-health-axe-core.integration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-axe-core.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-axe-core.integration.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AAEH,UAAU,OAAO;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,UAAU,SAAS;IACjB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,eAAe,EAAE;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"site-health-axe-core.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-axe-core.integration.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AAEH,UAAU,OAAO;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,UAAU,SAAS;IACjB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,eAAe,EAAE;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,GAAG,OAAO,GAAG,MAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CA+D/H"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-cloudwatch.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-cloudwatch.integration.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"site-health-cloudwatch.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-cloudwatch.integration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAKD;;GAEG;AACH,wBAAsB,4BAA4B,CACjD,MAAM,EAAE,2BAA2B,EACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,6BAA6B,CAAC,CAiJxC"}
|
package/dist/types/components/admin/site-health/site-health-core-web-vitals.integration.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-core-web-vitals.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-core-web-vitals.integration.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"site-health-core-web-vitals.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-core-web-vitals.integration.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAoC,MAAM,qBAAqB,CAAC;AAmC1F,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,OAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC,CA4E5B;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAmE5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-github.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-github.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAUnD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"site-health-github.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-github.tsx"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAUnD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAC3E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,iBAAiB,2CAyDhF;yBAzDe,aAAa"}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git Health Integration Services
|
|
3
|
-
* Server-side utilities for analyzing git repository health
|
|
4
|
-
*/
|
|
5
1
|
export interface GitCommit {
|
|
6
2
|
hash: string;
|
|
7
3
|
date: string;
|
|
8
4
|
message: string;
|
|
9
5
|
author: string;
|
|
10
|
-
version?: string;
|
|
11
6
|
}
|
|
12
7
|
export interface GitHealthResult {
|
|
13
8
|
commits: GitCommit[];
|
|
@@ -17,10 +12,18 @@ export interface GitHealthResult {
|
|
|
17
12
|
}
|
|
18
13
|
export interface SiteConfig {
|
|
19
14
|
name: string;
|
|
20
|
-
|
|
15
|
+
/** Optional: explicit repository identifier (e.g., "owner/repo" or just "repo") */
|
|
16
|
+
repo?: string;
|
|
17
|
+
/** Optional: remote name (legacy) */
|
|
18
|
+
remote?: string;
|
|
19
|
+
/** Optional explicit repo owner */
|
|
20
|
+
owner?: string;
|
|
21
|
+
/** Optional local path used to derive repo name if needed */
|
|
22
|
+
localPath?: string;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
|
-
* Analyze git repository health for a site
|
|
25
|
+
* Analyze git repository health for a site using the GitHub REST API.
|
|
26
|
+
* Expects a GitHub token to be present in the master config under `github.token`.
|
|
24
27
|
*/
|
|
25
|
-
export declare function analyzeGitHealth(siteConfig: SiteConfig, startDate?: string, endDate?: string): Promise<GitHealthResult>;
|
|
28
|
+
export declare function analyzeGitHealth(siteConfig: SiteConfig, startDate?: string, endDate?: string, httpFetch?: (input: RequestInfo, init?: RequestInit) => Promise<any>): Promise<GitHealthResult>;
|
|
26
29
|
//# sourceMappingURL=site-health-github.integration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-github.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-github.integration.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"site-health-github.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-github.integration.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAgHnM"}
|
package/dist/types/components/admin/site-health/site-health-on-site-seo.integration.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-on-site-seo.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-on-site-seo.integration.ts"],"names":[],"mappings":"AAq0BA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,QAAQ,GAAG,eAAe,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"site-health-on-site-seo.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-on-site-seo.integration.ts"],"names":[],"mappings":"AAq0BA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,QAAQ,GAAG,eAAe,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;KACxC,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8fD;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA6KtF"}
|
|
@@ -25,5 +25,5 @@ export interface SecurityScanResult {
|
|
|
25
25
|
};
|
|
26
26
|
error?: string;
|
|
27
27
|
}
|
|
28
|
-
export declare function analyzeSecurityHealth(localPath: string): Promise<SecurityScanResult>;
|
|
28
|
+
export declare function analyzeSecurityHealth(localPath: string, siteName?: string, repoName?: string): Promise<SecurityScanResult>;
|
|
29
29
|
//# sourceMappingURL=site-health-security.integration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-security.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-security.integration.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,aAAa,EAAE,CAAC;QACjC,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;QACF,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqCD,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"site-health-security.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-security.integration.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,aAAa,EAAE,CAAC;QACjC,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;QACF,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqCD,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiHhI"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
export interface AWSConfig {
|
|
2
|
+
/** Programmatic credentials for AWS (if not using instance/IAM role). Prefer using instance roles */
|
|
3
|
+
access_key_id?: string;
|
|
4
|
+
secret_access_key?: string;
|
|
5
|
+
session_token?: string;
|
|
6
|
+
region?: string;
|
|
7
|
+
}
|
|
1
8
|
export interface CloudinaryConfig {
|
|
2
9
|
product_env: string;
|
|
3
10
|
baseUrl?: string;
|
|
@@ -52,6 +59,14 @@ export interface FlickrConfig {
|
|
|
52
59
|
nojsoncallback?: string;
|
|
53
60
|
};
|
|
54
61
|
}
|
|
62
|
+
export interface GitHubConfig {
|
|
63
|
+
/** Personal Access Token or App token used to call GitHub REST API (use a fine-grained token with readonly repo access) */
|
|
64
|
+
token?: string;
|
|
65
|
+
/** Optional custom API base URL (enterprise installations). Defaults to https://api.github.com */
|
|
66
|
+
apiBaseUrl?: string;
|
|
67
|
+
/** Optional default organization/owner to use when a repo name is specified without owner */
|
|
68
|
+
defaultOwner?: string;
|
|
69
|
+
}
|
|
55
70
|
export interface GlobalConfig {
|
|
56
71
|
proxyUrl?: string;
|
|
57
72
|
pagesDir?: string;
|
|
@@ -145,19 +160,27 @@ export interface SiteInfo {
|
|
|
145
160
|
export declare const SECRET_CONFIG_KEYS: {
|
|
146
161
|
global: string[];
|
|
147
162
|
services: {
|
|
163
|
+
aws: string[];
|
|
148
164
|
cloudinary: string[];
|
|
149
165
|
contentful: string[];
|
|
150
166
|
ebay: string[];
|
|
151
|
-
|
|
167
|
+
github: string[];
|
|
152
168
|
instagram: string[];
|
|
169
|
+
paypal: string[];
|
|
153
170
|
};
|
|
154
171
|
};
|
|
172
|
+
export interface PuppeteerConfig {
|
|
173
|
+
executable_path?: string;
|
|
174
|
+
cache_dir?: string;
|
|
175
|
+
}
|
|
155
176
|
export interface PixelatedConfig {
|
|
156
177
|
global?: GlobalConfig;
|
|
178
|
+
aws?: AWSConfig;
|
|
157
179
|
cloudinary?: CloudinaryConfig;
|
|
158
180
|
contentful?: ContentfulConfig;
|
|
159
181
|
ebay?: EbayConfig;
|
|
160
182
|
flickr?: FlickrConfig;
|
|
183
|
+
github?: GitHubConfig;
|
|
161
184
|
globlalConfig?: GlobalConfig;
|
|
162
185
|
google?: Google;
|
|
163
186
|
googleAnalytics?: GoogleAnalyticsConfig;
|
|
@@ -168,5 +191,6 @@ export interface PixelatedConfig {
|
|
|
168
191
|
nextAuth?: NextAuth;
|
|
169
192
|
paypal?: PaypalConfig;
|
|
170
193
|
wordpress?: WordpressConfig;
|
|
194
|
+
puppeteer?: PuppeteerConfig;
|
|
171
195
|
}
|
|
172
196
|
//# sourceMappingURL=config.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../../src/components/config/config.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../../src/components/config/config.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,16 @@ export type SitemapConfig = {
|
|
|
27
27
|
export declare function getOriginFromHeaders(headersLike?: {
|
|
28
28
|
get: (k: string) => string | null;
|
|
29
29
|
} | undefined, fallbackOrigin?: string): string;
|
|
30
|
+
export type RuntimeEnv = 'auto' | 'local' | 'prod';
|
|
31
|
+
/**
|
|
32
|
+
* Infer a runtime environment from headers/origin.
|
|
33
|
+
* - 'local' when origin indicates localhost/127.0.0.1
|
|
34
|
+
* - 'prod' for any other host
|
|
35
|
+
* - 'auto' when no origin could be determined
|
|
36
|
+
*/
|
|
37
|
+
export declare function getRuntimeEnvFromHeaders(headersLike?: {
|
|
38
|
+
get: (k: string) => string | null;
|
|
39
|
+
} | undefined, fallbackOrigin?: string): RuntimeEnv;
|
|
30
40
|
/**
|
|
31
41
|
* Next-specific async helper: getOriginFromNextHeaders
|
|
32
42
|
* - Convenience wrapper that dynamically imports `next/headers` and calls our `getOriginFromHeaders` function
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/components/general/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAS1C,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAWzD,MAAM,MAAM,aAAa,GAAG;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,MAAM,CAAC,EAAE,GAAG,CAAC;CACb,CAAC;AAKF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE;IAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,EAAE,cAAc,SAA0B,UAU7I;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,cAAc,SAA0B,mBAatF;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,SAGxC;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,UAU3D;AAID;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,GAAE,aAAkB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAmEnH;AAKD,wBAAsB,cAAc,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,MAAM,EAAE,MAAM;;;;;;
|
|
1
|
+
{"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/components/general/sitemap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap.test.d.ts","sourceRoot":"","sources":["../../../../src/components/general/sitemap.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-analyzeGitHealth.d.ts","sourceRoot":"","sources":["../../../src/test/run-analyzeGitHealth.ts"],"names":[],"mappings":""}
|
|
@@ -11,10 +11,12 @@ interface ExtendedRenderOptions extends Omit<RenderOptions, 'queries'> {
|
|
|
11
11
|
declare function renderWithProviders(ui: ReactElement, { config, ...renderOptions }?: ExtendedRenderOptions): {
|
|
12
12
|
config: {
|
|
13
13
|
global?: import("@/components/config/config.types").GlobalConfig;
|
|
14
|
+
aws?: import("@/components/config/config.types").AWSConfig;
|
|
14
15
|
cloudinary?: import("@/components/config/config.types").CloudinaryConfig;
|
|
15
16
|
contentful?: import("@/components/config/config.types").ContentfulConfig;
|
|
16
17
|
ebay?: import("@/components/config/config.types").EbayConfig;
|
|
17
18
|
flickr?: import("@/components/config/config.types").FlickrConfig;
|
|
19
|
+
github?: import("@/components/config/config.types").GitHubConfig;
|
|
18
20
|
globlalConfig?: import("@/components/config/config.types").GlobalConfig;
|
|
19
21
|
google?: import("@/components/config/config.types").Google;
|
|
20
22
|
googleAnalytics?: import("@/components/config/config.types").GoogleAnalyticsConfig;
|
|
@@ -25,6 +27,7 @@ declare function renderWithProviders(ui: ReactElement, { config, ...renderOption
|
|
|
25
27
|
nextAuth?: import("@/components/config/config.types").NextAuth;
|
|
26
28
|
paypal?: import("@/components/config/config.types").PaypalConfig;
|
|
27
29
|
wordpress?: import("@/components/config/config.types").WordpressConfig;
|
|
30
|
+
puppeteer?: import("@/components/config/config.types").PuppeteerConfig;
|
|
28
31
|
};
|
|
29
32
|
container: HTMLElement;
|
|
30
33
|
baseElement: HTMLElement;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/test/test-utils.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAU,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGnE,UAAU,qBAAsB,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,iBAAS,mBAAmB,CAC3B,EAAE,EAAE,YAAY,EAChB,EACC,MAAW,EACX,GAAG,aAAa,EAChB,GAAE,qBAA0B
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/test/test-utils.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAU,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGnE,UAAU,qBAAsB,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,iBAAS,mBAAmB,CAC3B,EAAE,EAAE,YAAY,EAChB,EACC,MAAW,EACX,GAAG,aAAa,EAChB,GAAE,qBAA0B;;;;;;;;;;;;;;;;;;;;;;;uBAQf,CAAC,yJAUU,CAAC,6BACA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAH3B;AAGD,cAAc,wBAAwB,CAAC;AAGvC,OAAO,EAAE,mBAAmB,IAAI,MAAM,EAAE,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-health-axe-core.integration.test.d.ts","sourceRoot":"","sources":["../../../src/tests/site-health-axe-core.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-health-core-web-vitals.integration.test.d.ts","sourceRoot":"","sources":["../../../src/tests/site-health-core-web-vitals.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-health-github.integration.test.d.ts","sourceRoot":"","sources":["../../../src/tests/site-health-github.integration.test.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixelated-tech/components",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pixelated Technologies",
|
|
@@ -102,11 +102,11 @@
|
|
|
102
102
|
"html-entities": "^2.6.0"
|
|
103
103
|
},
|
|
104
104
|
"devDependencies": {
|
|
105
|
-
"@babel/cli": "^7.28.
|
|
106
|
-
"@babel/core": "^7.28.
|
|
105
|
+
"@babel/cli": "^7.28.6",
|
|
106
|
+
"@babel/core": "^7.28.6",
|
|
107
107
|
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
|
108
108
|
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
|
|
109
|
-
"@babel/preset-env": "^7.28.
|
|
109
|
+
"@babel/preset-env": "^7.28.6",
|
|
110
110
|
"@babel/preset-react": "^7.28.5",
|
|
111
111
|
"@babel/preset-typescript": "^7.28.5",
|
|
112
112
|
"@eslint/json": "^0.14.0",
|
|
@@ -118,15 +118,15 @@
|
|
|
118
118
|
"@testing-library/react": "^16.3.1",
|
|
119
119
|
"@testing-library/user-event": "^14.6.1",
|
|
120
120
|
"@types/md5": "^2.3.6",
|
|
121
|
-
"@types/node": "^25.0.
|
|
121
|
+
"@types/node": "^25.0.7",
|
|
122
122
|
"@types/prop-types": "^15.7.15",
|
|
123
123
|
"@types/react": "^19.2.8",
|
|
124
124
|
"@types/react-dom": "^19.2.3",
|
|
125
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
126
|
-
"@typescript-eslint/parser": "^8.
|
|
125
|
+
"@typescript-eslint/eslint-plugin": "^8.53.0",
|
|
126
|
+
"@typescript-eslint/parser": "^8.53.0",
|
|
127
127
|
"@vitejs/plugin-react": "^5.1.2",
|
|
128
|
-
"@vitest/coverage-v8": "^4.0.
|
|
129
|
-
"@vitest/ui": "^4.0.
|
|
128
|
+
"@vitest/coverage-v8": "^4.0.17",
|
|
129
|
+
"@vitest/ui": "^4.0.17",
|
|
130
130
|
"ajv": "^8.17.1",
|
|
131
131
|
"ajv-keywords": "^5.1.0",
|
|
132
132
|
"babel-loader": "^10.0.0",
|
|
@@ -161,10 +161,10 @@
|
|
|
161
161
|
"ts-loader": "^9.5.4",
|
|
162
162
|
"typescript": "^5.9.3",
|
|
163
163
|
"url-loader": "^4.1.1",
|
|
164
|
-
"vitest": "^4.0.
|
|
164
|
+
"vitest": "^4.0.17",
|
|
165
165
|
"webpack": "^5.104.1",
|
|
166
166
|
"webpack-cli": "^6.0.1",
|
|
167
|
-
"webpack-dev-server": "^5.2.
|
|
167
|
+
"webpack-dev-server": "^5.2.3",
|
|
168
168
|
"webpack-node-externals": "^3.0.0"
|
|
169
169
|
},
|
|
170
170
|
"peerDependencies": {
|
|
@@ -173,11 +173,11 @@
|
|
|
173
173
|
"react-dom": "^19.2.0"
|
|
174
174
|
},
|
|
175
175
|
"optionalDependencies": {
|
|
176
|
-
"@aws-sdk/client-cloudwatch": "^3.
|
|
177
|
-
"@aws-sdk/client-route-53": "^3.
|
|
176
|
+
"@aws-sdk/client-cloudwatch": "^3.967.0",
|
|
177
|
+
"@aws-sdk/client-route-53": "^3.967.0",
|
|
178
178
|
"googleapis": "^170.0.0",
|
|
179
179
|
"md5": "^2.3.0",
|
|
180
|
-
"puppeteer": "^24.
|
|
180
|
+
"puppeteer": "^24.35.0",
|
|
181
181
|
"react-redux": "*",
|
|
182
182
|
"recharts": "^3.6.0",
|
|
183
183
|
"redux": "*"
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
// We'll mock puppeteer and fs before importing the module under test to avoid ESM spy limitations
|
|
3
|
-
describe('performAxeCoreAnalysis (CDN blocked -> local-inline fallback)', () => {
|
|
4
|
-
beforeEach(async () => {
|
|
5
|
-
vi.resetModules();
|
|
6
|
-
// Mock puppeteer browser and page
|
|
7
|
-
const page = {
|
|
8
|
-
setViewport: vi.fn().mockResolvedValue(undefined),
|
|
9
|
-
on: vi.fn().mockReturnValue(undefined),
|
|
10
|
-
setUserAgent: vi.fn().mockResolvedValue(undefined),
|
|
11
|
-
goto: vi.fn().mockResolvedValue(undefined),
|
|
12
|
-
addScriptTag: vi.fn().mockImplementation(async (opts) => {
|
|
13
|
-
if (opts && opts.url && opts.url.includes('cdn.jsdelivr')) {
|
|
14
|
-
// Simulate CDN blocked
|
|
15
|
-
throw new Error('CDN blocked');
|
|
16
|
-
}
|
|
17
|
-
// Otherwise pretend inline injection succeeded
|
|
18
|
-
return Promise.resolve(undefined);
|
|
19
|
-
}),
|
|
20
|
-
frames: vi.fn().mockReturnValue([{
|
|
21
|
-
evaluate: vi.fn().mockImplementation(async (fn) => {
|
|
22
|
-
const fnStr = fn.toString();
|
|
23
|
-
if (fnStr.includes('typeof (window as any).axe') || fnStr.includes('typeof window.axe')) {
|
|
24
|
-
return true; // axe is present after inline injection
|
|
25
|
-
}
|
|
26
|
-
if (fnStr.includes('axe.run') || fnStr.includes('window.axe.run')) {
|
|
27
|
-
// return a minimal axe result shape
|
|
28
|
-
return {
|
|
29
|
-
violations: [],
|
|
30
|
-
passes: [],
|
|
31
|
-
incomplete: [],
|
|
32
|
-
inapplicable: [],
|
|
33
|
-
testEngine: { name: 'axe-core', version: 'test' },
|
|
34
|
-
testRunner: { name: 'mock' },
|
|
35
|
-
testEnvironment: { userAgent: 'mock', windowWidth: 1280, windowHeight: 720 },
|
|
36
|
-
timestamp: new Date().toISOString(),
|
|
37
|
-
url: 'http://example'
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
return null;
|
|
41
|
-
})
|
|
42
|
-
}])
|
|
43
|
-
};
|
|
44
|
-
const browser = {
|
|
45
|
-
newPage: vi.fn().mockResolvedValue(page),
|
|
46
|
-
close: vi.fn().mockResolvedValue(undefined)
|
|
47
|
-
};
|
|
48
|
-
// Mock puppeteer before importing the module to avoid ESM spy issues
|
|
49
|
-
vi.doMock('puppeteer', async (importOriginal) => {
|
|
50
|
-
// Provide a minimal mock that exposes launch as both default and named
|
|
51
|
-
return {
|
|
52
|
-
default: { launch: () => Promise.resolve(browser) },
|
|
53
|
-
launch: () => Promise.resolve(browser)
|
|
54
|
-
};
|
|
55
|
-
});
|
|
56
|
-
// Mock fs before importing the module (provide both default and named exports for interop)
|
|
57
|
-
vi.doMock('fs', () => ({
|
|
58
|
-
existsSync: () => true,
|
|
59
|
-
readFileSync: () => '/* fake axe content */',
|
|
60
|
-
default: {
|
|
61
|
-
existsSync: () => true,
|
|
62
|
-
readFileSync: () => '/* fake axe content */'
|
|
63
|
-
}
|
|
64
|
-
}));
|
|
65
|
-
});
|
|
66
|
-
afterEach(() => {
|
|
67
|
-
vi.restoreAllMocks();
|
|
68
|
-
vi.clearAllMocks();
|
|
69
|
-
vi.resetModules();
|
|
70
|
-
});
|
|
71
|
-
it('falls back to local inline injection when CDN is blocked and reports injectionSource "local-inline"', async () => {
|
|
72
|
-
const { performAxeCoreAnalysis } = await import('./site-health-axe-core.integration');
|
|
73
|
-
const url = 'http://example.local';
|
|
74
|
-
const res = await performAxeCoreAnalysis(url);
|
|
75
|
-
expect(res).toBeDefined();
|
|
76
|
-
expect(res.status).toBe('success');
|
|
77
|
-
expect(res.injectionSource).toBe('local-inline');
|
|
78
|
-
});
|
|
79
|
-
});
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import * as configModule from '../../config/config';
|
|
3
|
-
import { fetchPSIData } from './site-health-core-web-vitals.integration';
|
|
4
|
-
import { mockConfig } from '../../../test/config.mock';
|
|
5
|
-
// Use the test harness mock config derived from src/config/pixelated.config.json
|
|
6
|
-
describe('fetchPSIData', () => {
|
|
7
|
-
let originalFetch;
|
|
8
|
-
let getFullConfigSpy;
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
originalFetch = globalThis.fetch;
|
|
11
|
-
globalThis.fetch = vi.fn().mockResolvedValue({ ok: true, json: async () => ({ lighthouseResult: { audits: { someAudit: {} }, categories: {} } }) });
|
|
12
|
-
// Ensure server-side code sees the standard test harness config by default
|
|
13
|
-
getFullConfigSpy = vi.spyOn(configModule, 'getFullPixelatedConfig').mockReturnValue(mockConfig);
|
|
14
|
-
});
|
|
15
|
-
afterEach(() => {
|
|
16
|
-
globalThis.fetch = originalFetch;
|
|
17
|
-
getFullConfigSpy?.mockRestore();
|
|
18
|
-
vi.restoreAllMocks();
|
|
19
|
-
});
|
|
20
|
-
it('uses API key from pixelated.config.json', async () => {
|
|
21
|
-
const apiKey = mockConfig?.google?.api_key;
|
|
22
|
-
expect(apiKey).toBeDefined();
|
|
23
|
-
const url = 'https://example.com';
|
|
24
|
-
await fetchPSIData(url);
|
|
25
|
-
expect(globalThis.fetch).toHaveBeenCalled();
|
|
26
|
-
const calledUrl = globalThis.fetch.mock.calls[0][0];
|
|
27
|
-
expect(calledUrl).toContain(`key=${apiKey}`);
|
|
28
|
-
});
|
|
29
|
-
it('throws when api key is missing from config', async () => {
|
|
30
|
-
getFullConfigSpy.mockReturnValue({});
|
|
31
|
-
await expect(fetchPSIData('https://example.com')).rejects.toThrow('Google API key is not set');
|
|
32
|
-
});
|
|
33
|
-
});
|
package/dist/types/components/admin/site-health/site-health-axe-core.integration.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-axe-core.integration.test.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-axe-core.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"site-health-core-web-vitals.integration.test.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-core-web-vitals.integration.test.ts"],"names":[],"mappings":""}
|
|
File without changes
|
|
File without changes
|