vibetunnel/web/scripts/node-pty-plugin.js
Peter Steinberger 253d0ae3e7
Fix npm package build and installation issues (#360)
Co-authored-by: Alex Mazanov <alexandr.mazanov@gmail.com>
2025-07-16 23:05:26 +02:00

73 lines
No EOL
2.1 KiB
JavaScript

/**
* ESBuild plugin to handle node-pty resolution for npm packages
*/
const path = require('path');
const fs = require('fs');
const nodePtyPlugin = {
name: 'node-pty-resolver',
setup(build) {
// Resolve node-pty imports to our bundled version
build.onResolve({ filter: /^node-pty$/ }, args => {
// In development, use the normal node_modules resolution
if (process.env.NODE_ENV === 'development') {
return null;
}
// For npm builds, resolve to our bundled node-pty
return {
path: 'node-pty',
namespace: 'node-pty-stub'
};
});
// Provide stub that dynamically loads the bundled node-pty
build.onLoad({ filter: /^node-pty$/, namespace: 'node-pty-stub' }, () => {
return {
contents: `
const path = require('path');
const fs = require('fs');
// Try multiple possible locations for node-pty
const possiblePaths = [
// When installed via npm
path.join(__dirname, '../node-pty'),
path.join(__dirname, '../../node-pty'),
// During development
path.join(__dirname, '../node_modules/node-pty'),
// Fallback to regular require
'node-pty'
];
let nodePty;
let loadError;
for (const tryPath of possiblePaths) {
try {
if (tryPath === 'node-pty') {
// Try regular require as last resort
nodePty = require(tryPath);
} else if (fs.existsSync(tryPath)) {
// Check if the path exists before trying to load
nodePty = require(tryPath);
}
if (nodePty) break;
} catch (err) {
loadError = err;
}
}
if (!nodePty) {
throw new Error(\`Failed to load node-pty from any location. Last error: \${loadError?.message}\`);
}
module.exports = nodePty;
`,
loader: 'js'
};
});
}
};
module.exports = { nodePtyPlugin };