Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

`tanstack-start-trigger-wrapper.ts` static import of `dev-triggers.ts` crashes entire app when queue/cron handlers have `createRequire` dependencies

オープン
#70 コメント 1 件 リアクション 0 件 担当者 1 名 GitHub で見る

@TheAlexLichter がすでに取り組んでいます。

2026年6月9日 から。

評価

この issue はまだ評価されていません。

説明

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.2
  • vite-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 __job0 from "/path/to/crons/briefing-tick.ts";
import __queue0 from "/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

  1. TanStack Start project with void ≥ 0.9.x
  2. A queue handler in queues/ that imports @mastra/core (or any package using createRequire from node:module)
  3. 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:
async fetch(request, env, ctx) {
  const url = new URL(request.url);
  if (request.method === "POST" &&
      (url.pathname === "/__void/scheduled" || url.pathname === "/__void/queue")) {
    const { handleDevTrigger } = await import('./dev-triggers.ts');
    const res = await handleDevTrigger(request, env, ctx);
    if (res) return res;
  }
  return serveWithAssets(request, env, await original.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.

主要言語
TypeScript
スター
149
フォーク
2
PR マージ指標
30日以内にマージされた PR はありません

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

void-sdk/void のほかの issue

void-sdk/void の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。