vibetunnel/web/scripts/ensure-native-modules.js
2025-06-26 23:10:05 +02:00

66 lines
No EOL
2.3 KiB
JavaScript
Executable file

#!/usr/bin/env node
/**
* Ensures native modules are built and available for tests
* This script handles pnpm's symlink structure where node-pty might be in .pnpm directory
*/
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
console.log('Ensuring native modules are built for tests...');
// Find the actual node-pty location (could be in .pnpm directory)
let nodePtyPath;
try {
nodePtyPath = require.resolve('node-pty/package.json');
} catch (e) {
console.error('Could not find node-pty module');
process.exit(1);
}
const nodePtyDir = path.dirname(nodePtyPath);
const buildDir = path.join(nodePtyDir, 'build');
const releaseDir = path.join(buildDir, 'Release');
console.log(`Found node-pty at: ${nodePtyDir}`);
// Check if native modules are built
if (!fs.existsSync(releaseDir) || !fs.existsSync(path.join(releaseDir, 'pty.node'))) {
console.log('Native modules not found, building...');
try {
// Build using node-gyp directly to avoid TypeScript issues
execSync(`cd "${nodePtyDir}" && npx node-gyp rebuild`, {
stdio: 'inherit',
shell: true
});
} catch (e) {
console.error('Failed to build native modules:', e.message);
process.exit(1);
}
}
// For pnpm, ensure the symlinked node_modules/node-pty has the build directory
const symlinkNodePty = path.join(__dirname, '../node_modules/node-pty');
if (fs.existsSync(symlinkNodePty) && fs.lstatSync(symlinkNodePty).isSymbolicLink()) {
const symlinkBuildDir = path.join(symlinkNodePty, 'build');
// If the symlinked location doesn't have a build directory, create a symlink to the real one
if (!fs.existsSync(symlinkBuildDir) && fs.existsSync(buildDir)) {
console.log('Creating symlink for build directory in node_modules/node-pty...');
try {
const symlinkType = process.platform === 'win32' ? 'junction' : 'dir';
fs.symlinkSync(buildDir, symlinkBuildDir, symlinkType);
console.log('Created build directory symlink');
} catch (e) {
// If symlink fails, try copying instead
console.log('Symlink failed, trying to copy build directory...');
fs.cpSync(buildDir, symlinkBuildDir, { recursive: true });
console.log('Copied build directory');
}
}
}
console.log('Native modules are ready for tests');