Encountered a weird interaction when using Mastra with crons and queues. Once again, I've asked Claude to help dig into this in hopes that it'll help.
Appreciate it!
Environment
void: 0.9.2vite-plus: 0.1.24@cloudflare/vite-plugin: 1.39.2- Framework: TanStack Start (Class A)
- Compatibility date:
2026-02-24
What happens
Void generates .void/tanstack-start-trigger-wrapper.ts for Class A frameworks. In dev mode this wrapper contains a static top-level import:
import{handleDevTrigger}from'./dev-triggers.ts';.void/dev-triggers.ts (also auto-generated) statically imports every queue and cron handler:
import__job0from"/path/to/crons/briefing-tick.ts";import__queue0from"/path/to/queues/briefing-generation.ts";
If any queue or cron handler transitively imports a package that uses createRequire from Node's module API — in this case @mastra/core, which does so in its gateway/LSP chunks — the TanStack Start worker runner throws on every single request:
require is not defined
at runInRunnerObject (workers/runner-worker/index.js:107:3)
at Object.fetch (.void/tanstack-start-trigger-wrapper.ts:7:34)
at maybeCaptureError (workers/runner-worker/index.js:51:10)
The app is completely broken — not just the dev trigger curls, every page load returns 500.
Why
The static import forces dev-triggers.ts (and therefore all queue/cron handlers and their full dependency trees) to be evaluated at worker module initialization time, before any request is handled. In TanStack Start's workerd-based runner, createRequire from node:module exists but the function it returns throws require is not defined when invoked against CJS modules. Try-catch blocks inside @mastra/core don't help because the import itself (module evaluation) is what fails.
Expected behavior
handleDevTrigger is only needed for POST /__void/scheduled and POST /__void/queue — requests that are only issued during local dev testing. The import should not cause every other request to break.
Minimal repro
- TanStack Start project with
void ≥ 0.9.x - A queue handler in
queues/ that imports @mastra/core (or any package using createRequire from node:module) - Run
pnpm dev and load any page — 500 on every request
Suggested fix
Convert the static import to a lazy dynamic import, only evaluated when a dev trigger path is detected:
// In the generated tanstack-start-trigger-wrapper.ts fetch handler:asyncfetch(request,env,ctx){consturl=newURL(request.url);if(request.method==="POST"&&(url.pathname==="/__void/scheduled"||url.pathname==="/__void/queue")){const{ handleDevTrigger }=awaitimport('./dev-triggers.ts');constres=awaithandleDevTrigger(request,env,ctx);if(res)returnres;}returnserveWithAssets(request,env,awaitoriginal.fetch(request,env,ctx));},This ensures queue/cron handlers are only loaded when actually needed, isolating their dependency trees from the critical request path.
Workaround (in use)
Created a Vite plugin to patch the generated wrapper at dev-server startup to omit the dev-triggers.ts import entirely. Dev triggers are handled via TanStack routes instead.
Encountered a weird interaction when using Mastra with crons and queues. Once again, I've asked Claude to help dig into this in hopes that it'll help.
Appreciate it!
Environment
void: 0.9.2vite-plus: 0.1.24@cloudflare/vite-plugin: 1.39.22026-02-24What happens
Void generates
.void/tanstack-start-trigger-wrapper.tsfor Class A frameworks. In dev mode this wrapper contains a static top-level import:.void/dev-triggers.ts(also auto-generated) statically imports every queue and cron handler:If any queue or cron handler transitively imports a package that uses
createRequirefrom Node'smoduleAPI — in this case@mastra/core, which does so in its gateway/LSP chunks — the TanStack Start worker runner throws on every single request:The app is completely broken — not just the dev trigger curls, every page load returns 500.
Why
The static import forces
dev-triggers.ts(and therefore all queue/cron handlers and their full dependency trees) to be evaluated at worker module initialization time, before any request is handled. In TanStack Start's workerd-based runner,createRequirefromnode:moduleexists but the function it returns throwsrequire is not definedwhen invoked against CJS modules. Try-catch blocks inside@mastra/coredon't help because the import itself (module evaluation) is what fails.Expected behavior
handleDevTriggeris only needed forPOST /__void/scheduledandPOST /__void/queue— requests that are only issued during local dev testing. The import should not cause every other request to break.Minimal repro
void≥ 0.9.xqueues/that imports@mastra/core(or any package usingcreateRequirefromnode:module)pnpm devand load any page — 500 on every requestSuggested fix
Convert the static import to a lazy dynamic import, only evaluated when a dev trigger path is detected:
This ensures queue/cron handlers are only loaded when actually needed, isolating their dependency trees from the critical request path.
Workaround (in use)
Created a Vite plugin to patch the generated wrapper at dev-server startup to omit the
dev-triggers.tsimport entirely. Dev triggers are handled via TanStack routes instead.