summaryrefslogtreecommitdiff
path: root/cli/js/ops/fs/stat.ts
blob: 402adeafc3eda83bdee74f0c42f6b5499367b9b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
import { sendSync, sendAsync } from "../dispatch_json.ts";
import { build } from "../../build.ts";
import { pathFromURL } from "../../util.ts";

export interface FileInfo {
  size: number;
  mtime: Date | null;
  atime: Date | null;
  birthtime: Date | 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;
  isDirectory: boolean;
  isSymlink: boolean;
  size: number;
  mtime: number | null;
  atime: number | null;
  birthtime: number | null;
  // Unix only members
  dev: number;
  ino: number;
  mode: number;
  nlink: number;
  uid: number;
  gid: number;
  rdev: number;
  blksize: number;
  blocks: number;
}

// @internal
export function parseFileInfo(response: StatResponse): FileInfo {
  const isUnix = build.os === "darwin" || build.os === "linux";
  return {
    isFile: response.isFile,
    isDirectory: response.isDirectory,
    isSymlink: response.isSymlink,
    size: response.size,
    mtime: response.mtime != null ? new Date(response.mtime) : null,
    atime: response.atime != null ? new Date(response.atime) : null,
    birthtime: response.birthtime != null ? new Date(response.birthtime) : 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 function fstatSync(rid: number): FileInfo {
  return parseFileInfo(sendSync("op_fstat", { rid }));
}

export async function fstat(rid: number): Promise<FileInfo> {
  return parseFileInfo(await sendAsync("op_fstat", { rid }));
}

export async function lstat(path: string | URL): Promise<FileInfo> {
  path = pathFromURL(path);
  const res = (await sendAsync("op_stat", {
    path,
    lstat: true,
  })) as StatResponse;
  return parseFileInfo(res);
}

export function lstatSync(path: string | URL): FileInfo {
  path = pathFromURL(path);
  const res = sendSync("op_stat", {
    path,
    lstat: true,
  }) as StatResponse;
  return parseFileInfo(res);
}

export async function stat(path: string | URL): Promise<FileInfo> {
  path = pathFromURL(path);
  const res = (await sendAsync("op_stat", {
    path,
    lstat: false,
  })) as StatResponse;
  return parseFileInfo(res);
}

export function statSync(path: string | URL): FileInfo {
  path = pathFromURL(path);
  const res = sendSync("op_stat", {
    path,
    lstat: false,
  }) as StatResponse;
  return parseFileInfo(res);
}