microsoft/vscode-react-native

Public

mirrored fromhttps://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
4e7a6f0ea8877d0ec68aa871b8597e21af9cd6aa

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/utils/node/fileSystem.ts

119lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as fs from "fs";
5import * as path from "path";
6import * as Q from "q";
7
8export class FileSystem {
9
10 public ensureDirectory(dir: string): Q.Promise<void> {
11 return Q.nfcall(fs.stat, dir).then((stat: fs.Stats): void => {
12 if (stat.isDirectory()) {
13 return;
14 } else {
15 throw new Error(`Expected ${dir} to be a directory`);
16 }
17 }, (err: Error & { code?: string }): Q.Promise<any> => {
18 if (err && err.code === "ENOENT") {
19 return Q.nfcall(fs.mkdir, dir);
20 } else {
21 throw err;
22 }
23 });
24 }
25
26 public ensureFileWithContents(file: string, contents: string): Q.Promise<void> {
27 return Q.nfcall(fs.stat, file).then((stat: fs.Stats): void => {
28 if (!stat.isFile()) {
29 throw new Error(`Expected ${file} to be a file`);
30 }
31 // The file already exists, assume the contents are good and do not touch it.
32 }, (err: Error & { code?: string }): Q.Promise<any> => {
33 if (err && err.code === "ENOENT") {
34 return Q.nfcall(fs.writeFile, file, contents);
35 } else {
36 throw err;
37 }
38 });
39 }
40
41 public fileExistsSync(filename: string) {
42 try {
43 fs.lstatSync(filename);
44 return true;
45 } catch (error) {
46 return false;
47 }
48 }
49
50 public deleteFileIfExistsSync(filename: string) {
51 if (this.fileExistsSync(filename)) {
52 fs.unlinkSync(filename);
53 }
54 }
55
56 public readFile(filename: string, encoding: string = "utf8"): Q.Promise<string> {
57 return Q.nfcall<string>(fs.readFile, filename, encoding);
58 }
59
60 public writeFile(filename: string, data: any): Q.Promise<void> {
61 return Q.nfcall<void>(fs.writeFile, filename, data);
62 }
63
64 public findFilesByExtension(folder: string, extension: string): Q.Promise<string[]> {
65 return Q.nfcall(fs.readdir, folder).then((files: string[]) => {
66 const extFiles = files.filter((file: string) => path.extname(file) === `.${extension}`);
67 if (extFiles.length === 0) {
68 throw new Error(`Unable to find any ${extension} files.`);
69 }
70 return extFiles;
71 });
72 }
73
74 public pathExists(p: string): Q.Promise<boolean> {
75 let deferred = Q.defer<boolean>();
76 fs.exists(p, deferred.resolve);
77 return deferred.promise;
78 }
79
80 public mkDir(p: string): Q.Promise<void> {
81 return Q.nfcall<void>(fs.mkdir, p);
82 }
83
84 public removePathRecursivelyAsync(p: string): Q.Promise<void> {
85 return this.pathExists(p).then(exists => {
86 if (exists) {
87 return Q.nfcall<fs.Stats>(fs.stat, p).then((stats: fs.Stats) => {
88 if (stats.isDirectory()) {
89 return Q.nfcall<string[]>(fs.readdir, p).then((childPaths: string[]) => {
90 let result = Q<void>(void 0);
91 childPaths.forEach(childPath =>
92 result = result.then<void>(() => this.removePathRecursivelyAsync(path.join(p, childPath))));
93 return result;
94 }).then(() =>
95 Q.nfcall<void>(fs.rmdir, p));
96 } else {
97 /* file */
98 return Q.nfcall<void>(fs.unlink, p);
99 }
100 });
101 }
102 });
103 }
104
105 public removePathRecursivelySync(p: string): void {
106 if (fs.existsSync(p)) {
107 let stats = fs.statSync(p);
108 if (stats.isDirectory()) {
109 let contents = fs.readdirSync(p);
110 contents.forEach(childPath =>
111 this.removePathRecursivelySync(path.join(p, childPath)));
112 fs.rmdirSync(p);
113 } else {
114 /* file */
115 fs.unlinkSync(p);
116 }
117 }
118 }
119}
120