43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
import { exists } from "fs/promises"
|
|
import { dirname, join } from "path"
|
|
|
|
export namespace Filesystem {
|
|
export async function findUp(target: string, start: string, stop?: string) {
|
|
let current = start
|
|
const result = []
|
|
while (true) {
|
|
const search = join(current, target)
|
|
if (await exists(search)) result.push(search)
|
|
if (stop === current) break
|
|
const parent = dirname(current)
|
|
if (parent === current) break
|
|
current = parent
|
|
}
|
|
return result
|
|
}
|
|
|
|
export async function globUp(pattern: string, start: string, stop?: string) {
|
|
let current = start
|
|
const result = []
|
|
while (true) {
|
|
try {
|
|
const glob = new Bun.Glob(pattern)
|
|
for await (const match of glob.scan({
|
|
cwd: current,
|
|
onlyFiles: true,
|
|
dot: true,
|
|
})) {
|
|
result.push(join(current, match))
|
|
}
|
|
} catch {
|
|
// Skip invalid glob patterns
|
|
}
|
|
if (stop === current) break
|
|
const parent = dirname(current)
|
|
if (parent === current) break
|
|
current = parent
|
|
}
|
|
return result
|
|
}
|
|
}
|