83 lines
2.4 KiB
TypeScript
83 lines
2.4 KiB
TypeScript
|
|
import { App } from "../app/app"
|
||
|
|
import path from "path"
|
||
|
|
import { Global } from "../global"
|
||
|
|
import fs from "fs/promises"
|
||
|
|
|
||
|
|
export namespace Ripgrep {
|
||
|
|
const PLATFORM = {
|
||
|
|
darwin: { platform: "apple-darwin", extension: "tar.gz" },
|
||
|
|
linux: { platform: "unknown-linux-musl", extension: "tar.gz" },
|
||
|
|
win32: { platform: "pc-windows-msvc", extension: "zip" },
|
||
|
|
} as const
|
||
|
|
|
||
|
|
const state = App.state("ripgrep", async () => {
|
||
|
|
const filepath = path.join(
|
||
|
|
Global.Path.bin,
|
||
|
|
"rg" + (process.platform === "win32" ? ".exe" : ""),
|
||
|
|
)
|
||
|
|
|
||
|
|
const file = Bun.file(filepath)
|
||
|
|
if (!(await file.exists())) {
|
||
|
|
const archMap = { x64: "x86_64", arm64: "aarch64" } as const
|
||
|
|
const arch = archMap[process.arch as keyof typeof archMap] ?? process.arch
|
||
|
|
|
||
|
|
const config = PLATFORM[process.platform as keyof typeof PLATFORM]
|
||
|
|
if (!config) throw new Error(`Unsupported platform: ${process.platform}`)
|
||
|
|
|
||
|
|
const version = "14.1.1"
|
||
|
|
const filename = `ripgrep-${version}-${arch}-${config.platform}.${config.extension}`
|
||
|
|
const url = `https://github.com/BurntSushi/ripgrep/releases/download/${version}/${filename}`
|
||
|
|
|
||
|
|
const response = await fetch(url)
|
||
|
|
if (!response.ok)
|
||
|
|
throw new Error(`Failed to download ripgrep: ${response.statusText}`)
|
||
|
|
|
||
|
|
const buffer = await response.arrayBuffer()
|
||
|
|
const archivePath = path.join(Global.Path.bin, filename)
|
||
|
|
await Bun.write(archivePath, buffer)
|
||
|
|
if (config.extension === "tar.gz") {
|
||
|
|
const proc = Bun.spawn(
|
||
|
|
[
|
||
|
|
"tar",
|
||
|
|
"-xzf",
|
||
|
|
archivePath,
|
||
|
|
"--strip-components=1",
|
||
|
|
"--wildcards",
|
||
|
|
"*/rg",
|
||
|
|
],
|
||
|
|
{
|
||
|
|
cwd: Global.Path.bin,
|
||
|
|
stderr: "ignore",
|
||
|
|
stdout: "ignore",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
await proc.exited
|
||
|
|
}
|
||
|
|
if (config.extension === "zip") {
|
||
|
|
const proc = Bun.spawn(
|
||
|
|
["unzip", "-j", archivePath, "*/rg.exe", "-d", Global.Path.bin],
|
||
|
|
{
|
||
|
|
cwd: Global.Path.bin,
|
||
|
|
stderr: "ignore",
|
||
|
|
stdout: "ignore",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
await proc.exited
|
||
|
|
}
|
||
|
|
|
||
|
|
await fs.unlink(archivePath)
|
||
|
|
|
||
|
|
if (process.platform !== "win32") await fs.chmod(filepath, 0o755)
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
filepath,
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
export async function filepath() {
|
||
|
|
const { filepath } = await state()
|
||
|
|
return filepath
|
||
|
|
}
|
||
|
|
}
|