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:
parent
c4fe7d356f
commit
7ce5e58f8d
@ -20,20 +20,39 @@ export default defineNitroConfig({
|
|||||||
// → `Class extends value [object Module] is not a constructor` in push.mjs.
|
// → `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.
|
// Fix: external halten, läuft zur Laufzeit aus node_modules korrekt als ESM.
|
||||||
externals: {
|
externals: {
|
||||||
// imapflow MUSS external bleiben — nutzt CJS-inherits-Pattern, bricht beim
|
// imapflow + expo-server-sdk MÜSSEN external bleiben.
|
||||||
// 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.
|
|
||||||
//
|
//
|
||||||
// expo-server-sdk: dasselbe Robustness-Prinzip — Pfad-Regex statt reiner Lookahead,
|
// KRITISCH — warum inline UND external beide nötig sind:
|
||||||
// weil Rollup bei transitivem Import-Graph den nackten Specifier nicht immer sieht.
|
// 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: [
|
external: [
|
||||||
/(^|[\\/]node_modules[\\/])imapflow([\\/]|$)/,
|
/(^|[\\/]node_modules[\\/])imapflow([\\/]|$)/,
|
||||||
/(^|[\\/]node_modules[\\/])expo-server-sdk([\\/]|$)/,
|
/(^|[\\/]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: {
|
imports: {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user