withastro / astro · Issue No. 17585
Astro v7.1.6
Node v24.18.0
System Windows (x64)
Package Manager npm
Output server
Adapter @astrojs/cloudflare
Integrations unocss
@astrojs/vue
N/A — this is a build-time / bundler error, not browser-specific.
@astrojs/markdown-satteri (and its native dependency satteri) is unconditionally imported via a static top-level import in Astro's config schema, even when the project uses no Markdown or MDX files at all.
In packages/astro/src/core/config/schemas/base.ts (compiled: astro/dist/core/config/schemas/base.js), line 2:
import { satteri } from "@astrojs/markdown-satteri";
This import runs on every astro dev / astro build invocation, regardless of whether Markdown is configured or used.
The satteri() call is only used to supply the default value for markdown.processor:
}).default(() => satteri())
When building a project that uses @astrojs/vue with Vue client islands (client:only="vue") — but zero Markdown files — Rolldown encounters satteri/browser.js in the module graph. That file imports @bruits/satteri-wasm32-wasi, which is a platform-specific optional dependency that npm skips on Windows.
Using secrets defined in .dev.vars
[ERROR] [vite] ✗ Build failed in 627ms
[vite]: Rolldown failed to resolve import "@bruits/satteri-wasm32-wasi" from
"C:/Users/.../node_modules/satteri/browser.js".
This is most likely unintended because it can break your application at runtime.
If you do want to externalize this module explicitly add it to
`build.rolldownOptions.external`
On some runs, the process terminates with exit code 3221226505 (Windows STATUS_STACK_BUFFER_OVERRUN) and outputs:
Assertion failed: uv__has_active_reqs(loop), file src\win\async.c
.md / .mdx files@astrojs/mdx integration is not installedmarkdown config key is never set in astro.config.*@astrojs/vue with a client island (client:only="vue") containing a non-trivial module graph (Tiptap editor, Vue Router)@bruits/satteri-wasm32-wasi is not installed by npm@astrojs/markdown-satteri and its native binaries (satteri, @bruits/satteri-*) should only be loaded lazily / on-demand when the project actually processes Markdown or MDX content.
Projects that do not use Markdown at all should never trigger resolution of the Sätteri module or its WASM/native binaries.
Suggested fix — convert the static import in base.ts to a dynamic import:
// Before (current — eager, always loaded):
import { satteri } from "@astrojs/markdown-satteri";
// After (lazy — loaded only when markdown.processor is needed):
const getSatteriDefault = async () => {
const { satteri } = await import("@astrojs/markdown-satteri");
return satteri();
};
https://github.com/arcsynxae/astro-cloudflare-monorepo-repro
Relay reads this issue against the repository's contribution signals: the files it is likely to touch, how the maintainers triage work this size, and what the first contribution would exercise.
The full analysis for this issue is still being assembled. Until then, the description above and the thread on GitHub are the most reliable context.