diff --git a/MIGRATION.md b/MIGRATION.md
new file mode 100644
index 000000000000000..622c020aee16f4d
--- /dev/null
+++ b/MIGRATION.md
@@ -0,0 +1,174 @@
+# Astro v6 + Starlight Beta — Migration POC
+
+> **Reference links:**
+>
+> - Starlight beta: [withastro/starlight#3644]
+> - Astro Docs example: [withastro/docs#13230]
+> - [Astro migration guide]
+> - [Zod 4 migration guide]
+> - [Cloudflare adapter migration guide]
+
+[withastro/starlight#3644]: https://github.com/withastro/starlight/pull/3644
+[withastro/docs#13230]: https://github.com/withastro/docs/pull/13230
+[Astro Migration guide]: https://v6.docs.astro.build/en/guides/upgrade-to/v6/
+[Zod 4 migration guide]: https://zod.dev/v4/changelog
+[Cloudflare adapter migration guide]: https://v6.docs.astro.build/en/guides/integrations-guide/cloudflare/#upgrading-to-v13-and-astro-6
+[STARLIGHT_CUSTOMIZATIONS.md]: ./STARLIGHT_CUSTOMIZATIONS.md
+
+## High-risk items and unknowns
+
+| Item | Risk | Status |
+|-------------------------------------------------------|--------|---------------------------------------------------------------|
+| **`Page.astro` Vite alias** | HIGH | Unknown — We're coupled to low-level private implementation |
+| **`patch-package` hunks against Starlight internals** | HIGH | Unknown — We're coupled to low-level private implementation |
+| **`starlight-links-validator` Zod 4 incompatibility** | HIGH | Confirmed broken upstream |
+| **Community Starlight plugins vs. beta** | MEDIUM | Unknown — must investigate each |
+| **Vitest compatibility** | LOW | Must stay on Vitest v3.2.x, but we don't have a lot of tests. |
+| **Zod 4** | LOW | Will result in warnings, not errors |
+
+## Background notes
+
+- We do **not** use the `@astrojs/cloudflare` adapter.
+ The site is compiled to static HTML and served by a custom Cloudflare Worker defined in `worker/index.ts`.
+ The [Cloudflare adapter migration guide] does not apply here.
+- We have **six layers of Starlight customization** documented in [STARLIGHT_CUSTOMIZATIONS.md].
+ This should be read beforehand.
+ The most invasive is `patch-package`, which directly modifies Starlight files in `node_modules` after every install.
+- We use several **community Starlight plugins** alongside the official ones.
+
+## Version targets
+
+Targets are determined by [withastro/docs#13230].
+That is the north star.
+
+| Package | Current | Target |
+| ------------------------------ | -------- |--------------------------------------------------------|
+| `astro` | `5.13.7` | `6.0.0-beta.8` |
+| `@astrojs/starlight` | `0.36.0` | `https://pkg.pr.new/@astrojs/starlight@3644` |
+| `@astrojs/starlight-docsearch` | `0.6.0` | `https://pkg.pr.new/@astrojs/starlight-docsearch@3644` |
+| `@astrojs/starlight-tailwind` | `4.0.1` | `https://pkg.pr.new/@astrojs/starlight-tailwind@3644` |
+| `@astrojs/check` | `0.9.4` | `0.9.7-beta.1` |
+| `@astrojs/react` | `4.2.5` | ? |
+| `@astrojs/sitemap` | `3.5.1` | `3.6.1-beta.3` |
+| `@astrojs/rss` | `4.0.12` | ? |
+
+The Starlight packages use `pkg.pr.new` URLs.
+These are preview builds cut directly from the PR branch, not published to npm.
+
+## Can any of this be done in a separate PR first?
+
+Must be done in the final big-bang PR:
+
+- `astro/zod` (the Astro 6 replacement for `astro:schema`) does not exist in Astro 5. The
+ 18-file import rename must happen in the same commit as the version bump.
+- `experimental.contentIntellisense` is still behind the experimental flag in Astro 5; it
+ can only be removed once Astro 6 is installed.
+- All `patch-package` patches are pinned to exact package version strings and must be
+ regenerated against whatever versions the new packages install as.
+- Zod 4 cannot be upgraded independently — it is bundled by Astro and upgrades with it.
+
+## Things to ignore
+
+Both of these are deprecated in Zod 4 but not removed. The old names still work at runtime; the only consequence is TypeScript deprecation warnings.
+
+| Usage | Deprecated in favor of |
+| ---------------------------- | ------------------------------- |
+| `.catch((ctx) => ctx.input)` | `ctx.value` |
+| `.describe("...")` | `.meta({ description: "..." })` |
+
+---
+
+## Migration steps
+
+### Step 1 — Update versions
+
+```shell
+npx @astrojs/upgrade beta
+```
+
+This likely takes care of most Astro packages.
+Starlight package must be manually set to the PR.
+
+```shell
+npm install \
+ @astrojs/starlight@https://pkg.pr.new/@astrojs/starlight@3644 \
+ @astrojs/starlight-docsearch@https://pkg.pr.new/@astrojs/starlight-docsearch@3644 \
+ @astrojs/starlight-tailwind@https://pkg.pr.new/@astrojs/starlight-tailwind@3644
+```
+
+> **Note on Vitest:** `vitest` must stay at `3.2.x`. `vitest.workspace.ts` uses
+> `getViteConfig()` from `astro/config`, which Astro 6 only supports with Vitest v3.2.
+> Vitest v4 is not yet supported.
+
+### Step 2 — Regenerate patch-package patches ⚠️ HIGH RISK
+
+See `STARLIGHT_CUSTOMIZATIONS.md` for full context on what each patch does.
+It's likely these patches don't work out the box for the new Starlight beta.
+
+Open question: Why did we do this?
+This makes _every_ upgrade nearly impossible.
+
+### Step 3 — Update `astro:schema` imports to `astro/zod`
+
+All 18 files in `src/schemas/` import `z` from `"astro:schema"`.
+Astro 6 deprecates this virtual module in favor of `"astro/zod"`.
+
+```diff
+-import { z } from "astro:schema";
++import { z } from "astro/zod";
+```
+
+Note: The [zod code mod] is likely useful.
+
+Open question: Is there an Astro-specific code mod? Should there be?
+
+Without a code mod:
+
+```shell
+find src/schemas -name "*.ts" | xargs sed -i '' 's|from "astro:schema"|from "astro/zod"|g'
+```
+
+[zod code mod]: https://github.com/nicoespeon/zod-v3-to-v4
+
+### Step 4 — Remove `experimental.contentIntellisense` from `astro.config.ts`
+
+Content Intellisense was behind an experimental flag in Astro 5 and is stable by default in Astro 6.
+The flag will either be silently ignored or cause a type error.
+
+In `astro.config.ts`, remove:
+
+```ts
+experimental: {
+ contentIntellisense: true,
+},
+```
+
+### Step 5 — Investigate the `Page.astro` Vite alias ⚠️ HIGH RISK
+
+**File:** `astro.config.ts`, `vite.resolve.alias` block
+
+We shim Starlight's non-overridable `Page.astro` at the Vite bundler level:
+
+```ts
+vite: {
+ resolve: {
+ alias: {
+ "./Page.astro": fileURLToPath(...),
+ "../components/Page.astro": fileURLToPath(...),
+ },
+ },
+},
+```
+
+Open question: Can we even keep doing such a low-level override?
+This likely wasn't exposed for a reason.
+
+### Step 6 — Check community Starlight plugins
+
+| Plugin | Current version | Status |
+| ---------------------------- | --------------- | -------------------------------------------- |
+| `starlight-links-validator` | `0.17.2` | **Confirmed broken** — Zod 4 incompatibility |
+| `starlight-image-zoom` | `0.13.0` | ? |
+| `starlight-scroll-to-top` | `0.4.0` | ? |
+| `starlight-package-managers` | `0.11.0` | ? |
+| `starlight-showcases` | `0.3.0` | ? |
diff --git a/STARLIGHT_CUSTOMIZATIONS.md b/STARLIGHT_CUSTOMIZATIONS.md
new file mode 100644
index 000000000000000..cf1a1313bfbafce
--- /dev/null
+++ b/STARLIGHT_CUSTOMIZATIONS.md
@@ -0,0 +1,181 @@
+# Starlight Customizations
+
+This doc explains every way we've extended or patched Starlight. There are six distinct layers, ordered roughly from most to least invasive.
+
+## 1. `patch-package` — Direct node_modules patches
+
+**Trigger:** `postinstall` in `package.json` runs `npx patch-package` after every `npm install`.
+
+Patch files live in `patches/`. These are the nuclear option — used when Starlight gives us no other extension point.
+
+### `patches/@astrojs+starlight+0.36.0.patch`
+
+Three hunks against three different files:
+
+**`components/SidebarSublist.astro`** — Sidebar icons
+
+Starlight has no native API for per-item icons in the sidebar. We inject `~/components/SidebarIcon.astro` (Lottie animations) before each sidebar label:
+
+```diff
+-{entry.label}
++{entry.icon && }{entry.label}
+```
+
+The `icon` property comes from sidebar entry `attrs` set in our sidebar generation logic.
+
+**`integrations/remark-rehype-utils.ts`** — Remark/rehype pipeline scope
+
+Starlight's remark/rehype processing originally bails out for any file not inside the `docs` collection. We widen the guard to also process `partials/` and `changelog/`:
+
+```diff
+-if (!normalizePath(file.path).startsWith(docsCollectionPath)) return false;
++if (
++ !normalizePath(file.path).startsWith(docsCollectionPath) &&
++ !normalizePath(file.path).includes("/src/content/partials/") &&
++ !normalizePath(file.path).includes("/src/content/changelog/")
++) return false;
+```
+
+Without this, heading transforms, tab components, etc. don't run inside partials or changelogs.
+
+**`user-components/Tabs.astro`** — Injectable icon component
+
+Makes the `Icon` component inside `` replaceable via prop, so callers (e.g. `TypeScriptExample`) can swap in a custom icon renderer:
+
+```diff
++IconComponent?: typeof Icon;
+-const { syncKey } = Astro.props;
++const { syncKey, IconComponent = Icon } = Astro.props;
+ ...
+-{icon && }
++{icon && }
+```
+
+### `patches/@astrojs+starlight-docsearch+0.6.0.patch`
+
+**`DocSearch.astro`** — Keyboard shortcut hint UI
+
+We disable the `/` shortcut in DocSearch (re-routing it to the sidebar search input instead). The original button always rendered a `/` slash icon. The patch makes the hint adaptive:
+
+- Default: renders styled ``-style key badges (`Ctrl K`)
+- Only shows the slash SVG icon when `/` is enabled AND `Ctrl/Cmd+K` is disabled
+
+The slash icon CSS is moved from a static `
diff --git a/src/components/realtimekit/RTKCodeSnippet/RTKCodeSnippet.astro b/src/components/realtimekit/RTKCodeSnippet/RTKCodeSnippet.astro
index dd639d42f827bcd..38d864a4e582dff 100644
--- a/src/components/realtimekit/RTKCodeSnippet/RTKCodeSnippet.astro
+++ b/src/components/realtimekit/RTKCodeSnippet/RTKCodeSnippet.astro
@@ -1,5 +1,5 @@
---
-import { z } from "astro:schema";
+import { z } from "astro/zod";
import CodeSnippet from "./RTKCodeSnippet";
const props = z.object({
diff --git a/src/components/realtimekit/RTKSDKSelector/RTKSDKSelector.astro b/src/components/realtimekit/RTKSDKSelector/RTKSDKSelector.astro
index a264d2f0cc3a275..84861bdd8baaabb 100644
--- a/src/components/realtimekit/RTKSDKSelector/RTKSDKSelector.astro
+++ b/src/components/realtimekit/RTKSDKSelector/RTKSDKSelector.astro
@@ -1,5 +1,5 @@
---
-import { z } from "astro:schema";
+import { z } from "astro/zod";
import SDKSelector from "./RTKSDKSelector";
const platform = z.enum([
diff --git a/src/components/realtimekit/RTKicons/RTKIcon.astro b/src/components/realtimekit/RTKicons/RTKIcon.astro
index 6c5fc753c2cb603..0e6a432dc867882 100644
--- a/src/components/realtimekit/RTKicons/RTKIcon.astro
+++ b/src/components/realtimekit/RTKicons/RTKIcon.astro
@@ -1,5 +1,5 @@
---
-import { z } from "astro:schema";
+import { z } from "astro/zod";
import Icon from "./RTKIcon";
const props = z.object({
diff --git a/src/pages/changelog/post/[...slug].astro b/src/pages/changelog/post/[...slug].astro
index 98d13a6407b536c..c04570968742321 100644
--- a/src/pages/changelog/post/[...slug].astro
+++ b/src/pages/changelog/post/[...slug].astro
@@ -62,15 +62,14 @@ const props = {
+
diff --git a/src/schemas/apps.ts b/src/schemas/apps.ts
index c5d488887bf59dd..82135185c207e94 100644
--- a/src/schemas/apps.ts
+++ b/src/schemas/apps.ts
@@ -1,9 +1,9 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export const appsSchema = z
.object({
id: z.string(),
- link: z.string().url(),
+ link: z.url(),
description: z.string(),
tags: z.string().array().optional(),
products: z.string().array(),
diff --git a/src/schemas/base.ts b/src/schemas/base.ts
index ec3a445c7ae5929..29ef1401fa8129c 100644
--- a/src/schemas/base.ts
+++ b/src/schemas/base.ts
@@ -1,40 +1,17 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
import { reference, type SchemaContext } from "astro:content";
import { sidebar } from "./types/sidebar";
export const baseSchema = ({ image }: SchemaContext) =>
z.object({
- preview_image: image()
- .optional()
+ preview_image: z
+ .optional(image())
.describe(
"A `src` path to the image that you want to use as a custom preview image for social sharing.",
),
pcx_content_type: z
- .union([
- z.literal("changelog"),
- z.literal("changelog-entry"),
- z.literal("configuration"),
- z.literal("concept"),
- z.literal("design-guide"),
- z.literal("example"),
- z.literal("faq"),
- z.literal("get-started"),
- z.literal("how-to"),
- z.literal("integration-guide"),
- z.literal("implementation-guide"),
- z.literal("learning-unit"),
- z.literal("navigation"),
- z.literal("overview"),
- z.literal("reference"),
- z.literal("reference-architecture"),
- z.literal("reference-architecture-diagram"),
- z.literal("release-notes"),
- z.literal("troubleshooting"),
- z.literal("tutorial"),
- z.literal("video"),
- ])
- .catch((ctx) => ctx.input)
+ .string()
.optional()
.describe(
"The purpose of the page, and defined through specific pages in [Content strategy](/style-guide/documentation-content-strategy/content-types/).",
@@ -53,12 +30,7 @@ export const baseSchema = ({ image }: SchemaContext) =>
"Path to another page in our docs or elsewhere. Used to add a crosslink entry to the lefthand navigation sidebar.",
),
difficulty: z
- .union([
- z.literal("Beginner"),
- z.literal("Intermediate"),
- z.literal("Advanced"),
- ])
- .catch((ctx) => ctx.input)
+ .string()
.optional()
.describe(
"Difficulty is displayed as a column in the [ListTutorials component](/style-guide/components/list-tutorials/).",
diff --git a/src/schemas/changelog.ts b/src/schemas/changelog.ts
index d8c27850fbc47c6..07956bcd8758a2a 100644
--- a/src/schemas/changelog.ts
+++ b/src/schemas/changelog.ts
@@ -1,5 +1,5 @@
import { reference, type SchemaContext } from "astro:content";
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export const changelogSchema = ({ image }: SchemaContext) =>
z.object({
@@ -13,7 +13,7 @@ export const changelogSchema = ({ image }: SchemaContext) =>
.describe(
"An array of directory entries to associate this changelog entry with. You may omit the entry named after the folder this entry is in.",
),
- preview_image: image().optional(),
+ preview_image: z.optional(image()),
hidden: z
.boolean()
.default(false)
diff --git a/src/schemas/compatibility-flags.ts b/src/schemas/compatibility-flags.ts
index f35f8b572a14973..ab4143ebb96e408 100644
--- a/src/schemas/compatibility-flags.ts
+++ b/src/schemas/compatibility-flags.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export type CompatibilityFlagsSchema = z.infer;
diff --git a/src/schemas/fields.ts b/src/schemas/fields.ts
index 13da40948a6f4de..2724798fe967288 100644
--- a/src/schemas/fields.ts
+++ b/src/schemas/fields.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export const fieldsSchema = z.object({
entries: z
diff --git a/src/schemas/glossary.ts b/src/schemas/glossary.ts
index cc2cfa915482fa3..4f8d9422c4df1ca 100644
--- a/src/schemas/glossary.ts
+++ b/src/schemas/glossary.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export const glossarySchema = z.object({
productName: z.string(),
diff --git a/src/schemas/learning-paths.ts b/src/schemas/learning-paths.ts
index fae2a986410b33b..7d5eb038d788f94 100644
--- a/src/schemas/learning-paths.ts
+++ b/src/schemas/learning-paths.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
import { reference } from "astro:content";
export const learningPathsSchema = z
diff --git a/src/schemas/notifications.ts b/src/schemas/notifications.ts
index c2e27af1b35a5ed..6373fcc59f10997 100644
--- a/src/schemas/notifications.ts
+++ b/src/schemas/notifications.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export const notificationsSchema = z
.object({
diff --git a/src/schemas/pages-build-environment.ts b/src/schemas/pages-build-environment.ts
index 1ac6030a9c51eb5..b66c4c1f03e5855 100644
--- a/src/schemas/pages-build-environment.ts
+++ b/src/schemas/pages-build-environment.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
const supportInfo = z
.object({
diff --git a/src/schemas/pages-framework-presets.ts b/src/schemas/pages-framework-presets.ts
index a4af9a4096c61c9..46b9f548d1bc336 100644
--- a/src/schemas/pages-framework-presets.ts
+++ b/src/schemas/pages-framework-presets.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
const preset = z
.object({
diff --git a/src/schemas/partials.ts b/src/schemas/partials.ts
index 58e1c6075535219..77535cd14bad86d 100644
--- a/src/schemas/partials.ts
+++ b/src/schemas/partials.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
const paramsDocs =
"https://developers.cloudflare.com/style-guide/components/render/#defining-expected-properties-in-frontmatter";
diff --git a/src/schemas/release-notes.ts b/src/schemas/release-notes.ts
index 2f3f581c8d0155a..3c195e74cc523e6 100644
--- a/src/schemas/release-notes.ts
+++ b/src/schemas/release-notes.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export const releaseNotesSchema = z.object({
link: z.string(),
diff --git a/src/schemas/stream.ts b/src/schemas/stream.ts
index 4b4cfd24405ae36..eb9fb113b5e20fd 100644
--- a/src/schemas/stream.ts
+++ b/src/schemas/stream.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
import { reference } from "astro:content";
export const streamSchema = z.object({
diff --git a/src/schemas/types/badge.ts b/src/schemas/types/badge.ts
index 187c0add88a2f57..adf43ff7759ed9e 100644
--- a/src/schemas/types/badge.ts
+++ b/src/schemas/types/badge.ts
@@ -1,5 +1,5 @@
// Vendored from https://github.com/withastro/starlight/blob/a171a996b842f1fdb37a0bdbb2c9d86e1073e1a4/packages/starlight/schemas/badge.ts#
-import { z } from "astro:schema";
+import { z } from "astro/zod";
const badgeBaseSchema = z.object({
variant: z
@@ -13,14 +13,13 @@ const badgeSchema = badgeBaseSchema.extend({
});
const i18nBadgeSchema = badgeBaseSchema.extend({
- text: z.union([z.string(), z.record(z.string())]),
+ text: z.union([z.string(), z.record(z.string(), z.string())]),
});
-export const BadgeComponentSchema = badgeSchema
- .extend({
- size: z.enum(["small", "medium", "large"]).default("small"),
- })
- .passthrough();
+export const BadgeComponentSchema = z.looseObject({
+ ...badgeSchema.shape,
+ size: z.enum(["small", "medium", "large"]).default("small"),
+});
export type BadgeComponentProps = z.input;
diff --git a/src/schemas/types/sidebar.ts b/src/schemas/types/sidebar.ts
index d69ba71b73754c3..e5b367e75875e83 100644
--- a/src/schemas/types/sidebar.ts
+++ b/src/schemas/types/sidebar.ts
@@ -6,22 +6,19 @@
* https://github.com/withastro/starlight/blob/main/packages/starlight/schema.ts
*/
-import { z } from "astro:schema";
-import type { AstroBuiltinAttributes } from "astro";
-import type { HTMLAttributes } from "astro/types";
+import { z } from "astro/zod";
/**
* From https://github.com/withastro/starlight/blob/main/packages/starlight/schemas/badge.ts
*/
const linkHTMLAttributesSchema = z.record(
+ z.string(),
z.union([z.string(), z.number(), z.boolean(), z.undefined()]),
-) as z.Schema<
- Omit, keyof AstroBuiltinAttributes | "children">
->;
+);
const SidebarLinkItemHTMLAttributesSchema = () =>
- linkHTMLAttributesSchema.default({});
+ linkHTMLAttributesSchema.prefault({});
/**
* https://github.com/withastro/starlight/blob/main/packages/starlight/schemas/sidebar.ts
@@ -74,7 +71,7 @@ export const sidebar = z
})
.optional(),
})
- .default({})
+ .prefault({})
.describe(
"Used to configure various sidebar options. Refer to [Sidebar](/style-guide/frontmatter/sidebar/).",
);
diff --git a/src/schemas/videos.ts b/src/schemas/videos.ts
index 48b75e70aedfcbe..fcffefeb38d22cf 100644
--- a/src/schemas/videos.ts
+++ b/src/schemas/videos.ts
@@ -1,9 +1,9 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export const videosSchema = z
.object({
id: z.string(),
- link: z.string().url(),
+ link: z.url(),
description: z.string(),
tags: z.string().array().optional(),
products: z.string().array(),
diff --git a/src/schemas/warp-releases.ts b/src/schemas/warp-releases.ts
index ead196975dff28a..d70389f972db886 100644
--- a/src/schemas/warp-releases.ts
+++ b/src/schemas/warp-releases.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export const warpReleasesSchema = z
.object({
diff --git a/src/schemas/workers-ai-models.ts b/src/schemas/workers-ai-models.ts
index 346c8df6f662f4b..571db79880bc160 100644
--- a/src/schemas/workers-ai-models.ts
+++ b/src/schemas/workers-ai-models.ts
@@ -1,4 +1,4 @@
-import { z } from "astro:schema";
+import { z } from "astro/zod";
export type WorkersAIModelsSchema = z.infer;
@@ -17,11 +17,11 @@ export const workersAiModelsSchema = z.object({
properties: z
.object({
property_id: z.string(),
- value: z.string().or(z.array(z.object({}).passthrough())),
+ value: z.string().or(z.array(z.looseObject({}))),
})
.array(),
schema: z.object({
- input: z.object({}).passthrough(),
- output: z.object({}).passthrough(),
+ input: z.looseObject({}),
+ output: z.looseObject({}),
}),
});
diff --git a/src/util/container.ts b/src/util/container.ts
index 944b555f17f4999..bf22794f0a13d96 100644
--- a/src/util/container.ts
+++ b/src/util/container.ts
@@ -19,7 +19,6 @@ export async function entryToString(
});
container.addServerRenderer({
name: "@astrojs/react",
- // @ts-expect-error incompatible types
renderer: reactRenderer,
});
@@ -44,7 +43,6 @@ export async function componentToString(
});
container.addServerRenderer({
name: "@astrojs/react",
- // @ts-expect-error incompatible types
renderer: reactRenderer,
});
diff --git a/src/util/helpers.ts b/src/util/helpers.ts
index 158c6cd81ff7f2b..258f531b978c03d 100644
--- a/src/util/helpers.ts
+++ b/src/util/helpers.ts
@@ -1,10 +1,9 @@
-import { z, type ZodEnum } from "astro/zod";
+import { z } from "astro/zod";
-export function zodEnumFromObjKeys(
- obj: Record,
-): ZodEnum<[K, ...K[]]> {
- const [firstKey, ...otherKeys] = Object.keys(obj) as K[];
- return z.enum([firstKey, ...otherKeys]);
+export function zodEnumFromObjKeys>(obj: T) {
+ type Keys = keyof T & string;
+ const keys = Object.keys(obj) as [Keys, ...Keys[]];
+ return z.enum(keys);
}
export function formatBytes(bytes: number, decimals?: number) {
diff --git a/v6_deps.md b/v6_deps.md
new file mode 100644
index 000000000000000..e21f769fcf93b26
--- /dev/null
+++ b/v6_deps.md
@@ -0,0 +1,71 @@
+# cloudflare-docs
+
+| Package | Current version | Beta version | Owner | v6 compatible? | Notes |
+|------------------------------|-----------------|------------------------------------------------------|--------------------------|--------------------|----------------------------------------|
+| @astrojs/starlight | 0.36.0 | https://pkg.pr.new/@astrojs/starlight@3644 | @astrojs | Yes | |
+| @astrojs/starlight-docsearch | 0.6.0 | https://pkg.pr.new/@astrojs/starlight-docsearch@3644 | @astrojs | Yes | |
+| @astrojs/starlight-tailwind | 4.0.1 | https://pkg.pr.new/@astrojs/starlight-tailwind@3644 | @astrojs | Yes | |
+| @astrojs/check | 0.9.4 | 0.9.7-beta.1 | @astrojs | Yes | |
+| @astrojs/react | 4.2.5 | 5.0.0-beta.3 | @astrojs | Yes | |
+| @astrojs/sitemap | 3.5.1 | 3.6.1-beta.3 | @astrojs | Yes | |
+| @astrojs/rss | 4.0.12 | 4.0.15-beta.4 | @astrojs | Yes | |
+| astro-skills | 0.0.5 | None | fredkschott (core team) | Yes | |
+| starlight-image-zoom | 0.13.2 | None | HiDeoo (core team) | Yes (eventually) | |
+| starlight-links-validator | 0.19.2 | None | HiDeoo (core team) | Known Zod 4 issues | |
+| starlight-package-managers | 0.12.0 | None | HiDeoo (core team) | Yes (eventually) | |
+| starlight-showcases | 0.3.1 | None | HiDeoo (core team) | Yes (eventually) | |
+| astro-breadcrumbs | 3.3.1 | Unrelated | felix-berlin (community) | No | |
+| astro-icon | 1.1.5 | None | natemoo-re (community) | Maybe | No peers declared; devDeps us astro@4 |
+| astro-live-code | 0.0.6 | None | mattjennings (community) | Maybe | No peers declared; devDeps use astro@5 |
+| starlight-scroll-to-top | 0.4.0 | None | frostybee (community) | Likely yes | peer: @astrojs/starlight@>=0.35 |
+
+# astro-icon
+
+| Package | Current version | Beta version | Owner | v6 compatible? | Notes |
+|--------------------|-----------------|--------------------------------------------|----------|----------------|------------------------------------------|
+| astro | ^4.0.0 (dev) | 6.0.0-beta.15 | @astrojs | Yes | peerDeps cap at ^4; no v6 range declared |
+| @astrojs/starlight | ^0.15.1 (www) | https://pkg.pr.new/@astrojs/starlight@3644 | @astrojs | Yes | A dep of the docs, not the plugin |
+| @astrojs/check | ^0.3.4 (www) | 0.9.7-beta.1 | @astrojs | Yes | A dep of the docs, not the plugin |
+
+# astro-breadcrumbs
+
+| Package | Current version | Beta version | Owner | v6 compatible? | Notes |
+|---------------------------|-----------------|-----------------------------------------------------|--------------------------|--------------------|-----------------------------------|
+| @astrojs/starlight | 0.37.6 | https://pkg.pr.new/@astrojs/starlight@3644 | @astrojs | Yes | A dep of the docs, not the plugin |
+| @astrojs/mdx | 4.3.13 | 5.0.0-beta.8 | @astrojs | Yes | A dep of the demo, not the plugin |
+| starlight-links-validator | 0.19.2 | None | HiDeoo ( core team) | Known Zod 4 issues | A dep of the docs, not the plugin |
+| astro-matomo | 1.9.0 | https://pkg.pr.new/colbywhite/astro-matomo@12c1d60 | felix-berlin (community) | Yes | A dep of the docs, not the plugin |
+
+# astro-live-code
+
+| Package | Current version | Beta version | Owner | v6 compatible? | Notes |
+|--------------------|-----------------|--------------------------------------------|----------|----------------|-------|
+| astro | ^5.4.2 (dev) | 6.0.0-beta.15 | @astrojs | Yes | |
+| @astrojs/starlight | ^0.32.2 (dev) | https://pkg.pr.new/@astrojs/starlight@3644 | @astrojs | Yes | |
+| @astrojs/preact | ^4.0.1 (dev) | 5.0.0-beta.4 | @astrojs | Yes | |
+| @astrojs/solid-js | ^5.0.5 (dev) | 6.0.0-beta.2 | @astrojs | Yes | |
+| @astrojs/svelte | ^7.0.0 (dev) | 8.0.0-beta.3 | @astrojs | Yes | |
+| @astrojs/vue | ^5.0.0 (dev) | 6.0.0-beta.1 | @astrojs | Yes | |
+
+No vitest.
+
+# starlight-scroll-to-top
+
+Monorepo with `packages/starlight-scroll-to-top` (plugin) and `docs/` (docs site). Plugin peerDeps:
+`@astrojs/starlight: >=0.35` only — no direct `astro` version constraint.
+
+| Package | Current version | Beta version | Owner | v6 compatible? | Notes |
+|--------------------|----------------------|--------------------------------------------|----------|----------------|----------------|
+| astro | ^5.12.8 (dev + docs) | 6.0.0-beta.15 | @astrojs | Yes | |
+| @astrojs/starlight | ^0.35.2 (dev + docs) | https://pkg.pr.new/@astrojs/starlight@3644 | @astrojs | Yes | |
+| @astrojs/check | ^0.9.4 (docs) | 0.9.7-beta.1 | @astrojs | Yes | docs site only |
+
+No vitest.
+
+# astro-matomo
+
+| Package | Current version | Beta version | Owner | v6 compatible? | Notes |
+|---------|-----------------|---------------|----------|----------------|-------|
+| astro | ^5.16.5 (dev) | 6.0.0-beta.15 | @astrojs | Yes | |
+
+No other deps