@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.
Files changed (45) 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-cloudwatch.integration.js +10 -1
  4. package/dist/components/admin/site-health/site-health-core-web-vitals.integration.js +11 -0
  5. package/dist/components/admin/site-health/site-health-github.integration.js +83 -53
  6. package/dist/components/admin/site-health/site-health-github.js +2 -3
  7. package/dist/components/admin/site-health/site-health-on-site-seo.integration.js +59 -23
  8. package/dist/components/admin/site-health/site-health-security.integration.js +32 -5
  9. package/dist/components/config/config.types.js +11 -3
  10. package/dist/components/general/sitemap.js +14 -0
  11. package/dist/components/general/sitemap.test.js +19 -0
  12. package/dist/test/run-analyzeGitHealth.js +50 -0
  13. package/dist/types/components/admin/site-health/google.api.integration.d.ts +2 -0
  14. package/dist/types/components/admin/site-health/google.api.integration.d.ts.map +1 -1
  15. package/dist/types/components/admin/site-health/site-health-axe-core.integration.d.ts +1 -1
  16. package/dist/types/components/admin/site-health/site-health-axe-core.integration.d.ts.map +1 -1
  17. package/dist/types/components/admin/site-health/site-health-cloudwatch.integration.d.ts.map +1 -1
  18. package/dist/types/components/admin/site-health/site-health-core-web-vitals.integration.d.ts.map +1 -1
  19. package/dist/types/components/admin/site-health/site-health-github.d.ts.map +1 -1
  20. package/dist/types/components/admin/site-health/site-health-github.integration.d.ts +11 -8
  21. package/dist/types/components/admin/site-health/site-health-github.integration.d.ts.map +1 -1
  22. package/dist/types/components/admin/site-health/site-health-on-site-seo.integration.d.ts.map +1 -1
  23. package/dist/types/components/admin/site-health/site-health-security.integration.d.ts +1 -1
  24. package/dist/types/components/admin/site-health/site-health-security.integration.d.ts.map +1 -1
  25. package/dist/types/components/config/config.types.d.ts +25 -1
  26. package/dist/types/components/config/config.types.d.ts.map +1 -1
  27. package/dist/types/components/general/sitemap.d.ts +10 -0
  28. package/dist/types/components/general/sitemap.d.ts.map +1 -1
  29. package/dist/types/components/general/sitemap.test.d.ts +2 -0
  30. package/dist/types/components/general/sitemap.test.d.ts.map +1 -0
  31. package/dist/types/test/run-analyzeGitHealth.d.ts +2 -0
  32. package/dist/types/test/run-analyzeGitHealth.d.ts.map +1 -0
  33. package/dist/types/test/test-utils.d.ts +3 -0
  34. package/dist/types/test/test-utils.d.ts.map +1 -1
  35. package/dist/types/tests/site-health-axe-core.integration.test.d.ts.map +1 -0
  36. package/dist/types/tests/site-health-core-web-vitals.integration.test.d.ts.map +1 -0
  37. package/dist/types/tests/site-health-github.integration.test.d.ts +2 -0
  38. package/dist/types/tests/site-health-github.integration.test.d.ts.map +1 -0
  39. package/package.json +14 -14
  40. package/dist/components/admin/site-health/site-health-axe-core.integration.test.js +0 -79
  41. package/dist/components/admin/site-health/site-health-core-web-vitals.integration.test.js +0 -33
  42. package/dist/types/components/admin/site-health/site-health-axe-core.integration.test.d.ts.map +0 -1
  43. package/dist/types/components/admin/site-health/site-health-core-web-vitals.integration.test.d.ts.map +0 -1
  44. /package/dist/types/{components/admin/site-health → tests}/site-health-axe-core.integration.test.d.ts +0 -0
  45. /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 });
@@ -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
- * Git Health Integration Services
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
- const execAsync = promisify(exec);
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 { localPath } = siteConfig;
16
- // Check if the local path exists and is a git repository
17
- if (!fs.existsSync(localPath)) {
18
- throw new Error('Site directory not found');
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
- const gitDir = path.join(localPath, '.git');
21
- if (!fs.existsSync(gitDir)) {
22
- throw new Error('Not a git repository');
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
- // Build git log command with date range
25
- let sinceOption = '--since="30 days ago"';
26
- if (startDate && endDate) {
27
- sinceOption = `--since="${startDate}" --before="${endDate}"`;
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
- else if (startDate) {
30
- sinceOption = `--since="${startDate}"`;
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
- else if (endDate) {
33
- sinceOption = `--before="${endDate}"`;
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
- // Get git log
36
- const gitCommand = `git log --oneline ${sinceOption} --pretty=format:"%H|%ad|%s|%an" --date=iso`;
37
- const { stdout: logOutput } = await execAsync(gitCommand, { cwd: localPath });
38
- const commits = logOutput
39
- .trim()
40
- .split('\n')
41
- .filter(line => line.trim())
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(commit => !/^\d+\.\d+\.\d+$/.test(commit.message.trim())) // Filter out version-only commits
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 : 'Failed to analyze git health'
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).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
  }
@@ -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
+ });
@@ -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-cloudwatch.integration.d.ts","sourceRoot":"","sources":["../../../../../src/components/admin/site-health/site-health-cloudwatch.integration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,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,CAyIxC"}
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"}
@@ -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":"AAEA,OAAO,EAAE,iBAAiB,EAAoC,MAAM,qBAAqB,CAAC;AAkC1F,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,CA6D5D"}
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,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"}
@@ -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
- localPath: string;
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":"AAAA;;;GAGG;AASH,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,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA6E7H"}
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"}
@@ -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
- paypal: string[];
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":"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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":""}
@@ -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;;;;;;;;;;;;;;;;;;;;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.3",
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":""}