import type { Nullable } from "@libs/typing"
import { expandGlob } from "@std/fs"
export type { Nullable }
export function cwd(): string {
return Deno.cwd().replaceAll("\\", "/")
}
export function filetype(path: string): Nullable<"file" | "directory"> {
try {
const lstat = Deno.lstatSync(path)
if (lstat.isFile) {
return "file"
}
if (lstat.isDirectory) {
return "directory"
}
} catch {
}
return null
}
export type ListOptions = {
root?: string
relative?: boolean
files?: boolean
directories?: boolean
}
export async function list(glob: string, { root = cwd(), relative = true, files = false, directories = false }: ListOptions = {}): Promise<string[]> {
if (!root.endsWith("/")) {
root += "/"
}
const entries = await Array.fromAsync(expandGlob(glob, { root, canonicalize: true, includeDirs: directories }))
return entries
.filter(({ path }) => [files ? "file" : "", directories ? "directory" : ""].filter(Boolean).includes(filetype(path) as string))
.map(({ path }) => path.replaceAll("\\", "/").replace(root, relative ? "" : root))
}
|