vscode-fs 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,16 +1,411 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_node = require('./node-B6PykMfK.cjs');
3
-
4
- Object.defineProperty(exports, 'FileSystemError', {
5
- enumerable: true,
6
- get: function () {
7
- return require_node.FileSystemError;
8
- }
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let vscode_uri = require("vscode-uri");
3
+ //#region src/types.ts
4
+ /**
5
+ * Enumeration of file types. The types `File` and `Directory` can also be
6
+ * a symbolic links, in that case use `FileType.File | FileType.SymbolicLink` and
7
+ * `FileType.Directory | FileType.SymbolicLink`.
8
+ */
9
+ let FileType = /* @__PURE__ */ function(FileType) {
10
+ /**
11
+ * The file type is unknown.
12
+ */
13
+ FileType[FileType["Unknown"] = 0] = "Unknown";
14
+ /**
15
+ * A regular file.
16
+ */
17
+ FileType[FileType["File"] = 1] = "File";
18
+ /**
19
+ * A directory.
20
+ */
21
+ FileType[FileType["Directory"] = 2] = "Directory";
22
+ /**
23
+ * A symbolic link to a file.
24
+ */
25
+ FileType[FileType["SymbolicLink"] = 64] = "SymbolicLink";
26
+ return FileType;
27
+ }({});
28
+ /**
29
+ * The flags to use for the file.
30
+ */
31
+ let WriteableFlags = /* @__PURE__ */ function(WriteableFlags) {
32
+ /**
33
+ * Append to the file.
34
+ */
35
+ WriteableFlags["Append"] = "a";
36
+ return WriteableFlags;
37
+ }({});
38
+ let FileSystemError;
39
+ (function(_FileSystemError) {
40
+ function isFileSystemError(error) {
41
+ return error instanceof FileSystemErrorImpl;
42
+ }
43
+ _FileSystemError.isFileSystemError = isFileSystemError;
44
+ })(FileSystemError || (FileSystemError = {}));
45
+ let FileSystemProviderErrorCode = /* @__PURE__ */ function(FileSystemProviderErrorCode) {
46
+ FileSystemProviderErrorCode["FileExists"] = "EntryExists";
47
+ FileSystemProviderErrorCode["FileNotFound"] = "EntryNotFound";
48
+ FileSystemProviderErrorCode["FileNotADirectory"] = "EntryNotADirectory";
49
+ FileSystemProviderErrorCode["FileIsADirectory"] = "EntryIsADirectory";
50
+ FileSystemProviderErrorCode["FileExceedsStorageQuota"] = "EntryExceedsStorageQuota";
51
+ FileSystemProviderErrorCode["FileTooLarge"] = "EntryTooLarge";
52
+ FileSystemProviderErrorCode["FileWriteLocked"] = "EntryWriteLocked";
53
+ FileSystemProviderErrorCode["NoPermissions"] = "NoPermissions";
54
+ FileSystemProviderErrorCode["Unavailable"] = "Unavailable";
55
+ FileSystemProviderErrorCode["Unknown"] = "Unknown";
56
+ return FileSystemProviderErrorCode;
57
+ }({});
58
+ /**
59
+ * A relative pattern is a helper to construct glob patterns that are matched
60
+ * relatively to a base file path. The base path can either be an absolute file
61
+ * path as string or uri or a {@link WorkspaceFolder workspace folder}, which is the
62
+ * preferred way of creating the relative pattern.
63
+ */
64
+ var RelativePattern = class {
65
+ /**
66
+ * A base file path to which this pattern will be matched against relatively. The
67
+ * file path must be absolute, should not have any trailing path separators and
68
+ * not include any relative segments (`.` or `..`).
69
+ */
70
+ baseUri;
71
+ /**
72
+ * A file glob pattern like `*.{ts,js}` that will be matched on file paths
73
+ * relative to the base path.
74
+ *
75
+ * Example: Given a base of `/home/work/folder` and a file path of `/home/work/folder/index.js`,
76
+ * the file glob pattern will match on `index.js`.
77
+ */
78
+ pattern;
79
+ /**
80
+ * Creates a new relative pattern object with a base file path and pattern to match. This pattern
81
+ * will be matched on file paths relative to the base.
82
+ *
83
+ * Example:
84
+ * ```ts
85
+ * const folder = vscode.workspace.workspaceFolders?.[0];
86
+ * if (folder) {
87
+ *
88
+ * // Match any TypeScript file in the root of this workspace folder
89
+ * const pattern1 = new vscode.RelativePattern(folder, '*.ts');
90
+ *
91
+ * // Match any TypeScript file in `someFolder` inside this workspace folder
92
+ * const pattern2 = new vscode.RelativePattern(folder, 'someFolder/*.ts');
93
+ * }
94
+ * ```
95
+ *
96
+ * @param base A base to which this pattern will be matched against relatively. It is recommended
97
+ * to pass in a {@link WorkspaceFolder workspace folder} if the pattern should match inside the workspace.
98
+ * Otherwise, a uri or string should only be used if the pattern is for a file path outside the workspace.
99
+ * @param pattern A file glob pattern like `*.{ts,js}` that will be matched on paths relative to the base.
100
+ */
101
+ constructor(base, pattern) {
102
+ this.baseUri = base;
103
+ this.pattern = pattern;
104
+ }
105
+ };
106
+ //#endregion
107
+ //#region src/error.ts
108
+ var FileSystemErrorImpl = class FileSystemErrorImpl extends Error {
109
+ static create(error, code) {
110
+ const providerError = new FileSystemErrorImpl(error.toString(), code);
111
+ this.markAsFileSystemProviderError(providerError, code);
112
+ return providerError;
113
+ }
114
+ static markAsFileSystemProviderError(error, code) {
115
+ error.name = code ? `${code} (FileSystemError)` : `FileSystemError`;
116
+ return error;
117
+ }
118
+ constructor(message, code) {
119
+ super(message);
120
+ this.code = code;
121
+ }
122
+ };
123
+ function createFileSystemError(error, code) {
124
+ return FileSystemErrorImpl.create(error, code);
125
+ }
126
+ function toFileSystemError(error) {
127
+ let resultError = error;
128
+ let code;
129
+ switch (error.code) {
130
+ case "ENOENT":
131
+ code = FileSystemProviderErrorCode.FileNotFound;
132
+ break;
133
+ case "EISDIR":
134
+ code = FileSystemProviderErrorCode.FileIsADirectory;
135
+ break;
136
+ case "ENOTDIR":
137
+ code = FileSystemProviderErrorCode.FileNotADirectory;
138
+ break;
139
+ case "EEXIST":
140
+ code = FileSystemProviderErrorCode.FileExists;
141
+ break;
142
+ case "EPERM":
143
+ case "EACCES":
144
+ code = FileSystemProviderErrorCode.NoPermissions;
145
+ break;
146
+ case "ERR_UNC_HOST_NOT_ALLOWED":
147
+ resultError = `${error.message}. Please update the 'security.allowedUNCHosts' setting if you want to allow this host.`;
148
+ code = FileSystemProviderErrorCode.Unknown;
149
+ break;
150
+ default: code = FileSystemProviderErrorCode.Unknown;
151
+ }
152
+ return createFileSystemError(resultError, code);
153
+ }
154
+ //#endregion
155
+ //#region src/node.ts
156
+ function isErrnoException(err) {
157
+ return err !== null && typeof err === "object" && "code" in err;
158
+ }
159
+ function toFileType(stats) {
160
+ if (stats.isFile()) return FileType.File;
161
+ if (stats.isDirectory()) return FileType.Directory;
162
+ if (stats.isSymbolicLink()) return FileType.SymbolicLink;
163
+ return FileType.Unknown;
164
+ }
165
+ async function wrap(fn) {
166
+ try {
167
+ return await fn();
168
+ } catch (error) {
169
+ if (FileSystemError.isFileSystemError(error)) throw error;
170
+ throw toFileSystemError(error);
171
+ }
172
+ }
173
+ function joinPath(basePath, ...segments) {
174
+ return vscode_uri.Utils.joinPath(vscode_uri.URI.file(basePath), ...segments).fsPath;
175
+ }
176
+ async function createNodeFileSystem() {
177
+ const [fs, glob, watch, stream] = await Promise.all([
178
+ import("node:fs"),
179
+ import("tinyglobby").then((m) => m.glob),
180
+ import("chokidar").then((m) => m.watch),
181
+ import("node:stream")
182
+ ]);
183
+ async function resolveFileType(path) {
184
+ const lstats = await fs.promises.lstat(path);
185
+ if (!lstats.isSymbolicLink()) return {
186
+ type: toFileType(lstats),
187
+ stats: lstats
188
+ };
189
+ let targetStats = null;
190
+ try {
191
+ targetStats = await fs.promises.stat(path);
192
+ } catch {}
193
+ const baseType = targetStats ? toFileType(targetStats) : FileType.Unknown;
194
+ const stats = targetStats ?? lstats;
195
+ return {
196
+ type: baseType | FileType.SymbolicLink,
197
+ stats
198
+ };
199
+ }
200
+ async function getEntryType(dirPath, entry) {
201
+ if (!entry.isSymbolicLink()) return toFileType(entry);
202
+ try {
203
+ return toFileType(await fs.promises.stat(joinPath(dirPath, entry.name))) | FileType.SymbolicLink;
204
+ } catch {
205
+ return FileType.SymbolicLink;
206
+ }
207
+ }
208
+ async function ensureTargetNotExists(path) {
209
+ try {
210
+ await fs.promises.access(path, fs.constants.F_OK);
211
+ throw createFileSystemError(`File exists: ${path}`, FileSystemProviderErrorCode.FileExists);
212
+ } catch (err) {
213
+ if (isErrnoException(err) && err.code !== "ENOENT") throw err;
214
+ }
215
+ }
216
+ async function copyRecursive(sourcePath, targetPath, overwrite) {
217
+ const stats = await fs.promises.stat(sourcePath);
218
+ if (stats.isFile()) {
219
+ const mode = overwrite ? void 0 : fs.constants.COPYFILE_EXCL;
220
+ await fs.promises.copyFile(sourcePath, targetPath, mode);
221
+ return;
222
+ }
223
+ if (stats.isDirectory()) {
224
+ if (!overwrite) await ensureTargetNotExists(targetPath);
225
+ await fs.promises.mkdir(targetPath, { recursive: true });
226
+ const entries = await fs.promises.readdir(sourcePath, { withFileTypes: true });
227
+ for (const entry of entries) await copyRecursive(joinPath(sourcePath, entry.name), joinPath(targetPath, entry.name), overwrite);
228
+ return;
229
+ }
230
+ throw createFileSystemError(`Unsupported file type: ${sourcePath}`, FileSystemProviderErrorCode.Unknown);
231
+ }
232
+ function pathToUris(pathToUris) {
233
+ return pathToUris.map((path) => vscode_uri.URI.file(path));
234
+ }
235
+ return {
236
+ stat: (uri) => wrap(async () => {
237
+ const { type, stats } = await resolveFileType(uri.fsPath);
238
+ return {
239
+ type,
240
+ ctime: stats.birthtime.getTime(),
241
+ mtime: stats.mtime.getTime(),
242
+ size: stats.size
243
+ };
244
+ }),
245
+ readDirectory: (uri) => wrap(async () => {
246
+ const entries = await fs.promises.readdir(uri.fsPath, { withFileTypes: true });
247
+ return Promise.all(entries.map(async (entry) => [entry.name, await getEntryType(uri.fsPath, entry)]));
248
+ }),
249
+ createDirectory: (uri) => wrap(async () => {
250
+ await fs.promises.mkdir(uri.fsPath, { recursive: true });
251
+ }),
252
+ readFile: (uri) => wrap(() => fs.promises.readFile(uri.fsPath)),
253
+ writeFile: (uri, content) => wrap(() => fs.promises.writeFile(uri.fsPath, content)),
254
+ delete: (uri, options) => wrap(async () => {
255
+ if (options?.useTrash === true) await import("trash").then((m) => m.default).then((trash) => trash(uri.fsPath));
256
+ else await fs.promises.rm(uri.fsPath, { recursive: options?.recursive ?? false });
257
+ }),
258
+ rename: (source, target, options) => wrap(async () => {
259
+ if (options?.overwrite === false) await ensureTargetNotExists(target.fsPath);
260
+ await fs.promises.rename(source.fsPath, target.fsPath);
261
+ }),
262
+ copy: (source, target, options) => wrap(async () => {
263
+ const overwrite = options?.overwrite !== false;
264
+ await copyRecursive(source.fsPath, target.fsPath, overwrite);
265
+ }),
266
+ isFile: async (uri) => {
267
+ try {
268
+ const { type, stats } = await resolveFileType(uri.fsPath);
269
+ if (type !== FileType.File) return false;
270
+ return {
271
+ type,
272
+ ctime: stats.birthtime.getTime(),
273
+ mtime: stats.mtime.getTime(),
274
+ size: stats.size
275
+ };
276
+ } catch {
277
+ return false;
278
+ }
279
+ },
280
+ isDirectory: async (uri) => {
281
+ try {
282
+ const { type, stats } = await resolveFileType(uri.fsPath);
283
+ if (type !== FileType.Directory) return false;
284
+ return {
285
+ type,
286
+ ctime: stats.birthtime.getTime(),
287
+ mtime: stats.mtime.getTime(),
288
+ size: stats.size
289
+ };
290
+ } catch {
291
+ return false;
292
+ }
293
+ },
294
+ isSymbolicLink: async (uri) => {
295
+ try {
296
+ const { type, stats } = await resolveFileType(uri.fsPath);
297
+ if (type !== FileType.SymbolicLink) return false;
298
+ return {
299
+ type,
300
+ ctime: stats.birthtime.getTime(),
301
+ mtime: stats.mtime.getTime(),
302
+ size: stats.size
303
+ };
304
+ } catch {
305
+ return false;
306
+ }
307
+ },
308
+ exists: async (uri) => {
309
+ try {
310
+ const { type, stats } = await resolveFileType(uri.fsPath);
311
+ return {
312
+ type,
313
+ ctime: stats.birthtime.getTime(),
314
+ mtime: stats.mtime.getTime(),
315
+ size: stats.size
316
+ };
317
+ } catch {
318
+ return false;
319
+ }
320
+ },
321
+ glob: async (pattern, options) => {
322
+ return pathToUris(await glob(pattern.pattern, {
323
+ absolute: true,
324
+ cwd: pattern.baseUri.fsPath,
325
+ onlyFiles: options?.onlyFiles,
326
+ onlyDirectories: options?.onlyDirectories,
327
+ followSymbolicLinks: options?.followSymbolicLinks,
328
+ ignore: Array.isArray(options?.ignore) ? options?.ignore : options?.ignore ? options?.ignore.pattern : [],
329
+ dot: options?.dot,
330
+ expandDirectories: options?.expandDirectories,
331
+ extglob: options?.extglob,
332
+ deep: options?.deep,
333
+ fs
334
+ }));
335
+ },
336
+ createWatcher: async (pattern, options) => {
337
+ const watcher = watch(pattern.pattern, { cwd: pattern.baseUri.fsPath });
338
+ return new Promise((resolve) => {
339
+ watcher.on("ready", () => {
340
+ const fileSystemWatcher = new NodeFileSystemWatcherImpl(watcher, options);
341
+ if (options?.ignoreChangeEvents !== true) watcher.on("add", (path) => fileSystemWatcher.onDidCreateListeners.forEach((listener) => listener(vscode_uri.URI.file(path))));
342
+ if (options?.ignoreChangeEvents !== true) watcher.on("change", (path) => fileSystemWatcher.onDidChangeListeners.forEach((listener) => listener(vscode_uri.URI.file(path))));
343
+ if (options?.ignoreDeleteEvents !== true) watcher.on("unlink", (path) => fileSystemWatcher.onDidDeleteListeners.forEach((listener) => listener(vscode_uri.URI.file(path))));
344
+ resolve(fileSystemWatcher);
345
+ });
346
+ });
347
+ },
348
+ createWritableStream: async (uri, options) => {
349
+ const writableStream = fs.createWriteStream(uri.fsPath, {
350
+ ...options,
351
+ encoding: options?.encoding,
352
+ flags: options?.flags
353
+ });
354
+ return stream.Writable.toWeb(writableStream);
355
+ },
356
+ createReadableStream: async (uri) => {
357
+ const readableStream = fs.createReadStream(uri.fsPath);
358
+ return stream.Readable.toWeb(readableStream);
359
+ }
360
+ };
361
+ }
362
+ var NodeFileSystemWatcherImpl = class {
363
+ constructor(watcher, options) {
364
+ this.watcher = watcher;
365
+ this.options = options;
366
+ }
367
+ get ignoreChangeEvents() {
368
+ return this.options?.ignoreChangeEvents ?? false;
369
+ }
370
+ get ignoreCreateEvents() {
371
+ return this.options?.ignoreCreateEvents ?? false;
372
+ }
373
+ get ignoreDeleteEvents() {
374
+ return this.options?.ignoreDeleteEvents ?? false;
375
+ }
376
+ get isDisposed() {
377
+ return this.watcher.closed;
378
+ }
379
+ onDidCreateListeners = /* @__PURE__ */ new Set();
380
+ onDidChangeListeners = /* @__PURE__ */ new Set();
381
+ onDidDeleteListeners = /* @__PURE__ */ new Set();
382
+ onDidCreate(listener) {
383
+ this.onDidCreateListeners.add(listener);
384
+ return { dispose: () => this.onDidCreateListeners.delete(listener) };
385
+ }
386
+ onDidChange(listener) {
387
+ this.onDidChangeListeners.add(listener);
388
+ return { dispose: () => this.onDidChangeListeners.delete(listener) };
389
+ }
390
+ onDidDelete(listener) {
391
+ this.onDidDeleteListeners.add(listener);
392
+ return { dispose: () => this.onDidDeleteListeners.delete(listener) };
393
+ }
394
+ dispose() {
395
+ this.watcher.close();
396
+ }
397
+ };
398
+ //#endregion
399
+ Object.defineProperty(exports, "FileSystemError", {
400
+ enumerable: true,
401
+ get: function() {
402
+ return FileSystemError;
403
+ }
9
404
  });
10
- exports.FileSystemProviderErrorCode = require_node.FileSystemProviderErrorCode;
11
- exports.FileType = require_node.FileType;
12
- exports.RelativePattern = require_node.RelativePattern;
13
- exports.WriteableFlags = require_node.WriteableFlags;
14
- exports.createFileSystemError = require_node.createFileSystemError;
15
- exports.createNodeFileSystem = require_node.createNodeFileSystem;
16
- exports.toFileSystemError = require_node.toFileSystemError;
405
+ exports.FileSystemProviderErrorCode = FileSystemProviderErrorCode;
406
+ exports.FileType = FileType;
407
+ exports.RelativePattern = RelativePattern;
408
+ exports.WriteableFlags = WriteableFlags;
409
+ exports.createFileSystemError = createFileSystemError;
410
+ exports.createNodeFileSystem = createNodeFileSystem;
411
+ exports.toFileSystemError = toFileSystemError;