diff --git a/backend/nitro.config.ts b/backend/nitro.config.ts index ff75fb9..d63903f 100644 --- a/backend/nitro.config.ts +++ b/backend/nitro.config.ts @@ -20,20 +20,39 @@ export default defineNitroConfig({ // → `Class extends value [object Module] is not a constructor` in push.mjs. // Fix: external halten, läuft zur Laufzeit aus node_modules korrekt als ESM. externals: { - // imapflow MUSS external bleiben — nutzt CJS-inherits-Pattern, bricht beim - // Bundlen zu ESM ("superCtor.prototype must be of type object", util.inherits). - // Der inline-Negative-Lookahead allein ist FRAGIL: er greift nur auf den nackten - // Specifier "imapflow", nicht auf aufgelöste node_modules-Pfade. Bei Module-Graph- - // Shifts (z.B. neue Prisma-Felder) wurde imapflow doch inlined → scan-internal 500 - // (Incident 2026-06-05). Expliziter external-Eintrag mit Pfad-Regex erzwingt es robust. + // imapflow + expo-server-sdk MÜSSEN external bleiben. // - // expo-server-sdk: dasselbe Robustness-Prinzip — Pfad-Regex statt reiner Lookahead, - // weil Rollup bei transitivem Import-Graph den nackten Specifier nicht immer sieht. + // KRITISCH — warum inline UND external beide nötig sind: + // Nitro prüft inlineMatchers VOR externalMatchers (nitropack rollup/index.mjs:756-763). + // Die alte inline-Regex /^(?!imapflow)/ griff nur gegen bare Specifier ("imapflow"). + // Bei aufgelösten absoluten Pfaden (/…/node_modules/.pnpm/imapflow@x/…) startete der + // String mit "/" → der Lookahead ^(?!imapflow) schlug immer DURCH → Modul wurde + // inline gezogen, external-Eintrag nie erreicht → imap-flow.mjs-Chunk im Bundle → + // util.inherits(SonicBoom, EventEmitter) crash (Incident 2026-06-05 + Regression + // in 1493752 weil expo-server-sdk-Shift den Module-Graph veränderte). + // + // Fix: inline als Funktion — explizite blocklist schlägt jede Regex: external: [ /(^|[\\/]node_modules[\\/])imapflow([\\/]|$)/, /(^|[\\/]node_modules[\\/])expo-server-sdk([\\/]|$)/, ], - inline: [/^(?!@supabase\/supabase-js)(?!imapflow)(?!expo-server-sdk)/], + inline: [ + (id: string) => { + // Blocklist: diese Packages NIE bundlen — egal ob bare Specifier oder + // aufgelöster absoluter Pfad (pnpm virtual-store oder hoisted). + const blocked = [ + "imapflow", + "expo-server-sdk", + "@supabase/supabase-js", + ]; + for (const pkg of blocked) { + if (id === pkg || id.includes("/node_modules/" + pkg + "/") || id.includes("\\node_modules\\" + pkg + "\\")) { + return false; // false = NICHT inline = external + } + } + return true; // alles andere bundlen + }, + ], }, imports: {