1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-28 01:59:06 -05:00

fix(ext/node): add fs.promises.fstat and FileHandle#stat (#26719)

Co-authored-by: Yoshiya Hinosawa <stibium121@gmail.com>
This commit is contained in:
Trevor Manz 2024-11-25 01:02:38 -05:00 committed by GitHub
parent 12b377247b
commit 6b7e4c331b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 57 additions and 2 deletions

View file

@ -63,3 +63,24 @@ export function fstatSync(
const origin = new FsFile(fd, Symbol.for("Deno.internal.FsFile")).statSync();
return CFISBIS(origin, options?.bigint || false);
}
export function fstatPromise(fd: number): Promise<Stats>;
export function fstatPromise(
fd: number,
options: { bigint: false },
): Promise<Stats>;
export function fstatPromise(
fd: number,
options: { bigint: true },
): Promise<BigIntStats>;
export function fstatPromise(
fd: number,
options?: statOptions,
): Stats | BigIntStats {
return new Promise((resolve, reject) => {
fstat(fd, options, (err, stats) => {
if (err) reject(err);
else resolve(stats);
});
});
}

View file

@ -23,7 +23,7 @@ import Dir from "ext:deno_node/_fs/_fs_dir.ts";
import Dirent from "ext:deno_node/_fs/_fs_dirent.ts";
import { exists, existsSync } from "ext:deno_node/_fs/_fs_exists.ts";
import { fdatasync, fdatasyncSync } from "ext:deno_node/_fs/_fs_fdatasync.ts";
import { fstat, fstatSync } from "ext:deno_node/_fs/_fs_fstat.ts";
import { fstat, fstatPromise, fstatSync } from "ext:deno_node/_fs/_fs_fstat.ts";
import { fsync, fsyncSync } from "ext:deno_node/_fs/_fs_fsync.ts";
import { ftruncate, ftruncateSync } from "ext:deno_node/_fs/_fs_ftruncate.ts";
import { futimes, futimesSync } from "ext:deno_node/_fs/_fs_futimes.ts";
@ -174,6 +174,7 @@ const promises = {
lstat: lstatPromise,
stat: statPromise,
statfs: statfsPromise,
fstat: fstatPromise,
link: linkPromise,
unlink: unlinkPromise,
chmod: chmodPromise,

View file

@ -16,6 +16,7 @@ export const readlink = fsPromises.readlink;
export const symlink = fsPromises.symlink;
export const lstat = fsPromises.lstat;
export const stat = fsPromises.stat;
export const fstat = fsPromises.fstat;
export const link = fsPromises.link;
export const unlink = fsPromises.unlink;
export const chmod = fsPromises.chmod;

View file

@ -6,6 +6,7 @@
import { EventEmitter } from "node:events";
import { Buffer } from "node:buffer";
import { promises, read, write } from "node:fs";
export type { BigIntStats, Stats } from "ext:deno_node/_fs/_fs_stat.ts";
import {
BinaryOptionsArgument,
FileOptionsArgument,
@ -141,6 +142,13 @@ export class FileHandle extends EventEmitter {
// Note that Deno.close is not async
return Promise.resolve(core.close(this.fd));
}
stat(): Promise<Stats>;
stat(options: { bigint: false }): Promise<Stats>;
stat(options: { bigint: true }): Promise<BigIntStats>;
stat(options?: { bigint: boolean }): Promise<Stats | BigIntStats> {
return fsCall(promises.fstat, this, options);
}
}
function fsCall(fn, handle, ...args) {
@ -152,7 +160,7 @@ function fsCall(fn, handle, ...args) {
});
}
return fn(handle, ...args);
return fn(handle.fd, ...args);
}
export default {

View file

@ -93,3 +93,27 @@ Deno.test("[node/fs filehandle.write] Write from string", async function () {
assertEquals(res.bytesWritten, 11);
assertEquals(decoder.decode(data), "hello world");
});
Deno.test("[node/fs filehandle.stat] Get file status", async function () {
const fileHandle = await fs.open(testData);
const stat = await fileHandle.stat();
assertEquals(stat.isFile(), true);
assertEquals(stat.size, "hello world".length);
await fileHandle.close();
});
Deno.test("[node/fs filehandle.writeFile] Write to file", async function () {
const tempFile: string = await Deno.makeTempFile();
const fileHandle = await fs.open(tempFile, "w");
const str = "hello world";
await fileHandle.writeFile(str);
const data = Deno.readFileSync(tempFile);
await Deno.remove(tempFile);
await fileHandle.close();
assertEquals(decoder.decode(data), "hello world");
});