Files
5chan/scripts/fix-bonfida-imports.js
T

141 lines
4.6 KiB
JavaScript

#!/usr/bin/env node
// Fix broken ESM imports in @bonfida/spl-name-service
// The package ships with hardcoded ../node_modules/ paths that break in electron asar
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const rootDir = path.join(__dirname, '..');
const bonfidaEsmDir = path.join(rootDir, 'node_modules/@bonfida/spl-name-service/dist/esm');
const bonfidaCjsDir = path.join(rootDir, 'node_modules/@bonfida/spl-name-service/dist/cjs');
// Map of known packages to their correct import paths
const packageMappings = {
'@noble/hashes': (subpath) => {
// ../node_modules/@noble/hashes/esm/sha256.js -> @noble/hashes/sha256
if (subpath.includes('/sha256')) return '@noble/hashes/sha256';
if (subpath.includes('/sha512')) return '@noble/hashes/sha512';
return '@noble/hashes';
},
'@noble/curves': (subpath) => {
// ../node_modules/@noble/curves/esm/ed25519.js -> @noble/curves/ed25519
if (subpath.includes('/ed25519')) return '@noble/curves/ed25519';
if (subpath.includes('/secp256k1')) return '@noble/curves/secp256k1';
return '@noble/curves';
},
'@solana/spl-token': () => '@solana/spl-token',
'@solana/web3.js': () => '@solana/web3.js',
'@bonfida/sns-records': () => '@bonfida/sns-records',
'@scure/base': () => '@scure/base',
buffer: () => 'buffer',
borsh: () => 'borsh',
graphemesplit: () => 'graphemesplit',
bs58: () => 'bs58',
'ipaddr.js': () => 'ipaddr.js',
punycode: () => 'punycode',
};
// Generic function to fix node_modules imports
function fixImportsInContent(content) {
// Match patterns like from"../node_modules/PACKAGE/..." or from"./node_modules/PACKAGE/..."
const importPattern = /from\s*["'](\.\.?\/node_modules\/((?:@[^\/]+\/[^\/]+|[^\/]+))([^"']*))["']/g;
const sideEffectPattern = /import\s*["'](\.\.?\/node_modules\/((?:@[^\/]+\/[^\/]+|[^\/]+))([^"']*))["']/g;
const requirePattern = /require\s*\(\s*["'](\.\.?\/node_modules\/((?:@[^\/]+\/[^\/]+|[^\/]+))([^"']*))["']\s*\)/g;
let modified = false;
const replaceImport = (match, fullPath, packageName, subpath) => {
modified = true;
const mapper = packageMappings[packageName];
const correctImport = mapper ? mapper(subpath) : packageName;
return `from"${correctImport}"`;
};
const replaceSideEffect = (match, fullPath, packageName, subpath) => {
modified = true;
const mapper = packageMappings[packageName];
const correctImport = mapper ? mapper(subpath) : packageName;
return `import"${correctImport}"`;
};
const replaceRequire = (match, fullPath, packageName, subpath) => {
modified = true;
const mapper = packageMappings[packageName];
const correctImport = mapper ? mapper(subpath) : packageName;
return `require("${correctImport}")`;
};
let result = content;
result = result.replace(importPattern, replaceImport);
result = result.replace(sideEffectPattern, replaceSideEffect);
result = result.replace(requirePattern, replaceRequire);
return { content: result, modified };
}
function fixFile(filePath) {
if (!fs.existsSync(filePath)) return false;
const content = fs.readFileSync(filePath, 'utf8');
const result = fixImportsInContent(content);
if (result.modified) {
fs.writeFileSync(filePath, result.content);
return true;
}
return false;
}
function fixDirectory(dir) {
if (!fs.existsSync(dir)) {
console.log(`Directory not found: ${dir}`);
return;
}
let fixedCount = 0;
function walk(currentDir) {
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(currentDir, entry.name);
if (entry.isDirectory() && entry.name !== 'node_modules') {
walk(fullPath);
} else if (entry.isFile() && /\.(m?js|cjs)$/.test(entry.name)) {
if (fixFile(fullPath)) {
fixedCount++;
}
}
}
}
walk(dir);
return fixedCount;
}
console.log('Fixing @bonfida/spl-name-service broken imports...');
const esmFixed = fixDirectory(bonfidaEsmDir);
const cjsFixed = fixDirectory(bonfidaCjsDir);
console.log(`Fixed ${esmFixed} ESM files and ${cjsFixed} CJS files`);
// Also remove the nested node_modules that are no longer needed
const nestedEsm = path.join(bonfidaEsmDir, 'node_modules');
const nestedCjs = path.join(bonfidaCjsDir, 'node_modules');
if (fs.existsSync(nestedEsm)) {
fs.rmSync(nestedEsm, { recursive: true });
console.log('Removed nested ESM node_modules');
}
if (fs.existsSync(nestedCjs)) {
fs.rmSync(nestedCjs, { recursive: true });
console.log('Removed nested CJS node_modules');
}
console.log('Done!');