From 7ce5e58f8d158434da977be4e6d75116b16b9025 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Wed, 10 Jun 2026 15:35:52 +0200 Subject: [PATCH] =?UTF-8?q?fix(backend):=20fix=20imapflow=20bundling=20?= =?UTF-8?q?=E2=80=94=20inline-Funktion=20statt=20fragiler=20Regex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die inline-Regex /^(?!imapflow)/ griff nur gegen bare Specifier, nicht gegen aufgelöste absolute Pfade (z.B. /node_modules/.pnpm/imapflow@x/…). Nitro prüft inlineMatchers VOR externalMatchers — bei absoluten Pfaden startete der String mit "/" → Lookahead ^(?!imapflow) schlug durch → imapflow wurde gebundelt → imap-flow.mjs-Chunk → util.inherits-Crash → scan-internal 500 (Incident 2026-06-05, Regression in 1493752). Fix: inline als Funktion mit expliziter blocklist (imapflow, expo-server-sdk, @supabase/supabase-js). Deckt bare Specifier UND aufgelöste node_modules-Pfade. Lokal verifiziert: imap-flow.mjs-Chunk weg, alle 3 Packages in server/package.json. Co-Authored-By: Claude Opus 4.8 --- backend/nitro.config.ts | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) 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: {