From cf1a248e425c755be94a120e3318fab3ec875aa9 Mon Sep 17 00:00:00 2001 From: Vula Builder Date: Tue, 15 Sep 2026 18:02:53 +0000 Subject: [PATCH] Deploy --- src/app/robots.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/app/robots.ts diff --git a/src/app/robots.ts b/src/app/robots.ts new file mode 100644 index 0000000..fe6f727 --- /dev/null +++ b/src/app/robots.ts @@ -0,0 +1,33 @@ +import type { MetadataRoute } from 'next' + +export const revalidate = 3600 + +async function siteUrl(): Promise { + const base = process.env.NEXT_PUBLIC_VULA_COMMERCE_URL + const id = process.env.NEXT_PUBLIC_VULA_PROJECT_ID + if (!base || !id) return null + try { + const res = await fetch(base + '/api/public/profile/' + id, { next: { revalidate: 3600 } }) + if (!res.ok) return null + const url = (await res.json())?.profile?.siteUrl + return typeof url === 'string' && url.startsWith('http') ? url.replace(/\/$/, '') : null + } catch { + return null + } +} + +export default async function robots(): Promise { + const origin = await siteUrl() + return { + rules: { + userAgent: '*', + allow: '/', + // One customer's booking, a half-filled basket, somebody's account. + // None of these belong in a search result. + disallow: ['/b/', '/checkout', '/account/', '/api/'], + }, + // Named only when we know the address. Pointing at a sitemap that is not + // there is a fault a crawler reports and nobody sees. + ...(origin ? { sitemap: origin + '/sitemap.xml' } : {}), + } +}