@theia/filesystem 1.77.0-next.7 → 1.77.0-next.71

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 (158) hide show
  1. package/lib/browser/download/file-download-service.d.ts.map +1 -1
  2. package/lib/browser/download/file-download-service.js +0 -1
  3. package/lib/browser/download/file-download-service.js.map +1 -1
  4. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.d.ts +2 -0
  5. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.d.ts.map +1 -1
  6. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.js +1 -1
  7. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.js.map +1 -1
  8. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.spec.d.ts +2 -0
  9. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.spec.d.ts.map +1 -0
  10. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.spec.js +37 -0
  11. package/lib/browser/file-dialog/file-dialog-tree-filters-renderer.spec.js.map +1 -0
  12. package/lib/browser/file-dialog/file-dialog.d.ts +5 -0
  13. package/lib/browser/file-dialog/file-dialog.d.ts.map +1 -1
  14. package/lib/browser/file-dialog/file-dialog.js +6 -2
  15. package/lib/browser/file-dialog/file-dialog.js.map +1 -1
  16. package/lib/browser/file-resource.spec.js +2 -1
  17. package/lib/browser/file-resource.spec.js.map +1 -1
  18. package/lib/browser/file-service-watcher.spec.js +2 -1
  19. package/lib/browser/file-service-watcher.spec.js.map +1 -1
  20. package/lib/browser/file-service.d.ts +1 -1
  21. package/lib/browser/file-service.js +1 -1
  22. package/lib/browser/file-service.js.map +1 -1
  23. package/lib/browser/file-tree/file-tree-decorator-adapter.js +1 -1
  24. package/lib/browser/file-tree/file-tree-decorator-adapter.js.map +1 -1
  25. package/lib/browser/file-tree/file-tree-decorator-adapter.spec.js +2 -1
  26. package/lib/browser/file-tree/file-tree-decorator-adapter.spec.js.map +1 -1
  27. package/lib/browser/file-tree/file-tree-model.js +1 -1
  28. package/lib/browser/file-tree/file-tree-model.js.map +1 -1
  29. package/lib/browser/file-tree/file-tree-widget.js +1 -1
  30. package/lib/browser/file-tree/file-tree-widget.js.map +1 -1
  31. package/lib/browser/filesystem-frontend-contribution.js +1 -1
  32. package/lib/browser/filesystem-frontend-contribution.js.map +1 -1
  33. package/lib/browser/location/location-renderer.js +1 -1
  34. package/lib/browser/location/location-renderer.js.map +1 -1
  35. package/lib/browser/location/location-renderer.spec.js +2 -1
  36. package/lib/browser/location/location-renderer.spec.js.map +1 -1
  37. package/lib/browser/upload/file-upload-service-impl.js +1 -1
  38. package/lib/browser/upload/file-upload-service-impl.js.map +1 -1
  39. package/lib/browser-only/download/file-download-service.js +1 -1
  40. package/lib/browser-only/download/file-download-service.js.map +1 -1
  41. package/lib/browser-only/file-search.js +2 -1
  42. package/lib/browser-only/file-search.js.map +1 -1
  43. package/lib/browser-only/upload/file-upload-service-impl.js +1 -1
  44. package/lib/browser-only/upload/file-upload-service-impl.js.map +1 -1
  45. package/lib/common/files.js +2 -1
  46. package/lib/common/files.js.map +1 -1
  47. package/lib/common/files.spec.js +2 -1
  48. package/lib/common/files.spec.js.map +1 -1
  49. package/lib/common/filesystem-watcher-protocol.d.ts +4 -0
  50. package/lib/common/filesystem-watcher-protocol.d.ts.map +1 -1
  51. package/lib/common/remote-file-system-provider.d.ts +4 -4
  52. package/lib/common/remote-file-system-provider.d.ts.map +1 -1
  53. package/lib/common/remote-file-system-provider.js +1 -1
  54. package/lib/common/remote-file-system-provider.js.map +1 -1
  55. package/lib/electron-browser/file-dialog/electron-file-dialog-service.js +1 -1
  56. package/lib/electron-browser/file-dialog/electron-file-dialog-service.js.map +1 -1
  57. package/lib/electron-browser/file-dialog/electron-file-dialog-service.spec.d.ts +2 -0
  58. package/lib/electron-browser/file-dialog/electron-file-dialog-service.spec.d.ts.map +1 -0
  59. package/lib/electron-browser/file-dialog/electron-file-dialog-service.spec.js +48 -0
  60. package/lib/electron-browser/file-dialog/electron-file-dialog-service.spec.js.map +1 -0
  61. package/lib/node/disk-file-system-provider.d.ts.map +1 -1
  62. package/lib/node/disk-file-system-provider.js +8 -5
  63. package/lib/node/disk-file-system-provider.js.map +1 -1
  64. package/lib/node/disk-file-system-provider.spec.js +28 -2
  65. package/lib/node/disk-file-system-provider.spec.js.map +1 -1
  66. package/lib/node/download/directory-archiver.js +2 -2
  67. package/lib/node/download/directory-archiver.js.map +1 -1
  68. package/lib/node/download/directory-archiver.spec.js +5 -4
  69. package/lib/node/download/directory-archiver.spec.js.map +1 -1
  70. package/lib/node/download/file-download-cache.js +1 -1
  71. package/lib/node/download/file-download-cache.js.map +1 -1
  72. package/lib/node/download/file-download-handler.d.ts.map +1 -1
  73. package/lib/node/download/file-download-handler.js +4 -5
  74. package/lib/node/download/file-download-handler.js.map +1 -1
  75. package/lib/node/file-change-collection.spec.js +2 -1
  76. package/lib/node/file-change-collection.spec.js.map +1 -1
  77. package/lib/node/filesystem-backend-module.d.ts +2 -2
  78. package/lib/node/filesystem-backend-module.d.ts.map +1 -1
  79. package/lib/node/filesystem-backend-module.js +7 -5
  80. package/lib/node/filesystem-backend-module.js.map +1 -1
  81. package/lib/node/filesystem-watcher-service-impl.d.ts +30 -0
  82. package/lib/node/filesystem-watcher-service-impl.d.ts.map +1 -0
  83. package/lib/node/filesystem-watcher-service-impl.js +92 -0
  84. package/lib/node/filesystem-watcher-service-impl.js.map +1 -0
  85. package/lib/node/filesystem-watcher-service-impl.spec.d.ts +2 -0
  86. package/lib/node/filesystem-watcher-service-impl.spec.d.ts.map +1 -0
  87. package/lib/node/filesystem-watcher-service-impl.spec.js +202 -0
  88. package/lib/node/filesystem-watcher-service-impl.spec.js.map +1 -0
  89. package/lib/node/filesystem-watcher.d.ts +93 -0
  90. package/lib/node/filesystem-watcher.d.ts.map +1 -0
  91. package/lib/node/filesystem-watcher.js +134 -0
  92. package/lib/node/filesystem-watcher.js.map +1 -0
  93. package/lib/node/nodejs-watcher/node-directory-watcher.d.ts +175 -0
  94. package/lib/node/nodejs-watcher/node-directory-watcher.d.ts.map +1 -0
  95. package/lib/node/nodejs-watcher/node-directory-watcher.js +580 -0
  96. package/lib/node/nodejs-watcher/node-directory-watcher.js.map +1 -0
  97. package/lib/node/nodejs-watcher/node-directory-watcher.spec.d.ts +2 -0
  98. package/lib/node/nodejs-watcher/node-directory-watcher.spec.d.ts.map +1 -0
  99. package/lib/node/nodejs-watcher/node-directory-watcher.spec.js +1284 -0
  100. package/lib/node/nodejs-watcher/node-directory-watcher.spec.js.map +1 -0
  101. package/lib/node/nodejs-watcher/watch-request-router.d.ts +63 -0
  102. package/lib/node/nodejs-watcher/watch-request-router.d.ts.map +1 -0
  103. package/lib/node/nodejs-watcher/watch-request-router.js +183 -0
  104. package/lib/node/nodejs-watcher/watch-request-router.js.map +1 -0
  105. package/lib/node/nodejs-watcher/watcher-host.d.ts +50 -0
  106. package/lib/node/nodejs-watcher/watcher-host.d.ts.map +1 -0
  107. package/lib/node/nodejs-watcher/watcher-host.js +99 -0
  108. package/lib/node/nodejs-watcher/watcher-host.js.map +1 -0
  109. package/lib/node/parcel-watcher/index.js +4 -3
  110. package/lib/node/parcel-watcher/index.js.map +1 -1
  111. package/lib/node/parcel-watcher/parcel-filesystem-service.d.ts +14 -194
  112. package/lib/node/parcel-watcher/parcel-filesystem-service.d.ts.map +1 -1
  113. package/lib/node/parcel-watcher/parcel-filesystem-service.js +7 -424
  114. package/lib/node/parcel-watcher/parcel-filesystem-service.js.map +1 -1
  115. package/lib/node/parcel-watcher/parcel-filesystem-watcher.spec.js +8 -7
  116. package/lib/node/parcel-watcher/parcel-filesystem-watcher.spec.js.map +1 -1
  117. package/lib/node/parcel-watcher/parcel-watcher-exclude.spec.js +8 -7
  118. package/lib/node/parcel-watcher/parcel-watcher-exclude.spec.js.map +1 -1
  119. package/lib/node/parcel-watcher/parcel-watcher-retry.spec.js +7 -6
  120. package/lib/node/parcel-watcher/parcel-watcher-retry.spec.js.map +1 -1
  121. package/lib/node/parcel-watcher/parcel-watcher.d.ts +165 -0
  122. package/lib/node/parcel-watcher/parcel-watcher.d.ts.map +1 -0
  123. package/lib/node/parcel-watcher/parcel-watcher.js +370 -0
  124. package/lib/node/parcel-watcher/parcel-watcher.js.map +1 -0
  125. package/lib/node/test/watcher-test-helper.d.ts +21 -0
  126. package/lib/node/test/watcher-test-helper.d.ts.map +1 -0
  127. package/lib/node/test/watcher-test-helper.js +56 -0
  128. package/lib/node/test/watcher-test-helper.js.map +1 -0
  129. package/lib/node/upload/node-file-upload-service.spec.js +4 -3
  130. package/lib/node/upload/node-file-upload-service.spec.js.map +1 -1
  131. package/package.json +7 -7
  132. package/src/browser/download/file-download-service.ts +0 -1
  133. package/src/browser/file-dialog/file-dialog-tree-filters-renderer.spec.ts +43 -0
  134. package/src/browser/file-dialog/file-dialog-tree-filters-renderer.tsx +3 -1
  135. package/src/browser/file-dialog/file-dialog.ts +11 -1
  136. package/src/browser/file-service.ts +3 -3
  137. package/src/common/filesystem-watcher-protocol.ts +4 -0
  138. package/src/electron-browser/file-dialog/electron-file-dialog-service.spec.ts +57 -0
  139. package/src/electron-browser/file-dialog/electron-file-dialog-service.ts +1 -1
  140. package/src/node/disk-file-system-provider.spec.ts +29 -0
  141. package/src/node/disk-file-system-provider.ts +5 -2
  142. package/src/node/download/file-download-cache.ts +1 -1
  143. package/src/node/download/file-download-handler.ts +0 -1
  144. package/src/node/filesystem-backend-module.ts +5 -4
  145. package/src/node/filesystem-watcher-service-impl.spec.ts +272 -0
  146. package/src/node/filesystem-watcher-service-impl.ts +109 -0
  147. package/src/node/filesystem-watcher.ts +197 -0
  148. package/src/node/nodejs-watcher/node-directory-watcher.spec.ts +1594 -0
  149. package/src/node/nodejs-watcher/node-directory-watcher.ts +664 -0
  150. package/src/node/nodejs-watcher/watch-request-router.ts +224 -0
  151. package/src/node/nodejs-watcher/watcher-host.ts +126 -0
  152. package/src/node/parcel-watcher/index.ts +2 -2
  153. package/src/node/parcel-watcher/parcel-filesystem-service.ts +14 -500
  154. package/src/node/parcel-watcher/parcel-filesystem-watcher.spec.ts +4 -4
  155. package/src/node/parcel-watcher/parcel-watcher-exclude.spec.ts +4 -4
  156. package/src/node/parcel-watcher/parcel-watcher-retry.spec.ts +3 -3
  157. package/src/node/parcel-watcher/parcel-watcher.ts +432 -0
  158. package/src/node/test/watcher-test-helper.ts +58 -0
