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 +410 -15
- package/dist/index.d.cts +431 -1
- package/dist/index.d.mts +431 -1
- package/dist/index.mjs +398 -3
- package/dist/vscode.cjs +349 -19
- package/dist/vscode.d.cts +401 -1
- package/dist/vscode.d.mts +401 -1
- package/dist/vscode.mjs +341 -5
- package/package.json +3 -3
- package/dist/node-B6PykMfK.cjs +0 -451
- package/dist/node-FE5EZXEu.mjs +0 -403
- package/dist/types-Bpywvr5r.d.cts +0 -433
- package/dist/types-DIuEgbpF.d.mts +0 -433
package/dist/vscode.mjs
CHANGED
|
@@ -1,6 +1,343 @@
|
|
|
1
|
-
import { t as createNodeFileSystem } from "./node-FE5EZXEu.mjs";
|
|
2
1
|
import * as vscode from "vscode";
|
|
3
|
-
|
|
2
|
+
import { URI, Utils } from "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
|
+
let FileSystemError;
|
|
29
|
+
(function(_FileSystemError) {
|
|
30
|
+
function isFileSystemError(error) {
|
|
31
|
+
return error instanceof FileSystemErrorImpl;
|
|
32
|
+
}
|
|
33
|
+
_FileSystemError.isFileSystemError = isFileSystemError;
|
|
34
|
+
})(FileSystemError || (FileSystemError = {}));
|
|
35
|
+
let FileSystemProviderErrorCode = /* @__PURE__ */ function(FileSystemProviderErrorCode) {
|
|
36
|
+
FileSystemProviderErrorCode["FileExists"] = "EntryExists";
|
|
37
|
+
FileSystemProviderErrorCode["FileNotFound"] = "EntryNotFound";
|
|
38
|
+
FileSystemProviderErrorCode["FileNotADirectory"] = "EntryNotADirectory";
|
|
39
|
+
FileSystemProviderErrorCode["FileIsADirectory"] = "EntryIsADirectory";
|
|
40
|
+
FileSystemProviderErrorCode["FileExceedsStorageQuota"] = "EntryExceedsStorageQuota";
|
|
41
|
+
FileSystemProviderErrorCode["FileTooLarge"] = "EntryTooLarge";
|
|
42
|
+
FileSystemProviderErrorCode["FileWriteLocked"] = "EntryWriteLocked";
|
|
43
|
+
FileSystemProviderErrorCode["NoPermissions"] = "NoPermissions";
|
|
44
|
+
FileSystemProviderErrorCode["Unavailable"] = "Unavailable";
|
|
45
|
+
FileSystemProviderErrorCode["Unknown"] = "Unknown";
|
|
46
|
+
return FileSystemProviderErrorCode;
|
|
47
|
+
}({});
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/error.ts
|
|
50
|
+
var FileSystemErrorImpl = class FileSystemErrorImpl extends Error {
|
|
51
|
+
static create(error, code) {
|
|
52
|
+
const providerError = new FileSystemErrorImpl(error.toString(), code);
|
|
53
|
+
this.markAsFileSystemProviderError(providerError, code);
|
|
54
|
+
return providerError;
|
|
55
|
+
}
|
|
56
|
+
static markAsFileSystemProviderError(error, code) {
|
|
57
|
+
error.name = code ? `${code} (FileSystemError)` : `FileSystemError`;
|
|
58
|
+
return error;
|
|
59
|
+
}
|
|
60
|
+
constructor(message, code) {
|
|
61
|
+
super(message);
|
|
62
|
+
this.code = code;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
function createFileSystemError(error, code) {
|
|
66
|
+
return FileSystemErrorImpl.create(error, code);
|
|
67
|
+
}
|
|
68
|
+
function toFileSystemError(error) {
|
|
69
|
+
let resultError = error;
|
|
70
|
+
let code;
|
|
71
|
+
switch (error.code) {
|
|
72
|
+
case "ENOENT":
|
|
73
|
+
code = FileSystemProviderErrorCode.FileNotFound;
|
|
74
|
+
break;
|
|
75
|
+
case "EISDIR":
|
|
76
|
+
code = FileSystemProviderErrorCode.FileIsADirectory;
|
|
77
|
+
break;
|
|
78
|
+
case "ENOTDIR":
|
|
79
|
+
code = FileSystemProviderErrorCode.FileNotADirectory;
|
|
80
|
+
break;
|
|
81
|
+
case "EEXIST":
|
|
82
|
+
code = FileSystemProviderErrorCode.FileExists;
|
|
83
|
+
break;
|
|
84
|
+
case "EPERM":
|
|
85
|
+
case "EACCES":
|
|
86
|
+
code = FileSystemProviderErrorCode.NoPermissions;
|
|
87
|
+
break;
|
|
88
|
+
case "ERR_UNC_HOST_NOT_ALLOWED":
|
|
89
|
+
resultError = `${error.message}. Please update the 'security.allowedUNCHosts' setting if you want to allow this host.`;
|
|
90
|
+
code = FileSystemProviderErrorCode.Unknown;
|
|
91
|
+
break;
|
|
92
|
+
default: code = FileSystemProviderErrorCode.Unknown;
|
|
93
|
+
}
|
|
94
|
+
return createFileSystemError(resultError, code);
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src/node.ts
|
|
98
|
+
function isErrnoException(err) {
|
|
99
|
+
return err !== null && typeof err === "object" && "code" in err;
|
|
100
|
+
}
|
|
101
|
+
function toFileType(stats) {
|
|
102
|
+
if (stats.isFile()) return FileType.File;
|
|
103
|
+
if (stats.isDirectory()) return FileType.Directory;
|
|
104
|
+
if (stats.isSymbolicLink()) return FileType.SymbolicLink;
|
|
105
|
+
return FileType.Unknown;
|
|
106
|
+
}
|
|
107
|
+
async function wrap(fn) {
|
|
108
|
+
try {
|
|
109
|
+
return await fn();
|
|
110
|
+
} catch (error) {
|
|
111
|
+
if (FileSystemError.isFileSystemError(error)) throw error;
|
|
112
|
+
throw toFileSystemError(error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function joinPath(basePath, ...segments) {
|
|
116
|
+
return Utils.joinPath(URI.file(basePath), ...segments).fsPath;
|
|
117
|
+
}
|
|
118
|
+
async function createNodeFileSystem() {
|
|
119
|
+
const [fs, glob, watch, stream] = await Promise.all([
|
|
120
|
+
import("node:fs"),
|
|
121
|
+
import("tinyglobby").then((m) => m.glob),
|
|
122
|
+
import("chokidar").then((m) => m.watch),
|
|
123
|
+
import("node:stream")
|
|
124
|
+
]);
|
|
125
|
+
async function resolveFileType(path) {
|
|
126
|
+
const lstats = await fs.promises.lstat(path);
|
|
127
|
+
if (!lstats.isSymbolicLink()) return {
|
|
128
|
+
type: toFileType(lstats),
|
|
129
|
+
stats: lstats
|
|
130
|
+
};
|
|
131
|
+
let targetStats = null;
|
|
132
|
+
try {
|
|
133
|
+
targetStats = await fs.promises.stat(path);
|
|
134
|
+
} catch {}
|
|
135
|
+
const baseType = targetStats ? toFileType(targetStats) : FileType.Unknown;
|
|
136
|
+
const stats = targetStats ?? lstats;
|
|
137
|
+
return {
|
|
138
|
+
type: baseType | FileType.SymbolicLink,
|
|
139
|
+
stats
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
async function getEntryType(dirPath, entry) {
|
|
143
|
+
if (!entry.isSymbolicLink()) return toFileType(entry);
|
|
144
|
+
try {
|
|
145
|
+
return toFileType(await fs.promises.stat(joinPath(dirPath, entry.name))) | FileType.SymbolicLink;
|
|
146
|
+
} catch {
|
|
147
|
+
return FileType.SymbolicLink;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function ensureTargetNotExists(path) {
|
|
151
|
+
try {
|
|
152
|
+
await fs.promises.access(path, fs.constants.F_OK);
|
|
153
|
+
throw createFileSystemError(`File exists: ${path}`, FileSystemProviderErrorCode.FileExists);
|
|
154
|
+
} catch (err) {
|
|
155
|
+
if (isErrnoException(err) && err.code !== "ENOENT") throw err;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function copyRecursive(sourcePath, targetPath, overwrite) {
|
|
159
|
+
const stats = await fs.promises.stat(sourcePath);
|
|
160
|
+
if (stats.isFile()) {
|
|
161
|
+
const mode = overwrite ? void 0 : fs.constants.COPYFILE_EXCL;
|
|
162
|
+
await fs.promises.copyFile(sourcePath, targetPath, mode);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (stats.isDirectory()) {
|
|
166
|
+
if (!overwrite) await ensureTargetNotExists(targetPath);
|
|
167
|
+
await fs.promises.mkdir(targetPath, { recursive: true });
|
|
168
|
+
const entries = await fs.promises.readdir(sourcePath, { withFileTypes: true });
|
|
169
|
+
for (const entry of entries) await copyRecursive(joinPath(sourcePath, entry.name), joinPath(targetPath, entry.name), overwrite);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
throw createFileSystemError(`Unsupported file type: ${sourcePath}`, FileSystemProviderErrorCode.Unknown);
|
|
173
|
+
}
|
|
174
|
+
function pathToUris(pathToUris) {
|
|
175
|
+
return pathToUris.map((path) => URI.file(path));
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
stat: (uri) => wrap(async () => {
|
|
179
|
+
const { type, stats } = await resolveFileType(uri.fsPath);
|
|
180
|
+
return {
|
|
181
|
+
type,
|
|
182
|
+
ctime: stats.birthtime.getTime(),
|
|
183
|
+
mtime: stats.mtime.getTime(),
|
|
184
|
+
size: stats.size
|
|
185
|
+
};
|
|
186
|
+
}),
|
|
187
|
+
readDirectory: (uri) => wrap(async () => {
|
|
188
|
+
const entries = await fs.promises.readdir(uri.fsPath, { withFileTypes: true });
|
|
189
|
+
return Promise.all(entries.map(async (entry) => [entry.name, await getEntryType(uri.fsPath, entry)]));
|
|
190
|
+
}),
|
|
191
|
+
createDirectory: (uri) => wrap(async () => {
|
|
192
|
+
await fs.promises.mkdir(uri.fsPath, { recursive: true });
|
|
193
|
+
}),
|
|
194
|
+
readFile: (uri) => wrap(() => fs.promises.readFile(uri.fsPath)),
|
|
195
|
+
writeFile: (uri, content) => wrap(() => fs.promises.writeFile(uri.fsPath, content)),
|
|
196
|
+
delete: (uri, options) => wrap(async () => {
|
|
197
|
+
if (options?.useTrash === true) await import("trash").then((m) => m.default).then((trash) => trash(uri.fsPath));
|
|
198
|
+
else await fs.promises.rm(uri.fsPath, { recursive: options?.recursive ?? false });
|
|
199
|
+
}),
|
|
200
|
+
rename: (source, target, options) => wrap(async () => {
|
|
201
|
+
if (options?.overwrite === false) await ensureTargetNotExists(target.fsPath);
|
|
202
|
+
await fs.promises.rename(source.fsPath, target.fsPath);
|
|
203
|
+
}),
|
|
204
|
+
copy: (source, target, options) => wrap(async () => {
|
|
205
|
+
const overwrite = options?.overwrite !== false;
|
|
206
|
+
await copyRecursive(source.fsPath, target.fsPath, overwrite);
|
|
207
|
+
}),
|
|
208
|
+
isFile: async (uri) => {
|
|
209
|
+
try {
|
|
210
|
+
const { type, stats } = await resolveFileType(uri.fsPath);
|
|
211
|
+
if (type !== FileType.File) return false;
|
|
212
|
+
return {
|
|
213
|
+
type,
|
|
214
|
+
ctime: stats.birthtime.getTime(),
|
|
215
|
+
mtime: stats.mtime.getTime(),
|
|
216
|
+
size: stats.size
|
|
217
|
+
};
|
|
218
|
+
} catch {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
isDirectory: async (uri) => {
|
|
223
|
+
try {
|
|
224
|
+
const { type, stats } = await resolveFileType(uri.fsPath);
|
|
225
|
+
if (type !== FileType.Directory) return false;
|
|
226
|
+
return {
|
|
227
|
+
type,
|
|
228
|
+
ctime: stats.birthtime.getTime(),
|
|
229
|
+
mtime: stats.mtime.getTime(),
|
|
230
|
+
size: stats.size
|
|
231
|
+
};
|
|
232
|
+
} catch {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
isSymbolicLink: async (uri) => {
|
|
237
|
+
try {
|
|
238
|
+
const { type, stats } = await resolveFileType(uri.fsPath);
|
|
239
|
+
if (type !== FileType.SymbolicLink) return false;
|
|
240
|
+
return {
|
|
241
|
+
type,
|
|
242
|
+
ctime: stats.birthtime.getTime(),
|
|
243
|
+
mtime: stats.mtime.getTime(),
|
|
244
|
+
size: stats.size
|
|
245
|
+
};
|
|
246
|
+
} catch {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
exists: async (uri) => {
|
|
251
|
+
try {
|
|
252
|
+
const { type, stats } = await resolveFileType(uri.fsPath);
|
|
253
|
+
return {
|
|
254
|
+
type,
|
|
255
|
+
ctime: stats.birthtime.getTime(),
|
|
256
|
+
mtime: stats.mtime.getTime(),
|
|
257
|
+
size: stats.size
|
|
258
|
+
};
|
|
259
|
+
} catch {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
glob: async (pattern, options) => {
|
|
264
|
+
return pathToUris(await glob(pattern.pattern, {
|
|
265
|
+
absolute: true,
|
|
266
|
+
cwd: pattern.baseUri.fsPath,
|
|
267
|
+
onlyFiles: options?.onlyFiles,
|
|
268
|
+
onlyDirectories: options?.onlyDirectories,
|
|
269
|
+
followSymbolicLinks: options?.followSymbolicLinks,
|
|
270
|
+
ignore: Array.isArray(options?.ignore) ? options?.ignore : options?.ignore ? options?.ignore.pattern : [],
|
|
271
|
+
dot: options?.dot,
|
|
272
|
+
expandDirectories: options?.expandDirectories,
|
|
273
|
+
extglob: options?.extglob,
|
|
274
|
+
deep: options?.deep,
|
|
275
|
+
fs
|
|
276
|
+
}));
|
|
277
|
+
},
|
|
278
|
+
createWatcher: async (pattern, options) => {
|
|
279
|
+
const watcher = watch(pattern.pattern, { cwd: pattern.baseUri.fsPath });
|
|
280
|
+
return new Promise((resolve) => {
|
|
281
|
+
watcher.on("ready", () => {
|
|
282
|
+
const fileSystemWatcher = new NodeFileSystemWatcherImpl(watcher, options);
|
|
283
|
+
if (options?.ignoreChangeEvents !== true) watcher.on("add", (path) => fileSystemWatcher.onDidCreateListeners.forEach((listener) => listener(URI.file(path))));
|
|
284
|
+
if (options?.ignoreChangeEvents !== true) watcher.on("change", (path) => fileSystemWatcher.onDidChangeListeners.forEach((listener) => listener(URI.file(path))));
|
|
285
|
+
if (options?.ignoreDeleteEvents !== true) watcher.on("unlink", (path) => fileSystemWatcher.onDidDeleteListeners.forEach((listener) => listener(URI.file(path))));
|
|
286
|
+
resolve(fileSystemWatcher);
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
},
|
|
290
|
+
createWritableStream: async (uri, options) => {
|
|
291
|
+
const writableStream = fs.createWriteStream(uri.fsPath, {
|
|
292
|
+
...options,
|
|
293
|
+
encoding: options?.encoding,
|
|
294
|
+
flags: options?.flags
|
|
295
|
+
});
|
|
296
|
+
return stream.Writable.toWeb(writableStream);
|
|
297
|
+
},
|
|
298
|
+
createReadableStream: async (uri) => {
|
|
299
|
+
const readableStream = fs.createReadStream(uri.fsPath);
|
|
300
|
+
return stream.Readable.toWeb(readableStream);
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
var NodeFileSystemWatcherImpl = class {
|
|
305
|
+
constructor(watcher, options) {
|
|
306
|
+
this.watcher = watcher;
|
|
307
|
+
this.options = options;
|
|
308
|
+
}
|
|
309
|
+
get ignoreChangeEvents() {
|
|
310
|
+
return this.options?.ignoreChangeEvents ?? false;
|
|
311
|
+
}
|
|
312
|
+
get ignoreCreateEvents() {
|
|
313
|
+
return this.options?.ignoreCreateEvents ?? false;
|
|
314
|
+
}
|
|
315
|
+
get ignoreDeleteEvents() {
|
|
316
|
+
return this.options?.ignoreDeleteEvents ?? false;
|
|
317
|
+
}
|
|
318
|
+
get isDisposed() {
|
|
319
|
+
return this.watcher.closed;
|
|
320
|
+
}
|
|
321
|
+
onDidCreateListeners = /* @__PURE__ */ new Set();
|
|
322
|
+
onDidChangeListeners = /* @__PURE__ */ new Set();
|
|
323
|
+
onDidDeleteListeners = /* @__PURE__ */ new Set();
|
|
324
|
+
onDidCreate(listener) {
|
|
325
|
+
this.onDidCreateListeners.add(listener);
|
|
326
|
+
return { dispose: () => this.onDidCreateListeners.delete(listener) };
|
|
327
|
+
}
|
|
328
|
+
onDidChange(listener) {
|
|
329
|
+
this.onDidChangeListeners.add(listener);
|
|
330
|
+
return { dispose: () => this.onDidChangeListeners.delete(listener) };
|
|
331
|
+
}
|
|
332
|
+
onDidDelete(listener) {
|
|
333
|
+
this.onDidDeleteListeners.add(listener);
|
|
334
|
+
return { dispose: () => this.onDidDeleteListeners.delete(listener) };
|
|
335
|
+
}
|
|
336
|
+
dispose() {
|
|
337
|
+
this.watcher.close();
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
//#endregion
|
|
4
341
|
//#region src/vscode.ts
|
|
5
342
|
async function createVSCodeFileSystem() {
|
|
6
343
|
const nodeFileSystem = createNodeFileSystem();
|
|
@@ -10,7 +347,7 @@ async function createVSCodeFileSystem() {
|
|
|
10
347
|
createDirectory: async (uri) => await vscode.workspace.fs.createDirectory(uri),
|
|
11
348
|
readFile: async (uri) => await vscode.workspace.fs.readFile(uri),
|
|
12
349
|
writeFile: async (uri, content) => await vscode.workspace.fs.writeFile(uri, content),
|
|
13
|
-
delete: async (uri) => await vscode.workspace.fs.delete(uri),
|
|
350
|
+
delete: async (uri, options) => await vscode.workspace.fs.delete(uri, options),
|
|
14
351
|
rename: async (source, target, options) => await vscode.workspace.fs.rename(source, target, options),
|
|
15
352
|
copy: async (source, target, options) => await vscode.workspace.fs.copy(source, target, options),
|
|
16
353
|
isDirectory: async (uri) => await vscode.workspace.fs.stat(uri).then((stat) => stat.type === vscode.FileType.Directory ? stat : false, () => false),
|
|
@@ -32,6 +369,5 @@ async function createVSCodeFileSystem() {
|
|
|
32
369
|
createReadableStream: async (uri) => (await nodeFileSystem).createReadableStream(uri)
|
|
33
370
|
};
|
|
34
371
|
}
|
|
35
|
-
|
|
36
372
|
//#endregion
|
|
37
|
-
export { createVSCodeFileSystem };
|
|
373
|
+
export { createVSCodeFileSystem };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vscode-fs",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.2",
|
|
5
5
|
"description": "VSCode like simple、serializable and cross-platform file system utilities.",
|
|
6
6
|
"author": "Naily Zero <zero@naily.cc> (https://naily.cc)",
|
|
7
7
|
"license": "MIT",
|
|
@@ -65,10 +65,10 @@
|
|
|
65
65
|
"@types/node": "^25.3.2",
|
|
66
66
|
"@types/vscode": "^1.109.0",
|
|
67
67
|
"naily-eslint-config": "^0.0.1",
|
|
68
|
-
"
|
|
68
|
+
"vite-plus": "^0.1.10"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|
|
71
|
-
"build": "
|
|
71
|
+
"build": "vp pack",
|
|
72
72
|
"test": "vitest --coverage --ui",
|
|
73
73
|
"lint": "eslint ."
|
|
74
74
|
}
|