summaryrefslogtreecommitdiff
path: root/js/file_info.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/file_info.ts')
-rw-r--r--js/file_info.ts108
1 files changed, 108 insertions, 0 deletions
diff --git a/js/file_info.ts b/js/file_info.ts
new file mode 100644
index 000000000..00e68ac91
--- /dev/null
+++ b/js/file_info.ts
@@ -0,0 +1,108 @@
+// Copyright 2018 the Deno authors. All rights reserved. MIT license.
+import * as msg from "gen/msg_generated";
+
+/**
+ * A FileInfo describes a file and is returned by `stat`, `lstat`,
+ * `statSync`, `lstatSync`.
+ */
+export interface FileInfo {
+ readonly _isFile: boolean;
+ readonly _isSymlink: boolean;
+ /** 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;
+
+ /**
+ * Returns the file or directory name.
+ */
+ name: string | null;
+
+ /** Returns the file or directory path. */
+ path: 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;
+}
+
+export class FileInfoImpl implements FileInfo {
+ readonly _isFile: boolean;
+ readonly _isSymlink: boolean;
+ len: number;
+ modified: number | null;
+ accessed: number | null;
+ created: number | null;
+ mode: number | null;
+ name: string | null;
+ path: string | null;
+
+ /* @internal */
+ constructor(private _inner: msg.StatRes) {
+ const modified = this._inner.modified().toFloat64();
+ const accessed = this._inner.accessed().toFloat64();
+ const created = this._inner.created().toFloat64();
+ const hasMode = this._inner.hasMode();
+ const mode = this._inner.mode(); // negative for invalid mode (Windows)
+ const name = this._inner.name();
+ const path = this._inner.path();
+
+ this._isFile = this._inner.isFile();
+ this._isSymlink = this._inner.isSymlink();
+ this.len = this._inner.len().toFloat64();
+ 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;
+ this.path = path ? path : null;
+ }
+
+ isFile() {
+ return this._isFile;
+ }
+
+ isDirectory() {
+ return !this._isFile && !this._isSymlink;
+ }
+
+ isSymlink() {
+ return this._isSymlink;
+ }
+}