@pixelated-tech/components 3.9.5 → 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.
Files changed (43) hide show
  1. package/dist/components/admin/site-health/google.api.integration.js +11 -1
  2. package/dist/components/admin/site-health/site-health-axe-core.integration.js +78 -16
  3. package/dist/components/admin/site-health/site-health-core-web-vitals.integration.js +1 -1
  4. package/dist/components/admin/site-health/site-health-github.integration.js +28 -25
  5. package/dist/components/admin/site-health/site-health-github.js +2 -3
  6. package/dist/components/admin/site-health/site-health-on-site-seo.integration.js +59 -23
  7. package/dist/components/admin/site-health/site-health-security.integration.js +32 -5
  8. package/dist/components/general/sitemap.js +14 -0
  9. package/dist/components/general/sitemap.test.js +19 -0
  10. package/dist/test/run-analyzeGitHealth.js +50 -0
  11. package/dist/types/components/admin/site-health/google.api.integration.d.ts +2 -0
  12. package/dist/types/components/admin/site-health/google.api.integration.d.ts.map +1 -1
  13. package/dist/types/components/admin/site-health/site-health-axe-core.integration.d.ts +1 -1
  14. package/dist/types/components/admin/site-health/site-health-axe-core.integration.d.ts.map +1 -1
  15. package/dist/types/components/admin/site-health/site-health-github.d.ts.map +1 -1
  16. package/dist/types/components/admin/site-health/site-health-github.integration.d.ts +6 -3
  17. package/dist/types/components/admin/site-health/site-health-github.integration.d.ts.map +1 -1
  18. package/dist/types/components/admin/site-health/site-health-on-site-seo.integration.d.ts.map +1 -1
  19. package/dist/types/components/admin/site-health/site-health-security.integration.d.ts +1 -1
  20. package/dist/types/components/admin/site-health/site-health-security.integration.d.ts.map +1 -1
  21. package/dist/types/components/config/config.types.d.ts +5 -0
  22. package/dist/types/components/config/config.types.d.ts.map +1 -1
  23. package/dist/types/components/general/sitemap.d.ts +10 -0
  24. package/dist/types/components/general/sitemap.d.ts.map +1 -1
  25. package/dist/types/components/general/sitemap.test.d.ts +2 -0
  26. package/dist/types/components/general/sitemap.test.d.ts.map +1 -0
  27. package/dist/types/test/run-analyzeGitHealth.d.ts +2 -0
  28. package/dist/types/test/run-analyzeGitHealth.d.ts.map +1 -0
  29. package/dist/types/test/test-utils.d.ts +1 -0
  30. package/dist/types/test/test-utils.d.ts.map +1 -1
  31. package/dist/types/tests/site-health-axe-core.integration.test.d.ts.map +1 -0
  32. package/dist/types/tests/site-health-core-web-vitals.integration.test.d.ts.map +1 -0
  33. package/dist/types/tests/site-health-github.integration.test.d.ts +2 -0
  34. package/dist/types/tests/site-health-github.integration.test.d.ts.map +1 -0
  35. package/package.json +14 -14
  36. package/dist/components/admin/site-health/site-health-axe-core.integration.test.js +0 -79
  37. package/dist/components/admin/site-health/site-health-core-web-vitals.integration.test.js +0 -33
  38. package/dist/types/components/admin/site-health/site-health-axe-core.integration.test.d.ts.map +0 -1
  39. package/dist/types/components/admin/site-health/site-health-core-web-vitals.integration.test.d.ts.map +0 -1
  40. package/dist/types/tests/github.integration.test.d.ts +0 -2
  41. package/dist/types/tests/github.integration.test.d.ts.map +0 -1
  42. /package/dist/types/{components/admin/site-health → tests}/site-health-axe-core.integration.test.d.ts +0 -0
  43. /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: error.message
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
- async function runAxeCoreAnalysis(url) {
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
- // Launch browser with options for better compatibility
71
- browser = await puppeteer.launch({
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
- '--no-sandbox',
75
- '--disable-setuid-sandbox',
76
- '--disable-dev-shm-usage',
77
- '--disable-accelerated-2d-canvas',
78
- '--no-first-run',
79
- '--no-zygote',
80
- '--single-process', // <- this one doesn't work in Windows
81
- '--disable-gpu'
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 });
@@ -1,5 +1,5 @@
1
1
  "use server";
2
- const debug = true;
2
+ const debug = false;
3
3
  import { getFullPixelatedConfig } from '../../config/config';
4
4
  const psiCache = new Map();
5
5
  const CACHE_TTL_SUCCESS = 60 * 60 * 1000; // 1 hour for successful results
@@ -1,10 +1,14 @@
1
1
  "use server";
2
2
  import { getFullPixelatedConfig } from '../../config/config';
3
+ import path from 'path';
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;
3
7
  /**
4
8
  * Analyze git repository health for a site using the GitHub REST API.
5
9
  * Expects a GitHub token to be present in the master config under `github.token`.
6
10
  */
7
- export async function analyzeGitHealth(siteConfig, startDate, endDate) {
11
+ export async function analyzeGitHealth(siteConfig, startDate, endDate, httpFetch) {
8
12
  try {
9
13
  const cfg = getFullPixelatedConfig();
10
14
  const token = cfg?.github?.token;
@@ -15,15 +19,26 @@ export async function analyzeGitHealth(siteConfig, startDate, endDate) {
15
19
  // Determine owner and repo
16
20
  let owner;
17
21
  let repo;
18
- if (siteConfig.remote && siteConfig.remote.includes('/')) {
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('/')) {
19
34
  [owner, repo] = siteConfig.remote.split('/', 2);
20
35
  }
21
36
  else {
22
- repo = siteConfig.remote || siteConfig.name;
37
+ repo = siteConfig.remote || (siteConfig.localPath ? path.basename(siteConfig.localPath) : siteConfig.name);
23
38
  owner = siteConfig.owner || defaultOwner;
24
- }
25
- if (!owner || !repo) {
26
- throw new Error('Repository owner or name not provided. Set site.remote to "owner/repo" or configure github.defaultOwner in pixelated.config.json');
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
+ }
27
42
  }
28
43
  // Build query params
29
44
  let since;
@@ -52,25 +67,17 @@ export async function analyzeGitHealth(siteConfig, startDate, endDate) {
52
67
  params.set('since', since);
53
68
  if (until)
54
69
  params.set('until', until);
55
- params.set('per_page', '100');
56
70
  const commitsUrl = `https://api.github.com/repos/${owner}/${repo}/commits?${params.toString()}`;
57
- const commitsRes = await fetch(commitsUrl, { headers });
71
+ const fetcher = httpFetch || globalThis.fetch;
72
+ const commitsRes = await fetcher(commitsUrl, { headers });
58
73
  if (!commitsRes.ok) {
59
74
  const text = await commitsRes.text().catch(() => '');
60
75
  throw new Error(`GitHub API returned ${commitsRes.status}: ${commitsRes.statusText} ${text}`);
61
76
  }
62
77
  const commitsJson = await commitsRes.json();
63
- // Fetch tags to try to match commit -> tag (best-effort, only exact matches)
64
- const tagsUrl = `https://api.github.com/repos/${owner}/${repo}/tags?per_page=100`;
65
- const tagsRes = await fetch(tagsUrl, { headers });
66
- let tagMap = new Map();
67
- if (tagsRes.ok) {
68
- const tags = await tagsRes.json().catch(() => []);
69
- for (const t of tags || []) {
70
- if (t && t.commit && t.commit.sha && t.name) {
71
- tagMap.set(t.commit.sha, t.name);
72
- }
73
- }
78
+ if (debug) {
79
+ const totalCommits = Array.isArray(commitsJson) ? commitsJson.length : 0;
80
+ console.info(`Commits fetched: ${totalCommits}`);
74
81
  }
75
82
  const commits = (Array.isArray(commitsJson) ? commitsJson : [])
76
83
  .map((c) => {
@@ -84,13 +91,9 @@ export async function analyzeGitHealth(siteConfig, startDate, endDate) {
84
91
  date,
85
92
  message,
86
93
  author,
87
- version: tagMap.get(sha) // may be undefined
88
94
  };
89
95
  })
90
- .filter(Boolean)
91
- // Filter out trivial version-only commits if necessary
92
- .filter(commit => !/^\d+\.\d+\.\d+$/.test(commit.message.trim()))
93
- .slice(0, (startDate && endDate) ? 100 : 20);
96
+ .filter(Boolean);
94
97
  return {
95
98
  commits,
96
99
  timestamp: new Date().toISOString(),
@@ -102,7 +105,7 @@ export async function analyzeGitHealth(siteConfig, startDate, endDate) {
102
105
  commits: [],
103
106
  timestamp: new Date().toISOString(),
104
107
  status: 'error',
105
- error: error instanceof Error ? error.message : String(error)
108
+ error: error instanceof Error ? `${error.message}${error.stack ? '\n' + error.stack : ''}` : String(error)
106
109
  };
107
110
  }
108
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).toLocaleDateString(),
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 sitemapUrl = `${baseUrl}/sitemap.xml`;
1123
- const response = await fetch(sitemapUrl);
1124
- if (!response.ok) {
1125
- throw new Error(`Failed to fetch sitemap: ${response.status}`);
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 urls = [];
1132
- let match;
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 urlObj = new URL(url);
1138
- if (urlObj.hostname === baseUrlObj.hostname) {
1139
- const pathname = urlObj.pathname.toLowerCase();
1140
- // Exclude common non-page directories and files
1141
- const isExcluded = EXCLUDED_URL_PATTERNS.some(pattern => pathname.includes(pattern)) ||
1142
- pathname.match(EXCLUDED_FILE_EXTENSIONS) ||
1143
- EXCLUDED_DIRECTORY_NAMES.some(dir => pathname.endsWith(`/${dir}`));
1144
- if (!isExcluded) {
1145
- urls.push(url);
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
- // Invalid URL, skip
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); // Limit to 20 pages to prevent excessive analysis
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
- // Check if the local path exists and has package.json
9
- if (!fs.existsSync(localPath)) {
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(localPath, 'package.json');
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: 30000 // 30 second timeout
119
+ timeout: 120000 // 2 minute timeout (audits can take longer)
93
120
  });
94
121
  return JSON.parse(stdout);
95
122
  }
@@ -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
+ });
@@ -74,6 +74,8 @@ export interface SearchConsoleResponse {
74
74
  success: boolean;
75
75
  data?: SearchConsoleChartDataPoint[];
76
76
  error?: string;
77
+ code?: number;
78
+ details?: string;
77
79
  }
78
80
  /**
79
81
  * Get Google Search Console data for a site with current/previous period comparison
@@ -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;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;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,CAyGhC"}
1
+ {"version":3,"file":"google.api.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/google.api.integration.ts"],"names":[],"mappings":"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"}
@@ -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,CA8D9E"}
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-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,2CAgEhF;yBAhEe,aAAa"}
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"}
@@ -3,7 +3,6 @@ export interface GitCommit {
3
3
  date: string;
4
4
  message: string;
5
5
  author: string;
6
- version?: string;
7
6
  }
8
7
  export interface GitHealthResult {
9
8
  commits: GitCommit[];
@@ -13,14 +12,18 @@ export interface GitHealthResult {
13
12
  }
14
13
  export interface SiteConfig {
15
14
  name: string;
16
- /** Optional: repo name or owner/repo */
15
+ /** Optional: explicit repository identifier (e.g., "owner/repo" or just "repo") */
16
+ repo?: string;
17
+ /** Optional: remote name (legacy) */
17
18
  remote?: string;
18
19
  /** Optional explicit repo owner */
19
20
  owner?: string;
21
+ /** Optional local path used to derive repo name if needed */
22
+ localPath?: string;
20
23
  }
21
24
  /**
22
25
  * Analyze git repository health for a site using the GitHub REST API.
23
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":"AAIA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;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,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgH7H"}
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"}
@@ -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;AA6dD;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA6KtF"}
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,CAqF1F"}
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"}
@@ -169,6 +169,10 @@ export declare const SECRET_CONFIG_KEYS: {
169
169
  paypal: string[];
170
170
  };
171
171
  };
172
+ export interface PuppeteerConfig {
173
+ executable_path?: string;
174
+ cache_dir?: string;
175
+ }
172
176
  export interface PixelatedConfig {
173
177
  global?: GlobalConfig;
174
178
  aws?: AWSConfig;
@@ -187,5 +191,6 @@ export interface PixelatedConfig {
187
191
  nextAuth?: NextAuth;
188
192
  paypal?: PaypalConfig;
189
193
  wordpress?: WordpressConfig;
194
+ puppeteer?: PuppeteerConfig;
190
195
  }
191
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":"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"}
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../../src/components/general/sitemap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sitemap.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.test.d.ts","sourceRoot":"","sources":["../../../../src/components/general/sitemap.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run-analyzeGitHealth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-analyzeGitHealth.d.ts","sourceRoot":"","sources":["../../../src/test/run-analyzeGitHealth.ts"],"names":[],"mappings":""}
@@ -27,6 +27,7 @@ declare function renderWithProviders(ui: ReactElement, { config, ...renderOption
27
27
  nextAuth?: import("@/components/config/config.types").NextAuth;
28
28
  paypal?: import("@/components/config/config.types").PaypalConfig;
29
29
  wordpress?: import("@/components/config/config.types").WordpressConfig;
30
+ puppeteer?: import("@/components/config/config.types").PuppeteerConfig;
30
31
  };
31
32
  container: HTMLElement;
32
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;;;;;;;;;;;;;;;;;;;;;;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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=site-health-github.integration.test.d.ts.map
@@ -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.5",
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.3",
106
- "@babel/core": "^7.28.5",
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.5",
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.6",
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.52.0",
126
- "@typescript-eslint/parser": "^8.52.0",
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.16",
129
- "@vitest/ui": "^4.0.16",
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.16",
164
+ "vitest": "^4.0.17",
165
165
  "webpack": "^5.104.1",
166
166
  "webpack-cli": "^6.0.1",
167
- "webpack-dev-server": "^5.2.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.966.0",
177
- "@aws-sdk/client-route-53": "^3.966.0",
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.34.0",
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
- });
@@ -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":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=github.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github.integration.test.d.ts","sourceRoot":"","sources":["../../../src/tests/github.integration.test.ts"],"names":[],"mappings":""}