summaryrefslogtreecommitdiff
path: root/cli/js/file_info.ts
blob: 27df0bbb70d987e4ae632c98ddaed991cb93c05b (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
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
import { StatResponse } from "./ops/fs/stat.ts";
import { build } from "./build.ts";

export interface FileInfo {
  size: number;
  modified: number | null;
  accessed: number | null;
  created: number | null;
  name: string | 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;
}

// @internal
export class FileInfoImpl implements FileInfo {
  readonly #isFile: boolean;
  readonly #isDirectory: boolean;
  readonly #isSymlink: boolean;
  size: number;
  modified: number | null;
  accessed: number | null;
  created: number | null;
  name: string | 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;

  /* @internal */
  constructor(res: StatResponse) {
    const isUnix = build.os === "mac" || build.os === "linux";
    const modified = res.modified;
    const accessed = res.accessed;
    const created = res.created;
    const name = res.name;
    // Unix only
    const { dev, ino, mode, nlink, uid, gid, rdev, blksize, blocks } = res;

    this.#isFile = res.isFile;
    this.#isDirectory = res.isDirectory;
    this.#isSymlink = res.isSymlink;
    this.size = res.size;
    this.modified = modified ? modified : null;
    this.accessed = accessed ? accessed : null;
    this.created = created ? created : null;
    this.name = name ? name : null;
    // Only non-null if on Unix
    this.dev = isUnix ? dev : null;
    this.ino = isUnix ? ino : null;
    this.mode = isUnix ? mode : null;
    this.nlink = isUnix ? nlink : null;
    this.uid = isUnix ? uid : null;
    this.gid = isUnix ? gid : null;
    this.rdev = isUnix ? rdev : null;
    this.blksize = isUnix ? blksize : null;
    this.blocks = isUnix ? blocks : null;
  }

  isFile(): boolean {
    return this.#isFile;
  }

  isDirectory(): boolean {
    return this.#isDirectory;
  }

  isSymlink(): boolean {
    return this.#isSymlink;
  }
}