@@ -0,0 +1,197 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2026 Ehab Younes 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
+ import { Deferred } from '@theia/core/lib/common/promise-util';
18
+ import { CancellationTokenSource } from '@theia/core/lib/common/cancellation';
19
+ import { WatchOptions } from '../common/filesystem-watcher-protocol';
20
+
21
+ /** How a watcher reports what it is doing. */
22
+ export interface WatcherLogger {
23
+ verbose: boolean;
24
+ info: (message: string, ...args: unknown[]) => void;
25
+ error: (message: string, ...args: unknown[]) => void;
26
+ }
27
+
28
+ /** A single client request served by a {@link FileSystemWatcher}. */
29
+ export interface WatchRequest {
30
+ /** Client to route the changes of this request to. */
31
+ readonly clientId: number;
32
+ /** Path as requested by the client. Change URIs are built from it, never from the real path. */
33
+ readonly path: string;
34
+ /** Exclude patterns of this request alone. */
35
+ readonly ignored: readonly string[];
36
+ }
37
+
38
+ /** A watch shared by every request that resolves to the same target. Implementations decide whether it recurses. */
39
+ export interface FileSystemWatcher {
40
+ /** A disposed watcher released its resources and must not be given further requests. */
41
+ readonly isDisposed: boolean;
42
+ /** Resolves once this watcher disposed itself. Never rejects. */
43
+ readonly whenDisposed: Promise<void>;
44
+ /** Serves `request` until {@link removeRequest} is called with the same `watcherId`. */
45
+ addRequest(watcherId: number, request: WatchRequest): void;
46
+ /** Releases a request. The watcher disposes itself once it has none left. */
47
+ removeRequest(watcherId: number): void;
48
+ }
49
+
50
+ /** Handles disposal and logging for a watcher. Subclasses decide how to observe the file system. */
51
+ export abstract class AbstractFileSystemWatcher implements FileSystemWatcher {
52
+
53
+ private static debugIdSequence = 0;
54
+
55
+ private readonly debugId = AbstractFileSystemWatcher.debugIdSequence++;
56
+ private readonly disposalDeferred = new Deferred<void>();
57
+ private readonly disposal = new CancellationTokenSource();
58
+
59
+ readonly whenDisposed = this.disposalDeferred.promise;
60
+
61
+ constructor(
62
+ /** Path this watcher was asked about; the subclass decides what it resolves to. */
63
+ protected readonly target: string,
64
+ private readonly logger: WatcherLogger
65
+ ) { }
66
+
67
+ get isDisposed(): boolean {
68
+ return this.disposal.token.isCancellationRequested;
69
+ }
70
+
71
+ abstract addRequest(watcherId: number, request: WatchRequest): void;
72
+ abstract removeRequest(watcherId: number): void;
73
+
74
+ /**
75
+ * Marks this watcher disposed.
76
+ * @returns `false` if it already was, in which case the caller must not clean up again.
77
+ */
78
+ protected markDisposed(): boolean {
79
+ if (this.isDisposed) {
80
+ return false;
81
+ }
82
+ this.disposal.cancel();
83
+ this.disposalDeferred.resolve();
84
+ return true;
85
+ }
86
+
87
+ /** Logs as-is. Unlike {@link info} it is not prefixed, since these messages name their own path. */
88
+ protected error(message: string, ...params: unknown[]): void {
89
+ this.logger.error(message, ...params);
90
+ }
91
+
92
+ protected info(prefix: string, ...params: unknown[]): void {
93
+ this.logger.info(`${prefix} ${this.constructor.name}(${this.debugId} at "${this.target}"):`, ...params);
94
+ }
95
+
96
+ protected debug(prefix: string, ...params: unknown[]): void {
97
+ if (this.logger.verbose) {
98
+ this.info(prefix, ...params);
99
+ }
100
+ }
101
+ }
102
+
103
+ export type ResolvedWatchOptions = Required<WatchOptions>;
104
+
105
+ /** Serves either recursive or non-recursive requests, and decides which watcher serves each one. */
106
+ export interface WatcherProvider {
107
+ /** @returns `true` if this provider serves requests made with these options. */
108
+ canHandle(options: ResolvedWatchOptions): boolean;
109
+ /** Serves `request` under `watcherId`, on a watcher shared with requests resolving to the same target. */
110
+ watch(watcherId: number, request: WatchRequest): Promise<void>;
111
+ /**
112
+ * Releases the request registered under `watcherId`.
113
+ * @returns `true` if this provider served the request.
114
+ */
115
+ unwatch(watcherId: number): boolean;
116
+ }
117
+
118
+ /** A {@link WatcherProvider} that keeps one watcher per target. Subclasses decide which key a target maps to. */
119
+ export abstract class AbstractWatcherProvider implements WatcherProvider {
120
+
121
+ private readonly watchersByTarget = new Map<string, FileSystemWatcher>();
122
+ /** The watcher that serves each request, by `watcherId`. */
123
+ private readonly watchersByRequest = new Map<number, FileSystemWatcher>();
124
+
125
+ /** Every watcher this provider currently has open. */
126
+ protected get activeWatchers(): readonly FileSystemWatcher[] {
127
+ return Array.from(this.watchersByTarget.values());
128
+ }
129
+
130
+ abstract canHandle(options: ResolvedWatchOptions): boolean;
131
+ abstract watch(watcherId: number, request: WatchRequest): Promise<void>;
132
+
133
+ unwatch(watcherId: number): boolean {
134
+ const watcher = this.watchersByRequest.get(watcherId);
135
+ if (!watcher) {
136
+ return false;
137
+ }
138
+ this.watchersByRequest.delete(watcherId);
139
+ watcher.removeRequest(watcherId);
140
+ return true;
141
+ }
142
+
143
+ /** The watcher serving a request, if this provider has one. */
144
+ protected watcherFor(watcherId: number): FileSystemWatcher | undefined {
145
+ return this.watchersByRequest.get(watcherId);
146
+ }
147
+
148
+ /** Puts a request on a watcher and records which one, so {@link unwatch} finds it again. */
149
+ protected serve(watcherId: number, watcher: FileSystemWatcher, request: WatchRequest): void {
150
+ watcher.addRequest(watcherId, request);
151
+ this.assign(watcherId, watcher);
152
+ }
153
+
154
+ /** Records the watcher of a request that reached it without {@link serve}, such as through a re-key. */
155
+ protected assign(watcherId: number, watcher: FileSystemWatcher): void {
156
+ this.watchersByRequest.set(watcherId, watcher);
157
+ }
158
+
159
+ /**
160
+ * Returns the watcher under `watcherKey`, or creates one. A disposed watcher stays in the map until a later
161
+ * promise callback removes it, so it is replaced here rather than handed a new request.
162
+ */
163
+ protected getOrCreateWatcher<T extends FileSystemWatcher>(watcherKey: string, create: () => T): T {
164
+ const existing = this.watchersByTarget.get(watcherKey);
165
+ if (existing && !existing.isDisposed) {
166
+ return existing as T;
167
+ }
168
+ const watcher = create();
169
+ this.watchersByTarget.set(watcherKey, watcher);
170
+ watcher.whenDisposed.then(() => {
171
+ if (this.watchersByTarget.get(watcherKey) === watcher) {
172
+ this.watchersByTarget.delete(watcherKey);
173
+ }
174
+ // Requests it handed to another watcher already point there, so drop only the ones still on it.
175
+ for (const [watcherId, serving] of this.watchersByRequest) {
176
+ if (serving === watcher) {
177
+ this.watchersByRequest.delete(watcherId);
178
+ }
179
+ }
180
+ });
181
+ return watcher;
182
+ }
183
+
184
+ /** @returns `true` if `watcher` is the one registered under `watcherKey`. */
185
+ protected isRegisteredAs(watcher: FileSystemWatcher, watcherKey: string): boolean {
186
+ return this.watchersByTarget.get(watcherKey) === watcher;
187
+ }
188
+
189
+ /** Forgets every key a watcher is registered under, so that it can be registered under another. */
190
+ protected unregisterWatcher(watcher: FileSystemWatcher): void {
191
+ for (const [watcherKey, registered] of this.watchersByTarget) {
192
+ if (registered === watcher) {
193
+ this.watchersByTarget.delete(watcherKey);
194
+ }
195
+ }
196
+ }
197
+ }