hivecast-sdk/packages/federation/fix-esm-imports.mjs
hypnotranz 1a0419dc0c feat: initial Matrix SDK
Full SDK workspace: core, contracts, sdk, cli, browser-host, browser-kit,
federation, omega-core, oracle, self-healing, strategies, tools, emacs.
Clean extraction from the development monorepo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 15:54:15 -06:00

68 lines
2.1 KiB
JavaScript

#!/usr/bin/env node
/**
* Post-build script: Adds .js extensions to relative import specifiers in compiled ESM output.
*
* TypeScript with moduleResolution:"Bundler" emits extensionless imports (e.g., from './foo').
* Node.js ESM requires explicit .js extensions. This script rewrites all relative imports
* in dist/ to add .js extensions where missing.
*/
import { readFileSync, writeFileSync, readdirSync, statSync, existsSync } from 'fs';
import { join, extname, dirname, resolve } from 'path';
const DIST_DIR = new URL('./dist/src/', import.meta.url).pathname.replace(/^\/([A-Z]:)/, '$1');
let fixed = 0;
let files = 0;
function processFile(filePath) {
if (!filePath.endsWith('.js') && !filePath.endsWith('.d.ts')) return;
files++;
const fileDir = dirname(filePath);
let content = readFileSync(filePath, 'utf8');
let changed = false;
// Match: from './...' or from '../...' (relative imports without .js extension)
// Also match: import('./...') (dynamic imports in .d.ts files)
// Also match: import './...'; (bare side-effect imports)
const addExt = (match, prefix, specifier, suffix) => {
const ext = extname(specifier);
if (ext === '.js' || ext === '.mjs' || ext === '.cjs' || ext === '.json') {
return match;
}
// Check if specifier points to a directory with index.js
const resolved = resolve(fileDir, specifier);
if (existsSync(resolved) && statSync(resolved).isDirectory()) {
changed = true;
return `${prefix}${specifier}/index.js${suffix}`;
}
changed = true;
return `${prefix}${specifier}.js${suffix}`;
};
const updated = content
.replace(/(from\s+['"])(\.\.?\/[^'"]+)(['"])/g, addExt)
.replace(/(import\(['"])(\.\.?\/[^'"]+)(['"]\))/g, addExt)
.replace(/(import\s+['"])(\.\.?\/[^'"]+)(['"])/g, addExt);
if (changed) {
writeFileSync(filePath, updated);
fixed++;
}
}
function walk(dir) {
for (const entry of readdirSync(dir)) {
const full = join(dir, entry);
if (statSync(full).isDirectory()) {
walk(full);
} else {
processFile(full);
}
}
}
walk(DIST_DIR);
console.log(`Fixed ${fixed}/${files} files with .js extensions`);