/** * Minimal Node.js import hook for running tests from dist-test/. * * esbuild with bundle:false preserves import specifiers verbatim, so compiled * .js files still import '../foo.ts'. This hook redirects those to '.js' so * Node can find the compiled output. * * Also redirects @sf bare imports to their compiled counterparts in dist-test. */ import { fileURLToPath, pathToFileURL } from 'node:url'; import { existsSync } from 'node:fs'; import { join } from 'node:path'; // dist-test root — everything compiled lands here const DIST_TEST = new URL('../dist-test/', import.meta.url).href; // Absolute paths to compiled @singularity-forge/* entry points const SF_ALIASES = { '@singularity-forge/pi-coding-agent': new URL('../dist-test/packages/pi-coding-agent/src/index.js', import.meta.url).href, '@singularity-forge/pi-ai/oauth': new URL('../dist-test/packages/pi-ai/src/utils/oauth/index.js', import.meta.url).href, '@singularity-forge/pi-ai': new URL('../dist-test/packages/pi-ai/src/index.js', import.meta.url).href, '@singularity-forge/pi-agent-core': new URL('../dist-test/packages/pi-agent-core/src/index.js', import.meta.url).href, '@singularity-forge/pi-tui': new URL('../dist-test/packages/pi-tui/src/index.js', import.meta.url).href, '@singularity-forge/native': new URL('../dist-test/packages/native/src/index.js', import.meta.url).href, }; export function resolve(specifier, context, nextResolve) { // 1. @singularity-forge/* bare imports → compiled dist-test counterpart if (specifier in SF_ALIASES) { return nextResolve(SF_ALIASES[specifier], context); } // 2. .ts relative imports inside dist-test → .js if ( specifier.endsWith('.ts') && (specifier.startsWith('./') || specifier.startsWith('../')) && context.parentURL && context.parentURL.startsWith(DIST_TEST) ) { const jsSpecifier = specifier.slice(0, -3) + '.js'; return nextResolve(jsSpecifier, context); } return nextResolve(specifier, context); }