From b02368a15b82db4cfb8c4e91b08cce8bd41e8f0a Mon Sep 17 00:00:00 2001 From: Yvv Date: Fri, 27 Feb 2026 20:36:37 +0100 Subject: [PATCH] Fix build prod : Pinia CJS default import crash Node 22+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pinia résout vers pinia.prod.cjs en production, Rollup convertit require('vue') en default import ESM invalide. Script post-build remplace par un namespace import (* as). Co-Authored-By: Claude Opus 4.6 --- nuxt.config.ts | 1 + package.json | 2 +- scripts/fix-esm-imports.mjs | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 scripts/fix-esm-imports.mjs diff --git a/nuxt.config.ts b/nuxt.config.ts index 2117de7..45eeb2c 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -44,4 +44,5 @@ export default defineNuxtConfig({ siteUrl: 'https://librodrome.org', }, }, + }) diff --git a/package.json b/package.json index d33bf08..4a7445d 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "private": true, "scripts": { - "build": "nuxt build", + "build": "nuxt build && node scripts/fix-esm-imports.mjs", "dev": "nuxt dev", "generate": "nuxt generate", "preview": "nuxt preview", diff --git a/scripts/fix-esm-imports.mjs b/scripts/fix-esm-imports.mjs new file mode 100644 index 0000000..5425d38 --- /dev/null +++ b/scripts/fix-esm-imports.mjs @@ -0,0 +1,35 @@ +/** + * Post-build fix: Pinia CJS (pinia.prod.cjs) fait require('vue'). + * Rollup convertit ça en `import require$$0 from 'vue'` (default import). + * Vue 3 n'a pas de default export en ESM → crash Node 22+. + * + * Ce script remplace le default import par un namespace import valide. + */ +import { readFileSync, writeFileSync, existsSync } from 'node:fs' + +const file = '.output/server/chunks/build/server.mjs' + +if (!existsSync(file)) { + console.log('[fix-esm] server.mjs not found, skipping') + process.exit(0) +} + +let code = readFileSync(file, 'utf-8') + +// Pattern: import require$$0, { defineComponent, inject, ... } from 'vue' +// → import * as require$$0 from 'vue'; import { defineComponent, ... } from 'vue' +const re = /import\s+(require\$\$\d+)\s*,\s*\{([^}]+)\}\s*from\s*'vue'/g +let patched = false + +code = code.replace(re, (match, varName, namedStr) => { + patched = true + const names = namedStr.split(',').map(n => n.trim()).filter(Boolean) + return `import * as ${varName} from 'vue'; import { ${names.join(', ')} } from 'vue'` +}) + +if (patched) { + writeFileSync(file, code) + console.log('[fix-esm] Patched default import from vue in server.mjs') +} else { + console.log('[fix-esm] No default import found, nothing to patch') +}