Compare commits

...

5 Commits

Author SHA1 Message Date
5809291741 chore: bump version to 2.3.22-rc.11
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 6s
Build & Deploy / 🧪 QA (push) Successful in 1m22s
Build & Deploy / 🏗️ Build (push) Successful in 2m51s
Build & Deploy / 🚀 Deploy (push) Successful in 13s
Build & Deploy / 🧪 Post-Deploy Verification (push) Failing after 1m2s
Build & Deploy / 🔔 Notify (push) Successful in 1s
2026-05-06 13:16:04 +02:00
e263e7f25c feat(contact): add local jsonl backup for fail-safe lead retention
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 10s
Build & Deploy / 🧪 QA (push) Successful in 52s
Build & Deploy / 🏗️ Build (push) Successful in 1m48s
Build & Deploy / 🚀 Deploy (push) Successful in 12s
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 1s
2026-05-06 12:50:07 +02:00
1fee592ee7 chore(tests): simplify and optimize smoke test image validation
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 6s
Build & Deploy / 🧪 QA (push) Successful in 48s
Build & Deploy / 🏗️ Build (push) Successful in 1m42s
Build & Deploy / 🚀 Deploy (push) Successful in 12s
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s
2026-05-04 22:22:08 +02:00
ff73aa7c4e fix: use setup-chrome action to install chromium and system dependencies
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 6s
Build & Deploy / 🧪 QA (push) Successful in 49s
Build & Deploy / 🏗️ Build (push) Successful in 1m40s
Build & Deploy / 🚀 Deploy (push) Successful in 13s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 2m8s
Build & Deploy / 🔔 Notify (push) Successful in 2s
2026-05-04 22:10:36 +02:00
26f6ddc098 fix: ignore apt-get update errors and clear ppas
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 7s
Build & Deploy / 🧪 QA (push) Successful in 1m16s
Build & Deploy / 🏗️ Build (push) Successful in 2m41s
Build & Deploy / 🚀 Deploy (push) Successful in 11s
Build & Deploy / 🧪 Post-Deploy Verification (push) Failing after 29s
Build & Deploy / 🔔 Notify (push) Successful in 2s
2026-05-04 22:01:43 +02:00
4 changed files with 52 additions and 13 deletions

View File

@@ -394,10 +394,11 @@ jobs:
run: |
pnpm store prune
pnpm install --no-frozen-lockfile
- name: 🌐 Install Chrome & Dependencies
run: |
apt-get update && apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 libgbm1 libasound2t64 libpango-1.0-0 libcairo2
npx puppeteer browsers install chrome
- name: Setup Chrome
id: setup-chrome
uses: browser-actions/setup-chrome@v1
with:
install-dependencies: true
# ── Minimalist Smoke Test ──────────────────────────────────────────
- name: 🌐 Smoke Test (Essential Flow)
@@ -405,6 +406,7 @@ jobs:
env:
NEXT_PUBLIC_BASE_URL: ${{ needs.prepare.outputs.next_public_url }}
GATEKEEPER_PASSWORD: ${{ secrets.GATEKEEPER_PASSWORD || 'klz2026' }}
PUPPETEER_EXECUTABLE_PATH: ${{ steps.setup-chrome.outputs.chrome-path }}
run: npx tsx scripts/smoke.ts
# ──────────────────────────────────────────────────────────────────────────────

View File

@@ -45,6 +45,28 @@ export async function sendContactFormAction(formData: FormData) {
email,
});
// 1.5. Simple Fail-Safe Backup to Disk
// To ensure leads are never lost if email fails or Gotify is down, we append them to a local JSON Lines file.
try {
const fs = await import('fs');
const path = await import('path');
const backupDir = path.join(process.cwd(), '.data');
if (!fs.existsSync(backupDir)) fs.mkdirSync(backupDir, { recursive: true });
const backupFile = path.join(backupDir, 'leads-backup.jsonl');
const leadData = {
timestamp: new Date().toISOString(),
name,
email,
productName,
message,
};
fs.appendFileSync(backupFile, JSON.stringify(leadData) + '\\n');
logger.info('Successfully saved lead to local backup file', { backupFile });
} catch (backupError) {
logger.error('Failed to write to local leads backup', { error: String(backupError) });
}
// 2. Send Emails
logger.info('Sending branded emails', { email, productName });

View File

@@ -113,7 +113,7 @@
"prepare": "husky",
"preinstall": "npx only-allow pnpm"
},
"version": "2.3.22-rc.8",
"version": "2.3.22-rc.11",
"pnpm": {
"onlyBuiltDependencies": [
"@parcel/watcher",

View File

@@ -8,6 +8,7 @@ async function run() {
const browser = await puppeteer.launch({
headless: true,
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || undefined,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
const page = await browser.newPage();
@@ -33,16 +34,30 @@ async function run() {
const res = await page.goto(`${targetUrl}${p}`, { waitUntil: 'domcontentloaded' });
if (res?.status() !== 200) throw new Error(`Page ${p} returned ${res?.status()}`);
// Check for broken images on this page
const images = await page.$$eval('img', (imgs) => imgs.map((img) => img.src));
// Check for broken images (using in-page fetch to preserve session and avoid heavy navigation)
const images = await page.$$eval('img', (imgs) => imgs.map((img) => img.src).filter(Boolean));
console.log(` Checking ${images.length} images...`);
for (const src of images.slice(0, 5)) {
// Check first 5 images per page
const imgRes = await page.goto(src, { waitUntil: 'domcontentloaded' }).catch(() => null);
if (imgRes && imgRes.status() >= 400)
console.warn(` ⚠️ Broken image: ${src} (${imgRes.status()})`);
const brokenImages = await page.evaluate(async (urls) => {
const broken: string[] = [];
await Promise.all(
urls.map(async (url) => {
try {
const res = await fetch(url, { method: 'HEAD' });
if (res.status >= 400) broken.push(`${url} (Status: ${res.status})`);
} catch (e) {
broken.push(`${url} (Fetch failed)`);
}
}),
);
return broken;
}, images);
if (brokenImages.length > 0) {
throw new Error(
`Found ${brokenImages.length} broken images on ${p}:\n${brokenImages.join('\n')}`,
);
}
await page.goto(`${targetUrl}${p}`, { waitUntil: 'domcontentloaded' }); // Go back
}
// 3. Test Contact Form