@theia/filesystem 1.47.1 → 1.48.1

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.
Files changed (249) hide show
  1. package/README.md +30 -30
  2. package/lib/browser/breadcrumbs/filepath-breadcrumb.d.ts +15 -15
  3. package/lib/browser/breadcrumbs/filepath-breadcrumb.js +41 -41
  4. package/lib/browser/breadcrumbs/filepath-breadcrumbs-container.d.ts +13 -13
  5. package/lib/browser/breadcrumbs/filepath-breadcrumbs-container.js +70 -70
  6. package/lib/browser/breadcrumbs/filepath-breadcrumbs-contribution.d.ts +27 -27
  7. package/lib/browser/breadcrumbs/filepath-breadcrumbs-contribution.js +118 -118
  8. package/lib/browser/download/file-download-command-contribution.d.ts +18 -18
  9. package/lib/browser/download/file-download-command-contribution.js +75 -75
  10. package/lib/browser/download/file-download-frontend-module.d.ts +3 -3
  11. package/lib/browser/download/file-download-frontend-module.js +25 -25
  12. package/lib/browser/download/file-download-service.d.ts +28 -28
  13. package/lib/browser/download/file-download-service.js +167 -167
  14. package/lib/browser/file-dialog/file-dialog-container.d.ts +5 -5
  15. package/lib/browser/file-dialog/file-dialog-container.js +60 -60
  16. package/lib/browser/file-dialog/file-dialog-hidden-files-renderer.d.ts +15 -15
  17. package/lib/browser/file-dialog/file-dialog-hidden-files-renderer.js +59 -59
  18. package/lib/browser/file-dialog/file-dialog-model.d.ts +25 -25
  19. package/lib/browser/file-dialog/file-dialog-model.js +100 -100
  20. package/lib/browser/file-dialog/file-dialog-module.d.ts +3 -3
  21. package/lib/browser/file-dialog/file-dialog-module.js +45 -45
  22. package/lib/browser/file-dialog/file-dialog-service.d.ts +32 -32
  23. package/lib/browser/file-dialog/file-dialog-service.js +101 -101
  24. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.d.ts +39 -39
  25. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.js +81 -81
  26. package/lib/browser/file-dialog/file-dialog-tree.d.ts +26 -26
  27. package/lib/browser/file-dialog/file-dialog-tree.js +83 -83
  28. package/lib/browser/file-dialog/file-dialog-widget.d.ts +15 -15
  29. package/lib/browser/file-dialog/file-dialog-widget.js +75 -75
  30. package/lib/browser/file-dialog/file-dialog.d.ts +129 -129
  31. package/lib/browser/file-dialog/file-dialog.js +351 -351
  32. package/lib/browser/file-dialog/index.d.ts +4 -4
  33. package/lib/browser/file-dialog/index.js +22 -22
  34. package/lib/browser/file-resource.d.ts +67 -67
  35. package/lib/browser/file-resource.js +369 -369
  36. package/lib/browser/file-selection.d.ts +14 -14
  37. package/lib/browser/file-selection.js +36 -36
  38. package/lib/browser/file-service.d.ts +425 -425
  39. package/lib/browser/file-service.d.ts.map +1 -1
  40. package/lib/browser/file-service.js +1366 -1366
  41. package/lib/browser/file-service.js.map +1 -1
  42. package/lib/browser/file-tree/file-tree-container.d.ts +3 -3
  43. package/lib/browser/file-tree/file-tree-container.js +35 -35
  44. package/lib/browser/file-tree/file-tree-decorator-adapter.d.ts +30 -30
  45. package/lib/browser/file-tree/file-tree-decorator-adapter.js +169 -169
  46. package/lib/browser/file-tree/file-tree-label-provider.d.ts +12 -12
  47. package/lib/browser/file-tree/file-tree-label-provider.js +54 -54
  48. package/lib/browser/file-tree/file-tree-model.d.ts +37 -37
  49. package/lib/browser/file-tree/file-tree-model.js +217 -217
  50. package/lib/browser/file-tree/file-tree-widget.d.ts +44 -44
  51. package/lib/browser/file-tree/file-tree-widget.js +317 -317
  52. package/lib/browser/file-tree/file-tree.d.ts +46 -46
  53. package/lib/browser/file-tree/file-tree.js +176 -176
  54. package/lib/browser/file-tree/index.d.ts +6 -6
  55. package/lib/browser/file-tree/index.js +24 -24
  56. package/lib/browser/file-upload-service.d.ts +109 -109
  57. package/lib/browser/file-upload-service.js +434 -434
  58. package/lib/browser/filesystem-frontend-contribution.d.ts +74 -63
  59. package/lib/browser/filesystem-frontend-contribution.d.ts.map +1 -1
  60. package/lib/browser/filesystem-frontend-contribution.js +356 -319
  61. package/lib/browser/filesystem-frontend-contribution.js.map +1 -1
  62. package/lib/browser/filesystem-frontend-module.d.ts +5 -5
  63. package/lib/browser/filesystem-frontend-module.js +64 -64
  64. package/lib/browser/filesystem-preferences.d.ts +29 -29
  65. package/lib/browser/filesystem-preferences.js +110 -110
  66. package/lib/browser/filesystem-save-resource-service.d.ts +29 -29
  67. package/lib/browser/filesystem-save-resource-service.js +135 -135
  68. package/lib/browser/filesystem-watcher-error-handler.d.ts +10 -10
  69. package/lib/browser/filesystem-watcher-error-handler.js +61 -61
  70. package/lib/browser/index.d.ts +5 -5
  71. package/lib/browser/index.js +23 -23
  72. package/lib/browser/location/index.d.ts +2 -2
  73. package/lib/browser/location/index.js +20 -20
  74. package/lib/browser/location/location-renderer.d.ts +100 -100
  75. package/lib/browser/location/location-renderer.js +343 -343
  76. package/lib/browser/location/location-service.d.ts +5 -5
  77. package/lib/browser/location/location-service.js +17 -17
  78. package/lib/browser/remote-file-service-contribution.d.ts +6 -6
  79. package/lib/browser/remote-file-service-contribution.js +39 -39
  80. package/lib/browser-only/browser-only-filesystem-frontend-module.d.ts +3 -3
  81. package/lib/browser-only/browser-only-filesystem-frontend-module.js +40 -40
  82. package/lib/browser-only/browser-only-filesystem-provider-server.d.ts +11 -11
  83. package/lib/browser-only/browser-only-filesystem-provider-server.js +39 -39
  84. package/lib/browser-only/browserfs-filesystem-initialization.d.ts +12 -12
  85. package/lib/browser-only/browserfs-filesystem-initialization.js +54 -54
  86. package/lib/browser-only/browserfs-filesystem-provider.d.ts +45 -45
  87. package/lib/browser-only/browserfs-filesystem-provider.js +439 -439
  88. package/lib/common/delegating-file-system-provider.d.ts +76 -76
  89. package/lib/common/delegating-file-system-provider.js +168 -168
  90. package/lib/common/download/file-download-data.d.ts +6 -6
  91. package/lib/common/download/file-download-data.js +26 -26
  92. package/lib/common/file-upload.d.ts +1 -1
  93. package/lib/common/file-upload.js +19 -19
  94. package/lib/common/files.d.ts +659 -659
  95. package/lib/common/files.js +355 -355
  96. package/lib/common/files.spec.d.ts +1 -1
  97. package/lib/common/files.spec.js +51 -51
  98. package/lib/common/filesystem-utils.d.ts +14 -14
  99. package/lib/common/filesystem-utils.js +63 -63
  100. package/lib/common/filesystem-utils.spec.d.ts +1 -1
  101. package/lib/common/filesystem-utils.spec.js +378 -378
  102. package/lib/common/filesystem-watcher-protocol.d.ts +71 -71
  103. package/lib/common/filesystem-watcher-protocol.js +20 -20
  104. package/lib/common/filesystem.d.ts +22 -22
  105. package/lib/common/filesystem.js +42 -42
  106. package/lib/common/index.d.ts +2 -2
  107. package/lib/common/index.js +20 -20
  108. package/lib/common/io.d.ts +19 -19
  109. package/lib/common/io.js +110 -110
  110. package/lib/common/remote-file-system-provider.d.ts +173 -173
  111. package/lib/common/remote-file-system-provider.js +435 -435
  112. package/lib/electron-browser/file-dialog/electron-file-dialog-module.d.ts +3 -3
  113. package/lib/electron-browser/file-dialog/electron-file-dialog-module.js +24 -24
  114. package/lib/electron-browser/file-dialog/electron-file-dialog-service.d.ts +19 -19
  115. package/lib/electron-browser/file-dialog/electron-file-dialog-service.js +148 -148
  116. package/lib/electron-browser/preload.d.ts +1 -1
  117. package/lib/electron-browser/preload.js +30 -30
  118. package/lib/electron-common/electron-api.d.ts +34 -34
  119. package/lib/electron-common/electron-api.js +20 -20
  120. package/lib/electron-main/electron-api-main.d.ts +5 -5
  121. package/lib/electron-main/electron-api-main.js +73 -73
  122. package/lib/electron-main/electron-main-module.d.ts +3 -3
  123. package/lib/electron-main/electron-main-module.js +24 -24
  124. package/lib/node/disk-file-system-provider.d.ts +72 -72
  125. package/lib/node/disk-file-system-provider.js +787 -787
  126. package/lib/node/disk-file-system-provider.spec.d.ts +1 -1
  127. package/lib/node/disk-file-system-provider.spec.js +122 -122
  128. package/lib/node/download/directory-archiver.d.ts +9 -9
  129. package/lib/node/download/directory-archiver.js +127 -127
  130. package/lib/node/download/directory-archiver.spec.d.ts +1 -1
  131. package/lib/node/download/directory-archiver.spec.js +97 -97
  132. package/lib/node/download/file-download-backend-module.d.ts +3 -3
  133. package/lib/node/download/file-download-backend-module.js +32 -32
  134. package/lib/node/download/file-download-cache.d.ts +21 -21
  135. package/lib/node/download/file-download-cache.js +82 -82
  136. package/lib/node/download/file-download-endpoint.d.ts +11 -11
  137. package/lib/node/download/file-download-endpoint.js +67 -67
  138. package/lib/node/download/file-download-handler.d.ts +50 -50
  139. package/lib/node/download/file-download-handler.js +307 -307
  140. package/lib/node/download/test/mock-directory-archiver.d.ts +7 -7
  141. package/lib/node/download/test/mock-directory-archiver.js +29 -29
  142. package/lib/node/file-change-collection.d.ts +22 -22
  143. package/lib/node/file-change-collection.js +77 -77
  144. package/lib/node/file-change-collection.spec.d.ts +1 -1
  145. package/lib/node/file-change-collection.spec.js +90 -90
  146. package/lib/node/filesystem-backend-module.d.ts +26 -26
  147. package/lib/node/filesystem-backend-module.js +120 -120
  148. package/lib/node/filesystem-watcher-client.d.ts +23 -23
  149. package/lib/node/filesystem-watcher-client.js +75 -75
  150. package/lib/node/filesystem-watcher-dispatcher.d.ts +23 -23
  151. package/lib/node/filesystem-watcher-dispatcher.js +80 -80
  152. package/lib/node/node-file-upload-service.d.ts +16 -16
  153. package/lib/node/node-file-upload-service.js +79 -79
  154. package/lib/node/nsfw-watcher/index.d.ts +3 -3
  155. package/lib/node/nsfw-watcher/index.js +39 -39
  156. package/lib/node/nsfw-watcher/nsfw-filesystem-service.d.ts +191 -191
  157. package/lib/node/nsfw-watcher/nsfw-filesystem-service.js +405 -405
  158. package/lib/node/nsfw-watcher/nsfw-filesystem-watcher.spec.d.ts +1 -1
  159. package/lib/node/nsfw-watcher/nsfw-filesystem-watcher.spec.js +151 -151
  160. package/lib/node/nsfw-watcher/nsfw-options.d.ts +6 -6
  161. package/lib/node/nsfw-watcher/nsfw-options.js +22 -22
  162. package/package.json +4 -4
  163. package/src/browser/breadcrumbs/filepath-breadcrumb.ts +43 -43
  164. package/src/browser/breadcrumbs/filepath-breadcrumbs-container.ts +65 -65
  165. package/src/browser/breadcrumbs/filepath-breadcrumbs-contribution.ts +129 -129
  166. package/src/browser/download/file-download-command-contribution.ts +83 -83
  167. package/src/browser/download/file-download-frontend-module.ts +25 -25
  168. package/src/browser/download/file-download-service.ts +179 -179
  169. package/src/browser/file-dialog/file-dialog-container.ts +67 -67
  170. package/src/browser/file-dialog/file-dialog-hidden-files-renderer.tsx +59 -59
  171. package/src/browser/file-dialog/file-dialog-model.ts +96 -96
  172. package/src/browser/file-dialog/file-dialog-module.ts +44 -44
  173. package/src/browser/file-dialog/file-dialog-service.ts +99 -99
  174. package/src/browser/file-dialog/file-dialog-tree-filters-renderer.tsx +100 -100
  175. package/src/browser/file-dialog/file-dialog-tree.ts +89 -89
  176. package/src/browser/file-dialog/file-dialog-widget.ts +75 -75
  177. package/src/browser/file-dialog/file-dialog.ts +434 -434
  178. package/src/browser/file-dialog/index.ts +20 -20
  179. package/src/browser/file-resource.ts +390 -390
  180. package/src/browser/file-selection.ts +44 -44
  181. package/src/browser/file-service.ts +1841 -1841
  182. package/src/browser/file-tree/file-tree-container.ts +36 -36
  183. package/src/browser/file-tree/file-tree-decorator-adapter.ts +159 -159
  184. package/src/browser/file-tree/file-tree-label-provider.ts +53 -53
  185. package/src/browser/file-tree/file-tree-model.ts +212 -212
  186. package/src/browser/file-tree/file-tree-widget.tsx +327 -327
  187. package/src/browser/file-tree/file-tree.ts +183 -183
  188. package/src/browser/file-tree/index.ts +22 -22
  189. package/src/browser/file-upload-service.ts +539 -539
  190. package/src/browser/filesystem-frontend-contribution.ts +381 -338
  191. package/src/browser/filesystem-frontend-module.ts +77 -77
  192. package/src/browser/filesystem-preferences.ts +139 -139
  193. package/src/browser/filesystem-save-resource-service.ts +125 -125
  194. package/src/browser/filesystem-watcher-error-handler.ts +60 -60
  195. package/src/browser/index.ts +21 -21
  196. package/src/browser/location/index.ts +18 -18
  197. package/src/browser/location/location-renderer.tsx +404 -404
  198. package/src/browser/location/location-service.ts +22 -22
  199. package/src/browser/remote-file-service-contribution.ts +38 -38
  200. package/src/browser/style/file-dialog.css +208 -208
  201. package/src/browser/style/file-icons.css +64 -64
  202. package/src/browser/style/filepath-breadcrumbs.css +20 -20
  203. package/src/browser/style/index.css +36 -36
  204. package/src/browser-only/browser-only-filesystem-frontend-module.ts +38 -38
  205. package/src/browser-only/browser-only-filesystem-provider-server.ts +32 -32
  206. package/src/browser-only/browserfs-filesystem-initialization.ts +61 -61
  207. package/src/browser-only/browserfs-filesystem-provider.ts +462 -462
  208. package/src/common/delegating-file-system-provider.ts +226 -226
  209. package/src/common/download/README.md +30 -30
  210. package/src/common/download/file-download-data.ts +27 -27
  211. package/src/common/file-upload.ts +17 -17
  212. package/src/common/files.spec.ts +51 -51
  213. package/src/common/files.ts +996 -996
  214. package/src/common/filesystem-utils.spec.ts +411 -411
  215. package/src/common/filesystem-utils.ts +64 -64
  216. package/src/common/filesystem-watcher-protocol.ts +96 -96
  217. package/src/common/filesystem.ts +43 -43
  218. package/src/common/index.ts +18 -18
  219. package/src/common/io.ts +150 -150
  220. package/src/common/remote-file-system-provider.ts +549 -549
  221. package/src/electron-browser/file-dialog/electron-file-dialog-module.ts +24 -24
  222. package/src/electron-browser/file-dialog/electron-file-dialog-service.ts +165 -165
  223. package/src/electron-browser/preload.ts +31 -31
  224. package/src/electron-common/electron-api.ts +55 -55
  225. package/src/electron-main/electron-api-main.ts +78 -78
  226. package/src/electron-main/electron-main-module.ts +23 -23
  227. package/src/node/disk-file-system-provider.spec.ts +142 -142
  228. package/src/node/disk-file-system-provider.ts +915 -915
  229. package/src/node/download/directory-archiver.spec.ts +104 -104
  230. package/src/node/download/directory-archiver.ts +126 -126
  231. package/src/node/download/file-download-backend-module.ts +32 -32
  232. package/src/node/download/file-download-cache.ts +88 -88
  233. package/src/node/download/file-download-endpoint.ts +63 -63
  234. package/src/node/download/file-download-handler.ts +304 -304
  235. package/src/node/download/test/mock-directory-archiver.ts +30 -30
  236. package/src/node/file-change-collection.spec.ts +110 -110
  237. package/src/node/file-change-collection.ts +78 -78
  238. package/src/node/filesystem-backend-module.ts +140 -140
  239. package/src/node/filesystem-watcher-client.ts +72 -72
  240. package/src/node/filesystem-watcher-dispatcher.ts +82 -82
  241. package/src/node/node-file-upload-service.ts +80 -80
  242. package/src/node/nsfw-watcher/index.ts +45 -45
  243. package/src/node/nsfw-watcher/nsfw-filesystem-service.ts +481 -481
  244. package/src/node/nsfw-watcher/nsfw-filesystem-watcher.spec.ts +182 -182
  245. package/src/node/nsfw-watcher/nsfw-options.ts +23 -23
  246. package/src/typings/dom.webkit.d.ts +77 -77
  247. package/src/typings/mv/index.d.ts +21 -21
  248. package/src/typings/nsfw/index.d.ts +18 -18
  249. package/src/typings/trash/index.d.ts +20 -20
