refactor: remove CommonJS ripgrep launcher and spawn binary directly

Replace the ripgrep_launcher.cjs intermediary with direct binary execution.
This simplifies the ripgrep module by spawning the binary directly instead
of going through a Node.js subprocess wrapper. Add platform-specific binary
path resolution to handle both Unix and Windows environments.
This commit is contained in:
weishu
2025-12-23 18:09:12 +08:00
parent eafd4d12a9
commit 92996667d5
5 changed files with 13 additions and 49 deletions
-33
View File
@@ -1,33 +0,0 @@
#!/usr/bin/env node
/**
* Ripgrep runner - executed as a subprocess to run the native module
* This file is intentionally written in CommonJS to avoid ESM complexities
*/
const path = require('path');
// Load the native module from unpacked directory
const modulePath = path.join(__dirname, '..', 'tools', 'unpacked', 'ripgrep.node');
const ripgrepNative = require(modulePath);
// Get arguments from command line (skip node and script name)
const args = process.argv.slice(2);
// Parse the JSON-encoded arguments
let parsedArgs;
try {
parsedArgs = JSON.parse(args[0]);
} catch (error) {
console.error('Failed to parse arguments:', error.message);
process.exit(1);
}
// Run ripgrep
try {
const exitCode = ripgrepNative.ripgrepMain(parsedArgs);
process.exit(exitCode);
} catch (error) {
console.error('Ripgrep error:', error.message);
process.exit(1);
}
+2 -3
View File
@@ -57,8 +57,7 @@ function areToolsUnpacked(toolsDir) {
const expectedFiles = [
path.join(unpackedPath, difftBinary),
path.join(unpackedPath, rgBinary),
path.join(unpackedPath, 'ripgrep.node')
path.join(unpackedPath, rgBinary)
];
return expectedFiles.every(file => fs.existsSync(file));
@@ -160,4 +159,4 @@ if (require.main === module) {
console.error('Error:', error);
process.exit(1);
});
}
}
+9 -2
View File
@@ -4,6 +4,7 @@
import { spawn } from 'child_process';
import { join, resolve } from 'path';
import { platform } from 'os';
import { runtimePath } from '@/projectPath';
import { withBunRuntimeEnv } from '@/utils/bunRuntime';
@@ -17,10 +18,16 @@ export interface RipgrepOptions {
cwd?: string
}
function getBinaryPath(): string {
const platformName = platform();
const binaryName = platformName === 'win32' ? 'rg.exe' : 'rg';
return resolve(join(runtimePath(), 'tools', 'unpacked', binaryName));
}
export function run(args: string[], options?: RipgrepOptions): Promise<RipgrepResult> {
const runnerPath = resolve(join(runtimePath(), 'scripts', 'ripgrep_launcher.cjs'));
const binaryPath = getBinaryPath();
return new Promise((resolve, reject) => {
const child = spawn(process.execPath, [runnerPath, JSON.stringify(args)], {
const child = spawn(binaryPath, args, {
stdio: ['pipe', 'pipe', 'pipe'],
cwd: options?.cwd,
env: withBunRuntimeEnv()
+2 -8
View File
@@ -61,8 +61,7 @@ function areToolsUnpacked(unpackedPath: string): boolean {
const expectedFiles = [
join(unpackedPath, difftBinary),
join(unpackedPath, rgBinary),
join(unpackedPath, 'ripgrep.node')
join(unpackedPath, rgBinary)
];
return expectedFiles.every((file) => existsSync(file));
@@ -115,12 +114,7 @@ function unpackTools(runtimeRoot: string): void {
}
function runtimeAssetsReady(runtimeRoot: string): boolean {
const requiredScripts = [
join(runtimeRoot, 'scripts', 'ripgrep_launcher.cjs')
];
return requiredScripts.every((script) => existsSync(script)) &&
areToolsUnpacked(join(runtimeRoot, 'tools', 'unpacked'));
return areToolsUnpacked(join(runtimeRoot, 'tools', 'unpacked'));
}
export async function ensureRuntimeAssets(): Promise<void> {
-3
View File
@@ -1,7 +1,5 @@
import { feature } from 'bun:bundle';
import ripgrepLauncher from '../../scripts/ripgrep_launcher.cjs' assert { type: 'file' };
import difftasticArchiveLicense from '../../tools/archives/difftastic-LICENSE' assert { type: 'file' };
import ripgrepArchiveLicense from '../../tools/archives/ripgrep-LICENSE' assert { type: 'file' };
import difftasticLicense from '../../tools/licenses/difftastic-LICENSE' assert { type: 'file' };
@@ -20,7 +18,6 @@ function asset(relativePath: string, sourcePath: string): EmbeddedAsset {
}
const COMMON_ASSETS: EmbeddedAsset[] = [
asset('scripts/ripgrep_launcher.cjs', ripgrepLauncher),
asset('tools/archives/difftastic-LICENSE', difftasticArchiveLicense),
asset('tools/archives/ripgrep-LICENSE', ripgrepArchiveLicense),
asset('tools/licenses/difftastic-LICENSE', difftasticLicense),