Merge pull request #59 from davidmonterocrespo24/website

Website
pull/74/head
David Montero Crespo 2026-03-23 18:56:49 -03:00 committed by GitHub
commit 6f76aaa224
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 257 additions and 40 deletions

View File

@ -56,6 +56,12 @@ jobs:
cache-from: type=gha cache-from: type=gha
cache-to: type=gha,mode=max cache-to: type=gha,mode=max
- name: Ping search engines with sitemap
if: success()
run: |
curl -s "https://www.google.com/ping?sitemap=https%3A%2F%2Fvelxio.dev%2Fsitemap.xml" -o /dev/null -w "Google ping: %{http_code}\n"
curl -s "https://www.bing.com/ping?sitemap=https%3A%2F%2Fvelxio.dev%2Fsitemap.xml" -o /dev/null -w "Bing ping: %{http_code}\n"
- name: Update Docker Hub description - name: Update Docker Hub description
uses: peter-evans/dockerhub-description@v4 uses: peter-evans/dockerhub-description@v4
with: with:

View File

@ -8,9 +8,10 @@
"generate:metadata": "cd .. && npx tsx scripts/generate-component-metadata.ts", "generate:metadata": "cd .. && npx tsx scripts/generate-component-metadata.ts",
"generate:favicons": "node ../scripts/generate-favicons.mjs", "generate:favicons": "node ../scripts/generate-favicons.mjs",
"generate:og-image": "node ../scripts/generate-og-image.mjs", "generate:og-image": "node ../scripts/generate-og-image.mjs",
"generate:sitemap": "cd .. && npx tsx scripts/generate-sitemap.ts",
"dev": "npm run generate:metadata && vite", "dev": "npm run generate:metadata && vite",
"build": "npm run generate:metadata && tsc -b && vite build", "build": "npm run generate:metadata && npm run generate:sitemap && tsc -b && vite build",
"build:docker": "vite build", "build:docker": "npm run generate:sitemap && vite build",
"lint": "eslint .", "lint": "eslint .",
"preview": "vite preview", "preview": "vite preview",
"test": "vitest run", "test": "vitest run",

View File

@ -2,192 +2,162 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml"> xmlns:xhtml="http://www.w3.org/1999/xhtml">
<!-- ── Main pages ─────────────────────────────────── -->
<url> <url>
<loc>https://velxio.dev/</loc> <loc>https://velxio.dev/</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>1.0</priority> <priority>1</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/editor</loc> <loc>https://velxio.dev/editor</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.9</priority> <priority>0.9</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/examples</loc> <loc>https://velxio.dev/examples</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<!-- ── Documentation ──────────────────────────────── -->
<url> <url>
<loc>https://velxio.dev/docs</loc> <loc>https://velxio.dev/docs</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/intro</loc> <loc>https://velxio.dev/docs/intro</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/getting-started</loc> <loc>https://velxio.dev/docs/getting-started</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/emulator</loc> <loc>https://velxio.dev/docs/emulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/esp32-emulation</loc> <loc>https://velxio.dev/docs/esp32-emulation</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/riscv-emulation</loc> <loc>https://velxio.dev/docs/riscv-emulation</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/rp2040-emulation</loc> <loc>https://velxio.dev/docs/rp2040-emulation</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/raspberry-pi3-emulation</loc> <loc>https://velxio.dev/docs/raspberry-pi3-emulation</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/components</loc> <loc>https://velxio.dev/docs/components</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/architecture</loc> <loc>https://velxio.dev/docs/architecture</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/wokwi-libs</loc> <loc>https://velxio.dev/docs/wokwi-libs</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/mcp</loc> <loc>https://velxio.dev/docs/mcp</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/setup</loc> <loc>https://velxio.dev/docs/setup</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.6</priority> <priority>0.6</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/docs/roadmap</loc> <loc>https://velxio.dev/docs/roadmap</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.6</priority> <priority>0.6</priority>
</url> </url>
<!-- ── SEO keyword landing pages ──────────────────── -->
<url> <url>
<loc>https://velxio.dev/arduino-simulator</loc> <loc>https://velxio.dev/arduino-simulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.9</priority> <priority>0.9</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/arduino-emulator</loc> <loc>https://velxio.dev/arduino-emulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.9</priority> <priority>0.9</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/atmega328p-simulator</loc> <loc>https://velxio.dev/atmega328p-simulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.85</priority> <priority>0.85</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/arduino-mega-simulator</loc> <loc>https://velxio.dev/arduino-mega-simulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.85</priority> <priority>0.85</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/esp32-simulator</loc> <loc>https://velxio.dev/esp32-simulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.9</priority> <priority>0.9</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/esp32-s3-simulator</loc> <loc>https://velxio.dev/esp32-s3-simulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.85</priority> <priority>0.85</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/esp32-c3-simulator</loc> <loc>https://velxio.dev/esp32-c3-simulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.85</priority> <priority>0.85</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/raspberry-pi-pico-simulator</loc> <loc>https://velxio.dev/raspberry-pi-pico-simulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.9</priority> <priority>0.9</priority>
</url> </url>
<url> <url>
<loc>https://velxio.dev/raspberry-pi-simulator</loc> <loc>https://velxio.dev/raspberry-pi-simulator</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
<changefreq>monthly</changefreq> <changefreq>monthly</changefreq>
<priority>0.85</priority> <priority>0.85</priority>
</url> </url>
<!-- ── Release pages ────────────────────────────────── -->
<url> <url>
<loc>https://velxio.dev/v2</loc> <loc>https://velxio.dev/v2</loc>
<lastmod>2026-03-23</lastmod> <lastmod>2026-03-23</lastmod>
@ -195,6 +165,4 @@
<priority>0.9</priority> <priority>0.9</priority>
</url> </url>
<!-- Auth/admin/project pages intentionally excluded (noindex) -->
</urlset> </urlset>