@@ -1,996 +1,996 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2020 TypeFox and others.
3
- //
4
- // This program and the accompanying materials are made available under the
5
- // terms of the Eclipse Public License v. 2.0 which is available at
6
- // http://www.eclipse.org/legal/epl-2.0.
7
- //
8
- // This Source Code may also be made available under the following Secondary
9
- // Licenses when the conditions for such availability set forth in the Eclipse
10
- // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
- // with the GNU Classpath Exception which is available at
12
- // https://www.gnu.org/software/classpath/license.html.
13
- //
14
- // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
- // *****************************************************************************
16
- /*---------------------------------------------------------------------------------------------
17
- * Copyright (c) Microsoft Corporation. All rights reserved.
18
- * Licensed under the MIT License. See License.txt in the project root for license information.
19
- *--------------------------------------------------------------------------------------------*/
20
- // based on https://github.com/microsoft/vscode/blob/04c36be045a94fee58e5f8992d3e3fd980294a84/src/vs/platform/files/common/files.ts
21
-
22
- import URI from '@theia/core/lib/common/uri';
23
- import { Event } from '@theia/core/lib/common/event';
24
- import { Disposable as IDisposable } from '@theia/core/lib/common/disposable';
25
- import { BinaryBuffer, BinaryBufferReadableStream } from '@theia/core/lib/common/buffer';
26
- import type { TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol';
27
- import { ReadableStreamEvents } from '@theia/core/lib/common/stream';
28
- import { CancellationToken } from '@theia/core/lib/common/cancellation';
29
- import { isObject } from '@theia/core/lib/common';
30
- import { MarkdownString } from '@theia/core/lib/common/markdown-rendering';
31
-
32
- export const enum FileOperation {
33
- CREATE,
34
- DELETE,
35
- MOVE,
36
- COPY
37
- }
38
-
39
- export class FileOperationEvent {
40
-
41
- constructor(resource: URI, operation: FileOperation.DELETE);
42
- constructor(resource: URI, operation: FileOperation.CREATE | FileOperation.MOVE | FileOperation.COPY, target: FileStatWithMetadata);
43
- constructor(public readonly resource: URI, public readonly operation: FileOperation, public readonly target?: FileStatWithMetadata) { }
44
-
45
- isOperation(operation: FileOperation.DELETE): boolean;
46
- isOperation(operation: FileOperation.MOVE | FileOperation.COPY | FileOperation.CREATE): this is { readonly target: FileStatWithMetadata };
47
- isOperation(operation: FileOperation): boolean {
48
- return this.operation === operation;
49
- }
50
- }
51
-
52
- /**
53
- * Possible changes that can occur to a file.
54
- */
55
- export const enum FileChangeType {
56
- UPDATED = 0,
57
- ADDED = 1,
58
- DELETED = 2
59
- }
60
-
61
- /**
62
- * Identifies a single change in a file.
63
- */
64
- export interface FileChange {
65
-
66
- /**
67
- * The type of change that occurred to the file.
68
- */
69
- readonly type: FileChangeType;
70
-
71
- /**
72
- * The unified resource identifier of the file that changed.
73
- */
74
- readonly resource: URI;
75
- }
76
-
77
- export class FileChangesEvent {
78
-
79
- constructor(public readonly changes: readonly FileChange[]) { }
80
-
81
- /**
82
- * Returns true if this change event contains the provided file with the given change type (if provided). In case of
83
- * type DELETED, this method will also return true if a folder got deleted that is the parent of the
84
- * provided file path.
85
- */
86
- contains(resource: URI, type?: FileChangeType): boolean {
87
- if (!resource) {
88
- return false;
89
- }
90
-
91
- const checkForChangeType = typeof type === 'number';
92
-
93
- return this.changes.some(change => {
94
- if (checkForChangeType && change.type !== type) {
95
- return false;
96
- }
97
-
98
- // For deleted also return true when deleted folder is parent of target path
99
- if (change.type === FileChangeType.DELETED) {
100
- return change.resource.isEqualOrParent(resource);
101
- }
102
-
103
- return change.resource.toString() === resource.toString();
104
- });
105
- }
106
-
107
- /**
108
- * Returns the changes that describe added files.
109
- */
110
- getAdded(): FileChange[] {
111
- return this.getOfType(FileChangeType.ADDED);
112
- }
113
-
114
- /**
115
- * Returns if this event contains added files.
116
- */
117
- gotAdded(): boolean {
118
- return this.hasType(FileChangeType.ADDED);
119
- }
120
-
121
- /**
122
- * Returns the changes that describe deleted files.
123
- */
124
- getDeleted(): FileChange[] {
125
- return this.getOfType(FileChangeType.DELETED);
126
- }
127
-
128
- /**
129
- * Returns if this event contains deleted files.
130
- */
131
- gotDeleted(): boolean {
132
- return this.hasType(FileChangeType.DELETED);
133
- }
134
-
135
- /**
136
- * Returns the changes that describe updated files.
137
- */
138
- getUpdated(): FileChange[] {
139
- return this.getOfType(FileChangeType.UPDATED);
140
- }
141
-
142
- /**
143
- * Returns if this event contains updated files.
144
- */
145
- gotUpdated(): boolean {
146
- return this.hasType(FileChangeType.UPDATED);
147
- }
148
-
149
- private getOfType(type: FileChangeType): FileChange[] {
150
- return this.changes.filter(change => change.type === type);
151
- }
152
-
153
- private hasType(type: FileChangeType): boolean {
154
- return this.changes.some(change => change.type === type);
155
- }
156
- }
157
-
158
- export interface BaseStat {
159
-
160
- /**
161
- * The unified resource identifier of this file or folder.
162
- */
163
- resource: URI;
164
-
165
- /**
166
- * The name which is the last segment
167
- * of the {{path}}.
168
- */
169
- name: string;
170
-
171
- /**
172
- * The size of the file.
173
- *
174
- * The value may or may not be resolved as
175
- * it is optional.
176
- */
177
- size?: number;
178
-
179
- /**
180
- * The last modification date represented as millis from unix epoch.
181
- *
182
- * The value may or may not be resolved as
183
- * it is optional.
184
- */
185
- mtime?: number;
186
-
187
- /**
188
- * The creation date represented as millis from unix epoch.
189
- *
190
- * The value may or may not be resolved as
191
- * it is optional.
192
- */
193
- ctime?: number;
194
-
195
- /**
196
- * A unique identifier that represents the
197
- * current state of the file or directory.
198
- *
199
- * The value may or may not be resolved as
200
- * it is optional.
201
- */
202
- etag?: string;
203
- }
204
- export namespace BaseStat {
205
- export function is(arg: unknown): arg is BaseStat {
206
- return isObject<BaseStat>(arg)
207
- && arg.resource instanceof URI
208
- && typeof arg.name === 'string';
209
- }
210
- }
211
-
212
- export interface BaseStatWithMetadata extends BaseStat {
213
- mtime: number;
214
- ctime: number;
215
- etag: string;
216
- size: number;
217
- }
218
-
219
- /**
220
- * A file resource with meta information.
221
- */
222
- export interface FileStat extends BaseStat {
223
-
224
- /**
225
- * The resource is a file.
226
- */
227
- isFile: boolean;
228
-
229
- /**
230
- * The resource is a directory.
231
- */
232
- isDirectory: boolean;
233
-
234
- /**
235
- * The resource is a symbolic link.
236
- */
237
- isSymbolicLink: boolean;
238
-
239
- /**
240
- * The resource is read only.
241
- */
242
- isReadonly: boolean;
243
-
244
- /**
245
- * The children of the file stat or undefined if none.
246
- */
247
- children?: FileStat[];
248
- }
249
- export namespace FileStat {
250
- export function is(arg: unknown): arg is FileStat {
251
- const fileStat = arg as FileStat;
252
- return BaseStat.is(fileStat) &&
253
- ('isFile' in fileStat && typeof fileStat.isFile === 'boolean') &&
254
- ('isDirectory' in fileStat && typeof fileStat.isDirectory === 'boolean') &&
255
- ('isSymbolicLink' in fileStat && typeof fileStat.isSymbolicLink === 'boolean');
256
- }
257
- export function asFileType(stat: FileStat): FileType {
258
- let res = 0;
259
- if (stat.isFile) {
260
- res += FileType.File;
261
-
262
- } else if (stat.isDirectory) {
263
- res += FileType.Directory;
264
- }
265
- if (stat.isSymbolicLink) {
266
- res += FileType.SymbolicLink;
267
- }
268
- return res;
269
- }
270
- export function toStat(stat: FileStat): Stat | { type: FileType } & Partial<Stat> {
271
- return {
272
- type: asFileType(stat),
273
- ctime: stat.ctime,
274
- mtime: stat.mtime,
275
- size: stat.size
276
- };
277
- }
278
- export function fromStat(resource: URI, stat: Stat): FileStatWithMetadata;
279
- export function fromStat(resource: URI, stat: { type: FileType } & Partial<Stat>): FileStat;
280
- export function fromStat(resource: URI, stat: Stat | { type: FileType } & Partial<Stat>): FileStat {
281
- return {
282
- resource,
283
- name: resource.path.base || resource.path.toString(),
284
- isFile: (stat.type & FileType.File) !== 0,
285
- isDirectory: (stat.type & FileType.Directory) !== 0,
286
- isSymbolicLink: (stat.type & FileType.SymbolicLink) !== 0,
287
- isReadonly: !!stat.permissions && (stat.permissions & FilePermission.Readonly) !== 0,
288
- mtime: stat.mtime,
289
- ctime: stat.ctime,
290
- size: stat.size,
291
- etag: etag({ mtime: stat.mtime, size: stat.size })
292
- };
293
- }
294
- export function dir(resource: string | URI, stat?: Partial<Omit<Stat, 'type'>>): FileStat {
295
- return fromStat(resource instanceof URI ? resource : new URI(resource), { type: FileType.Directory, ...stat });
296
- }
297
- export function file(resource: string | URI, stat?: Partial<Omit<Stat, 'type'>>): FileStat {
298
- return fromStat(resource instanceof URI ? resource : new URI(resource), { type: FileType.File, ...stat });
299
- }
300
- }
301
-
302
- export interface FileStatWithMetadata extends FileStat, BaseStatWithMetadata {
303
- mtime: number;
304
- ctime: number;
305
- etag: string;
306
- size: number;
307
- children?: FileStatWithMetadata[];
308
- }
309
-
310
- export interface ResolveFileResult {
311
- stat?: FileStat;
312
- success: boolean;
313
- }
314
-
315
- export interface ResolveFileResultWithMetadata extends ResolveFileResult {
316
- stat?: FileStatWithMetadata;
317
- }
318
-
319
- export interface FileContent extends BaseStatWithMetadata {
320
-
321
- /**
322
- * The content of a file as buffer.
323
- */
324
- value: BinaryBuffer;
325
- }
326
-
327
- export interface FileStreamContent extends BaseStatWithMetadata {
328
-
329
- /**
330
- * The content of a file as stream.
331
- */
332
- value: BinaryBufferReadableStream;
333
- }
334
-
335
- export interface WriteFileOptions {
336
-
337
- /**
338
- * The last known modification time of the file. This can be used to prevent dirty writes.
339
- */
340
- readonly mtime?: number;
341
-
342
- /**
343
- * The etag of the file. This can be used to prevent dirty writes.
344
- */
345
- readonly etag?: string;
346
- }
347
-
348
- export interface ReadFileOptions extends FileReadStreamOptions {
349
-
350
- /**
351
- * The optional etag parameter allows to return early from resolving the resource if
352
- * the contents on disk match the etag. This prevents accumulated reading of resources
353
- * that have been read already with the same etag.
354
- * It is the task of the caller to makes sure to handle this error case from the promise.
355
- */
356
- readonly etag?: string;
357
- }
358
-
359
- export interface WriteFileOptions {
360
-
361
- /**
362
- * The last known modification time of the file. This can be used to prevent dirty writes.
363
- */
364
- readonly mtime?: number;
365
-
366
- /**
367
- * The etag of the file. This can be used to prevent dirty writes.
368
- */
369
- readonly etag?: string;
370
- }
371
-
372
- export interface ResolveFileOptions {
373
-
374
- /**
375
- * Automatically continue resolving children of a directory until the provided resources
376
- * are found.
377
- */
378
- readonly resolveTo?: readonly URI[];
379
-
380
- /**
381
- * Automatically continue resolving children of a directory if the number of children is 1.
382
- */
383
- readonly resolveSingleChildDescendants?: boolean;
384
-
385
- /**
386
- * Will resolve mtime, ctime, size and etag of files if enabled. This can have a negative impact
387
- * on performance and thus should only be used when these values are required.
388
- */
389
- readonly resolveMetadata?: boolean;
390
- }
391
-
392
- export interface ResolveMetadataFileOptions extends ResolveFileOptions {
393
- readonly resolveMetadata: true;
394
- }
395
-
396
- export interface FileOperationOptions {
397
- /**
398
- * Indicates that a user action triggered the opening, e.g.
399
- * via mouse or keyboard use. Default is true.
400
- */
401
- fromUserGesture?: boolean
402
- }
403
-
404
- export interface MoveFileOptions extends FileOperationOptions, Partial<FileOverwriteOptions> {
405
- }
406
-
407
- export interface CopyFileOptions extends FileOperationOptions, Partial<FileOverwriteOptions> {
408
- }
409
-
410
- export interface CreateFileOptions extends FileOperationOptions, Partial<FileOverwriteOptions> {
411
- }
412
-
413
- export class FileOperationError extends Error {
414
- constructor(message: string, public fileOperationResult: FileOperationResult, public options?: ReadFileOptions & WriteFileOptions & CreateFileOptions) {
415
- super(message);
416
- Object.setPrototypeOf(this, FileOperationError.prototype);
417
- }
418
- }
419
-
420
- export const enum FileOperationResult {
421
- FILE_IS_DIRECTORY,
422
- FILE_NOT_FOUND,
423
- FILE_NOT_MODIFIED_SINCE,
424
- FILE_MODIFIED_SINCE,
425
- FILE_MOVE_CONFLICT,
426
- FILE_READ_ONLY,
427
- FILE_PERMISSION_DENIED,
428
- FILE_TOO_LARGE,
429
- FILE_INVALID_PATH,
430
- FILE_EXCEEDS_MEMORY_LIMIT,
431
- FILE_NOT_DIRECTORY,
432
- FILE_OTHER_ERROR
433
- }
434
-
435
- export interface FileOverwriteOptions {
436
- /**
437
- * Overwrite the file to create if it already exists on disk. Otherwise
438
- * an error will be thrown (FILE_MODIFIED_SINCE).
439
- */
440
- overwrite: boolean;
441
- }
442
-
443
- export interface FileReadStreamOptions {
444
-
445
- /**
446
- * Is an integer specifying where to begin reading from in the file. If position is undefined,
447
- * data will be read from the current file position.
448
- */
449
- readonly position?: number;
450
-
451
- /**
452
- * Is an integer specifying how many bytes to read from the file. By default, all bytes
453
- * will be read.
454
- */
455
- readonly length?: number;
456
-
457
- /**
458
- * If provided, the size of the file will be checked against the limits.
459
- */
460
- limits?: {
461
- readonly size?: number;
462
- readonly memory?: number;
463
- };
464
- }
465
-
466
- export interface FileUpdateOptions {
467
- readEncoding: string;
468
- writeEncoding: string;
469
- overwriteEncoding: boolean;
470
- }
471
- export interface FileUpdateResult extends Stat {
472
- encoding: string;
473
- }
474
-
475
- export interface FileWriteOptions {
476
- overwrite: boolean;
477
- create: boolean;
478
- }
479
-
480
- export interface FileOpenOptions {
481
- create: boolean;
482
- }
483
-
484
- export interface FileDeleteOptions {
485
- recursive: boolean;
486
- useTrash: boolean;
487
- }
488
-
489
- export enum FileType {
490
- Unknown = 0,
491
- File = 1,
492
- Directory = 2,
493
- SymbolicLink = 64
494
- }
495
-
496
- export enum FilePermission {
497
-
498
- /**
499
- * File is readonly.
500
- */
501
- Readonly = 1
502
- }
503
-
504
- export interface Stat {
505
- type: FileType;
506
-
507
- /**
508
- * The last modification date represented as millis from unix epoch.
509
- */
510
- mtime: number;
511
-
512
- /**
513
- * The creation date represented as millis from unix epoch.
514
- */
515
- ctime: number;
516
-
517
- size: number;
518
-
519
- permissions?: FilePermission;
520
- }
521
-
522
- export interface WatchOptions {
523
- recursive: boolean;
524
- excludes: string[];
525
- }
526
-
527
- export const enum FileSystemProviderCapabilities {
528
- FileReadWrite = 1 << 1,
529
- FileOpenReadWriteClose = 1 << 2,
530
- FileReadStream = 1 << 4,
531
-
532
- FileFolderCopy = 1 << 3,
533
-
534
- PathCaseSensitive = 1 << 10,
535
- Readonly = 1 << 11,
536
-
537
- Trash = 1 << 12,
538
-
539
- Access = 1 << 24,
540
- Update = 1 << 25
541
- }
542
-
543
- export enum FileSystemProviderErrorCode {
544
- FileExists = 'EntryExists',
545
- FileNotFound = 'EntryNotFound',
546
- FileNotADirectory = 'EntryNotADirectory',
547
- FileIsADirectory = 'EntryIsADirectory',
548
- FileExceedsMemoryLimit = 'EntryExceedsMemoryLimit',
549
- FileTooLarge = 'EntryTooLarge',
550
- NoPermissions = 'NoPermissions',
551
- Unavailable = 'Unavailable',
552
- Unknown = 'Unknown'
553
- }
554
-
555
- export class FileSystemProviderError extends Error {
556
-
557
- constructor(message: string, public readonly code: FileSystemProviderErrorCode) {
558
- super(message);
559
- Object.setPrototypeOf(this, FileSystemProviderError.prototype);
560
- }
561
- }
562
-
563
- export function createFileSystemProviderError(error: Error | string, code: FileSystemProviderErrorCode): FileSystemProviderError {
564
- const providerError = new FileSystemProviderError(error.toString(), code);
565
- markAsFileSystemProviderError(providerError, code);
566
-
567
- return providerError;
568
- }
569
-
570
- export function ensureFileSystemProviderError(error?: Error): Error {
571
- if (!error) {
572
- return createFileSystemProviderError('Unknown Error', FileSystemProviderErrorCode.Unknown); // https://github.com/Microsoft/vscode/issues/72798
573
- }
574
-
575
- return error;
576
- }
577
-
578
- export const FileSystemProvider = Symbol('FileSystemProvider');
579
- /**
580
- * A {@link FileSystemProvider} provides the capabilities to read, write, discover, and to manage files and folders
581
- * of the underlying (potentially virtual) file system. {@link FileSystemProvider}s can be used to serve files from both the
582
- * local disk as well as remote locations like ftp-servers, REST-services etc. A {@link FileSystemProvider} is registered for a certain
583
- * scheme and can handle all resources whose uri does conform to that scheme.
584
- */
585
- export interface FileSystemProvider {
586
-
587
- /** The {@link FileSystemProviderCapabilities} for this provider. */
588
- readonly capabilities: FileSystemProviderCapabilities;
589
-
590
- /** * Event that is fired if the capabilities of this provider have changed. */
591
- readonly onDidChangeCapabilities: Event<void>;
592
-
593
- /** Event that is fired if a (watched) file in the filesystem of this provider has changed. */
594
- readonly onDidChangeFile: Event<readonly FileChange[]>;
595
-
596
- /** Event that is fired if an error occurred when watching files in the filesystem of this provider. */
597
- readonly onFileWatchError: Event<void>;
598
-
599
- /**
600
- * Watch the given resource and react to changes by firing the {@link FileSystemProvider#onDidChangeFile} event.
601
- * @param resource `URI` of the resource to be watched.
602
- * @param opts Options to define if the resource should be watched recursively and to
603
- * provide a set of resources that should be excluded from watching.
604
- *
605
- * @returns A `Disposable` that can be invoked to stop watching the resource.
606
- */
607
- watch(resource: URI, opts: WatchOptions): IDisposable;
608
-
609
- /**
610
- * Retrieve metadata about a given file.
611
- *
612
- * @param uri The `URI` of the file to retrieve meta data about.
613
- * @returns A promise of the metadata about the resource.
614
- */
615
- stat(resource: URI): Promise<Stat>;
616
-
617
- /**
618
- * Create a new directory using the given resource uri.
619
- * @param resource The `URI` of the new folder.
620
- */
621
- mkdir(resource: URI): Promise<void>;
622
-
623
- /**
624
- * Retrieve the content of a given directory.
625
- * @param resource The `URI` of the directory.
626
- *
627
- * @returns A map containing the {@link FileType} for each child resource, identified by name.
628
- */
629
- readdir(resource: URI): Promise<[string, FileType][]>;
630
-
631
- /**
632
- * Delete the given resource.
633
- * @param resource The `URI` of the resource to delete.
634
- * @param opts Options to define if files should be deleted recursively and if the trash should be used.
635
- */
636
- delete(resource: URI, opts: FileDeleteOptions): Promise<void>;
637
-
638
- /**
639
- * Rename a file or folder.
640
- * @param from `URI` of the existing file or folder.
641
- * @param to `URI` of the target location.
642
- * @param opts Options to define if existing files should be overwritten.
643
- */
644
- rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise<void>;
645
-
646
- /**
647
- * Optional function that has to be implemented by {@link FileSystemProviderWithFileFolderCopyCapability}.
648
- * See {@link FileSystemProviderWithFileFolderCopyCapability#copy}} for additional documentation.
649
- */
650
- copy?(from: URI, to: URI, opts: FileOverwriteOptions): Promise<void>;
651
-
652
- /**
653
- * Optional function that has to be implemented by {@link FileSystemProviderWithFileReadWriteCapability}.
654
- * See {@link FileSystemProviderWithFileReadWriteCapability#readFile} for additional documentation.
655
- */
656
- readFile?(resource: URI): Promise<Uint8Array>;
657
-
658
- /**
659
- * Optional function that has to be implemented by {@link FileSystemProviderWithFileReadWriteCapability}.
660
- * See {@link FileSystemProviderWithFileReadWriteCapability#writeFile} for additional documentation.
661
- */
662
- writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise<void>;
663
-
664
- /**
665
- * Optional function that has to be implemented by {@link FileSystemProviderWithFileReadStreamCapability}.
666
- * See {@link FileSystemProviderWithFileReadStreamCapability#readFileStream} for additional documentation.
667
- */
668
- readFileStream?(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array>;
669
-
670
- /**
671
- * Optional function that has to be implemented by {@link FileSystemProviderWithOpenReadWriteCloseCapability}.
672
- * See {@link FileSystemProviderWithOpenReadWriteCloseCapability#open} for additional documentation.
673
- */
674
- open?(resource: URI, opts: FileOpenOptions): Promise<number>;
675
-
676
- /**
677
- * Optional function that has to be implemented by {@link FileSystemProviderWithOpenReadWriteCloseCapability}.
678
- * See {@link FileSystemProviderWithOpenReadWriteCloseCapability#close} for additional documentation.
679
- */
680
- close?(fd: number): Promise<void>;
681
-
682
- /**
683
- * Optional function that has to be implemented by {@link FileSystemProviderWithOpenReadWriteCloseCapability}.
684
- * See {@link FileSystemProviderWithOpenReadWriteCloseCapability#read} for additional documentation.
685
- */
686
- read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number>;
687
-
688
- /**
689
- * Optional function that has to be implemented by {@link FileSystemProviderWithOpenReadWriteCloseCapability}.
690
- * See {@link FileSystemProviderWithOpenReadWriteCloseCapability#write} for additional documentation.
691
- */
692
- write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number>;
693
-
694
- /**
695
- * Optional function that has to be implemented by {@link FileSystemProviderWithAccessCapability}.
696
- * See {@link FileSystemProviderWithAccessCapability#access} for additional documentation.
697
- */
698
- access?(resource: URI, mode?: number): Promise<void>;
699
-
700
- /**
701
- * Optional function that has to be implemented by {@link FileSystemProviderWithAccessCapability}.
702
- * See {@link FileSystemProviderWithAccessCapability#fsPath} for additional documentation.
703
- */
704
- fsPath?(resource: URI): Promise<string>;
705
-
706
- /**
707
- * Optional function that has to be implemented by {@link FileSystemProviderWithUpdateCapability}.
708
- * See {@link FileSystemProviderWithUpdateCapability#updateFile} for additional documentation.
709
- */
710
- updateFile?(resource: URI, changes: TextDocumentContentChangeEvent[], opts: FileUpdateOptions): Promise<FileUpdateResult>;
711
- }
712
-
713
- /**
714
- * Subtype of {@link FileSystemProvider} that ensures that the optional functions needed for providers, that should be
715
- * able access files, are implemented.
716
- */
717
- export interface FileSystemProviderWithAccessCapability extends FileSystemProvider {
718
- /**
719
- * Tests a user's permissions for the file or directory specified by URI.
720
- * @param resource The `URI` of the file that should be tested.
721
- * @param mode An optional integer that specifies the accessibility checks to be performed.
722
- * Check `FileAccess.Constants` for possible values of mode.
723
- * It is possible to create a mask consisting of the bitwise `OR` of two or more values (e.g. FileAccess.Constants.W_OK | FileAccess.Constants.R_OK).
724
- * If `mode` is not defined, `FileAccess.Constants.F_OK` will be used instead.
725
- *
726
- * @returns A promise that resolves if the user has the required permissions, should be rejected otherwise.
727
- */
728
- access(resource: URI, mode?: number): Promise<void>;
729
-
730
- /**
731
- * Returns the path of the given file URI, specific to the backend's operating system.
732
- * If the URI is not a file URI, undefined is returned.
733
- *
734
- * USE WITH CAUTION: You should always prefer URIs to paths if possible, as they are
735
- * portable and platform independent. Paths should only be used in cases you directly
736
- * interact with the OS, e.g. when running a command on the shell.
737
- *
738
- * @param resource `URI` of the resource to derive the path from.
739
- *
740
- * @returns A promise of the corresponding file system path.
741
- */
742
- fsPath(resource: URI): Promise<string>;
743
- }
744
-
745
- export function hasAccessCapability(provider: FileSystemProvider): provider is FileSystemProviderWithAccessCapability {
746
- return !!(provider.capabilities & FileSystemProviderCapabilities.Access);
747
- }
748
-
749
- /**
750
- * Subtype of {@link FileSystemProvider} that ensures that the optional functions needed, for providers that should be
751
- * able to update (text) files, are implemented.
752
- */
753
- export interface FileSystemProviderWithUpdateCapability extends FileSystemProvider {
754
- /**
755
- * Update the content of the given (text) file according to the given text document changes.
756
- * @param resource `URI` of the resource to update.
757
- * @param changes Array of events describing the changes to the file.
758
- * @param opts The encoding options.
759
- *
760
- * @returns A promise of the file metadata that resolves after the update process has completed.
761
- */
762
- updateFile(resource: URI, changes: TextDocumentContentChangeEvent[], opts: FileUpdateOptions): Promise<FileUpdateResult>;
763
- }
764
-
765
- export function hasUpdateCapability(provider: FileSystemProvider): provider is FileSystemProviderWithUpdateCapability {
766
- return !!(provider.capabilities & FileSystemProviderCapabilities.Update);
767
- }
768
-
769
- export interface ReadOnlyMessageFileSystemProvider {
770
- readOnlyMessage: MarkdownString | undefined;
771
- readonly onDidChangeReadOnlyMessage: Event<MarkdownString | undefined>;
772
- }
773
-
774
- export namespace ReadOnlyMessageFileSystemProvider {
775
- export function is(arg: unknown): arg is ReadOnlyMessageFileSystemProvider {
776
- return isObject<ReadOnlyMessageFileSystemProvider>(arg)
777
- && 'readOnlyMessage' in arg;
778
- }
779
- }
780
-
781
- /**
782
- * Subtype of {@link FileSystemProvider} that ensures that the optional functions, needed for providers
783
- * that should be able to read & write files, are implemented.
784
- */
785
- export interface FileSystemProviderWithFileReadWriteCapability extends FileSystemProvider {
786
- /**
787
- * Read the contents of the given file as stream.
788
- * @param resource The `URI` of the file.
789
- *
790
- * @return The `ReadableStreamEvents` for the readable stream of the given file.
791
- */
792
- readFile(resource: URI): Promise<Uint8Array>;
793
-
794
- /**
795
- * Write data to a file, replacing its entire contents.
796
- * @param resource The uri of the file.
797
- * @param content The new content of the file.
798
- * @param opts Options to define if the file should be created if missing and if an existing file should be overwritten.
799
- */
800
- writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise<void>;
801
- }
802
-
803
- export function hasReadWriteCapability(provider: FileSystemProvider): provider is FileSystemProviderWithFileReadWriteCapability {
804
- return !!(provider.capabilities & FileSystemProviderCapabilities.FileReadWrite);
805
- }
806
-
807
- /**
808
- * Subtype of {@link FileSystemProvider} that ensures that the optional functions, needed for providers that should be able to copy
809
- * file folders, are implemented.
810
- */
811
- export interface FileSystemProviderWithFileFolderCopyCapability extends FileSystemProvider {
812
- /**
813
- * Copy files or folders.
814
- * @param from `URI` of the existing file or folder.
815
- * @param to `URI` of the destination location.
816
- * @param opts Options to define if existing files should be overwritten.
817
- */
818
- copy(from: URI, to: URI, opts: FileOverwriteOptions): Promise<void>;
819
- }
820
-
821
- export function hasFileFolderCopyCapability(provider: FileSystemProvider): provider is FileSystemProviderWithFileFolderCopyCapability {
822
- return !!(provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy);
823
- }
824
-
825
- /**
826
- * Subtype of {@link FileSystemProvider} that ensures that the optional functions, needed for providers that should be able to open,read, write
827
- * or close files, are implemented.
828
- */
829
- export interface FileSystemProviderWithOpenReadWriteCloseCapability extends FileSystemProvider {
830
- /**
831
- * Open the give file.
832
- * @param resource The `URI` of the file to open.
833
- * @param opts Options to define if the file should be created if it does not exist yet.
834
- *
835
- * @returns A promise of the file descriptor that resolves after the file is open.
836
- */
837
- open(resource: URI, opts: FileOpenOptions): Promise<number>;
838
-
839
- /**
840
- * Close the file with the given file descriptor.
841
- * @param fd the file descriptor to close.
842
- */
843
- close(fd: number): Promise<void>;
844
-
845
- /**
846
- * Read specified content from a given file descriptor into a data buffer.
847
- * @param fd The file descriptor referencing the file to read from.
848
- * @param pos The offset from the beginning of the file from which data should be read.
849
- * @param data The buffer that the data will be written to.
850
- * @param offset The offset in the buffer at which to start writing.
851
- * @param length The number of bytes to read.
852
- *
853
- * @returns A promise of the number of bytes read.
854
- */
855
- read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number>;
856
-
857
- /**
858
- * Write specified content from the data buffer to the file referenced by the given file descriptor.
859
- * @param fd The file descriptor referencing the file to write to.
860
- * @param pos The offset from the beginning of the file where this data should be written.
861
- * @param offset The part of the buffer to be read from.
862
- * @param length The number of bytes to write.
863
- *
864
- * @returns A promise of the number of bytes written.
865
- */
866
- write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number>;
867
- }
868
-
869
- export function hasOpenReadWriteCloseCapability(provider: FileSystemProvider): provider is FileSystemProviderWithOpenReadWriteCloseCapability {
870
- return !!(provider.capabilities & FileSystemProviderCapabilities.FileOpenReadWriteClose);
871
- }
872
-
873
- /**
874
- * Subtype of {@link FileSystemProvider} that ensures that the optional functions, needed for providers that should be able to read
875
- * files as streams, are implemented.
876
- */
877
- export interface FileSystemProviderWithFileReadStreamCapability extends FileSystemProvider {
878
- /**
879
- * Read the contents of the given file as stream.
880
- * @param resource The `URI` of the file.
881
- *
882
- * @return The `ReadableStreamEvents` for the readable stream of the given file.
883
- */
884
- readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array>;
885
- }
886
-
887
- export function hasFileReadStreamCapability(provider: FileSystemProvider): provider is FileSystemProviderWithFileReadStreamCapability {
888
- return !!(provider.capabilities & FileSystemProviderCapabilities.FileReadStream);
889
- }
890
-
891
- export function markAsFileSystemProviderError(error: Error, code: FileSystemProviderErrorCode): Error {
892
- error.name = code ? `${code} (FileSystemError)` : 'FileSystemError';
893
-
894
- return error;
895
- }
896
-
897
- export function toFileSystemProviderErrorCode(error: Error | undefined | null): FileSystemProviderErrorCode {
898
-
899
- // Guard against abuse
900
- if (!error) {
901
- return FileSystemProviderErrorCode.Unknown;
902
- }
903
-
904
- // FileSystemProviderError comes with the code
905
- if (error instanceof FileSystemProviderError) {
906
- return error.code;
907
- }
908
-
909
- // Any other error, check for name match by assuming that the error
910
- // went through the markAsFileSystemProviderError() method
911
- const match = /^(.+) \(FileSystemError\)$/.exec(error.name);
912
- if (!match) {
913
- return FileSystemProviderErrorCode.Unknown;
914
- }
915
-
916
- switch (match[1]) {
917
- case FileSystemProviderErrorCode.FileExists: return FileSystemProviderErrorCode.FileExists;
918
- case FileSystemProviderErrorCode.FileIsADirectory: return FileSystemProviderErrorCode.FileIsADirectory;
919
- case FileSystemProviderErrorCode.FileNotADirectory: return FileSystemProviderErrorCode.FileNotADirectory;
920
- case FileSystemProviderErrorCode.FileNotFound: return FileSystemProviderErrorCode.FileNotFound;
921
- case FileSystemProviderErrorCode.FileExceedsMemoryLimit: return FileSystemProviderErrorCode.FileExceedsMemoryLimit;
922
- case FileSystemProviderErrorCode.FileTooLarge: return FileSystemProviderErrorCode.FileTooLarge;
923
- case FileSystemProviderErrorCode.NoPermissions: return FileSystemProviderErrorCode.NoPermissions;
924
- case FileSystemProviderErrorCode.Unavailable: return FileSystemProviderErrorCode.Unavailable;
925
- }
926
-
927
- return FileSystemProviderErrorCode.Unknown;
928
- }
929
-
930
- export function toFileOperationResult(error: Error): FileOperationResult {
931
-
932
- // FileSystemProviderError comes with the result already
933
- if (error instanceof FileOperationError) {
934
- return error.fileOperationResult;
935
- }
936
-
937
- // Otherwise try to find from code
938
- switch (toFileSystemProviderErrorCode(error)) {
939
- case FileSystemProviderErrorCode.FileNotFound:
940
- return FileOperationResult.FILE_NOT_FOUND;
941
- case FileSystemProviderErrorCode.FileIsADirectory:
942
- return FileOperationResult.FILE_IS_DIRECTORY;
943
- case FileSystemProviderErrorCode.FileNotADirectory:
944
- return FileOperationResult.FILE_NOT_DIRECTORY;
945
- case FileSystemProviderErrorCode.NoPermissions:
946
- return FileOperationResult.FILE_PERMISSION_DENIED;
947
- case FileSystemProviderErrorCode.FileExists:
948
- return FileOperationResult.FILE_MOVE_CONFLICT;
949
- case FileSystemProviderErrorCode.FileExceedsMemoryLimit:
950
- return FileOperationResult.FILE_EXCEEDS_MEMORY_LIMIT;
951
- case FileSystemProviderErrorCode.FileTooLarge:
952
- return FileOperationResult.FILE_TOO_LARGE;
953
- default:
954
- return FileOperationResult.FILE_OTHER_ERROR;
955
- }
956
- }
957
-
958
- /**
959
- * A hint to disable etag checking for reading/writing.
960
- */
961
- export const ETAG_DISABLED = '';
962
-
963
- export function etag(stat: { mtime: number, size: number }): string;
964
- export function etag(stat: { mtime: number | undefined, size: number | undefined }): string | undefined;
965
- export function etag(stat: { mtime: number | undefined, size: number | undefined }): string | undefined {
966
- if (typeof stat.size !== 'number' || typeof stat.mtime !== 'number') {
967
- return undefined;
968
- }
969
-
970
- return stat.mtime.toString(29) + stat.size.toString(31);
971
- }
972
- /**
973
- * Helper to format a raw byte size into a human readable label.
974
- */
975
- export class BinarySize {
976
- static readonly KB = 1024;
977
- static readonly MB = BinarySize.KB * BinarySize.KB;
978
- static readonly GB = BinarySize.MB * BinarySize.KB;
979
- static readonly TB = BinarySize.GB * BinarySize.KB;
980
-
981
- static formatSize(size: number): string {
982
- if (size < BinarySize.KB) {
983
- return size + 'B';
984
- }
985
- if (size < BinarySize.MB) {
986
- return (size / BinarySize.KB).toFixed(2) + 'KB';
987
- }
988
- if (size < BinarySize.GB) {
989
- return (size / BinarySize.MB).toFixed(2) + 'MB';
990
- }
991
- if (size < BinarySize.TB) {
992
- return (size / BinarySize.GB).toFixed(2) + 'GB';
993
- }
994
- return (size / BinarySize.TB).toFixed(2) + 'TB';
995
- }
996
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2020 TypeFox and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+ /*---------------------------------------------------------------------------------------------
17
+ * Copyright (c) Microsoft Corporation. All rights reserved.
18
+ * Licensed under the MIT License. See License.txt in the project root for license information.
19
+ *--------------------------------------------------------------------------------------------*/
20
+ // based on https://github.com/microsoft/vscode/blob/04c36be045a94fee58e5f8992d3e3fd980294a84/src/vs/platform/files/common/files.ts
21
+
22
+ import URI from '@theia/core/lib/common/uri';
23
+ import { Event } from '@theia/core/lib/common/event';
24
+ import { Disposable as IDisposable } from '@theia/core/lib/common/disposable';
25
+ import { BinaryBuffer, BinaryBufferReadableStream } from '@theia/core/lib/common/buffer';
26
+ import type { TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol';
27
+ import { ReadableStreamEvents } from '@theia/core/lib/common/stream';
28
+ import { CancellationToken } from '@theia/core/lib/common/cancellation';
29
+ import { isObject } from '@theia/core/lib/common';
30
+ import { MarkdownString } from '@theia/core/lib/common/markdown-rendering';
31
+
32
+ export const enum FileOperation {
33
+ CREATE,
34
+ DELETE,
35
+ MOVE,
36
+ COPY
37
+ }
38
+
39
+ export class FileOperationEvent {
40
+
41
+ constructor(resource: URI, operation: FileOperation.DELETE);
42
+ constructor(resource: URI, operation: FileOperation.CREATE | FileOperation.MOVE | FileOperation.COPY, target: FileStatWithMetadata);
43
+ constructor(public readonly resource: URI, public readonly operation: FileOperation, public readonly target?: FileStatWithMetadata) { }
44
+
45
+ isOperation(operation: FileOperation.DELETE): boolean;
46
+ isOperation(operation: FileOperation.MOVE | FileOperation.COPY | FileOperation.CREATE): this is { readonly target: FileStatWithMetadata };
47
+ isOperation(operation: FileOperation): boolean {
48
+ return this.operation === operation;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Possible changes that can occur to a file.
54
+ */
55
+ export const enum FileChangeType {
56
+ UPDATED = 0,
57
+ ADDED = 1,
58
+ DELETED = 2
59
+ }
60
+
61
+ /**
62
+ * Identifies a single change in a file.
63
+ */
64
+ export interface FileChange {
65
+
66
+ /**
67
+ * The type of change that occurred to the file.
68
+ */
69
+ readonly type: FileChangeType;
70
+
71
+ /**
72
+ * The unified resource identifier of the file that changed.
73
+ */
74
+ readonly resource: URI;
75
+ }
76
+
77
+ export class FileChangesEvent {
78
+
79
+ constructor(public readonly changes: readonly FileChange[]) { }
80
+
81
+ /**
82
+ * Returns true if this change event contains the provided file with the given change type (if provided). In case of
83
+ * type DELETED, this method will also return true if a folder got deleted that is the parent of the
84
+ * provided file path.
85
+ */
86
+ contains(resource: URI, type?: FileChangeType): boolean {
87
+ if (!resource) {
88
+ return false;
89
+ }
90
+
91
+ const checkForChangeType = typeof type === 'number';
92
+
93
+ return this.changes.some(change => {
94
+ if (checkForChangeType && change.type !== type) {
95
+ return false;
96
+ }
97
+
98
+ // For deleted also return true when deleted folder is parent of target path
99
+ if (change.type === FileChangeType.DELETED) {
100
+ return change.resource.isEqualOrParent(resource);
101
+ }
102
+
103
+ return change.resource.toString() === resource.toString();
104
+ });
105
+ }
106
+
107
+ /**
108
+ * Returns the changes that describe added files.
109
+ */
110
+ getAdded(): FileChange[] {
111
+ return this.getOfType(FileChangeType.ADDED);
112
+ }
113
+
114
+ /**
115
+ * Returns if this event contains added files.
116
+ */
117
+ gotAdded(): boolean {
118
+ return this.hasType(FileChangeType.ADDED);
119
+ }
120
+
121
+ /**
122
+ * Returns the changes that describe deleted files.
123
+ */
124
+ getDeleted(): FileChange[] {
125
+ return this.getOfType(FileChangeType.DELETED);
126
+ }
127
+
128
+ /**
129
+ * Returns if this event contains deleted files.
130
+ */
131
+ gotDeleted(): boolean {
132
+ return this.hasType(FileChangeType.DELETED);
133
+ }
134
+
135
+ /**
136
+ * Returns the changes that describe updated files.
137
+ */
138
+ getUpdated(): FileChange[] {
139
+ return this.getOfType(FileChangeType.UPDATED);
140
+ }
141
+
142
+ /**
143
+ * Returns if this event contains updated files.
144
+ */
145
+ gotUpdated(): boolean {
146
+ return this.hasType(FileChangeType.UPDATED);
147
+ }
148
+
149
+ private getOfType(type: FileChangeType): FileChange[] {
150
+ return this.changes.filter(change => change.type === type);
151
+ }
152
+
153
+ private hasType(type: FileChangeType): boolean {
154
+ return this.changes.some(change => change.type === type);
155
+ }
156
+ }
157
+
158
+ export interface BaseStat {
159
+
160
+ /**
161
+ * The unified resource identifier of this file or folder.
162
+ */
163
+ resource: URI;
164
+
165
+ /**
166
+ * The name which is the last segment
167
+ * of the {{path}}.
168
+ */
169
+ name: string;
170
+
171
+ /**
172
+ * The size of the file.
173
+ *
174
+ * The value may or may not be resolved as
175
+ * it is optional.
176
+ */
177
+ size?: number;
178
+
179
+ /**
180
+ * The last modification date represented as millis from unix epoch.
181
+ *
182
+ * The value may or may not be resolved as
183
+ * it is optional.
184
+ */
185
+ mtime?: number;
186
+
187
+ /**
188
+ * The creation date represented as millis from unix epoch.
189
+ *
190
+ * The value may or may not be resolved as
191
+ * it is optional.
192
+ */
193
+ ctime?: number;
194
+
195
+ /**
196
+ * A unique identifier that represents the
197
+ * current state of the file or directory.
198
+ *
199
+ * The value may or may not be resolved as
200
+ * it is optional.
201
+ */
202
+ etag?: string;
203
+ }
204
+ export namespace BaseStat {
205
+ export function is(arg: unknown): arg is BaseStat {
206
+ return isObject<BaseStat>(arg)
207
+ && arg.resource instanceof URI
208
+ && typeof arg.name === 'string';
209
+ }
210
+ }
211
+
212
+ export interface BaseStatWithMetadata extends BaseStat {
213
+ mtime: number;
214
+ ctime: number;
215
+ etag: string;
216
+ size: number;
217
+ }
218
+
219
+ /**
220
+ * A file resource with meta information.
221
+ */
222
+ export interface FileStat extends BaseStat {
223
+
224
+ /**
225
+ * The resource is a file.
226
+ */
227
+ isFile: boolean;
228
+
229
+ /**
230
+ * The resource is a directory.
231
+ */
232
+ isDirectory: boolean;
233
+
234
+ /**
235
+ * The resource is a symbolic link.
236
+ */
237
+ isSymbolicLink: boolean;
238
+
239
+ /**
240
+ * The resource is read only.
241
+ */
242
+ isReadonly: boolean;
243
+
244
+ /**
245
+ * The children of the file stat or undefined if none.
246
+ */
247
+ children?: FileStat[];
248
+ }
249
+ export namespace FileStat {
250
+ export function is(arg: unknown): arg is FileStat {
251
+ const fileStat = arg as FileStat;
252
+ return BaseStat.is(fileStat) &&
253
+ ('isFile' in fileStat && typeof fileStat.isFile === 'boolean') &&
254
+ ('isDirectory' in fileStat && typeof fileStat.isDirectory === 'boolean') &&
255
+ ('isSymbolicLink' in fileStat && typeof fileStat.isSymbolicLink === 'boolean');
256
+ }
257
+ export function asFileType(stat: FileStat): FileType {
258
+ let res = 0;
259
+ if (stat.isFile) {
260
+ res += FileType.File;
261
+
262
+ } else if (stat.isDirectory) {
263
+ res += FileType.Directory;
264
+ }
265
+ if (stat.isSymbolicLink) {
266
+ res += FileType.SymbolicLink;
267
+ }
268
+ return res;
269
+ }
270
+ export function toStat(stat: FileStat): Stat | { type: FileType } & Partial<Stat> {
271
+ return {
272
+ type: asFileType(stat),
273
+ ctime: stat.ctime,
274
+ mtime: stat.mtime,
275
+ size: stat.size
276
+ };
277
+ }
278
+ export function fromStat(resource: URI, stat: Stat): FileStatWithMetadata;
279
+ export function fromStat(resource: URI, stat: { type: FileType } & Partial<Stat>): FileStat;
280
+ export function fromStat(resource: URI, stat: Stat | { type: FileType } & Partial<Stat>): FileStat {
281
+ return {
282
+ resource,
283
+ name: resource.path.base || resource.path.toString(),
284
+ isFile: (stat.type & FileType.File) !== 0,
285
+ isDirectory: (stat.type & FileType.Directory) !== 0,
286
+ isSymbolicLink: (stat.type & FileType.SymbolicLink) !== 0,
287
+ isReadonly: !!stat.permissions && (stat.permissions & FilePermission.Readonly) !== 0,
288
+ mtime: stat.mtime,
289
+ ctime: stat.ctime,
290
+ size: stat.size,
291
+ etag: etag({ mtime: stat.mtime, size: stat.size })
292
+ };
293
+ }
294
+ export function dir(resource: string | URI, stat?: Partial<Omit<Stat, 'type'>>): FileStat {
295
+ return fromStat(resource instanceof URI ? resource : new URI(resource), { type: FileType.Directory, ...stat });
296
+ }
297
+ export function file(resource: string | URI, stat?: Partial<Omit<Stat, 'type'>>): FileStat {
298
+ return fromStat(resource instanceof URI ? resource : new URI(resource), { type: FileType.File, ...stat });
299
+ }
300
+ }
301
+
302
+ export interface FileStatWithMetadata extends FileStat, BaseStatWithMetadata {
303
+ mtime: number;
304
+ ctime: number;
305
+ etag: string;
306
+ size: number;
307
+ children?: FileStatWithMetadata[];
308
+ }
309
+
310
+ export interface ResolveFileResult {
311
+ stat?: FileStat;
312
+ success: boolean;
313
+ }
314
+
315
+ export interface ResolveFileResultWithMetadata extends ResolveFileResult {
316
+ stat?: FileStatWithMetadata;
317
+ }
318
+
319
+ export interface FileContent extends BaseStatWithMetadata {
320
+
321
+ /**
322
+ * The content of a file as buffer.
323
+ */
324
+ value: BinaryBuffer;
325
+ }
326
+
327
+ export interface FileStreamContent extends BaseStatWithMetadata {
328
+
329
+ /**
330
+ * The content of a file as stream.
331
+ */
332
+ value: BinaryBufferReadableStream;
333
+ }
334
+
335
+ export interface WriteFileOptions {
336
+
337
+ /**
338
+ * The last known modification time of the file. This can be used to prevent dirty writes.
339
+ */
340
+ readonly mtime?: number;
341
+
342
+ /**
343
+ * The etag of the file. This can be used to prevent dirty writes.
344
+ */
345
+ readonly etag?: string;
346
+ }
347
+
348
+ export interface ReadFileOptions extends FileReadStreamOptions {
349
+
350
+ /**
351
+ * The optional etag parameter allows to return early from resolving the resource if
352
+ * the contents on disk match the etag. This prevents accumulated reading of resources
353
+ * that have been read already with the same etag.
354
+ * It is the task of the caller to makes sure to handle this error case from the promise.
355
+ */
356
+ readonly etag?: string;
357
+ }
358
+
359
+ export interface WriteFileOptions {
360
+
361
+ /**
362
+ * The last known modification time of the file. This can be used to prevent dirty writes.
363
+ */
364
+ readonly mtime?: number;
365
+
366
+ /**
367
+ * The etag of the file. This can be used to prevent dirty writes.
368
+ */
369
+ readonly etag?: string;
370
+ }
371
+
372
+ export interface ResolveFileOptions {
373
+
374
+ /**
375
+ * Automatically continue resolving children of a directory until the provided resources
376
+ * are found.
377
+ */
378
+ readonly resolveTo?: readonly URI[];
379
+
380
+ /**
381
+ * Automatically continue resolving children of a directory if the number of children is 1.
382
+ */
383
+ readonly resolveSingleChildDescendants?: boolean;
384
+
385
+ /**
386
+ * Will resolve mtime, ctime, size and etag of files if enabled. This can have a negative impact
387
+ * on performance and thus should only be used when these values are required.
388
+ */
389
+ readonly resolveMetadata?: boolean;
390
+ }
391
+
392
+ export interface ResolveMetadataFileOptions extends ResolveFileOptions {
393
+ readonly resolveMetadata: true;
394
+ }
395
+
396
+ export interface FileOperationOptions {
397
+ /**
398
+ * Indicates that a user action triggered the opening, e.g.
399
+ * via mouse or keyboard use. Default is true.
400
+ */
401
+ fromUserGesture?: boolean
402
+ }
403
+
404
+ export interface MoveFileOptions extends FileOperationOptions, Partial<FileOverwriteOptions> {
405
+ }
406
+
407
+ export interface CopyFileOptions extends FileOperationOptions, Partial<FileOverwriteOptions> {
408
+ }
409
+
410
+ export interface CreateFileOptions extends FileOperationOptions, Partial<FileOverwriteOptions> {
411
+ }
412
+
413
+ export class FileOperationError extends Error {
414
+ constructor(message: string, public fileOperationResult: FileOperationResult, public options?: ReadFileOptions & WriteFileOptions & CreateFileOptions) {
415
+ super(message);
416
+ Object.setPrototypeOf(this, FileOperationError.prototype);
417
+ }
418
+ }
419
+
420
+ export const enum FileOperationResult {
421
+ FILE_IS_DIRECTORY,
422
+ FILE_NOT_FOUND,
423
+ FILE_NOT_MODIFIED_SINCE,
424
+ FILE_MODIFIED_SINCE,
425
+ FILE_MOVE_CONFLICT,
426
+ FILE_READ_ONLY,
427
+ FILE_PERMISSION_DENIED,
428
+ FILE_TOO_LARGE,
429
+ FILE_INVALID_PATH,
430
+ FILE_EXCEEDS_MEMORY_LIMIT,
431
+ FILE_NOT_DIRECTORY,
432
+ FILE_OTHER_ERROR
433
+ }
434
+
435
+ export interface FileOverwriteOptions {
436
+ /**
437
+ * Overwrite the file to create if it already exists on disk. Otherwise
438
+ * an error will be thrown (FILE_MODIFIED_SINCE).
439
+ */
440
+ overwrite: boolean;
441
+ }
442
+
443
+ export interface FileReadStreamOptions {
444
+
445
+ /**
446
+ * Is an integer specifying where to begin reading from in the file. If position is undefined,
447
+ * data will be read from the current file position.
448
+ */
449
+ readonly position?: number;
450
+
451
+ /**
452
+ * Is an integer specifying how many bytes to read from the file. By default, all bytes
453
+ * will be read.
454
+ */
455
+ readonly length?: number;
456
+
457
+ /**
458
+ * If provided, the size of the file will be checked against the limits.
459
+ */
460
+ limits?: {
461
+ readonly size?: number;
462
+ readonly memory?: number;
463
+ };
464
+ }
465
+
466
+ export interface FileUpdateOptions {
467
+ readEncoding: string;
468
+ writeEncoding: string;
469
+ overwriteEncoding: boolean;
470
+ }
471
+ export interface FileUpdateResult extends Stat {
472
+ encoding: string;
473
+ }
474
+
475
+ export interface FileWriteOptions {
476
+ overwrite: boolean;
477
+ create: boolean;
478
+ }
479
+
480
+ export interface FileOpenOptions {
481
+ create: boolean;
482
+ }
483
+
484
+ export interface FileDeleteOptions {
485
+ recursive: boolean;
486
+ useTrash: boolean;
487
+ }
488
+
489
+ export enum FileType {
490
+ Unknown = 0,
491
+ File = 1,
492
+ Directory = 2,
493
+ SymbolicLink = 64
494
+ }
495
+
496
+ export enum FilePermission {
497
+
498
+ /**
499
+ * File is readonly.
500
+ */
501
+ Readonly = 1
502
+ }
503
+
504
+ export interface Stat {
505
+ type: FileType;
506
+
507
+ /**
508
+ * The last modification date represented as millis from unix epoch.
509
+ */
510
+ mtime: number;
511
+
512
+ /**
513
+ * The creation date represented as millis from unix epoch.
514
+ */
515
+ ctime: number;
516
+
517
+ size: number;
518
+
519
+ permissions?: FilePermission;
520
+ }
521
+
522
+ export interface WatchOptions {
523
+ recursive: boolean;
524
+ excludes: string[];
525
+ }
526
+
527
+ export const enum FileSystemProviderCapabilities {
528
+ FileReadWrite = 1 << 1,
529
+ FileOpenReadWriteClose = 1 << 2,
530
+ FileReadStream = 1 << 4,
531
+
532
+ FileFolderCopy = 1 << 3,
533
+
534
+ PathCaseSensitive = 1 << 10,
535
+ Readonly = 1 << 11,
536
+
537
+ Trash = 1 << 12,
538
+
539
+ Access = 1 << 24,
540
+ Update = 1 << 25
541
+ }
542
+
543
+ export enum FileSystemProviderErrorCode {
544
+ FileExists = 'EntryExists',
545
+ FileNotFound = 'EntryNotFound',
546
+ FileNotADirectory = 'EntryNotADirectory',
547
+ FileIsADirectory = 'EntryIsADirectory',
548
+ FileExceedsMemoryLimit = 'EntryExceedsMemoryLimit',
549
+ FileTooLarge = 'EntryTooLarge',
550
+ NoPermissions = 'NoPermissions',
551
+ Unavailable = 'Unavailable',
552
+ Unknown = 'Unknown'
553
+ }
554
+
555
+ export class FileSystemProviderError extends Error {
556
+
557
+ constructor(message: string, public readonly code: FileSystemProviderErrorCode) {
558
+ super(message);
559
+ Object.setPrototypeOf(this, FileSystemProviderError.prototype);
560
+ }
561
+ }
562
+
563
+ export function createFileSystemProviderError(error: Error | string, code: FileSystemProviderErrorCode): FileSystemProviderError {
564
+ const providerError = new FileSystemProviderError(error.toString(), code);
565
+ markAsFileSystemProviderError(providerError, code);
566
+
567
+ return providerError;
568
+ }
569
+
570
+ export function ensureFileSystemProviderError(error?: Error): Error {
571
+ if (!error) {
572
+ return createFileSystemProviderError('Unknown Error', FileSystemProviderErrorCode.Unknown); // https://github.com/Microsoft/vscode/issues/72798
573
+ }
574
+
575
+ return error;
576
+ }
577
+
578
+ export const FileSystemProvider = Symbol('FileSystemProvider');
579
+ /**
580
+ * A {@link FileSystemProvider} provides the capabilities to read, write, discover, and to manage files and folders
581
+ * of the underlying (potentially virtual) file system. {@link FileSystemProvider}s can be used to serve files from both the
582
+ * local disk as well as remote locations like ftp-servers, REST-services etc. A {@link FileSystemProvider} is registered for a certain
583
+ * scheme and can handle all resources whose uri does conform to that scheme.
584
+ */
585
+ export interface FileSystemProvider {
586
+
587
+ /** The {@link FileSystemProviderCapabilities} for this provider. */
588
+ readonly capabilities: FileSystemProviderCapabilities;
589
+
590
+ /** * Event that is fired if the capabilities of this provider have changed. */
591
+ readonly onDidChangeCapabilities: Event<void>;
592
+
593
+ /** Event that is fired if a (watched) file in the filesystem of this provider has changed. */
594
+ readonly onDidChangeFile: Event<readonly FileChange[]>;
595
+
596
+ /** Event that is fired if an error occurred when watching files in the filesystem of this provider. */
597
+ readonly onFileWatchError: Event<void>;
598
+
599
+ /**
600
+ * Watch the given resource and react to changes by firing the {@link FileSystemProvider#onDidChangeFile} event.
601
+ * @param resource `URI` of the resource to be watched.
602
+ * @param opts Options to define if the resource should be watched recursively and to
603
+ * provide a set of resources that should be excluded from watching.
604
+ *
605
+ * @returns A `Disposable` that can be invoked to stop watching the resource.
606
+ */
607
+ watch(resource: URI, opts: WatchOptions): IDisposable;
608
+
609
+ /**
610
+ * Retrieve metadata about a given file.
611
+ *
612
+ * @param uri The `URI` of the file to retrieve meta data about.
613
+ * @returns A promise of the metadata about the resource.
614
+ */
615
+ stat(resource: URI): Promise<Stat>;
616
+
617
+ /**
618
+ * Create a new directory using the given resource uri.
619
+ * @param resource The `URI` of the new folder.
620
+ */
621
+ mkdir(resource: URI): Promise<void>;
622
+
623
+ /**
624
+ * Retrieve the content of a given directory.
625
+ * @param resource The `URI` of the directory.
626
+ *
627
+ * @returns A map containing the {@link FileType} for each child resource, identified by name.
628
+ */
629
+ readdir(resource: URI): Promise<[string, FileType][]>;
630
+
631
+ /**
632
+ * Delete the given resource.
633
+ * @param resource The `URI` of the resource to delete.
634
+ * @param opts Options to define if files should be deleted recursively and if the trash should be used.
635
+ */
636
+ delete(resource: URI, opts: FileDeleteOptions): Promise<void>;
637
+
638
+ /**
639
+ * Rename a file or folder.
640
+ * @param from `URI` of the existing file or folder.
641
+ * @param to `URI` of the target location.
642
+ * @param opts Options to define if existing files should be overwritten.
643
+ */
644
+ rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise<void>;
645
+
646
+ /**
647
+ * Optional function that has to be implemented by {@link FileSystemProviderWithFileFolderCopyCapability}.
648
+ * See {@link FileSystemProviderWithFileFolderCopyCapability#copy}} for additional documentation.
649
+ */
650
+ copy?(from: URI, to: URI, opts: FileOverwriteOptions): Promise<void>;
651
+
652
+ /**
653
+ * Optional function that has to be implemented by {@link FileSystemProviderWithFileReadWriteCapability}.
654
+ * See {@link FileSystemProviderWithFileReadWriteCapability#readFile} for additional documentation.
655
+ */
656
+ readFile?(resource: URI): Promise<Uint8Array>;
657
+
658
+ /**
659
+ * Optional function that has to be implemented by {@link FileSystemProviderWithFileReadWriteCapability}.
660
+ * See {@link FileSystemProviderWithFileReadWriteCapability#writeFile} for additional documentation.
661
+ */
662
+ writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise<void>;
663
+
664
+ /**
665
+ * Optional function that has to be implemented by {@link FileSystemProviderWithFileReadStreamCapability}.
666
+ * See {@link FileSystemProviderWithFileReadStreamCapability#readFileStream} for additional documentation.
667
+ */
668
+ readFileStream?(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array>;
669
+
670
+ /**
671
+ * Optional function that has to be implemented by {@link FileSystemProviderWithOpenReadWriteCloseCapability}.
672
+ * See {@link FileSystemProviderWithOpenReadWriteCloseCapability#open} for additional documentation.
673
+ */
674
+ open?(resource: URI, opts: FileOpenOptions): Promise<number>;
675
+
676
+ /**
677
+ * Optional function that has to be implemented by {@link FileSystemProviderWithOpenReadWriteCloseCapability}.
678
+ * See {@link FileSystemProviderWithOpenReadWriteCloseCapability#close} for additional documentation.
679
+ */
680
+ close?(fd: number): Promise<void>;
681
+
682
+ /**
683
+ * Optional function that has to be implemented by {@link FileSystemProviderWithOpenReadWriteCloseCapability}.
684
+ * See {@link FileSystemProviderWithOpenReadWriteCloseCapability#read} for additional documentation.
685
+ */
686
+ read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number>;
687
+
688
+ /**
689
+ * Optional function that has to be implemented by {@link FileSystemProviderWithOpenReadWriteCloseCapability}.
690
+ * See {@link FileSystemProviderWithOpenReadWriteCloseCapability#write} for additional documentation.
691
+ */
692
+ write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number>;
693
+
694
+ /**
695
+ * Optional function that has to be implemented by {@link FileSystemProviderWithAccessCapability}.
696
+ * See {@link FileSystemProviderWithAccessCapability#access} for additional documentation.
697
+ */
698
+ access?(resource: URI, mode?: number): Promise<void>;
699
+
700
+ /**
701
+ * Optional function that has to be implemented by {@link FileSystemProviderWithAccessCapability}.
702
+ * See {@link FileSystemProviderWithAccessCapability#fsPath} for additional documentation.
703
+ */
704
+ fsPath?(resource: URI): Promise<string>;
705
+
706
+ /**
707
+ * Optional function that has to be implemented by {@link FileSystemProviderWithUpdateCapability}.
708
+ * See {@link FileSystemProviderWithUpdateCapability#updateFile} for additional documentation.
709
+ */
710
+ updateFile?(resource: URI, changes: TextDocumentContentChangeEvent[], opts: FileUpdateOptions): Promise<FileUpdateResult>;
711
+ }
712
+
713
+ /**
714
+ * Subtype of {@link FileSystemProvider} that ensures that the optional functions needed for providers, that should be
715
+ * able access files, are implemented.
716
+ */
717
+ export interface FileSystemProviderWithAccessCapability extends FileSystemProvider {
718
+ /**
719
+ * Tests a user's permissions for the file or directory specified by URI.
720
+ * @param resource The `URI` of the file that should be tested.
721
+ * @param mode An optional integer that specifies the accessibility checks to be performed.
722
+ * Check `FileAccess.Constants` for possible values of mode.
723
+ * It is possible to create a mask consisting of the bitwise `OR` of two or more values (e.g. FileAccess.Constants.W_OK | FileAccess.Constants.R_OK).
724
+ * If `mode` is not defined, `FileAccess.Constants.F_OK` will be used instead.
725
+ *
726
+ * @returns A promise that resolves if the user has the required permissions, should be rejected otherwise.
727
+ */
728
+ access(resource: URI, mode?: number): Promise<void>;
729
+
730
+ /**
731
+ * Returns the path of the given file URI, specific to the backend's operating system.
732
+ * If the URI is not a file URI, undefined is returned.
733
+ *
734
+ * USE WITH CAUTION: You should always prefer URIs to paths if possible, as they are
735
+ * portable and platform independent. Paths should only be used in cases you directly
736
+ * interact with the OS, e.g. when running a command on the shell.
737
+ *
738
+ * @param resource `URI` of the resource to derive the path from.
739
+ *
740
+ * @returns A promise of the corresponding file system path.
741
+ */
742
+ fsPath(resource: URI): Promise<string>;
743
+ }
744
+
745
+ export function hasAccessCapability(provider: FileSystemProvider): provider is FileSystemProviderWithAccessCapability {
746
+ return !!(provider.capabilities & FileSystemProviderCapabilities.Access);
747
+ }
748
+
749
+ /**
750
+ * Subtype of {@link FileSystemProvider} that ensures that the optional functions needed, for providers that should be
751
+ * able to update (text) files, are implemented.
752
+ */
753
+ export interface FileSystemProviderWithUpdateCapability extends FileSystemProvider {
754
+ /**
755
+ * Update the content of the given (text) file according to the given text document changes.
756
+ * @param resource `URI` of the resource to update.
757
+ * @param changes Array of events describing the changes to the file.
758
+ * @param opts The encoding options.
759
+ *
760
+ * @returns A promise of the file metadata that resolves after the update process has completed.
761
+ */
762
+ updateFile(resource: URI, changes: TextDocumentContentChangeEvent[], opts: FileUpdateOptions): Promise<FileUpdateResult>;
763
+ }
764
+
765
+ export function hasUpdateCapability(provider: FileSystemProvider): provider is FileSystemProviderWithUpdateCapability {
766
+ return !!(provider.capabilities & FileSystemProviderCapabilities.Update);
767
+ }
768
+
769
+ export interface ReadOnlyMessageFileSystemProvider {
770
+ readOnlyMessage: MarkdownString | undefined;
771
+ readonly onDidChangeReadOnlyMessage: Event<MarkdownString | undefined>;
772
+ }
773
+
774
+ export namespace ReadOnlyMessageFileSystemProvider {
775
+ export function is(arg: unknown): arg is ReadOnlyMessageFileSystemProvider {
776
+ return isObject<ReadOnlyMessageFileSystemProvider>(arg)
777
+ && 'readOnlyMessage' in arg;
778
+ }
779
+ }
780
+
781
+ /**
782
+ * Subtype of {@link FileSystemProvider} that ensures that the optional functions, needed for providers
783
+ * that should be able to read & write files, are implemented.
784
+ */
785
+ export interface FileSystemProviderWithFileReadWriteCapability extends FileSystemProvider {
786
+ /**
787
+ * Read the contents of the given file as stream.
788
+ * @param resource The `URI` of the file.
789
+ *
790
+ * @return The `ReadableStreamEvents` for the readable stream of the given file.
791
+ */
792
+ readFile(resource: URI): Promise<Uint8Array>;
793
+
794
+ /**
795
+ * Write data to a file, replacing its entire contents.
796
+ * @param resource The uri of the file.
797
+ * @param content The new content of the file.
798
+ * @param opts Options to define if the file should be created if missing and if an existing file should be overwritten.
799
+ */
800
+ writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise<void>;
801
+ }
802
+
803
+ export function hasReadWriteCapability(provider: FileSystemProvider): provider is FileSystemProviderWithFileReadWriteCapability {
804
+ return !!(provider.capabilities & FileSystemProviderCapabilities.FileReadWrite);
805
+ }
806
+
807
+ /**
808
+ * Subtype of {@link FileSystemProvider} that ensures that the optional functions, needed for providers that should be able to copy
809
+ * file folders, are implemented.
810
+ */
811
+ export interface FileSystemProviderWithFileFolderCopyCapability extends FileSystemProvider {
812
+ /**
813
+ * Copy files or folders.
814
+ * @param from `URI` of the existing file or folder.
815
+ * @param to `URI` of the destination location.
816
+ * @param opts Options to define if existing files should be overwritten.
817
+ */
818
+ copy(from: URI, to: URI, opts: FileOverwriteOptions): Promise<void>;
819
+ }
820
+
821
+ export function hasFileFolderCopyCapability(provider: FileSystemProvider): provider is FileSystemProviderWithFileFolderCopyCapability {
822
+ return !!(provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy);
823
+ }
824
+
825
+ /**
826
+ * Subtype of {@link FileSystemProvider} that ensures that the optional functions, needed for providers that should be able to open,read, write
827
+ * or close files, are implemented.
828
+ */
829
+ export interface FileSystemProviderWithOpenReadWriteCloseCapability extends FileSystemProvider {
830
+ /**
831
+ * Open the give file.
832
+ * @param resource The `URI` of the file to open.
833
+ * @param opts Options to define if the file should be created if it does not exist yet.
834
+ *
835
+ * @returns A promise of the file descriptor that resolves after the file is open.
836
+ */
837
+ open(resource: URI, opts: FileOpenOptions): Promise<number>;
838
+
839
+ /**
840
+ * Close the file with the given file descriptor.
841
+ * @param fd the file descriptor to close.
842
+ */
843
+ close(fd: number): Promise<void>;
844
+
845
+ /**
846
+ * Read specified content from a given file descriptor into a data buffer.
847
+ * @param fd The file descriptor referencing the file to read from.
848
+ * @param pos The offset from the beginning of the file from which data should be read.
849
+ * @param data The buffer that the data will be written to.
850
+ * @param offset The offset in the buffer at which to start writing.
851
+ * @param length The number of bytes to read.
852
+ *
853
+ * @returns A promise of the number of bytes read.
854
+ */
855
+ read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number>;
856
+
857
+ /**
858
+ * Write specified content from the data buffer to the file referenced by the given file descriptor.
859
+ * @param fd The file descriptor referencing the file to write to.
860
+ * @param pos The offset from the beginning of the file where this data should be written.
861
+ * @param offset The part of the buffer to be read from.
862
+ * @param length The number of bytes to write.
863
+ *
864
+ * @returns A promise of the number of bytes written.
865
+ */
866
+ write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise<number>;
867
+ }
868
+
869
+ export function hasOpenReadWriteCloseCapability(provider: FileSystemProvider): provider is FileSystemProviderWithOpenReadWriteCloseCapability {
870
+ return !!(provider.capabilities & FileSystemProviderCapabilities.FileOpenReadWriteClose);
871
+ }
872
+
873
+ /**
874
+ * Subtype of {@link FileSystemProvider} that ensures that the optional functions, needed for providers that should be able to read
875
+ * files as streams, are implemented.
876
+ */
877
+ export interface FileSystemProviderWithFileReadStreamCapability extends FileSystemProvider {
878
+ /**
879
+ * Read the contents of the given file as stream.
880
+ * @param resource The `URI` of the file.
881
+ *
882
+ * @return The `ReadableStreamEvents` for the readable stream of the given file.
883
+ */
884
+ readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents<Uint8Array>;
885
+ }
886
+
887
+ export function hasFileReadStreamCapability(provider: FileSystemProvider): provider is FileSystemProviderWithFileReadStreamCapability {
888
+ return !!(provider.capabilities & FileSystemProviderCapabilities.FileReadStream);
889
+ }
890
+
891
+ export function markAsFileSystemProviderError(error: Error, code: FileSystemProviderErrorCode): Error {
892
+ error.name = code ? `${code} (FileSystemError)` : 'FileSystemError';
893
+
894
+ return error;
895
+ }
896
+
897
+ export function toFileSystemProviderErrorCode(error: Error | undefined | null): FileSystemProviderErrorCode {
898
+
899
+ // Guard against abuse
900
+ if (!error) {
901
+ return FileSystemProviderErrorCode.Unknown;
902
+ }
903
+
904
+ // FileSystemProviderError comes with the code
905
+ if (error instanceof FileSystemProviderError) {
906
+ return error.code;
907
+ }
908
+
909
+ // Any other error, check for name match by assuming that the error
910
+ // went through the markAsFileSystemProviderError() method
911
+ const match = /^(.+) \(FileSystemError\)$/.exec(error.name);
912
+ if (!match) {
913
+ return FileSystemProviderErrorCode.Unknown;
914
+ }
915
+
916
+ switch (match[1]) {
917
+ case FileSystemProviderErrorCode.FileExists: return FileSystemProviderErrorCode.FileExists;
918
+ case FileSystemProviderErrorCode.FileIsADirectory: return FileSystemProviderErrorCode.FileIsADirectory;
919
+ case FileSystemProviderErrorCode.FileNotADirectory: return FileSystemProviderErrorCode.FileNotADirectory;
920
+ case FileSystemProviderErrorCode.FileNotFound: return FileSystemProviderErrorCode.FileNotFound;
921
+ case FileSystemProviderErrorCode.FileExceedsMemoryLimit: return FileSystemProviderErrorCode.FileExceedsMemoryLimit;
922
+ case FileSystemProviderErrorCode.FileTooLarge: return FileSystemProviderErrorCode.FileTooLarge;
923
+ case FileSystemProviderErrorCode.NoPermissions: return FileSystemProviderErrorCode.NoPermissions;
924
+ case FileSystemProviderErrorCode.Unavailable: return FileSystemProviderErrorCode.Unavailable;
925
+ }
926
+
927
+ return FileSystemProviderErrorCode.Unknown;
928
+ }
929
+
930
+ export function toFileOperationResult(error: Error): FileOperationResult {
931
+
932
+ // FileSystemProviderError comes with the result already
933
+ if (error instanceof FileOperationError) {
934
+ return error.fileOperationResult;
935
+ }
936
+
937
+ // Otherwise try to find from code
938
+ switch (toFileSystemProviderErrorCode(error)) {
939
+ case FileSystemProviderErrorCode.FileNotFound:
940
+ return FileOperationResult.FILE_NOT_FOUND;
941
+ case FileSystemProviderErrorCode.FileIsADirectory:
942
+ return FileOperationResult.FILE_IS_DIRECTORY;
943
+ case FileSystemProviderErrorCode.FileNotADirectory:
944
+ return FileOperationResult.FILE_NOT_DIRECTORY;
945
+ case FileSystemProviderErrorCode.NoPermissions:
946
+ return FileOperationResult.FILE_PERMISSION_DENIED;
947
+ case FileSystemProviderErrorCode.FileExists:
948
+ return FileOperationResult.FILE_MOVE_CONFLICT;
949
+ case FileSystemProviderErrorCode.FileExceedsMemoryLimit:
950
+ return FileOperationResult.FILE_EXCEEDS_MEMORY_LIMIT;
951
+ case FileSystemProviderErrorCode.FileTooLarge:
952
+ return FileOperationResult.FILE_TOO_LARGE;
953
+ default:
954
+ return FileOperationResult.FILE_OTHER_ERROR;
955
+ }
956
+ }
957
+
958
+ /**
959
+ * A hint to disable etag checking for reading/writing.
960
+ */
961
+ export const ETAG_DISABLED = '';
962
+
963
+ export function etag(stat: { mtime: number, size: number }): string;
964
+ export function etag(stat: { mtime: number | undefined, size: number | undefined }): string | undefined;
965
+ export function etag(stat: { mtime: number | undefined, size: number | undefined }): string | undefined {
966
+ if (typeof stat.size !== 'number' || typeof stat.mtime !== 'number') {
967
+ return undefined;
968
+ }
969
+
970
+ return stat.mtime.toString(29) + stat.size.toString(31);
971
+ }
972
+ /**
973
+ * Helper to format a raw byte size into a human readable label.
974
+ */
975
+ export class BinarySize {
976
+ static readonly KB = 1024;
977
+ static readonly MB = BinarySize.KB * BinarySize.KB;
978
+ static readonly GB = BinarySize.MB * BinarySize.KB;
979
+ static readonly TB = BinarySize.GB * BinarySize.KB;
980
+
981
+ static formatSize(size: number): string {
982
+ if (size < BinarySize.KB) {
983
+ return size + 'B';
984
+ }
985
+ if (size < BinarySize.MB) {
986
+ return (size / BinarySize.KB).toFixed(2) + 'KB';
987
+ }
988
+ if (size < BinarySize.GB) {
989
+ return (size / BinarySize.MB).toFixed(2) + 'MB';
990
+ }
991
+ if (size < BinarySize.TB) {
992
+ return (size / BinarySize.GB).toFixed(2) + 'GB';
993
+ }
994
+ return (size / BinarySize.TB).toFixed(2) + 'TB';
995
+ }
996
+ }