diff options
Diffstat (limited to 'cli/js/ops/fs')
-rw-r--r-- | cli/js/ops/fs/read_dir.ts | 26 | ||||
-rw-r--r-- | cli/js/ops/fs/stat.ts | 54 |
2 files changed, 66 insertions, 14 deletions
diff --git a/cli/js/ops/fs/read_dir.ts b/cli/js/ops/fs/read_dir.ts index c48104d4b..29b8676ef 100644 --- a/cli/js/ops/fs/read_dir.ts +++ b/cli/js/ops/fs/read_dir.ts @@ -1,24 +1,32 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. import { sendSync, sendAsync } from "../dispatch_json.ts"; -import { FileInfo, FileInfoImpl } from "../../file_info.ts"; -import { StatResponse } from "./stat.ts"; +import { FileInfo, StatResponse, parseFileInfo } from "./stat.ts"; + +export interface DirEntry extends FileInfo { + name: string; +} interface ReadDirResponse { entries: StatResponse[]; } -function res(response: ReadDirResponse): FileInfo[] { +function res(response: ReadDirResponse): DirEntry[] { return response.entries.map( - (statRes: StatResponse): FileInfo => { - return new FileInfoImpl(statRes); + (statRes: StatResponse): DirEntry => { + return { ...parseFileInfo(statRes), name: statRes.name! }; } ); } -export function readdirSync(path: string): FileInfo[] { - return res(sendSync("op_read_dir", { path })); +export function readdirSync(path: string): Iterable<DirEntry> { + return res(sendSync("op_read_dir", { path }))[Symbol.iterator](); } -export async function readdir(path: string): Promise<FileInfo[]> { - return res(await sendAsync("op_read_dir", { path })); +export function readdir(path: string): AsyncIterable<DirEntry> { + const array = sendAsync("op_read_dir", { path }).then(res); + return { + async *[Symbol.asyncIterator](): AsyncIterableIterator<DirEntry> { + yield* await array; + }, + }; } diff --git a/cli/js/ops/fs/stat.ts b/cli/js/ops/fs/stat.ts index 5d8860939..6b7e5ea93 100644 --- a/cli/js/ops/fs/stat.ts +++ b/cli/js/ops/fs/stat.ts @@ -1,6 +1,25 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. import { sendSync, sendAsync } from "../dispatch_json.ts"; -import { FileInfo, FileInfoImpl } from "../../file_info.ts"; +import { build } from "../../build.ts"; + +export interface FileInfo { + size: number; + modified: number | null; + accessed: number | null; + created: number | null; + dev: number | null; + ino: number | null; + mode: number | null; + nlink: number | null; + uid: number | null; + gid: number | null; + rdev: number | null; + blksize: number | null; + blocks: number | null; + isFile: boolean; + isDirectory: boolean; + isSymlink: boolean; +} export interface StatResponse { isFile: boolean; @@ -10,6 +29,7 @@ export interface StatResponse { modified: number; accessed: number; created: number; + // Null for stat(), but exists for readdir(). name: string | null; // Unix only members dev: number; @@ -23,12 +43,36 @@ export interface StatResponse { blocks: number; } +// @internal +export function parseFileInfo(response: StatResponse): FileInfo { + const isUnix = build.os === "mac" || build.os === "linux"; + return { + isFile: response.isFile, + isDirectory: response.isDirectory, + isSymlink: response.isSymlink, + size: response.size, + modified: response.modified ? response.modified : null, + accessed: response.accessed ? response.accessed : null, + created: response.created ? response.created : null, + // Only non-null if on Unix + dev: isUnix ? response.dev : null, + ino: isUnix ? response.ino : null, + mode: isUnix ? response.mode : null, + nlink: isUnix ? response.nlink : null, + uid: isUnix ? response.uid : null, + gid: isUnix ? response.gid : null, + rdev: isUnix ? response.rdev : null, + blksize: isUnix ? response.blksize : null, + blocks: isUnix ? response.blocks : null, + }; +} + export async function lstat(path: string): Promise<FileInfo> { const res = (await sendAsync("op_stat", { path, lstat: true, })) as StatResponse; - return new FileInfoImpl(res); + return parseFileInfo(res); } export function lstatSync(path: string): FileInfo { @@ -36,7 +80,7 @@ export function lstatSync(path: string): FileInfo { path, lstat: true, }) as StatResponse; - return new FileInfoImpl(res); + return parseFileInfo(res); } export async function stat(path: string): Promise<FileInfo> { @@ -44,7 +88,7 @@ export async function stat(path: string): Promise<FileInfo> { path, lstat: false, })) as StatResponse; - return new FileInfoImpl(res); + return parseFileInfo(res); } export function statSync(path: string): FileInfo { @@ -52,5 +96,5 @@ export function statSync(path: string): FileInfo { path, lstat: false, }) as StatResponse; - return new FileInfoImpl(res); + return parseFileInfo(res); } |