import { existsSync, mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { createRequire } from 'node:module';
import { afterEach, describe, expect, it } from 'vitest';
const require = createRequire(import.meta.url);
type AfterPackTestHooks = {
cleanupNativePlatformPackages: (nodeModulesDir: string, platform: string, arch: string) => number;
cleanupNodeModulesRuntimeJunk: (nodeModulesDir: string, platform: string, arch: string) => number;
};
const afterPack = require('../../scripts/after-pack.cjs') as { __test?: AfterPackTestHooks };
describe('after-pack cleanup helpers', () => {
const tempRoots: string[] = [];
afterEach(() => {
for (const root of tempRoots.splice(0)) {
rmSync(root, { recursive: true, force: true });
}
});
function makeTempNodeModules(): string {
const root = mkdtempSync(join(tmpdir(), 'clawx-after-pack-'));
tempRoots.push(root);
const nodeModules = join(root, 'node_modules');
mkdirSync(nodeModules, { recursive: true });
return nodeModules;
}
function makePackage(dir: string): void {
mkdirSync(dir, { recursive: true });
writeFileSync(join(dir, 'package.json'), '{"version":"1.0.0"}\n', 'utf8');
}
it('keeps both mac Codex native packages for universal builds', () => {
const nodeModules = makeTempNodeModules();
makePackage(join(nodeModules, '@openai', 'codex-darwin-arm64'));
makePackage(join(nodeModules, '@openai', 'codex-darwin-x64'));
makePackage(join(nodeModules, '@openai', 'codex-linux-x64'));
afterPack.__test!.cleanupNativePlatformPackages(nodeModules, 'darwin', 'universal');
expect(existsSync(join(nodeModules, '@openai', 'codex-darwin-arm64'))).toBe(true);
expect(existsSync(join(nodeModules, '@openai', 'codex-darwin-x64'))).toBe(true);
expect(existsSync(join(nodeModules, '@openai', 'codex-linux-x64'))).toBe(false);
});
it('keeps both mac tree-sitter-bash prebuilds for universal builds', () => {
const nodeModules = makeTempNodeModules();
const prebuilds = join(nodeModules, 'tree-sitter-bash', 'prebuilds');
mkdirSync(join(prebuilds, 'darwin-arm64'), { recursive: true });
mkdirSync(join(prebuilds, 'darwin-x64'), { recursive: true });
mkdirSync(join(prebuilds, 'linux-x64'), { recursive: true });
afterPack.__test!.cleanupNodeModulesRuntimeJunk(nodeModules, 'darwin', 'universal');
expect(existsSync(join(prebuilds, 'darwin-arm64'))).toBe(true);
expect(existsSync(join(prebuilds, 'darwin-x64'))).toBe(true);
expect(existsSync(join(prebuilds, 'linux-x64'))).toBe(false);
});
});