@jdevalk/astro-seo-graph 2.0.0 → 2.1.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"integration.js","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, readdir, writeFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { submitToIndexNow } from '@jdevalk/seo-graph-core';\nimport { renderLlmsTxt, type LlmsTxtSection } from './llms-txt.js';\nimport {\n buildUrlManifest,\n changedUrls,\n diffManifests,\n hashContent,\n parseManifest,\n serializeManifest,\n type ManifestEntry,\n type UrlManifest,\n} from './indexnow-manifest.js';\n\n// Narrow shape of the Astro integration hook we use. We don't import\n// Astro types here to keep this package installable without `astro`\n// present at type-check time (it's a peer dep).\ninterface BuildDoneHook {\n dir: URL;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n logger: { warn: (msg: string) => void; info: (msg: string) => void; [key: string]: any };\n}\n\n/**\n * Subset of `AstroConfig` we read in `astro:config:setup`. Only the\n * fields we actually use, so the integration stays decoupled from\n * Astro's full type surface.\n */\ninterface ConfigSetupHook {\n config: {\n site?: string | URL;\n trailingSlash?: 'always' | 'never' | 'ignore';\n redirects?: Record<string, string | { status?: number; destination: string } | undefined>;\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n updateConfig: (patch: Record<string, any>) => void;\n}\n\ninterface AstroIntegrationLike {\n name: string;\n hooks: {\n 'astro:config:setup'?: (args: ConfigSetupHook) => void | Promise<void>;\n 'astro:build:done'?: (args: BuildDoneHook) => void | Promise<void>;\n };\n}\n\nexport interface IndexNowIntegrationOptions {\n /** IndexNow key (8–128 chars from `[A-Za-z0-9-]`). Required to enable submission. */\n key: string;\n /** Bare host, e.g. `example.com`. */\n host: string;\n /**\n * Absolute site origin used to resolve built HTML paths into URLs\n * for submission. E.g. `https://example.com`. Trailing slash is\n * tolerated.\n */\n siteUrl: string;\n /**\n * Optional absolute URL to the key file. Defaults to\n * `https://<host>/<key>.txt`.\n */\n keyLocation?: string;\n /**\n * Override the IndexNow endpoint. Defaults to the neutral aggregator\n * at `api.indexnow.org`.\n */\n endpoint?: string;\n /**\n * Filter the list of URLs before submission. Return `false` to skip\n * a URL. Composed on top of the built-in `/404` exclusion — you\n * don't need to re-exclude that yourself.\n *\n * @example excluding paginated archives in addition to the default 404:\n * ```ts\n * filter: (url) => !/^\\/blog\\/\\d+\\/$/.test(new URL(url).pathname),\n * ```\n */\n filter?: (url: string) => boolean;\n /**\n * Submit only URLs that changed since the last build, instead of the\n * whole site every time (the IndexNow spec asks for added/updated/\n * deleted URLs only, and full resubmits can trip per-host rate limits).\n *\n * Enabled with `true` (defaults) or an options object. On each build the\n * integration hashes every eligible page into a manifest, fetches the\n * previously published manifest from the live site, diffs them, and\n * submits only the difference — then writes the new manifest into the\n * build output so it ships with this deploy and becomes the next baseline.\n *\n * The previous state lives on the live site (not local disk or a\n * key/value store), so this works the same whether you build locally or\n * in CI, and adds no infrastructure. Default is off (full submit).\n */\n incremental?: boolean | IndexNowIncrementalOptions;\n}\n\n/**\n * Options for incremental IndexNow submission (`indexNow.incremental`).\n */\nexport interface IndexNowIncrementalOptions {\n /**\n * Build-output path the manifest is written to, and the URL path it is\n * served from. Defaults to `indexnow-manifest.json` at the site root.\n */\n manifestPath?: string;\n /**\n * Absolute URL to fetch the previous manifest from. Defaults to\n * `<siteUrl>/<manifestPath>`. Override if the manifest is served from a\n * different host or path than where it's written.\n */\n manifestUrl?: string;\n /**\n * Normalize a page's HTML before hashing, to strip per-build volatile\n * markup (CSP nonces, timestamps, build ids) that would otherwise make\n * unchanged pages look modified. Receives the raw HTML and the page URL.\n */\n normalize?: (html: string, url: string) => string;\n /**\n * What to do when the previous manifest can't be fetched or parsed for a\n * reason other than a clean 404 (network error, 5xx, malformed body). A\n * 404 is always treated as \"first run\" (submit everything once).\n *\n * - `'skip'` (default): submit nothing this build, so a transient fetch\n * failure can't trigger an accidental full resubmit.\n * - `'full'`: fall back to submitting every eligible URL.\n */\n onError?: 'skip' | 'full';\n}\n\n/**\n * Pathnames that `indexNow` excludes by default, regardless of any\n * caller-supplied `filter`. The 404 page is the only universal case —\n * search engines don't need to be notified about it, and submitting it\n * wastes daily IndexNow quota.\n *\n * Matches both `/404` (from an Astro `src/pages/404.astro` → `404.html`\n * that `htmlFileToUrl` strips to `/404`) and `/404/` (the directory form\n * when the build emits `404/index.html`).\n */\nexport function isDefaultExcludedFromIndexNow(url: string): boolean {\n let pathname: string;\n try {\n pathname = new URL(url).pathname;\n } catch {\n return false;\n }\n return pathname === '/404' || pathname === '/404/';\n}\n\n/**\n * Return `options` only when `branch` matches `productionBranch` (default\n * `\"main\"`), otherwise return `undefined` so that `seoGraph()` skips\n * IndexNow submission entirely.\n *\n * This is useful on CI/CD platforms that expose the current branch as an\n * environment variable (e.g. `CF_PAGES_BRANCH`, `VERCEL_GIT_COMMIT_REF`,\n * `BRANCH`) so that preview deployments never submit URLs to IndexNow.\n *\n * @example\n * ```js\n * // astro.config.mjs\n * import { seoGraph, indexNowOnBranch } from '@jdevalk/astro-seo-graph/integration';\n *\n * export default defineConfig({\n * integrations: [\n * seoGraph({\n * indexNow: indexNowOnBranch(process.env.CF_PAGES_BRANCH ?? '', {\n * key: 'your-key-here',\n * host: 'example.com',\n * siteUrl: 'https://example.com',\n * }),\n * }),\n * ],\n * });\n * ```\n */\nexport function indexNowOnBranch(\n /** Current branch name, e.g. process.env.WORKERS_CI_BRANCH or process.env.VERCEL_GIT_COMMIT_REF or process.env.BRANCH, etc. */\n branch: string,\n /** Options for IndexNow submission. */\n options: IndexNowIntegrationOptions,\n /** Branch name that triggers production submission, defaults to `\"main\"` */\n productionBranch = 'main',\n) {\n return branch === productionBranch ? options : undefined;\n}\n\nexport interface LlmsTxtIntegrationOptions {\n /** H1 of the generated `llms.txt`. */\n title: string;\n /** Absolute site origin used to resolve built HTML paths into URLs. */\n siteUrl: string;\n /** Optional blockquote summary shown under the title. */\n summary?: string;\n /** Optional paragraphs of context between summary and sections. */\n details?: string;\n /**\n * User-supplied sections. When provided, these are used verbatim and\n * no pages are auto-collected from the build output. When omitted, a\n * single \"Pages\" section is generated from all built HTML files.\n */\n sections?: LlmsTxtSection[];\n /**\n * Filter which crawled URLs end up in the auto-generated section.\n * Ignored when `sections` is supplied.\n */\n filter?: (url: string) => boolean;\n /**\n * Section name used for auto-generated pages. Defaults to `Pages`.\n * Ignored when `sections` is supplied.\n */\n autoSectionName?: string;\n /**\n * Output file path relative to the build output directory. Defaults\n * to `llms.txt`.\n */\n outputPath?: string;\n}\n\n/**\n * Options for `validateInternalLinks`. Pass `true` to enable with\n * defaults, `false` to disable, or an object to customize.\n */\nexport interface ValidateInternalLinksOptions {\n /**\n * Skip a specific href from validation. Return `true` to exclude.\n * Useful for SSR-only routes, dynamic redirects, or paths handled\n * at the host/CDN layer that aren't present in the build output.\n *\n * Receives the raw `href` attribute value as it appeared in the\n * HTML (not resolved/normalized), so callers can match on the\n * source form.\n */\n skip?: (href: string) => boolean;\n /**\n * Treat explicit redirect sources as valid link targets. Defaults\n * to `true` — unions literal `from` paths from `public/_redirects`\n * (Netlify / Cloudflare Pages format) and literal keys from\n * Astro's `redirects` config into the built-paths set, so linking\n * to an intentional redirect doesn't warn.\n *\n * Set to `false` to treat only actual built pages as valid. Useful\n * when you want to surface \"this link hits a redirect, even if\n * that's on purpose\" — e.g. during an audit pass where you're\n * actively eliminating redirect hops for performance.\n */\n honorRedirects?: boolean;\n}\n\n/**\n * Configurable bounds for `validateMetadataLength`. Missing fields fall\n * back to the defaults (title 30–65, description 70–200).\n */\nexport interface MetadataLengthBounds {\n title?: { min?: number; max?: number };\n description?: { min?: number; max?: number };\n}\n\n/** Defaults applied when `validateMetadataLength: true`. */\nexport const DEFAULT_METADATA_LENGTH_BOUNDS = {\n title: { min: 30, max: 65 },\n description: { min: 70, max: 200 },\n} as const;\n\n/**\n * Resolve the `validateMetadataLength` option into concrete bounds, or\n * `null` when the check is disabled. Exported so callers can reuse the\n * same resolution in their own pipelines (and so tests can cover the\n * merge logic without running a full build).\n */\nexport function resolveMetadataLengthBounds(\n option: boolean | MetadataLengthBounds | undefined,\n): { title: { min: number; max: number }; description: { min: number; max: number } } | null {\n if (option === false || option === undefined) return null;\n const overrides = option === true ? {} : option;\n return {\n title: {\n min: overrides.title?.min ?? DEFAULT_METADATA_LENGTH_BOUNDS.title.min,\n max: overrides.title?.max ?? DEFAULT_METADATA_LENGTH_BOUNDS.title.max,\n },\n description: {\n min: overrides.description?.min ?? DEFAULT_METADATA_LENGTH_BOUNDS.description.min,\n max: overrides.description?.max ?? DEFAULT_METADATA_LENGTH_BOUNDS.description.max,\n },\n };\n}\n\nexport interface SeoGraphIntegrationOptions {\n /**\n * Warn when a built page has zero or more than one `<h1>` element.\n * Defaults to `true`. Only static pages are checked (SSR pages are\n * not present on disk at build time).\n */\n validateH1?: boolean;\n /**\n * Warn when two or more built pages share the same `<title>` or\n * meta description. Duplicate metadata is an SEO smell that can only\n * be detected across the whole corpus. Defaults to `true`.\n *\n * Pages without a title or description are reported separately by\n * the H1 validator's siblings — this check only compares values that\n * are present on multiple pages.\n */\n validateUniqueMetadata?: boolean;\n /**\n * Warn when a built page contains `<img>` tags without an `alt`\n * attribute. Missing alt text is both an accessibility and SEO\n * issue. Defaults to `true`.\n *\n * Decorative images with `alt=\"\"` are treated as correct — that's\n * the intended WCAG pattern for images that convey no information.\n * Only a fully missing `alt` attribute triggers a warning.\n */\n validateImageAlt?: boolean;\n /**\n * Warn when `<title>` or `<meta name=\"description\">` length falls\n * outside SERP-friendly bounds. Defaults to `true` (title 30–65\n * chars, description 70–200 chars).\n *\n * Pass `false` to disable, or an object to override the bounds.\n * Length is measured on the whitespace-collapsed, entity-decoded\n * text — the same thing Google displays in the SERP.\n */\n validateMetadataLength?: boolean | MetadataLengthBounds;\n /**\n * Warn when an internal `<a href>` points to a URL that doesn't\n * match a built page. Catches two common classes of bug:\n *\n * - **Trailing-slash mismatches.** Linking to `/about-me` when the\n * site emits `/about-me/` (or vice versa). The link \"works\" via\n * a redirect but wastes a round-trip and hurts SEO.\n * - **Broken internal links.** A link to a path that isn't in the\n * build at all — a 404 waiting to happen.\n *\n * Defaults to `true`. Only checks links with the same origin as\n * `config.site` (plus root-relative `/foo`-style links). External\n * links, `mailto:`, `tel:`, fragment-only (`#x`), and SSR-only\n * routes are not checked. Pass `false` to disable, or\n * `{ skip: (href) => boolean }` to exclude specific hrefs (e.g.\n * dynamic redirects handled at the host layer).\n */\n validateInternalLinks?: boolean | ValidateInternalLinksOptions;\n /**\n * Submit built URLs to IndexNow after the build completes. Omit to\n * disable. Only URLs on `host` are submitted; URLs with trailing\n * `index.html` are rewritten to their directory form.\n */\n indexNow?: IndexNowIntegrationOptions;\n /**\n * Generate an `llms.txt` file at the root of the build output. Omit\n * to disable.\n */\n llmsTxt?: LlmsTxtIntegrationOptions;\n /**\n * Auto-emit `<link rel=\"alternate\" type=\"text/markdown\">` from `<Seo>`\n * on every page, with `href` derived from the canonical URL (e.g.\n * `/blog/post/` → `/blog/post.md`). Pair with `createMarkdownEndpoint`\n * to actually serve the markdown — this flag only controls the\n * discovery link, not whether the endpoint exists.\n *\n * Default: `false`. Enable explicitly once you've added\n * `createMarkdownEndpoint` at the matching path. Implemented via a\n * Vite `define` that replaces a sentinel token in the compiled\n * `<Seo>` component at build time.\n *\n * After the build, the integration walks the output directory and\n * strips any link whose target `.md` isn't on disk — so dangling\n * discovery links (collection entries that didn't get prerendered,\n * routes that don't cover this page) don't ship to production. SSR\n * users whose `.md` endpoints aren't prerendered should leave this\n * flag off and emit the link themselves.\n */\n markdownAlternate?: boolean;\n}\n\n/**\n * Turn a built HTML file path (relative to the outDir, e.g.\n * `blog/post/index.html`) into an absolute URL on `siteUrl`. Rewrites\n * `index.html` to a trailing slash and strips other `.html` extensions\n * — matching Astro's default `trailingSlash: 'ignore'` output layout.\n */\nexport function htmlFileToUrl(relativePath: string, siteUrl: string): string {\n const origin = siteUrl.replace(/\\/+$/, '');\n const normalized = relativePath.split(/[\\\\/]/).join('/');\n let pathname: string;\n if (normalized === 'index.html' || normalized === '/index.html') {\n pathname = '/';\n } else if (normalized.endsWith('/index.html')) {\n pathname = '/' + normalized.slice(0, -'index.html'.length);\n } else if (normalized.endsWith('.html')) {\n pathname = '/' + normalized.slice(0, -'.html'.length);\n } else {\n pathname = '/' + normalized;\n }\n return `${origin}${pathname}`;\n}\n\n/**\n * Count `<h1>` elements in an HTML string. Matches the opening tag only;\n * tolerant of attributes and whitespace. Doesn't parse — good enough for\n * a lint warning.\n */\nexport function countH1s(html: string): number {\n const matches = html.match(/<h1[\\s>]/gi);\n return matches ? matches.length : 0;\n}\n\n/**\n * Parse a Netlify/Cloudflare Pages `_redirects` file and return the\n * `from` paths of rules with literal sources (no wildcards or\n * placeholders). The literal subset is enough to treat those paths as\n * valid link targets — if a rule uses `*` or `:splat` it's dynamic and\n * we can't meaningfully pre-validate hrefs against it.\n *\n * Format per line: `from to [status]`. `#` starts a comment. Blank\n * lines are ignored. See:\n * https://docs.netlify.com/routing/redirects/\n * https://developers.cloudflare.com/pages/configuration/redirects/\n */\nexport function parseNetlifyRedirects(content: string): string[] {\n const sources: string[] = [];\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line === '' || line.startsWith('#')) continue;\n const from = line.split(/\\s+/)[0];\n if (!from) continue;\n // Skip dynamic rules — we only union literal paths into the\n // built-paths set. Glob/splat matching is out of scope.\n if (/[*:]/.test(from)) continue;\n // Ignore non-path sources (full URLs in _redirects denote\n // proxy/rewrite rules; not a link target we'd validate).\n if (!from.startsWith('/')) continue;\n sources.push(from);\n }\n return sources;\n}\n\n/**\n * Return the literal `from` paths from an Astro `config.redirects`\n * object. Parameterized routes (`/old/[slug]` or `/old/*`) are skipped\n * for the same reason `parseNetlifyRedirects` skips dynamic rules.\n */\nexport function collectAstroRedirectSources(\n redirects: ConfigSetupHook['config']['redirects'] | undefined,\n): string[] {\n if (!redirects) return [];\n const sources: string[] = [];\n for (const from of Object.keys(redirects)) {\n if (!from.startsWith('/')) continue;\n if (/[[\\]*]/.test(from)) continue;\n sources.push(from);\n }\n return sources;\n}\n\n/**\n * Turn a built HTML file path into its canonical pathname (the `url`\n * form without origin). Used by `validateInternalLinks` to build the\n * set of paths that actually exist in the build.\n */\nexport function htmlFileToPath(relativePath: string): string {\n const normalized = relativePath.split(/[\\\\/]/).join('/');\n if (normalized === 'index.html' || normalized === '/index.html') return '/';\n if (normalized.endsWith('/index.html')) {\n return '/' + normalized.slice(0, -'index.html'.length);\n }\n if (normalized.endsWith('.html')) {\n return '/' + normalized.slice(0, -'.html'.length);\n }\n return '/' + normalized;\n}\n\n/**\n * Build the set of root-relative paths that count as valid link\n * targets, given the full list of files produced by the build.\n *\n * HTML files become their pretty-URL form (via `htmlFileToPath`, so\n * `blog/post/index.html` → `/blog/post/`). Every other file —\n * static assets copied from `public/`, sitemap files, etc. — is\n * included verbatim as `/<path>`, because those are valid link\n * targets too even though they're not pages.\n *\n * Adding non-HTML files here is what stops `validateInternalLinks`\n * from flagging `<a href=\"/images/foo.avif\">` as a 404.\n */\nexport function buildLinkTargetSet(files: readonly string[]): Set<string> {\n const paths = new Set<string>();\n for (const file of files) {\n if (file.endsWith('.html')) {\n paths.add(htmlFileToPath(file));\n } else {\n const normalized = file.split(/[\\\\/]/).join('/');\n paths.add('/' + normalized);\n }\n }\n return paths;\n}\n\n/**\n * Extract all `<a href=\"...\">` values from an HTML string. Returns the\n * raw attribute values (not decoded) in document order.\n */\nexport function extractAnchorHrefs(html: string): string[] {\n const hrefs: string[] = [];\n for (const match of html.matchAll(/<a\\b[^>]*\\bhref\\s*=\\s*[\"']([^\"']*)[\"'][^>]*>/gi)) {\n hrefs.push(match[1]!);\n }\n return hrefs;\n}\n\n/**\n * Classify an internal link's href against the set of built pathnames.\n *\n * Returns:\n * - `{ status: 'external' }` for off-origin, `mailto:`, `tel:`,\n * fragment-only, or non-http(s) schemes.\n * - `{ status: 'ok' }` when the resolved pathname exactly matches a\n * built page.\n * - `{ status: 'trailing-slash', suggested }` when the other form\n * (with/without trailing slash) matches — your case.\n * - `{ status: 'not-found' }` when no form matches — a broken link.\n *\n * `origin` is the site's canonical origin (from Astro's `config.site`).\n * When omitted, only root-relative hrefs (`/foo`) are classified;\n * absolute URLs return `external`.\n */\nexport function classifyInternalLink(\n href: string,\n builtPaths: ReadonlySet<string>,\n origin: string | undefined,\n):\n | { status: 'external' }\n | { status: 'ok' }\n | { status: 'trailing-slash'; suggested: string }\n | {\n status: 'not-found';\n } {\n if (!href) return { status: 'external' };\n // Same-page anchors and non-http schemes.\n if (href.startsWith('#')) return { status: 'external' };\n if (/^(?:mailto:|tel:|javascript:|data:|blob:)/i.test(href)) return { status: 'external' };\n\n let pathname: string;\n if (href.startsWith('/') && !href.startsWith('//')) {\n // Root-relative. Strip query + fragment.\n pathname = href.split('#')[0]!.split('?')[0]!;\n } else if (/^https?:\\/\\//i.test(href) || href.startsWith('//')) {\n // Absolute (or protocol-relative). Compare origins if we know ours.\n if (!origin) return { status: 'external' };\n let parsed: URL;\n try {\n parsed = new URL(href.startsWith('//') ? `https:${href}` : href);\n } catch {\n return { status: 'external' };\n }\n let ourOrigin: URL;\n try {\n ourOrigin = new URL(origin);\n } catch {\n return { status: 'external' };\n }\n if (parsed.origin !== ourOrigin.origin) return { status: 'external' };\n pathname = parsed.pathname;\n } else {\n // Relative or unknown shape — not worth guessing.\n return { status: 'external' };\n }\n\n if (builtPaths.has(pathname)) return { status: 'ok' };\n\n const flipped = pathname.endsWith('/') ? pathname.slice(0, -1) : pathname + '/';\n if (builtPaths.has(flipped)) {\n return { status: 'trailing-slash', suggested: flipped };\n }\n return { status: 'not-found' };\n}\n\n/**\n * Find `<img>` tags missing an `alt` attribute. Returns the `src` value\n * of each offending tag (or `\"(no src)\"` when src is absent too) so the\n * warning can identify which image to fix.\n *\n * Two WCAG-sanctioned ways to mark an image as decorative are respected\n * and NOT flagged:\n *\n * - `alt=\"\"` — the canonical decorative-image pattern. Also recognized\n * in HTML5 boolean-attribute form `<img ... alt>` (no `=`), which is\n * spec-equivalent to `alt=\"\"` and is what Vite's HTML minifier (used\n * by Astro) emits when given `alt=\"\"`.\n * - `role=\"presentation\"` (or `role=\"none\"`) — removes the image from\n * the accessibility tree; typically paired with `alt=\"\"` but some\n * codebases use it alone.\n *\n * Only a tag that has neither an `alt` attribute nor a decorative role\n * triggers a warning.\n */\nexport function findImagesWithoutAlt(html: string): string[] {\n const results: string[] = [];\n for (const match of html.matchAll(/<img\\b[^>]*>/gi)) {\n const tag = match[0];\n // Match `alt` whether written as `alt=\"...\"`, bare-boolean `alt`,\n // or self-closed `alt/`. Leading `\\s` anchors `alt` to an\n // attribute slot inside the tag, avoiding false matches on\n // attribute names like `data-alt` or `data-altitude`.\n if (/\\salt(?:\\s*=|\\s|\\/?>|$)/i.test(tag)) continue;\n if (/\\brole\\s*=\\s*[\"'](?:presentation|none)[\"']/i.test(tag)) continue;\n const src = tag.match(/\\bsrc\\s*=\\s*[\"']([^\"']*)[\"']/i)?.[1] ?? '(no src)';\n results.push(src);\n }\n return results;\n}\n\nconst HTML_ENTITIES: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&apos;': \"'\",\n '&#39;': \"'\",\n '&nbsp;': ' ',\n};\n\nfunction decodeHtmlEntities(value: string): string {\n return value.replace(/&(?:amp|lt|gt|quot|apos|#39|nbsp);/g, (m) => HTML_ENTITIES[m] ?? m);\n}\n\n/**\n * Extract the first `<title>` element's text content. Returns `null` when\n * no title tag is found. Whitespace-collapsed and entity-decoded so\n * duplicate-detection compares rendered text, not raw HTML.\n */\nexport function extractTitle(html: string): string | null {\n const match = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i);\n if (!match) return null;\n const text = decodeHtmlEntities(match[1]!).replace(/\\s+/g, ' ').trim();\n return text.length > 0 ? text : null;\n}\n\n/**\n * Extract the `content` attribute of the first `<meta name=\"description\">`\n * tag. Returns `null` when absent. Entity-decoded for duplicate detection.\n *\n * Uses a backreference on the opening quote so the capture terminates\n * only on the *matching* quote — `content=\"don't stop\"` keeps its\n * apostrophe, and `content='She said \"hi\"'` keeps its double quotes.\n * A naive `[^\"']*` character class would cut both short.\n */\nexport function extractMetaDescription(html: string): string | null {\n // Two orderings: name-before-content or content-before-name.\n const nameFirst =\n /<meta\\b[^>]*?\\bname\\s*=\\s*[\"']description[\"'][^>]*?\\bcontent\\s*=\\s*([\"'])([\\s\\S]*?)\\1/i;\n const contentFirst =\n /<meta\\b[^>]*?\\bcontent\\s*=\\s*([\"'])([\\s\\S]*?)\\1[^>]*?\\bname\\s*=\\s*[\"']description[\"']/i;\n const match = nameFirst.exec(html) ?? contentFirst.exec(html);\n if (!match) return null;\n const raw = (match[2] ?? '').trim();\n if (!raw) return null;\n return decodeHtmlEntities(raw);\n}\n\n/**\n * Locate the auto-emitted `<link rel=\"alternate\" type=\"text/markdown\">`\n * tag in a built HTML file. Returns the full match text and the raw\n * `href` attribute value, or `null` when absent. Matches the exact\n * shape `<Seo>` produces — a simple regex is fine because we control\n * the source.\n */\nexport function findMarkdownAlternateLink(html: string): { match: string; href: string } | null {\n const re = /<link\\s+rel=\"alternate\"\\s+type=\"text\\/markdown\"\\s+href=\"([^\"]*)\"\\s*\\/?>/;\n const m = re.exec(html);\n if (!m) return null;\n return { match: m[0], href: m[1]! };\n}\n\n/**\n * Remove a previously-located markdown-alternate `<link>` tag from\n * `html`. Also trims one trailing newline if present, so the surrounding\n * `<head>` whitespace stays clean. No-op if `match` isn't found\n * verbatim.\n */\nexport function stripMarkdownAlternateLink(html: string, match: string): string {\n const idx = html.indexOf(match);\n if (idx === -1) return html;\n let end = idx + match.length;\n if (html[end] === '\\n') end += 1;\n return html.slice(0, idx) + html.slice(end);\n}\n\n/**\n * Resolve a markdown-alternate `href` (as emitted by `<Seo>`) to its\n * expected build-output path, relative to `outDir`. Returns `null`\n * when the href is cross-origin (different origin than `siteOrigin`)\n * or otherwise unverifiable — caller should leave such links alone.\n *\n * `siteOrigin` may be undefined (no `config.site` in astro.config); in\n * that case only root-relative hrefs (starting with `/`) are resolvable.\n */\nexport function resolveMarkdownAlternatePath(\n href: string,\n siteOrigin: string | undefined,\n): string | null {\n let pathname: string;\n if (href.startsWith('/') && !href.startsWith('//')) {\n pathname = href.split('#')[0]!.split('?')[0]!;\n } else if (/^https?:\\/\\//i.test(href)) {\n if (!siteOrigin) return null;\n let parsed: URL;\n let ours: URL;\n try {\n parsed = new URL(href);\n ours = new URL(siteOrigin);\n } catch {\n return null;\n }\n if (parsed.origin !== ours.origin) return null;\n pathname = parsed.pathname;\n } else {\n return null;\n }\n return pathname.replace(/^\\/+/, '');\n}\n\nasync function collectBuildFiles(dir: string, base: string = dir): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await collectBuildFiles(fullPath, base)));\n } else if (entry.isFile()) {\n files.push(relative(base, fullPath));\n }\n }\n return files;\n}\n\n/**\n * Astro integration for `@jdevalk/astro-seo-graph`.\n *\n * Currently:\n * - Warns about built pages with zero or more than one `<h1>` element\n * (a common SEO and accessibility issue).\n *\n * ```js\n * // astro.config.mjs\n * import { defineConfig } from 'astro/config';\n * import seoGraph from '@jdevalk/astro-seo-graph/integration';\n *\n * export default defineConfig({\n * integrations: [seoGraph()],\n * });\n * ```\n */\nexport default function seoGraph(options: SeoGraphIntegrationOptions = {}): AstroIntegrationLike {\n const {\n validateH1 = true,\n validateUniqueMetadata = true,\n validateImageAlt = true,\n validateMetadataLength = true,\n validateInternalLinks = true,\n indexNow,\n llmsTxt,\n markdownAlternate = false,\n } = options;\n const autoLlmsTxt = llmsTxt && !llmsTxt.sections;\n const lengthBounds = resolveMetadataLengthBounds(validateMetadataLength);\n const internalLinksEnabled = validateInternalLinks !== false;\n const internalLinksSkip =\n typeof validateInternalLinks === 'object' ? validateInternalLinks.skip : undefined;\n const internalLinksHonorRedirects =\n typeof validateInternalLinks === 'object'\n ? (validateInternalLinks.honorRedirects ?? true)\n : true;\n\n // Captured in astro:config:setup so astro:build:done can classify\n // absolute same-origin links against the site's canonical origin\n // and treat Astro-configured redirect sources as valid link targets.\n let siteOrigin: string | undefined;\n let astroRedirectSources: string[] = [];\n\n return {\n name: '@jdevalk/astro-seo-graph',\n hooks: {\n 'astro:config:setup': ({ config, updateConfig }) => {\n // Vite `define` controls the auto-emitted\n // <link rel=\"alternate\" type=\"text/markdown\"> in <Seo>.\n // The sentinel is replaced token-by-token at build time;\n // when the integration isn't installed, the identifier\n // stays free and <Seo>'s `typeof` check falls back to\n // the default (enabled).\n updateConfig({\n vite: {\n define: {\n __JDV_SEO_GRAPH_MD_ALT__: JSON.stringify(markdownAlternate),\n },\n },\n });\n if (config.site) {\n try {\n siteOrigin = new URL(config.site.toString()).origin;\n } catch {\n // Leave undefined — validateInternalLinks will\n // still work for root-relative hrefs.\n }\n }\n astroRedirectSources = collectAstroRedirectSources(config.redirects);\n },\n 'astro:build:done': async ({ dir, logger }) => {\n const buildDir = fileURLToPath(dir);\n const needsContentScan =\n validateH1 ||\n validateUniqueMetadata ||\n validateImageAlt ||\n lengthBounds !== null ||\n internalLinksEnabled ||\n autoLlmsTxt ||\n markdownAlternate;\n const needsAnyFiles =\n needsContentScan ||\n indexNow ||\n llmsTxt ||\n internalLinksEnabled ||\n markdownAlternate;\n const allFiles = needsAnyFiles ? await collectBuildFiles(buildDir) : [];\n const htmlFiles = allFiles.filter((f) => f.endsWith('.html'));\n const builtFilesSet = markdownAlternate\n ? new Set(allFiles.map((f) => f.split(/[\\\\/]/).join('/')))\n : null;\n let builtPaths: Set<string> | null = null;\n if (internalLinksEnabled) {\n // Include every build artefact, not just HTML pages.\n // Static assets copied from public/ (images, fonts,\n // downloads, etc.) are valid link targets too —\n // filtering to .html would flag <a href=\"/images/foo.avif\">\n // as a 404.\n builtPaths = buildLinkTargetSet(allFiles);\n if (internalLinksHonorRedirects) {\n // Treat explicit redirect sources as valid link\n // targets. Reads `_redirects` (Netlify/Cloudflare\n // Pages) from the build output and merges Astro's\n // `config.redirects` captured at setup time.\n try {\n const redirectsContent = await readFile(\n join(buildDir, '_redirects'),\n 'utf8',\n );\n for (const from of parseNetlifyRedirects(redirectsContent)) {\n builtPaths.add(from);\n }\n } catch {\n // No `_redirects` file; that's fine.\n }\n for (const from of astroRedirectSources) {\n builtPaths.add(from);\n }\n }\n }\n const autoLinks: Array<{ url: string; title: string; description?: string }> = [];\n\n const h1Missing: string[] = [];\n const h1Multiple: Array<{ file: string; count: number }> = [];\n const titlesByValue = new Map<string, string[]>();\n const descriptionsByValue = new Map<string, string[]>();\n const imagesMissingAlt: Array<{ file: string; srcs: string[] }> = [];\n const internalLinkIssues: Array<{\n file: string;\n href: string;\n kind: 'trailing-slash' | 'not-found';\n suggested?: string;\n }> = [];\n const lengthIssues: Array<{\n file: string;\n field: 'title' | 'description';\n length: number;\n bound: 'short' | 'long';\n limit: number;\n value: string;\n }> = [];\n const mdAltStripped: Array<{ file: string; href: string }> = [];\n let mdAltVerified = 0;\n\n if (needsContentScan) {\n for (const file of htmlFiles) {\n let content = await readFile(join(buildDir, file), 'utf8');\n\n if (markdownAlternate && builtFilesSet !== null) {\n const link = findMarkdownAlternateLink(content);\n if (link) {\n const expected = resolveMarkdownAlternatePath(\n link.href,\n siteOrigin,\n );\n if (expected !== null) {\n if (builtFilesSet.has(expected)) {\n mdAltVerified += 1;\n } else {\n content = stripMarkdownAlternateLink(content, link.match);\n await writeFile(join(buildDir, file), content);\n mdAltStripped.push({ file, href: link.href });\n }\n }\n }\n }\n\n if (validateH1) {\n const count = countH1s(content);\n if (count === 0) h1Missing.push(file);\n else if (count > 1) h1Multiple.push({ file, count });\n }\n\n if (validateImageAlt) {\n const srcs = findImagesWithoutAlt(content);\n if (srcs.length > 0) imagesMissingAlt.push({ file, srcs });\n }\n\n if (builtPaths !== null) {\n for (const href of extractAnchorHrefs(content)) {\n if (internalLinksSkip && internalLinksSkip(href)) continue;\n const result = classifyInternalLink(href, builtPaths, siteOrigin);\n if (result.status === 'trailing-slash') {\n internalLinkIssues.push({\n file,\n href,\n kind: 'trailing-slash',\n suggested: result.suggested,\n });\n } else if (result.status === 'not-found') {\n internalLinkIssues.push({\n file,\n href,\n kind: 'not-found',\n });\n }\n }\n }\n\n const needsTitle =\n validateUniqueMetadata || autoLlmsTxt || lengthBounds !== null;\n const needsDescription = needsTitle;\n const title = needsTitle ? extractTitle(content) : null;\n const description = needsDescription\n ? extractMetaDescription(content)\n : null;\n\n if (validateUniqueMetadata) {\n if (title) {\n const list = titlesByValue.get(title) ?? [];\n list.push(file);\n titlesByValue.set(title, list);\n }\n if (description) {\n const list = descriptionsByValue.get(description) ?? [];\n list.push(file);\n descriptionsByValue.set(description, list);\n }\n }\n\n if (lengthBounds !== null) {\n if (title) {\n if (title.length < lengthBounds.title.min) {\n lengthIssues.push({\n file,\n field: 'title',\n length: title.length,\n bound: 'short',\n limit: lengthBounds.title.min,\n value: title,\n });\n } else if (title.length > lengthBounds.title.max) {\n lengthIssues.push({\n file,\n field: 'title',\n length: title.length,\n bound: 'long',\n limit: lengthBounds.title.max,\n value: title,\n });\n }\n }\n if (description) {\n if (description.length < lengthBounds.description.min) {\n lengthIssues.push({\n file,\n field: 'description',\n length: description.length,\n bound: 'short',\n limit: lengthBounds.description.min,\n value: description,\n });\n } else if (description.length > lengthBounds.description.max) {\n lengthIssues.push({\n file,\n field: 'description',\n length: description.length,\n bound: 'long',\n limit: lengthBounds.description.max,\n value: description,\n });\n }\n }\n }\n\n if (autoLlmsTxt && llmsTxt) {\n const url = htmlFileToUrl(file, llmsTxt.siteUrl);\n if (!llmsTxt.filter || llmsTxt.filter(url)) {\n autoLinks.push({\n url,\n title: title ?? url,\n description: description ?? undefined,\n });\n }\n }\n }\n }\n\n if (validateH1) {\n if (h1Missing.length === 0 && h1Multiple.length === 0) {\n logger.info(`H1 validation: ${htmlFiles.length} pages checked, all good.`);\n } else {\n for (const file of h1Missing) {\n logger.warn(`H1 validation: ${file} has no <h1>.`);\n }\n for (const { file, count } of h1Multiple) {\n logger.warn(\n `H1 validation: ${file} has ${count} <h1> elements (expected 1).`,\n );\n }\n }\n }\n\n if (builtPaths !== null) {\n if (internalLinkIssues.length === 0) {\n logger.info(`Internal links: ${htmlFiles.length} pages checked, all good.`);\n } else {\n for (const issue of internalLinkIssues) {\n if (issue.kind === 'trailing-slash') {\n logger.warn(\n `Internal links: ${issue.file} links to ${JSON.stringify(issue.href)} but built page is ${JSON.stringify(issue.suggested!)} (redirect on every visit).`,\n );\n } else {\n logger.warn(\n `Internal links: ${issue.file} links to ${JSON.stringify(issue.href)} which isn't in the build (404).`,\n );\n }\n }\n }\n }\n\n if (validateImageAlt) {\n if (imagesMissingAlt.length === 0) {\n logger.info(\n `Image alt validation: ${htmlFiles.length} pages checked, all good.`,\n );\n } else {\n for (const { file, srcs } of imagesMissingAlt) {\n const preview = srcs.slice(0, 5).join(', ');\n const more = srcs.length > 5 ? ` (+${srcs.length - 5} more)` : '';\n logger.warn(\n `Image alt validation: ${file} has ${srcs.length} <img> without alt: ${preview}${more}`,\n );\n }\n }\n }\n\n if (lengthBounds !== null) {\n if (lengthIssues.length === 0) {\n logger.info(\n `Metadata length: ${htmlFiles.length} pages checked, all good.`,\n );\n } else {\n for (const issue of lengthIssues) {\n const direction = issue.bound === 'short' ? 'min' : 'max';\n const preview =\n issue.value.length > 80\n ? issue.value.slice(0, 77) + '…'\n : issue.value;\n logger.warn(\n `Metadata length: ${issue.file} ${issue.field} is ${issue.length} chars (${direction} ${issue.limit}): ${JSON.stringify(preview)}`,\n );\n }\n }\n }\n\n if (validateUniqueMetadata) {\n const dupTitles = [...titlesByValue.entries()].filter(\n ([, files]) => files.length > 1,\n );\n const dupDescriptions = [...descriptionsByValue.entries()].filter(\n ([, files]) => files.length > 1,\n );\n\n if (dupTitles.length === 0 && dupDescriptions.length === 0) {\n logger.info(\n `Metadata uniqueness: ${htmlFiles.length} pages checked, all good.`,\n );\n } else {\n for (const [title, files] of dupTitles) {\n logger.warn(\n `Metadata uniqueness: title ${JSON.stringify(title)} appears on ${files.length} pages: ${files.join(', ')}`,\n );\n }\n for (const [description, files] of dupDescriptions) {\n const preview =\n description.length > 80\n ? description.slice(0, 77) + '…'\n : description;\n logger.warn(\n `Metadata uniqueness: description ${JSON.stringify(preview)} appears on ${files.length} pages: ${files.join(', ')}`,\n );\n }\n }\n }\n\n if (markdownAlternate) {\n if (mdAltStripped.length === 0) {\n logger.info(\n `Markdown alternate: ${mdAltVerified} link(s) verified against build output.`,\n );\n } else {\n for (const { file, href } of mdAltStripped) {\n logger.warn(\n `Markdown alternate: stripped link from ${file} — ${JSON.stringify(href)} is not in the build output (would 404).`,\n );\n }\n }\n }\n\n if (indexNow) {\n const eligible = htmlFiles\n .map((f) => ({ file: f, url: htmlFileToUrl(f, indexNow.siteUrl) }))\n .filter((e) => !isDefaultExcludedFromIndexNow(e.url))\n .filter((e) => (indexNow.filter ? indexNow.filter(e.url) : true));\n\n const submit = async (urls: string[]) => {\n if (urls.length === 0) {\n logger.info('IndexNow: no URLs to submit.');\n return;\n }\n const results = await submitToIndexNow({\n host: indexNow.host,\n key: indexNow.key,\n keyLocation: indexNow.keyLocation,\n endpoint: indexNow.endpoint,\n urls,\n });\n for (const r of results) {\n if (r.ok) {\n logger.info(\n `IndexNow: submitted ${r.submitted} URLs (status ${r.status}).`,\n );\n } else {\n logger.warn(\n `IndexNow: submission failed (status ${r.status}): ${r.message}`,\n );\n }\n }\n };\n\n if (!indexNow.incremental) {\n await submit(eligible.map((e) => e.url));\n } else {\n const opts: IndexNowIncrementalOptions =\n indexNow.incremental === true ? {} : indexNow.incremental;\n const manifestRelPath = (\n opts.manifestPath ?? 'indexnow-manifest.json'\n ).replace(/^\\//, '');\n const siteBase = indexNow.siteUrl.replace(/\\/$/, '');\n const manifestUrl = opts.manifestUrl ?? `${siteBase}/${manifestRelPath}`;\n const onError = opts.onError ?? 'skip';\n const normalize = opts.normalize;\n\n // Current manifest: hash every eligible page's built HTML.\n const entries: ManifestEntry[] = [];\n for (const e of eligible) {\n const html = await readFile(join(buildDir, e.file), 'utf8');\n entries.push({ url: e.url, content: html });\n }\n const current = buildUrlManifest(\n entries,\n normalize\n ? (content, url) => hashContent(normalize(content, url))\n : undefined,\n );\n\n // Previous state lives on the live site. A clean 404 means\n // \"first run\" (baseline). Any other failure leaves `previous`\n // null so we never accidentally full-resubmit on a transient\n // network blip.\n let previous: UrlManifest | null = null;\n try {\n const res = await fetch(manifestUrl);\n if (res.status === 404) {\n previous = {};\n } else if (res.ok) {\n previous = parseManifest(await res.text());\n }\n } catch {\n previous = null;\n }\n\n // Always publish the new manifest so it ships with this\n // deploy and becomes the next build's baseline.\n await writeFile(\n join(buildDir, manifestRelPath),\n serializeManifest(current),\n 'utf8',\n );\n\n if (previous === null) {\n if (onError === 'full') {\n logger.warn(\n `IndexNow: could not read previous manifest at ${manifestUrl}; submitting all URLs.`,\n );\n await submit(Object.keys(current));\n } else {\n logger.warn(\n `IndexNow: could not read previous manifest at ${manifestUrl}; skipping submission this build.`,\n );\n }\n } else {\n const diff = diffManifests(previous, current);\n logger.info(\n `IndexNow: ${diff.added.length} added, ${diff.updated.length} updated, ${diff.deleted.length} deleted.`,\n );\n await submit(changedUrls(diff));\n }\n }\n }\n\n if (llmsTxt) {\n const sections = llmsTxt.sections ?? [\n { name: llmsTxt.autoSectionName ?? 'Pages', links: autoLinks },\n ];\n const rendered = renderLlmsTxt({\n title: llmsTxt.title,\n summary: llmsTxt.summary,\n details: llmsTxt.details,\n sections,\n });\n const outPath = join(buildDir, llmsTxt.outputPath ?? 'llms.txt');\n await writeFile(outPath, rendered, 'utf8');\n const linkCount = sections.reduce((n, s) => n + s.links.length, 0);\n logger.info(\n `llms.txt: wrote ${relative(buildDir, outPath)} with ${linkCount} link(s).`,\n );\n }\n },\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../src/llms-txt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA2BH,SAAS,eAAe,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC7C,MAAM,KAAK,GAAa,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEpD,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACzC,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../src/llms-txt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA2BH,SAAS,eAAe,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC7C,MAAM,KAAK,GAAa,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEpD,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACzC,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACrC,CAAC","sourcesContent":["/**\n * Build an `llms.txt` file — a markdown document that gives LLMs a\n * concise, structured map of a site. Spec: https://llmstxt.org\n *\n * Shape:\n *\n * ```\n * # Title\n *\n * > Summary (optional blockquote)\n *\n * Details paragraph(s) (optional)\n *\n * ## Section name\n *\n * - [Link title](url): optional description\n * ```\n *\n * Callers can supply sections explicitly or let the integration\n * auto-generate a single \"Pages\" section from crawled HTML.\n */\n\nexport interface LlmsTxtLink {\n /** Absolute URL. */\n url: string;\n /** Link label. Usually the page `<title>`. */\n title: string;\n /** Optional short description. Usually the meta description. */\n description?: string;\n}\n\nexport interface LlmsTxtSection {\n /** Section heading (rendered as `## name`). */\n name: string;\n links: LlmsTxtLink[];\n}\n\nexport interface LlmsTxtInput {\n /** H1 of the document. Required. */\n title: string;\n /** Short blockquote summary shown under the title. */\n summary?: string;\n /** Extra paragraphs of context between summary and sections. */\n details?: string;\n sections: LlmsTxtSection[];\n}\n\nfunction escapeLinkTitle(title: string): string {\n return title.replace(/\\[/g, '\\\\[').replace(/\\]/g, '\\\\]');\n}\n\n/**\n * Render an `LlmsTxtInput` to a markdown string. Pure.\n *\n * Empty sections are omitted. A trailing newline is included so the file\n * ends cleanly on disk.\n */\nexport function renderLlmsTxt(input: LlmsTxtInput): string {\n const parts: string[] = [`# ${input.title.trim()}`];\n\n if (input.summary?.trim()) {\n parts.push(`> ${input.summary.trim()}`);\n }\n\n if (input.details?.trim()) {\n parts.push(input.details.trim());\n }\n\n for (const section of input.sections) {\n if (section.links.length === 0) continue;\n parts.push(`## ${section.name.trim()}`);\n const lines = section.links.map((link) => {\n const label = escapeLinkTitle(link.title.trim() || link.url);\n const base = `- [${label}](${link.url})`;\n const desc = link.description?.trim();\n return desc ? `${base}: ${desc}` : base;\n });\n parts.push(lines.join('\\n'));\n }\n\n return parts.join('\\n\\n') + '\\n';\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-alternate.js","sourceRoot":"","sources":["../src/markdown-alternate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown-alternate.js","sourceRoot":"","sources":["../src/markdown-alternate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Markdown alternate rendering.\n *\n * Turns a content entry + metadata into a markdown string with YAML\n * frontmatter, suitable for serving at an `.md` URL so that AI agents\n * (Claude, Perplexity, ChatGPT) can consume a clean, machine-readable\n * version of the page. Pair with `createMarkdownEndpoint` to serve it,\n * and with the auto-emitted `<link rel=\"alternate\" type=\"text/markdown\">`\n * in `<Seo>` for discovery.\n *\n * Pure; no Astro runtime required. Safe to import from non-Astro TS.\n */\n\nexport interface MarkdownAlternateFrontmatter {\n title: string;\n canonical: string | URL;\n pubDate?: Date | string;\n updatedDate?: Date | string;\n author?: string;\n description?: string;\n tags?: readonly string[];\n categories?: readonly string[];\n}\n\nexport interface RenderMarkdownAlternateOptions {\n frontmatter: MarkdownAlternateFrontmatter;\n /** Raw markdown body (entry.body from Astro content collections). */\n body: string;\n /**\n * Token estimator. Defaults to `Math.ceil(text.length / 4)` — crude,\n * dependency-free. Callers that need accuracy can pass in\n * `gpt-tokenizer` or `@anthropic-ai/tokenizer`. Called once with the\n * final rendered string so the returned `tokenCount` matches the\n * `X-Markdown-Tokens` header.\n */\n estimateTokens?: (text: string) => number;\n /**\n * Pre-render transform applied to `body`. Useful for stripping MDX\n * imports/components. Pure.\n */\n transformBody?: (body: string) => string;\n}\n\nexport interface RenderedMarkdownAlternate {\n markdown: string;\n tokenCount: number;\n /**\n * The stringified canonical URL from `frontmatter.canonical`. Exposed\n * so the endpoint can echo it in a `Link: <…>; rel=\"canonical\"`\n * header — tells crawlers the `.md` is an alternate representation,\n * not a separately indexable resource.\n */\n canonicalHref: string;\n}\n\nconst FRONTMATTER_KEYS = [\n 'title',\n 'canonical',\n 'pubDate',\n 'updatedDate',\n 'author',\n 'description',\n 'tags',\n 'categories',\n] as const satisfies ReadonlyArray<keyof MarkdownAlternateFrontmatter>;\n\nfunction needsQuoting(value: string): boolean {\n if (value === '') return true;\n if (/^\\s|\\s$/.test(value)) return true;\n return /[:#[\\]{}\"'`,&*!|>%@]/.test(value);\n}\n\nfunction yamlString(value: string): string {\n if (!needsQuoting(value)) return value;\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `\"${escaped}\"`;\n}\n\nfunction yamlList(values: readonly string[]): string {\n return `[${values.map(yamlString).join(', ')}]`;\n}\n\nfunction toIso(value: Date | string): string {\n return value instanceof Date ? value.toISOString() : value;\n}\n\nfunction renderFrontmatter(fm: MarkdownAlternateFrontmatter): string {\n const lines: string[] = ['---'];\n for (const key of FRONTMATTER_KEYS) {\n const raw = fm[key];\n if (raw === undefined || raw === null) continue;\n switch (key) {\n case 'title':\n case 'author':\n case 'description':\n lines.push(`${key}: ${yamlString(String(raw))}`);\n break;\n case 'canonical':\n lines.push(`canonical: ${yamlString(raw.toString())}`);\n break;\n case 'pubDate':\n case 'updatedDate':\n lines.push(`${key}: ${yamlString(toIso(raw as Date | string))}`);\n break;\n case 'tags':\n case 'categories': {\n const arr = raw as readonly string[];\n if (arr.length === 0) continue;\n lines.push(`${key}: ${yamlList(arr)}`);\n break;\n }\n }\n }\n lines.push('---');\n return lines.join('\\n');\n}\n\nfunction defaultEstimate(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Render a `MarkdownAlternateFrontmatter` + body into a markdown string\n * with YAML frontmatter and a token count. Pure.\n */\nexport function renderMarkdownAlternate(\n options: RenderMarkdownAlternateOptions,\n): RenderedMarkdownAlternate {\n const { frontmatter, body, estimateTokens = defaultEstimate, transformBody } = options;\n const rawBody = transformBody ? transformBody(body) : body;\n const trimmedBody = rawBody.replace(/\\s+$/, '');\n const markdown = `${renderFrontmatter(frontmatter)}\\n\\n${trimmedBody}\\n`;\n return {\n markdown,\n tokenCount: estimateTokens(markdown),\n canonicalHref: frontmatter.canonical.toString(),\n };\n}\n\n/**\n * Derive the `.md` URL from a canonical URL. Internal helper — exported\n * for testing and so `<Seo>` can reuse the same algorithm.\n *\n * Rules:\n * - Root (`/`) → `/index.md`. Matches Astro's filesystem routing for\n * `src/pages/index.md.ts`. Without this special case the trailing-\n * slash rule below would yield `/.md`, which Astro never produces.\n * - Trailing `/` → `.md` (e.g. `/blog/post/` → `/blog/post.md`).\n * - Existing extension → replaced with `.md`.\n * - No trailing slash, no extension → `.md` appended.\n * - Query string and hash preserved.\n * - Malformed URL → empty string (caller should emit nothing).\n */\nexport function deriveMdUrl(canonical: string | URL): string {\n let url: URL;\n try {\n url = typeof canonical === 'string' ? new URL(canonical) : new URL(canonical.toString());\n } catch {\n return '';\n }\n const { pathname } = url;\n let newPath: string;\n if (pathname === '/') {\n newPath = '/index.md';\n } else if (pathname.endsWith('/')) {\n newPath = `${pathname.slice(0, -1)}.md`;\n } else if (/\\.[a-z0-9]+$/i.test(pathname)) {\n newPath = pathname.replace(/\\.[a-z0-9]+$/i, '.md');\n } else {\n newPath = `${pathname}.md`;\n }\n url.pathname = newPath;\n return url.toString();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-routes.js","sourceRoot":"","sources":["../src/markdown-routes.ts"],"names":[],"mappings":"AACA,OAAO,EACH,uBAAuB,GAE1B,MAAM,yBAAyB,CAAC;AA6BjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,sBAAsB,CAAQ,OAAuC;IACjF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC/F,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,8BAA8B,CAAC;IAC1E,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC;IAE1D,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAE7D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,QAAQ,GAAsD,IAAI,CAAC;QACvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAC7B,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM;QACV,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAEjE,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,WAAW;YAC3B,cAAc,EAAE,iBAAiB;SACpC,CAAC;QACF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;QACnE,IAAI,eAAe;YAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChF,0DAA0D;QAC1D,mEAAmE;QACnE,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC;QACzC,IAAI,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS,oBAAoB,CAAC;QACnE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"markdown-routes.js","sourceRoot":"","sources":["../src/markdown-routes.ts"],"names":[],"mappings":"AACA,OAAO,EACH,uBAAuB,GAE1B,MAAM,yBAAyB,CAAC;AA6BjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,sBAAsB,CAAQ,OAAuC;IACjF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC/F,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,8BAA8B,CAAC;IAC1E,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC;IAE1D,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAE7D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,QAAQ,GAAsD,IAAI,CAAC;QACvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAC7B,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM;QACV,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAEjE,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,WAAW;YAC3B,cAAc,EAAE,iBAAiB;SACpC,CAAC;QACF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;QACnE,IAAI,eAAe;YAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChF,0DAA0D;QAC1D,mEAAmE;QACnE,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC;QACzC,IAAI,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS,oBAAoB,CAAC;QACnE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC;AACN,CAAC","sourcesContent":["import type { APIRoute } from 'astro';\nimport {\n renderMarkdownAlternate,\n type RenderMarkdownAlternateOptions,\n} from './markdown-alternate.js';\n\nexport interface MarkdownEndpointOptions<Entry> {\n /**\n * Async source of content entries. Usually a thin wrapper around\n * Astro's `getCollection`, e.g. `() => getCollection('blog')`.\n */\n entries: () => Promise<readonly Entry[]>;\n /**\n * Match an entry against the route param (e.g. `Astro.params.slug`).\n * Return the renderer input for a match, or `null` to skip this entry.\n * The first non-null mapping wins.\n */\n mapper: (entry: Entry, slug: string) => RenderMarkdownAlternateOptions | null;\n /**\n * Name of the URL param to read. Defaults to `'slug'`, matching the\n * common `[...slug].md.ts` filename pattern.\n */\n paramName?: string;\n /** `Cache-Control`. Defaults to `max-age=300`. `null` to omit. */\n cacheControl?: string | null;\n /** `Content-Type`. Defaults to `text/markdown; charset=utf-8`. */\n contentType?: string;\n /** Emit `X-Markdown-Tokens`. Defaults to `true`. */\n emitTokenHeader?: boolean;\n /** Extra response headers. Caller wins on key conflicts. */\n extraHeaders?: Record<string, string>;\n}\n\n/**\n * Returns an Astro `APIRoute` that serves a markdown version of a\n * content collection entry, one `.md` URL per entry. Drop into an\n * `.ts` file under `src/pages/`, e.g. `src/pages/blog/[...slug].md.ts`.\n *\n * @example\n * ```ts\n * // src/pages/blog/[...slug].md.ts\n * import { getCollection } from 'astro:content';\n * import { createMarkdownEndpoint } from '@jdevalk/astro-seo-graph';\n *\n * export const getStaticPaths = async () => {\n * const posts = await getCollection('blog');\n * return posts.map((p) => ({ params: { slug: p.id } }));\n * };\n *\n * export const GET = createMarkdownEndpoint({\n * entries: () => getCollection('blog'),\n * mapper: (post, slug) => post.id !== slug ? null : ({\n * frontmatter: {\n * title: post.data.title,\n * canonical: `https://example.com/blog/${post.id}/`,\n * pubDate: post.data.pubDate,\n * author: post.data.author,\n * description: post.data.description,\n * tags: post.data.tags,\n * },\n * body: post.body ?? '',\n * }),\n * });\n * ```\n */\nexport function createMarkdownEndpoint<Entry>(options: MarkdownEndpointOptions<Entry>): APIRoute {\n const paramName = options.paramName ?? 'slug';\n const cacheControl = options.cacheControl === undefined ? 'max-age=300' : options.cacheControl;\n const contentType = options.contentType ?? 'text/markdown; charset=utf-8';\n const emitTokenHeader = options.emitTokenHeader !== false;\n\n return async ({ params }) => {\n const raw = params?.[paramName];\n const slug = Array.isArray(raw) ? raw.join('/') : (raw ?? '');\n if (!slug) return new Response('Not found', { status: 404 });\n\n const entries = await options.entries();\n let rendered: ReturnType<typeof renderMarkdownAlternate> | null = null;\n for (const entry of entries) {\n const input = options.mapper(entry, slug);\n if (input === null) continue;\n rendered = renderMarkdownAlternate(input);\n break;\n }\n if (!rendered) return new Response('Not found', { status: 404 });\n\n const headers: Record<string, string> = {\n 'Content-Type': contentType,\n 'X-Robots-Tag': 'noindex, follow',\n };\n if (cacheControl !== null) headers['Cache-Control'] = cacheControl;\n if (emitTokenHeader) headers['X-Markdown-Tokens'] = String(rendered.tokenCount);\n // Point crawlers at the HTML canonical — the .md URL is a\n // machine-readable alternate, not a separately indexable resource.\n const canonical = rendered.canonicalHref;\n if (canonical) headers['Link'] = `<${canonical}>; rel=\"canonical\"`;\n if (options.extraHeaders) {\n for (const [k, v] of Object.entries(options.extraHeaders)) headers[k] = v;\n }\n return new Response(rendered.markdown, { headers });\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA+B5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAAQ,OAAqC;IAC7E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC/F,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,qBAAqB,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAEnC,OAAO,KAAK,IAAI,EAAE;QACd,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,WAAW;YAC3B,cAAc,EAAE,iBAAiB;SACpC,CAAC;QACF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;QACnE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC;AACN,CAAC;AAqBD,SAAS,SAAS,CAAC,KAAa;IAC5B,OAAO,KAAK;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB;IACrD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC/F,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEjD,OAAO,KAAK,IAAI,EAAE;QACd,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO;aACvB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACX,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5E,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,OAAO;WACZ,GAAG;eACC,OAAO;SACb,CAAC;QACE,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhB,MAAM,GAAG,GAAG;;EAElB,IAAI;UACI,CAAC;QAEH,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,iBAAiB;YACjC,cAAc,EAAE,iBAAiB;SACpC,CAAC;QACF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;QACnE,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA+B5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAAQ,OAAqC;IAC7E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC/F,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,qBAAqB,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAEnC,OAAO,KAAK,IAAI,EAAE;QACd,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,WAAW;YAC3B,cAAc,EAAE,iBAAiB;SACpC,CAAC;QACF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;QACnE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC;AACN,CAAC;AAqBD,SAAS,SAAS,CAAC,KAAa;IAC5B,OAAO,KAAK;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB;IACrD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC/F,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEjD,OAAO,KAAK,IAAI,EAAE;QACd,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO;aACvB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACX,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5E,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,OAAO;WACZ,GAAG;eACC,OAAO;SACb,CAAC;QACE,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhB,MAAM,GAAG,GAAG;;EAElB,IAAI;UACI,CAAC;QAEH,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,iBAAiB;YACjC,cAAc,EAAE,iBAAiB;SACpC,CAAC;QACF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;QACnE,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;AACN,CAAC","sourcesContent":["import type { APIRoute } from 'astro';\nimport type { GraphEntity } from '@jdevalk/seo-graph-core';\nimport { aggregate } from './aggregator.js';\n\nexport interface SchemaEndpointOptions<Entry> {\n /**\n * Async source of content entries. Usually a thin wrapper around\n * Astro's `getCollection`, e.g. `() => getCollection('blog')`, or\n * a filtered variant: `() => (await getCollection('blog')).filter(isPublished)`.\n */\n entries: () => Promise<readonly Entry[]>;\n /**\n * Map a single entry to an array of schema.org pieces. The pieces\n * are assembled into a single `@graph` via the aggregator and\n * deduplicated by `@id`.\n */\n mapper: (entry: Entry) => ReadonlyArray<GraphEntity>;\n /**\n * `Cache-Control` header value. Defaults to `max-age=300` (5 min).\n * Pass `null` to omit the header entirely.\n */\n cacheControl?: string | null;\n /**\n * `Content-Type` header value. Defaults to `application/ld+json`.\n */\n contentType?: string;\n /**\n * JSON output indentation. Defaults to `2`. Pass `0` for compact\n * output.\n */\n indent?: number;\n}\n\n/**\n * Returns an Astro `APIRoute` that serves a corpus-wide schema.org\n * `@graph` for a content collection as JSON-LD. Drop the returned\n * handler into an `.ts` file under `src/pages/`.\n *\n * @example\n * ```ts\n * // src/pages/schema/post.json.ts\n * import { getCollection } from 'astro:content';\n * import { createSchemaEndpoint } from '@jdevalk/astro-seo-graph';\n * import { buildArticle, buildWebPage } from '@jdevalk/seo-graph-core';\n *\n * export const GET = createSchemaEndpoint({\n * entries: () => getCollection('blog'),\n * mapper: (post) => [\n * buildWebPage({ url: `https://example.com/${post.id}/`, ... }, ids),\n * buildArticle({ url: `https://example.com/${post.id}/`, ... }, ids),\n * ],\n * });\n * ```\n */\nexport function createSchemaEndpoint<Entry>(options: SchemaEndpointOptions<Entry>): APIRoute {\n const cacheControl = options.cacheControl === undefined ? 'max-age=300' : options.cacheControl;\n const contentType = options.contentType ?? 'application/ld+json';\n const indent = options.indent ?? 2;\n\n return async () => {\n const entries = await options.entries();\n const graph = aggregate({ entries, mapper: options.mapper });\n const headers: Record<string, string> = {\n 'Content-Type': contentType,\n 'X-Robots-Tag': 'noindex, follow',\n };\n if (cacheControl !== null) headers['Cache-Control'] = cacheControl;\n return new Response(JSON.stringify(graph, null, indent), { headers });\n };\n}\n\nexport interface SchemaMapEntry {\n /**\n * URL path relative to the site root, e.g. `/schema/post.json`.\n * May start with or without a leading slash.\n */\n path: string;\n /** When the resource at this path was last modified. */\n lastModified: Date;\n}\n\nexport interface SchemaMapOptions {\n /** Canonical site URL. Trailing slash is stripped. */\n siteUrl: string;\n /** One entry per schema endpoint. */\n entries: readonly SchemaMapEntry[];\n /** Defaults to `max-age=300`. Pass `null` to omit. */\n cacheControl?: string | null;\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\n/**\n * Returns an Astro `APIRoute` that serves a sitemap-style XML listing\n * of the site's schema.org endpoints. Agent crawlers can use this as\n * a discovery point for a site's JSON-LD knowledge graph.\n *\n * @example\n * ```ts\n * // src/pages/schemamap.xml.ts\n * import { createSchemaMap } from '@jdevalk/astro-seo-graph';\n *\n * export const GET = createSchemaMap({\n * siteUrl: 'https://example.com',\n * entries: [\n * { path: '/schema/post.json', lastModified: new Date('2026-04-07') },\n * { path: '/schema/video.json', lastModified: new Date('2026-03-13') },\n * ],\n * });\n * ```\n */\nexport function createSchemaMap(options: SchemaMapOptions): APIRoute {\n const cacheControl = options.cacheControl === undefined ? 'max-age=300' : options.cacheControl;\n const site = options.siteUrl.replace(/\\/+$/, '');\n\n return async () => {\n const urls = options.entries\n .map((entry) => {\n const pathPart = entry.path.startsWith('/') ? entry.path : `/${entry.path}`;\n const loc = escapeXml(`${site}${pathPart}`);\n const lastmod = entry.lastModified.toISOString().split('T')[0];\n return ` <url contentType=\"structuredData/schema.org\">\n <loc>${loc}</loc>\n <lastmod>${lastmod}</lastmod>\n </url>`;\n })\n .join('\\n');\n\n const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urls}\n</urlset>`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/xml',\n 'X-Robots-Tag': 'noindex, follow',\n };\n if (cacheControl !== null) headers['Cache-Control'] = cacheControl;\n return new Response(xml, { headers });\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jdevalk/astro-seo-graph",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Astro integration for @jdevalk/seo-graph-core. Seo component, route factories, content-collection aggregator, Zod content helpers.",
5
5
  "keywords": [
6
6
  "astro",
@@ -51,13 +51,13 @@
51
51
  "dependencies": {
52
52
  "schema-dts": "^2.0.0",
53
53
  "zod": "^4.4.3",
54
- "@jdevalk/seo-graph-core": "0.6.2"
54
+ "@jdevalk/seo-graph-core": "0.7.0"
55
55
  },
56
56
  "devDependencies": {
57
- "@types/node": "^22.0.0",
57
+ "@types/node": "^25.9.3",
58
58
  "astro": "^6.0.5",
59
- "typescript": "^5.6.0",
60
- "vitest": "^3.2.4"
59
+ "typescript": "^6.0.3",
60
+ "vitest": "^4.1.9"
61
61
  },
62
62
  "scripts": {
63
63
  "build": "tsc -p tsconfig.build.json && mkdir -p dist/components && cp src/components/*.astro dist/components/ && cp ../../AGENTS.md .",