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