fix(backend): fix imapflow bundling — inline-Funktion statt fragiler Regex

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 <noreply@anthropic.com>
This commit is contained in:
chahinebrini 2026-06-10 15:35:52 +02:00
parent c4fe7d356f
commit 7ce5e58f8d

View File

@ -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: {