summaryrefslogtreecommitdiff
path: root/cli/js/file_info.ts
diff options
context:
space:
mode:
Diffstat (limited to 'cli/js/file_info.ts')
-rw-r--r--cli/js/file_info.ts91
1 files changed, 91 insertions, 0 deletions
diff --git a/cli/js/file_info.ts b/cli/js/file_info.ts
new file mode 100644
index 000000000..a98989e79
--- /dev/null
+++ b/cli/js/file_info.ts
@@ -0,0 +1,91 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import { StatResponse } from "./stat.ts";
+
+/** A FileInfo describes a file and is returned by `stat`, `lstat`,
+ * `statSync`, `lstatSync`.
+ */
+export interface FileInfo {
+ /** The size of the file, in bytes. */
+ len: number;
+ /** The last modification time of the file. This corresponds to the `mtime`
+ * field from `stat` on Unix and `ftLastWriteTime` on Windows. This may not
+ * be available on all platforms.
+ */
+ modified: number | null;
+ /** The last access time of the file. This corresponds to the `atime`
+ * field from `stat` on Unix and `ftLastAccessTime` on Windows. This may not
+ * be available on all platforms.
+ */
+ accessed: number | null;
+ /** The last access time of the file. This corresponds to the `birthtime`
+ * field from `stat` on Unix and `ftCreationTime` on Windows. This may not
+ * be available on all platforms.
+ */
+ created: number | null;
+ /** The underlying raw st_mode bits that contain the standard Unix permissions
+ * for this file/directory. TODO Match behavior with Go on windows for mode.
+ */
+ mode: number | null;
+
+ /** The file or directory name. */
+ name: string | null;
+
+ /** Returns whether this is info for a regular file. This result is mutually
+ * exclusive to `FileInfo.isDirectory` and `FileInfo.isSymlink`.
+ */
+ isFile(): boolean;
+
+ /** Returns whether this is info for a regular directory. This result is
+ * mutually exclusive to `FileInfo.isFile` and `FileInfo.isSymlink`.
+ */
+ isDirectory(): boolean;
+
+ /** Returns whether this is info for a symlink. This result is
+ * mutually exclusive to `FileInfo.isFile` and `FileInfo.isDirectory`.
+ */
+ isSymlink(): boolean;
+}
+
+// @internal
+export class FileInfoImpl implements FileInfo {
+ private readonly _isFile: boolean;
+ private readonly _isSymlink: boolean;
+ len: number;
+ modified: number | null;
+ accessed: number | null;
+ created: number | null;
+ mode: number | null;
+ name: string | null;
+
+ /* @internal */
+ constructor(private _res: StatResponse) {
+ const modified = this._res.modified;
+ const accessed = this._res.accessed;
+ const created = this._res.created;
+ const hasMode = this._res.hasMode;
+ const mode = this._res.mode; // negative for invalid mode (Windows)
+ const name = this._res.name;
+
+ this._isFile = this._res.isFile;
+ this._isSymlink = this._res.isSymlink;
+ this.len = this._res.len;
+ this.modified = modified ? modified : null;
+ this.accessed = accessed ? accessed : null;
+ this.created = created ? created : null;
+ // null on Windows
+ this.mode = hasMode ? mode : null;
+ this.name = name ? name : null;
+ }
+
+ isFile(): boolean {
+ return this._isFile;
+ }
+
+ isDirectory(): boolean {
+ return !this._isFile && !this._isSymlink;
+ }
+
+ isSymlink(): boolean {
+ return this._isSymlink;
+ }
+}