import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
import sitemap from '@astrojs/sitemap';
// Canonical origin. Drives canonical URLs, OG tags, and the sitemap.
const SITE = process.env.PUBLIC_SITE_URL ?? 'https://adr.smlcompany.ca';
export default defineConfig({
site: SITE,
// Static output is the point of this rebuild — see docs/04-seo-spec.md.
// Do not switch to a server adapter without an AGENTS.md Change Log entry.
output: 'static',
// Directory-style URLs with a trailing slash, matched by the CloudFront
// trailing-slash function. See docs/06-deployment.md.
trailingSlash: 'always',
build: { format: 'directory', inlineStylesheets: 'auto' },
// Astro 7 changed this default from `true` to `'jsx'`. Measured, not assumed
// (AGENTS.md entry (t)): in an .astro template, an inline pair split across
// two lines renders as `inlinepair` under 'jsx' and
// `inline pair` under `true`. The space is silently
// deleted — no error, no warning; you find out by reading the page.
//
// MDX prose is NOT affected either way; the hazard is .astro markup only.
// Held at the HTML-aware behaviour because hand-written templates on a
// text-heavy site are exactly where a wrapped line meets an inline tag.
// Revisit only with a measurement, not a preference. See R12.
compressHTML: true,
integrations: [
mdx(),
sitemap({
// NOINDEX PAGES ARE EXCLUDED, and the list is now three shapes rather
// than one. `/legal/*` is noindex by spec (docs/04). The two added at
// build step 8 are the intake form's POST-redirect-GET landing pages:
// both are transactional, neither has standalone value, and a search
// result reading "your inquiry has been received" for someone who has not
// sent one is worse than no result at all.
//
// ⚠️ `/insights/` IS DELIBERATELY NOT HERE even though it emits
// `noindex` while no article is published. This filter cannot see
// collection data — it runs from build config, with no access to
// `getCollection` — so the exclusion could only be a guess at the
// collection's state, and it would then be wrong in the direction that
// matters the moment an article publishes. The page derives its own
// `noindex` from the collection on every build, so the mismatch is
// temporary, self-clearing, and reported accurately by Search Console as
// excluded-by-noindex. Recorded rather than fixed with a frontmatter
// parser in build config.
//
// The `/type-scale/` half of this condition is gone with the page it
// named: the step-1 proof sheet was deleted at step 2, as its own comment
// and InfinityMark's both said it would be. Recoverable from git if the
// specimen is ever wanted again; it is not a route the site ships.
filter: (page) =>
!page.includes('/legal/') &&
!page.includes('/contact/received/') &&
!page.includes('/contact/could-not-send/') &&
// `/bio/` is a condensed duplicate of `/about/` and `/fees/`, and it
// exists to be rendered to a PDF (R16). Two URLs competing on the same
// content is the thing `docs/04` is most concerned with, so it is
// `noindex` and out of the sitemap.
!page.includes('/bio/'),
changefreq: 'monthly',
// No `lastmod`. It was `new Date()`, which stamped every URL with the
// build time — telling crawlers all 17 pages changed whenever one did.
// Google discounts lastmod it judges unreliable, so that spent the signal
// docs/04-seo-spec.md wants rather than sending it. Step 7 can reinstate
// it per-entry from an article's `updatedDate` via `serialize`.
}),
],
// No `image` block: `astro/assets/services/sharp` is already Astro's default
// service, so setting it was dead configuration. The conventions it used to
// sit under — explicit width/height on every image, never base64-inline —
// live in CLAUDE.md, which is where they are actually enforced (by review).
// No `prefetch` block at all — removed 2026-08-26, see AGENTS.md entry (r).
// Any prefetch setting ships Astro's prefetch script to every page, against
// CLAUDE.md's "default to zero JS", for a marginal gain on a small static site
// already served from CloudFront. Revisit only against real Lighthouse numbers.
});