View File

@ -233,6 +233,64 @@
background: #484848; background: #484848;
} }
/* ── Repository cards ────────────────────────────────── */
.v2-repos {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 10px;
}
.v2-repo-card {
display: flex;
align-items: flex-start;
gap: 12px;
background: #121214;
border: 1px solid #1c1c1e;
border-radius: 10px;
padding: 1rem 1.15rem;
text-decoration: none;
transition: border-color 0.2s, transform 0.15s;
}
.v2-repo-card:hover {
border-color: #333;
transform: translateY(-1px);
}
.v2-repo-card > svg {
flex-shrink: 0;
margin-top: 2px;
color: #8b949e;
fill: #8b949e;
}
.v2-repo-card h3 {
font-size: 0.85rem;
font-weight: 600;
color: #e6edf3;
margin: 0 0 3px;
}
.v2-repo-card p {
font-size: 0.78rem;
color: #8b949e;
margin: 0;
line-height: 1.5;
}
.v2-repo-card--primary {
border-color: rgba(0, 122, 204, 0.3);
background: rgba(0, 122, 204, 0.06);
}
.v2-repo-card--primary:hover {
border-color: #007acc;
}
.v2-repo-card--primary h3 {
color: #007acc;
}
/* ── Bottom community ────────────────────────────────── */ /* ── Bottom community ────────────────────────────────── */
.v2-bottom-community { .v2-bottom-community {
display: flex; display: flex;

View File

@ -118,7 +118,7 @@ const JSON_LD: object[] = [
operatingSystem: 'Any (browser-based)', operatingSystem: 'Any (browser-based)',
softwareVersion: '2.0.0', softwareVersion: '2.0.0',
description: description:
'Velxio 2.0 — a free, open-source multi-board embedded systems simulator. 19 boards, 5 CPU architectures, QEMU-based ESP32 emulation, sensor simulation, 68+ examples. Runs in your browser.', 'Velxio 2.0 — simulate Arduino, ESP32, Raspberry Pi Pico, and Raspberry Pi 3 in your browser. 19 boards, 68+ examples, realistic sensor simulation. Free and open-source.',
url: 'https://velxio.dev/v2', url: 'https://velxio.dev/v2',
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' }, offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
author: { '@type': 'Person', name: 'David Montero Crespo' }, author: { '@type': 'Person', name: 'David Montero Crespo' },
@ -236,7 +236,7 @@ export const Velxio2Page: React.FC = () => {
useSEO({ useSEO({
title: 'Velxio 2.0 — Multi-Board Embedded Simulator | ESP32, Raspberry Pi, Arduino, RISC-V', title: 'Velxio 2.0 — Multi-Board Embedded Simulator | ESP32, Raspberry Pi, Arduino, RISC-V',
description: description:
'Velxio 2.0 is here. 19 boards, 5 CPU architectures, QEMU-based ESP32 emulation, realistic sensor simulation, 68+ examples. A free, open-source multi-platform embedded systems simulator.', 'Velxio 2.0 is here. Simulate Arduino, ESP32, Raspberry Pi Pico, and Raspberry Pi 3 in your browser. 19 boards, 68+ examples, realistic sensor simulation. Free and open-source.',
url: 'https://velxio.dev/v2', url: 'https://velxio.dev/v2',
jsonLd: JSON_LD, jsonLd: JSON_LD,
}); });
@ -255,9 +255,9 @@ export const Velxio2Page: React.FC = () => {
<span className="accent">Multi-Platform Embedded Simulator</span> <span className="accent">Multi-Platform Embedded Simulator</span>
</h1> </h1>
<p className="subtitle"> <p className="subtitle">
19 boards across 5 CPU architectures AVR8, RP2040, RISC-V, Xtensa, and ARM Linux. Simulate Arduino, ESP32, Raspberry Pi Pico, and Raspberry Pi 3 in your browser.
QEMU-based ESP32 emulation, realistic sensor simulation, 68+ ready-to-run examples. 19 boards, 68+ ready-to-run examples, realistic sensor simulation.
Free, open-source, runs in your browser. Free, open-source, no install needed.
</p> </p>
<div className="seo-cta-group"> <div className="seo-cta-group">
<Link to="/editor" className="seo-btn-primary"> <Link to="/editor" className="seo-btn-primary">
@ -479,6 +479,72 @@ export const Velxio2Page: React.FC = () => {
</div> </div>
</section> </section>
{/* ── Open-source libraries ── */}
<section className="seo-section">
<h2>Built on open-source</h2>
<p className="lead">
Velxio is powered by these open-source projects. Without them, none of this would be possible.
</p>
<div className="v2-repos">
<a href="https://github.com/wokwi/avr8js" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
<IcoGitHub />
<div>
<h3>avr8js</h3>
<p>AVR8 CPU emulator in JavaScript powers Arduino Uno, Nano, Mega simulation</p>
</div>
</a>
<a href="https://github.com/wokwi/rp2040js" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
<IcoGitHub />
<div>
<h3>rp2040js</h3>
<p>RP2040 emulator powers Raspberry Pi Pico and Pico W simulation</p>
</div>
</a>
<a href="https://github.com/wokwi/wokwi-elements" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
<IcoGitHub />
<div>
<h3>wokwi-elements</h3>
<p>Web Components for electronic parts LEDs, buttons, sensors, displays, and more</p>
</div>
</a>
<a href="https://github.com/wokwi/wokwi-boards" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
<IcoGitHub />
<div>
<h3>wokwi-boards</h3>
<p>SVG board definitions for Arduino, ESP32, Raspberry Pi Pico, and other boards</p>
</div>
</a>
<a href="https://github.com/lcgamboa/qemu" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
<IcoGitHub />
<div>
<h3>QEMU (lcgamboa fork)</h3>
<p>QEMU fork with ESP32 Xtensa LX6/LX7 emulation support</p>
</div>
</a>
<a href="https://github.com/espressif/qemu" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
<IcoGitHub />
<div>
<h3>QEMU (Espressif)</h3>
<p>Official Espressif QEMU fork for ESP32 development and testing</p>
</div>
</a>
<a href="https://github.com/wokwi/wokwi-features" target="_blank" rel="noopener noreferrer" className="v2-repo-card">
<IcoGitHub />
<div>
<h3>wokwi-features</h3>
<p>Feature tracking and component specifications for the Wokwi ecosystem</p>
</div>
</a>
<a href={GITHUB_URL} target="_blank" rel="noopener noreferrer" className="v2-repo-card v2-repo-card--primary">
<IcoGitHub />
<div>
<h3>Velxio</h3>
<p>This project free, open-source multi-board embedded simulator</p>
</div>
</a>
</div>
</section>
{/* ── Bottom CTA ── */} {/* ── Bottom CTA ── */}
<div className="seo-bottom"> <div className="seo-bottom">
<h2>Try Velxio 2.0 now</h2> <h2>Try Velxio 2.0 now</h2>

59
frontend/src/seoRoutes.ts Normal file
View File

@ -0,0 +1,59 @@
/**
* Single source of truth for all public, indexable routes.
* Used by:
* 1. scripts/generate-sitemap.ts builds sitemap.xml at build time
* 2. Any component that needs the canonical URL list
*
* Routes with `noindex: true` are excluded from the sitemap.
*/
export interface SeoRoute {
path: string;
/** 0.0 1.0 (default 0.5) */
priority?: number;
changefreq?: 'daily' | 'weekly' | 'monthly' | 'yearly';
/** If true, excluded from sitemap */
noindex?: boolean;
}
export const SEO_ROUTES: SeoRoute[] = [
// ── Main pages
{ path: '/', priority: 1.0, changefreq: 'weekly' },
{ path: '/editor', priority: 0.9, changefreq: 'weekly' },
{ path: '/examples', priority: 0.8, changefreq: 'weekly' },
// ── Documentation
{ path: '/docs', priority: 0.8, changefreq: 'monthly' },
{ path: '/docs/intro', priority: 0.8, changefreq: 'monthly' },
{ path: '/docs/getting-started', priority: 0.8, changefreq: 'monthly' },
{ path: '/docs/emulator', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/esp32-emulation', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/riscv-emulation', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/rp2040-emulation', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/raspberry-pi3-emulation', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/components', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/architecture', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/wokwi-libs', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/mcp', priority: 0.7, changefreq: 'monthly' },
{ path: '/docs/setup', priority: 0.6, changefreq: 'monthly' },
{ path: '/docs/roadmap', priority: 0.6, changefreq: 'monthly' },
// ── SEO keyword landing pages
{ path: '/arduino-simulator', priority: 0.9, changefreq: 'monthly' },
{ path: '/arduino-emulator', priority: 0.9, changefreq: 'monthly' },
{ path: '/atmega328p-simulator', priority: 0.85, changefreq: 'monthly' },
{ path: '/arduino-mega-simulator', priority: 0.85, changefreq: 'monthly' },
{ path: '/esp32-simulator', priority: 0.9, changefreq: 'monthly' },
{ path: '/esp32-s3-simulator', priority: 0.85, changefreq: 'monthly' },
{ path: '/esp32-c3-simulator', priority: 0.85, changefreq: 'monthly' },
{ path: '/raspberry-pi-pico-simulator', priority: 0.9, changefreq: 'monthly' },
{ path: '/raspberry-pi-simulator', priority: 0.85, changefreq: 'monthly' },
// ── Release pages
{ path: '/v2', priority: 0.9, changefreq: 'monthly' },
// ── Auth / admin (noindex)
{ path: '/login', noindex: true },
{ path: '/register', noindex: true },
{ path: '/admin', noindex: true },
];

View File

@ -0,0 +1,59 @@
/**
* Auto-generates frontend/public/sitemap.xml from seoRoutes.ts
* Run: npx tsx scripts/generate-sitemap.ts
* Integrated into: npm run build (via generate:sitemap)
*/
import { writeFileSync } from 'fs';
import { resolve } from 'path';
// Import the single source of truth
import { SEO_ROUTES } from '../frontend/src/seoRoutes';
const DOMAIN = 'https://velxio.dev';
const TODAY = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
const indexableRoutes = SEO_ROUTES.filter((r) => !r.noindex);
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
${indexableRoutes
.map(
(r) => `
<url>
<loc>${DOMAIN}${r.path}</loc>
<lastmod>${TODAY}</lastmod>
<changefreq>${r.changefreq ?? 'monthly'}</changefreq>
<priority>${r.priority ?? 0.5}</priority>
</url>`
)
.join('')}
</urlset>
`;
const outPath = resolve(__dirname, '../frontend/public/sitemap.xml');
writeFileSync(outPath, xml.trimStart(), 'utf-8');
console.log(`sitemap.xml generated → ${indexableRoutes.length} URLs (${TODAY})`);
// Also ping Google & Bing sitemap endpoints (non-blocking, best-effort)
const SITEMAP_URL = `${DOMAIN}/sitemap.xml`;
const PING_URLS = [
`https://www.google.com/ping?sitemap=${encodeURIComponent(SITEMAP_URL)}`,
`https://www.bing.com/ping?sitemap=${encodeURIComponent(SITEMAP_URL)}`,
];
if (process.argv.includes('--ping')) {
console.log('Pinging search engines...');
Promise.allSettled(
PING_URLS.map(async (url) => {
try {
const res = await fetch(url);
console.log(` ${res.ok ? 'OK' : 'FAIL'} ${url.split('?')[0]}`);
} catch (e: any) {
console.log(` FAIL ${url.split('?')[0]}: ${e.message}`);
}
})
);
}