|
1 | | -import { |
2 | | - existsSync, |
3 | | - mkdirSync, |
4 | | - readFileSync, |
5 | | - readdirSync, |
6 | | - statSync, |
7 | | - writeFileSync, |
8 | | -} from 'fs'; |
9 | | -import { |
10 | | - dirname, |
11 | | - join, |
12 | | -} from 'path'; |
| 1 | +import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'fs'; |
| 2 | +import { dirname, join } from 'path'; |
13 | 3 | import { fileURLToPath } from 'url'; |
14 | 4 |
|
15 | 5 | const __dirname = dirname(fileURLToPath(import.meta.url)); |
16 | 6 | const packageRoot = dirname(__dirname); |
17 | 7 |
|
18 | 8 | /** |
19 | | - * Convert CommonJS locale module to ESM format |
| 9 | + * Convert CommonJS locale module to ESM named export format |
20 | 10 | * From: module.exports={messages:JSON.parse("{...}")}; |
21 | | - * To: export default {messages:JSON.parse("{...}")}; |
| 11 | + * To: export const messages=JSON.parse("{...}"); |
| 12 | + * |
| 13 | + * The locale-registry imports `{ messages }` as a named export, |
| 14 | + * so we must produce a named export, not `export default`. |
22 | 15 | */ |
23 | 16 | function convertToESM(content: string): string { |
| 17 | + const prefix = 'module.exports={messages:'; |
| 18 | + const start = content.indexOf(prefix); |
| 19 | + if (start !== -1) { |
| 20 | + const value = content.slice(start + prefix.length, -2); // strip trailing "};" |
| 21 | + return `/*eslint-disable*/export const messages=${value};`; |
| 22 | + } |
24 | 23 | return content.replace(/module\.exports\s*=\s*/, 'export default '); |
25 | 24 | } |
26 | 25 |
|
@@ -56,10 +55,33 @@ export function pluginCopyLocales() { |
56 | 55 | const cjsFile = join(distLocales, file.replace('.js', '.cjs')); |
57 | 56 | writeFileSync(cjsFile, content, 'utf-8'); |
58 | 57 |
|
59 | | - // Write .js (ESM format) |
| 58 | + // Write .js (ESM named export format) |
60 | 59 | const esmFile = join(distLocales, file); |
61 | 60 | const esmContent = convertToESM(content); |
62 | 61 | writeFileSync(esmFile, esmContent, 'utf-8'); |
| 62 | + } else if (file.endsWith('.mjs')) { |
| 63 | + // ESM compiled files (from compileNamespace: 'es') — already correct format |
| 64 | + const srcFile = join(srcLocales, file); |
| 65 | + const content = readFileSync(srcFile, 'utf-8'); |
| 66 | + const baseName = file.replace('.mjs', ''); |
| 67 | + |
| 68 | + // Write .js only if not already created from a .js source above |
| 69 | + const jsFile = join(distLocales, `${baseName}.js`); |
| 70 | + if (!existsSync(jsFile)) { |
| 71 | + writeFileSync(jsFile, content, 'utf-8'); |
| 72 | + } |
| 73 | + |
| 74 | + // Write .cjs only if not already created from a .js source above |
| 75 | + const cjsFile = join(distLocales, `${baseName}.cjs`); |
| 76 | + if (!existsSync(cjsFile)) { |
| 77 | + const cjsContent = content |
| 78 | + .replace( |
| 79 | + /\/\*eslint-disable\*\/export const messages=/, |
| 80 | + '/*eslint-disable*/module.exports={messages:' |
| 81 | + ) |
| 82 | + .replace(/;$/, '};'); |
| 83 | + writeFileSync(cjsFile, cjsContent, 'utf-8'); |
| 84 | + } |
63 | 85 | } else if (file.endsWith('.json')) { |
64 | 86 | // Copy JSON files as-is |
65 | 87 | const srcFile = join(srcLocales, file); |
|
0 commit comments