@theia/filesystem 1.65.0-next.55 → 1.65.0

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 (117) hide show
  1. package/lib/browser/download/file-download-command-contribution.d.ts +1 -1
  2. package/lib/browser/download/file-download-command-contribution.d.ts.map +1 -1
  3. package/lib/browser/download/file-download-command-contribution.js +3 -3
  4. package/lib/browser/download/file-download-command-contribution.js.map +1 -1
  5. package/lib/browser/download/file-download-frontend-module.d.ts.map +1 -1
  6. package/lib/browser/download/file-download-frontend-module.js +2 -1
  7. package/lib/browser/download/file-download-frontend-module.js.map +1 -1
  8. package/lib/browser/download/file-download-service.d.ts +2 -10
  9. package/lib/browser/download/file-download-service.d.ts.map +1 -1
  10. package/lib/browser/download/file-download-service.js +8 -7
  11. package/lib/browser/download/file-download-service.js.map +1 -1
  12. package/lib/browser/file-tree/file-tree-widget.d.ts +1 -1
  13. package/lib/browser/file-tree/file-tree-widget.d.ts.map +1 -1
  14. package/lib/browser/file-tree/file-tree-widget.js +3 -3
  15. package/lib/browser/file-tree/file-tree-widget.js.map +1 -1
  16. package/lib/browser/filesystem-frontend-contribution.d.ts +2 -2
  17. package/lib/browser/filesystem-frontend-contribution.d.ts.map +1 -1
  18. package/lib/browser/filesystem-frontend-contribution.js +3 -3
  19. package/lib/browser/filesystem-frontend-contribution.js.map +1 -1
  20. package/lib/browser/filesystem-frontend-module.d.ts.map +1 -1
  21. package/lib/browser/filesystem-frontend-module.js +3 -2
  22. package/lib/browser/filesystem-frontend-module.js.map +1 -1
  23. package/lib/browser/{file-upload-service.d.ts → upload/file-upload-service-impl.d.ts} +16 -52
  24. package/lib/browser/upload/file-upload-service-impl.d.ts.map +1 -0
  25. package/lib/browser/{file-upload-service.js → upload/file-upload-service-impl.js} +27 -27
  26. package/lib/browser/upload/file-upload-service-impl.js.map +1 -0
  27. package/lib/browser-only/browser-only-filesystem-frontend-module.d.ts.map +1 -1
  28. package/lib/browser-only/browser-only-filesystem-frontend-module.js +8 -0
  29. package/lib/browser-only/browser-only-filesystem-frontend-module.js.map +1 -1
  30. package/lib/browser-only/download/file-download-command-contribution.d.ts +15 -0
  31. package/lib/browser-only/download/file-download-command-contribution.d.ts.map +1 -0
  32. package/lib/browser-only/download/file-download-command-contribution.js +55 -0
  33. package/lib/browser-only/download/file-download-command-contribution.js.map +1 -0
  34. package/lib/browser-only/download/file-download-frontend-module.d.ts +4 -0
  35. package/lib/browser-only/download/file-download-frontend-module.d.ts.map +1 -0
  36. package/lib/browser-only/download/file-download-frontend-module.js +27 -0
  37. package/lib/browser-only/download/file-download-frontend-module.js.map +1 -0
  38. package/lib/browser-only/download/file-download-service.d.ts +86 -0
  39. package/lib/browser-only/download/file-download-service.d.ts.map +1 -0
  40. package/lib/browser-only/download/file-download-service.js +551 -0
  41. package/lib/browser-only/download/file-download-service.js.map +1 -0
  42. package/lib/browser-only/file-search.d.ts +38 -0
  43. package/lib/browser-only/file-search.d.ts.map +1 -0
  44. package/lib/browser-only/file-search.js +153 -0
  45. package/lib/browser-only/file-search.js.map +1 -0
  46. package/lib/browser-only/opfs-filesystem-initialization.d.ts +4 -2
  47. package/lib/browser-only/opfs-filesystem-initialization.d.ts.map +1 -1
  48. package/lib/browser-only/opfs-filesystem-initialization.js +4 -1
  49. package/lib/browser-only/opfs-filesystem-initialization.js.map +1 -1
  50. package/lib/browser-only/opfs-filesystem-provider.d.ts +89 -12
  51. package/lib/browser-only/opfs-filesystem-provider.d.ts.map +1 -1
  52. package/lib/browser-only/opfs-filesystem-provider.js +345 -181
  53. package/lib/browser-only/opfs-filesystem-provider.js.map +1 -1
  54. package/lib/browser-only/upload/file-upload-service-impl.d.ts +67 -0
  55. package/lib/browser-only/upload/file-upload-service-impl.d.ts.map +1 -0
  56. package/lib/browser-only/upload/file-upload-service-impl.js +328 -0
  57. package/lib/browser-only/upload/file-upload-service-impl.js.map +1 -0
  58. package/lib/common/download/file-download.d.ts +17 -0
  59. package/lib/common/download/file-download.d.ts.map +1 -0
  60. package/lib/common/download/{file-download-data.js → file-download.js} +3 -2
  61. package/lib/common/download/file-download.js.map +1 -0
  62. package/lib/common/files.d.ts +8 -1
  63. package/lib/common/files.d.ts.map +1 -1
  64. package/lib/common/files.js +35 -1
  65. package/lib/common/files.js.map +1 -1
  66. package/lib/common/io.js +7 -1
  67. package/lib/common/io.js.map +1 -1
  68. package/lib/common/upload/file-upload.d.ts +45 -0
  69. package/lib/common/upload/file-upload.d.ts.map +1 -0
  70. package/{src/common/download/file-download-data.ts → lib/common/upload/file-upload.js} +6 -13
  71. package/lib/common/upload/file-upload.js.map +1 -0
  72. package/lib/node/disk-file-system-provider.d.ts.map +1 -1
  73. package/lib/node/disk-file-system-provider.js +2 -4
  74. package/lib/node/disk-file-system-provider.js.map +1 -1
  75. package/lib/node/download/file-download-handler.js +2 -2
  76. package/lib/node/download/file-download-handler.js.map +1 -1
  77. package/lib/node/filesystem-backend-module.js +1 -1
  78. package/lib/node/filesystem-backend-module.js.map +1 -1
  79. package/lib/node/parcel-watcher/parcel-filesystem-service.d.ts +2 -2
  80. package/lib/node/parcel-watcher/parcel-filesystem-service.d.ts.map +1 -1
  81. package/lib/node/parcel-watcher/parcel-filesystem-service.js.map +1 -1
  82. package/lib/node/upload/node-file-upload-service.d.ts.map +1 -0
  83. package/lib/node/{node-file-upload-service.js → upload/node-file-upload-service.js} +1 -1
  84. package/lib/node/upload/node-file-upload-service.js.map +1 -0
  85. package/package.json +10 -5
  86. package/src/browser/download/file-download-command-contribution.ts +1 -1
  87. package/src/browser/download/file-download-frontend-module.ts +3 -2
  88. package/src/browser/download/file-download-service.ts +7 -12
  89. package/src/browser/file-tree/file-tree-widget.tsx +1 -1
  90. package/src/browser/filesystem-frontend-contribution.ts +2 -2
  91. package/src/browser/filesystem-frontend-module.ts +3 -2
  92. package/src/browser/{file-upload-service.ts → upload/file-upload-service-impl.ts} +31 -72
  93. package/src/browser-only/browser-only-filesystem-frontend-module.ts +10 -0
  94. package/src/browser-only/download/file-download-command-contribution.ts +56 -0
  95. package/src/browser-only/download/file-download-frontend-module.ts +26 -0
  96. package/src/browser-only/download/file-download-service.ts +726 -0
  97. package/src/browser-only/file-search.ts +170 -0
  98. package/src/browser-only/opfs-filesystem-initialization.ts +7 -4
  99. package/src/browser-only/opfs-filesystem-provider.ts +402 -189
  100. package/src/browser-only/upload/file-upload-service-impl.ts +408 -0
  101. package/src/common/download/file-download.ts +40 -0
  102. package/src/common/files.ts +42 -1
  103. package/src/common/io.ts +6 -1
  104. package/src/common/upload/file-upload.ts +65 -0
  105. package/src/node/disk-file-system-provider.ts +3 -4
  106. package/src/node/download/file-download-handler.ts +1 -1
  107. package/src/node/filesystem-backend-module.ts +1 -1
  108. package/src/node/parcel-watcher/parcel-filesystem-service.ts +2 -2
  109. package/src/node/{node-file-upload-service.ts → upload/node-file-upload-service.ts} +1 -1
  110. package/lib/browser/file-upload-service.d.ts.map +0 -1
  111. package/lib/browser/file-upload-service.js.map +0 -1
  112. package/lib/common/download/file-download-data.d.ts +0 -7
  113. package/lib/common/download/file-download-data.d.ts.map +0 -1
  114. package/lib/common/download/file-download-data.js.map +0 -1
  115. package/lib/node/node-file-upload-service.d.ts.map +0 -1
  116. package/lib/node/node-file-upload-service.js.map +0 -1
  117. /package/lib/node/{node-file-upload-service.d.ts → upload/node-file-upload-service.d.ts} +0 -0
@@ -0,0 +1,551 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2025 Maksim Kachurin and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.FileDownloadServiceImpl = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const inversify_1 = require("@theia/core/shared/inversify");
21
+ const logger_1 = require("@theia/core/lib/common/logger");
22
+ const message_service_1 = require("@theia/core/lib/common/message-service");
23
+ const filesystem_preferences_1 = require("../../common/filesystem-preferences");
24
+ const core_1 = require("@theia/core");
25
+ const stream_1 = require("@theia/core/lib/common/stream");
26
+ const file_service_1 = require("../../browser/file-service");
27
+ const tarStream = require("tar-stream");
28
+ const minimatch_1 = require("minimatch");
29
+ let FileDownloadServiceImpl = class FileDownloadServiceImpl {
30
+ constructor() {
31
+ this.ignorePatterns = [];
32
+ }
33
+ getFileSizeThreshold() {
34
+ return this.preferences['files.maxFileSizeMB'] * 1024 * 1024;
35
+ }
36
+ /**
37
+ * Check if streaming download is supported (File System Access API)
38
+ */
39
+ isStreamingSupported() {
40
+ var _a, _b;
41
+ if (!globalThis.isSecureContext) {
42
+ return false;
43
+ }
44
+ if (!('showSaveFilePicker' in globalThis)) {
45
+ return false;
46
+ }
47
+ try {
48
+ return typeof ((_b = (_a = globalThis.ReadableStream) === null || _a === void 0 ? void 0 : _a.prototype) === null || _b === void 0 ? void 0 : _b.pipeTo) === 'function';
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ async download(uris, options) {
55
+ if (uris.length === 0) {
56
+ return;
57
+ }
58
+ const abortController = new AbortController();
59
+ try {
60
+ const progress = await this.messageService.showProgress({
61
+ text: core_1.nls.localize('theia/filesystem/prepareDownload', 'Preparing download...'),
62
+ options: { cancelable: true },
63
+ }, () => {
64
+ abortController.abort();
65
+ });
66
+ try {
67
+ await this.doDownload(uris, abortController.signal);
68
+ }
69
+ finally {
70
+ progress.cancel();
71
+ }
72
+ }
73
+ catch (e) {
74
+ if (!abortController.signal.aborted) {
75
+ this.logger.error(`Error occurred when downloading: ${uris.map(u => u.toString(true))}.`, e);
76
+ this.messageService.error(core_1.nls.localize('theia/filesystem/downloadError', 'Failed to download files. See console for details.'));
77
+ }
78
+ }
79
+ }
80
+ async doDownload(uris, abortSignal) {
81
+ try {
82
+ const { files, directories, totalSize, stats } = await this.collectFiles(uris, abortSignal);
83
+ if (abortSignal.aborted) {
84
+ return;
85
+ }
86
+ if (totalSize > this.getFileSizeThreshold() &&
87
+ this.isStreamingSupported()) {
88
+ await this.streamDownloadToFile(uris, files, directories, stats, abortSignal);
89
+ }
90
+ else {
91
+ let data;
92
+ let filename = 'theia-download.tar';
93
+ if (uris.length === 1) {
94
+ const stat = stats[0];
95
+ if (stat.isDirectory) {
96
+ filename = `${stat.name}.tar`;
97
+ data = await this.createArchiveBlob(async (tarPack) => {
98
+ await this.addFilesToArchive(tarPack, files, directories, abortSignal);
99
+ }, abortSignal);
100
+ }
101
+ else {
102
+ filename = stat.name;
103
+ const content = await this.fileService.readFile(uris[0]);
104
+ data = new Blob([content.value.buffer], {
105
+ type: 'application/octet-stream',
106
+ });
107
+ }
108
+ }
109
+ else {
110
+ data = await this.createArchiveBlob(async (tarPack) => {
111
+ await this.addFilesToArchive(tarPack, files, directories, abortSignal);
112
+ }, abortSignal);
113
+ }
114
+ if (!abortSignal.aborted) {
115
+ this.blobDownload(data, filename);
116
+ }
117
+ }
118
+ }
119
+ catch (error) {
120
+ if (!abortSignal.aborted) {
121
+ this.logger.error('Failed to download files', error);
122
+ throw error;
123
+ }
124
+ }
125
+ }
126
+ async createArchiveBlob(populateArchive, abortSignal) {
127
+ const stream = this.createArchiveStream(abortSignal, populateArchive);
128
+ const reader = stream.getReader();
129
+ const chunks = [];
130
+ let total = 0;
131
+ try {
132
+ while (true) {
133
+ if (abortSignal.aborted) {
134
+ throw new Error('Operation aborted');
135
+ }
136
+ const { done, value } = await reader.read();
137
+ if (done) {
138
+ break;
139
+ }
140
+ chunks.push(value);
141
+ total += value.byteLength;
142
+ }
143
+ const out = new Uint8Array(total);
144
+ let off = 0;
145
+ for (const c of chunks) {
146
+ out.set(c, off);
147
+ off += c.byteLength;
148
+ }
149
+ return new Blob([out], { type: 'application/x-tar' });
150
+ }
151
+ finally {
152
+ try {
153
+ reader.releaseLock();
154
+ }
155
+ catch { }
156
+ }
157
+ }
158
+ /**
159
+ * Create ReadableStream from a single file using FileService streaming
160
+ */
161
+ async createFileStream(uri, abortSignal) {
162
+ if (abortSignal.aborted) {
163
+ throw new Error('Operation aborted');
164
+ }
165
+ const fileStreamContent = await this.fileService.readFileStream(uri);
166
+ return (0, stream_1.binaryStreamToWebStream)(fileStreamContent.value, abortSignal);
167
+ }
168
+ async addFileToArchive(tarPack, file, abortSignal) {
169
+ if (abortSignal.aborted) {
170
+ return;
171
+ }
172
+ try {
173
+ const name = this.sanitizeFilename(file.path);
174
+ const size = file.size;
175
+ const entry = tarPack.entry({ name, size });
176
+ const fileStreamContent = await this.fileService.readFileStream(file.uri);
177
+ const src = fileStreamContent.value;
178
+ return new Promise((resolve, reject) => {
179
+ var _a, _b, _c, _d;
180
+ const cleanup = () => {
181
+ var _a, _b, _c, _d;
182
+ (_a = src.removeListener) === null || _a === void 0 ? void 0 : _a.call(src, 'data', onData);
183
+ (_b = src.removeListener) === null || _b === void 0 ? void 0 : _b.call(src, 'end', onEnd);
184
+ (_c = src.removeListener) === null || _c === void 0 ? void 0 : _c.call(src, 'error', onError);
185
+ (_d = entry.removeListener) === null || _d === void 0 ? void 0 : _d.call(entry, 'error', onEntryError);
186
+ abortSignal.removeEventListener('abort', onAbort);
187
+ };
188
+ const onAbort = () => {
189
+ var _a;
190
+ cleanup();
191
+ (_a = entry.destroy) === null || _a === void 0 ? void 0 : _a.call(entry);
192
+ reject(new Error('Operation aborted'));
193
+ };
194
+ let ended = false;
195
+ let pendingWrite = undefined;
196
+ const onData = async (chunk) => {
197
+ var _a, _b;
198
+ if (abortSignal.aborted || ended) {
199
+ return;
200
+ }
201
+ (_a = src.pause) === null || _a === void 0 ? void 0 : _a.call(src);
202
+ const u8 = new Uint8Array(chunk.buffer);
203
+ const canWrite = entry.write(u8);
204
+ if (!canWrite) {
205
+ pendingWrite = new Promise(resolveDrain => {
206
+ entry.once('drain', resolveDrain);
207
+ });
208
+ await pendingWrite;
209
+ pendingWrite = undefined;
210
+ }
211
+ if (!ended) {
212
+ (_b = src.resume) === null || _b === void 0 ? void 0 : _b.call(src);
213
+ }
214
+ };
215
+ const onEnd = async () => {
216
+ ended = true;
217
+ if (pendingWrite) {
218
+ await pendingWrite;
219
+ }
220
+ cleanup();
221
+ entry.end();
222
+ resolve();
223
+ };
224
+ const onError = (err) => {
225
+ var _a;
226
+ cleanup();
227
+ try {
228
+ (_a = entry.destroy) === null || _a === void 0 ? void 0 : _a.call(entry, err);
229
+ }
230
+ catch { }
231
+ reject(err);
232
+ };
233
+ const onEntryError = (err) => {
234
+ cleanup();
235
+ reject(new Error(`Entry error for ${name}: ${err.message}`));
236
+ };
237
+ if (abortSignal.aborted) {
238
+ return onAbort();
239
+ }
240
+ abortSignal.addEventListener('abort', onAbort, { once: true });
241
+ (_a = entry.on) === null || _a === void 0 ? void 0 : _a.call(entry, 'error', onEntryError);
242
+ (_b = src.on) === null || _b === void 0 ? void 0 : _b.call(src, 'data', onData);
243
+ (_c = src.on) === null || _c === void 0 ? void 0 : _c.call(src, 'end', onEnd);
244
+ (_d = src.on) === null || _d === void 0 ? void 0 : _d.call(src, 'error', onError);
245
+ });
246
+ }
247
+ catch (error) {
248
+ this.logger.error(`Failed to read file ${file.uri.toString()}:`, error);
249
+ throw error;
250
+ }
251
+ }
252
+ async addFilesToArchive(tarPack, files, directories, abortSignal) {
253
+ const uniqueDirs = new Set();
254
+ for (const dir of directories) {
255
+ const normalizedPath = this.sanitizeFilename(dir.path) + '/';
256
+ uniqueDirs.add(normalizedPath);
257
+ }
258
+ for (const dirPath of uniqueDirs) {
259
+ try {
260
+ const entry = tarPack.entry({
261
+ name: dirPath,
262
+ type: 'directory',
263
+ });
264
+ entry.end();
265
+ }
266
+ catch (error) {
267
+ this.logger.error(`Failed to add directory ${dirPath}:`, error);
268
+ }
269
+ }
270
+ for (const file of files) {
271
+ if (abortSignal.aborted) {
272
+ break;
273
+ }
274
+ try {
275
+ await this.addFileToArchive(tarPack, file, abortSignal);
276
+ }
277
+ catch (error) {
278
+ this.logger.error(`Failed to read file ${file.uri.toString()}:`, error);
279
+ }
280
+ }
281
+ }
282
+ createArchiveStream(abortSignal, populateArchive) {
283
+ const tarPack = tarStream.pack();
284
+ return new ReadableStream({
285
+ start(controller) {
286
+ const cleanup = () => {
287
+ var _a;
288
+ try {
289
+ tarPack.removeAllListeners();
290
+ }
291
+ catch { }
292
+ try {
293
+ (_a = tarPack.destroy) === null || _a === void 0 ? void 0 : _a.call(tarPack);
294
+ }
295
+ catch { }
296
+ abortSignal.removeEventListener('abort', onAbort);
297
+ };
298
+ const onAbort = () => {
299
+ cleanup();
300
+ controller.error(new Error('Operation aborted'));
301
+ };
302
+ if (abortSignal.aborted) {
303
+ onAbort();
304
+ return;
305
+ }
306
+ abortSignal.addEventListener('abort', onAbort, { once: true });
307
+ tarPack.on('data', (chunk) => {
308
+ if (abortSignal.aborted) {
309
+ return;
310
+ }
311
+ try {
312
+ controller.enqueue(chunk);
313
+ }
314
+ catch (error) {
315
+ cleanup();
316
+ controller.error(error);
317
+ }
318
+ });
319
+ tarPack.once('end', () => {
320
+ cleanup();
321
+ controller.close();
322
+ });
323
+ tarPack.once('error', error => {
324
+ cleanup();
325
+ controller.error(error);
326
+ });
327
+ populateArchive(tarPack)
328
+ .then(() => {
329
+ if (!abortSignal.aborted) {
330
+ tarPack.finalize();
331
+ }
332
+ })
333
+ .catch(error => {
334
+ cleanup();
335
+ controller.error(error);
336
+ });
337
+ },
338
+ cancel: () => {
339
+ var _a, _b;
340
+ try {
341
+ (_a = tarPack.finalize) === null || _a === void 0 ? void 0 : _a.call(tarPack);
342
+ (_b = tarPack.destroy) === null || _b === void 0 ? void 0 : _b.call(tarPack);
343
+ }
344
+ catch { }
345
+ },
346
+ });
347
+ }
348
+ async streamDownloadToFile(uris, files, directories, stats, abortSignal) {
349
+ var _a;
350
+ let filename = 'theia-download.tar';
351
+ if (uris.length === 1) {
352
+ const stat = stats[0];
353
+ filename = stat.isDirectory ? `${stat.name}.tar` : stat.name;
354
+ }
355
+ const isArchive = filename.endsWith('.tar');
356
+ let fileHandle;
357
+ try {
358
+ // @ts-expect-error non-standard
359
+ fileHandle = await window.showSaveFilePicker({
360
+ suggestedName: filename,
361
+ types: isArchive
362
+ ? [
363
+ {
364
+ description: 'Archive files',
365
+ accept: { 'application/x-tar': ['.tar'] },
366
+ },
367
+ ]
368
+ : undefined,
369
+ });
370
+ }
371
+ catch (error) {
372
+ if (error instanceof DOMException && error.name === 'AbortError') {
373
+ return;
374
+ }
375
+ throw error;
376
+ }
377
+ let stream;
378
+ if (uris.length === 1) {
379
+ const stat = await this.fileService.resolve(uris[0]);
380
+ stream = stat.isDirectory
381
+ ? this.createArchiveStream(abortSignal, async (tarPack) => {
382
+ await this.addFilesToArchive(tarPack, files, directories, abortSignal);
383
+ })
384
+ : await this.createFileStream(uris[0], abortSignal);
385
+ }
386
+ else {
387
+ stream = this.createArchiveStream(abortSignal, async (tarPack) => {
388
+ await this.addFilesToArchive(tarPack, files, directories, abortSignal);
389
+ });
390
+ }
391
+ const writable = await fileHandle.createWritable();
392
+ try {
393
+ await stream.pipeTo(writable, { signal: abortSignal });
394
+ }
395
+ catch (error) {
396
+ try {
397
+ await ((_a = writable.abort) === null || _a === void 0 ? void 0 : _a.call(writable));
398
+ }
399
+ catch { }
400
+ throw error;
401
+ }
402
+ }
403
+ blobDownload(data, filename) {
404
+ const url = URL.createObjectURL(data);
405
+ const a = document.createElement('a');
406
+ a.href = url;
407
+ a.download = filename;
408
+ a.style.display = 'none';
409
+ document.body.appendChild(a);
410
+ a.click();
411
+ setTimeout(() => {
412
+ document.body.removeChild(a);
413
+ URL.revokeObjectURL(url);
414
+ }, 0);
415
+ }
416
+ sanitizeFilename(filename) {
417
+ return filename
418
+ .replace(/[\\:*?"<>|]/g, '_') // Replace Windows-problematic chars
419
+ .replace(/\.\./g, '__') // Replace .. to prevent directory traversal
420
+ .replace(/^\/+/g, '') // Remove leading slashes
421
+ .replace(/\/+$/, '') // Remove trailing slashes for files
422
+ .replace(/[\u0000-\u001f\u007f]/g, '_') // Replace control characters
423
+ .replace(/\/+/g, '/')
424
+ .replace(/^\.$/, '_')
425
+ .replace(/^$/, '_');
426
+ }
427
+ shouldIncludeFile(path) {
428
+ return !this.ignorePatterns.some((pattern) => (0, minimatch_1.minimatch)(path, pattern));
429
+ }
430
+ /**
431
+ * Collect all files and calculate total size
432
+ */
433
+ async collectFiles(uris, abortSignal) {
434
+ var _a;
435
+ const files = [];
436
+ const directories = [];
437
+ let totalSize = 0;
438
+ const stats = [];
439
+ for (const uri of uris) {
440
+ if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
441
+ break;
442
+ }
443
+ try {
444
+ const stat = await this.fileService.resolve(uri, {
445
+ resolveMetadata: true,
446
+ });
447
+ stats.push({
448
+ name: stat.name,
449
+ isDirectory: stat.isDirectory,
450
+ size: stat.size,
451
+ });
452
+ if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
453
+ break;
454
+ }
455
+ if (!stat.isDirectory) {
456
+ const size = stat.size || 0;
457
+ files.push({ uri, path: stat.name, size });
458
+ totalSize += size;
459
+ continue;
460
+ }
461
+ if (!((_a = stat.children) === null || _a === void 0 ? void 0 : _a.length)) {
462
+ directories.push({ path: stat.name });
463
+ continue;
464
+ }
465
+ directories.push({ path: stat.name });
466
+ const dirResult = await this.collectFilesFromDirectory(uri, stat.name, abortSignal);
467
+ files.push(...dirResult.files);
468
+ directories.push(...dirResult.directories);
469
+ totalSize += dirResult.files.reduce((sum, file) => sum + file.size, 0);
470
+ }
471
+ catch (error) {
472
+ this.logger.warn(`Failed to collect files from ${uri.toString()}:`, error);
473
+ stats.push({
474
+ name: uri.path.name || 'unknown',
475
+ isDirectory: false,
476
+ size: 0,
477
+ });
478
+ }
479
+ }
480
+ return { files, directories, totalSize, stats };
481
+ }
482
+ /**
483
+ * Recursively collect files from a directory
484
+ */
485
+ async collectFilesFromDirectory(dirUri, basePath, abortSignal) {
486
+ var _a;
487
+ const files = [];
488
+ const directories = [];
489
+ try {
490
+ const dirStat = await this.fileService.resolve(dirUri);
491
+ if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
492
+ return { files, directories };
493
+ }
494
+ // Empty directory - add it to preserve structure
495
+ if (!((_a = dirStat.children) === null || _a === void 0 ? void 0 : _a.length)) {
496
+ directories.push({ path: basePath });
497
+ return { files, directories };
498
+ }
499
+ for (const child of dirStat.children) {
500
+ if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
501
+ break;
502
+ }
503
+ const childPath = basePath
504
+ ? `${basePath}/${child.name}`
505
+ : child.name;
506
+ if (!this.shouldIncludeFile(childPath)) {
507
+ continue;
508
+ }
509
+ if (child.isDirectory) {
510
+ directories.push({ path: childPath });
511
+ const subResult = await this.collectFilesFromDirectory(child.resource, childPath, abortSignal);
512
+ files.push(...subResult.files);
513
+ directories.push(...subResult.directories);
514
+ }
515
+ else {
516
+ const childStat = await this.fileService.resolve(child.resource);
517
+ files.push({
518
+ uri: child.resource,
519
+ path: childPath,
520
+ size: childStat.size || 0,
521
+ });
522
+ }
523
+ }
524
+ }
525
+ catch (error) {
526
+ this.logger.warn(`Failed to collect files from directory ${dirUri.toString()}:`, error);
527
+ }
528
+ return { files, directories };
529
+ }
530
+ };
531
+ exports.FileDownloadServiceImpl = FileDownloadServiceImpl;
532
+ tslib_1.__decorate([
533
+ (0, inversify_1.inject)(file_service_1.FileService),
534
+ tslib_1.__metadata("design:type", file_service_1.FileService)
535
+ ], FileDownloadServiceImpl.prototype, "fileService", void 0);
536
+ tslib_1.__decorate([
537
+ (0, inversify_1.inject)(logger_1.ILogger),
538
+ tslib_1.__metadata("design:type", Object)
539
+ ], FileDownloadServiceImpl.prototype, "logger", void 0);
540
+ tslib_1.__decorate([
541
+ (0, inversify_1.inject)(message_service_1.MessageService),
542
+ tslib_1.__metadata("design:type", message_service_1.MessageService)
543
+ ], FileDownloadServiceImpl.prototype, "messageService", void 0);
544
+ tslib_1.__decorate([
545
+ (0, inversify_1.inject)(filesystem_preferences_1.FileSystemPreferences),
546
+ tslib_1.__metadata("design:type", Object)
547
+ ], FileDownloadServiceImpl.prototype, "preferences", void 0);
548
+ exports.FileDownloadServiceImpl = FileDownloadServiceImpl = tslib_1.__decorate([
549
+ (0, inversify_1.injectable)()
550
+ ], FileDownloadServiceImpl);
551
+ //# sourceMappingURL=file-download-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-download-service.js","sourceRoot":"","sources":["../../../src/browser-only/download/file-download-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,iDAAiD;AACjD,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAAkE;AAElE,0DAAwD;AACxD,4EAAwE;AACxE,gFAA4E;AAC5E,sCAAkC;AAElC,0DAAwE;AACxE,6DAAyD;AAEzD,wCAAwC;AACxC,yCAAsC;AAG/B,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAA7B;QAac,mBAAc,GAAa,EAAE,CAAC;IA0qBnD,CAAC;IAxqBa,oBAAoB;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACjE,CAAC;IAED;;OAEG;IACO,oBAAoB;;QAC1B,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,CAAC,oBAAoB,IAAI,UAAU,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,CAAC;YACD,OAAO,OAAO,CAAA,MAAA,MAAC,UAAmF,CAAC,cAAc,0CAAE,SAAS,0CAAE,MAAM,CAAA,KAAK,UAAU,CAAC;QACxJ,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAW,EAAE,OAAe;QACvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO;QACX,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE9C,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CACnD;gBACI,IAAI,EAAE,UAAG,CAAC,QAAQ,CACd,kCAAkC,EAClC,uBAAuB,CAC1B;gBACD,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;aAChC,EACD,GAAG,EAAE;gBACD,eAAe,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC,CACJ,CAAC;YAEF,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;YACxD,CAAC;oBAAS,CAAC;gBACX,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,oCAAoC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC7C,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CACnB,GAAG,EACJ,CAAC,CACJ,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,KAAK,CACrB,UAAG,CAAC,QAAQ,CACR,gCAAgC,EAChC,oDAAoD,CACvD,CACJ,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAES,KAAK,CAAC,UAAU,CACtB,IAAW,EACX,WAAwB;QAExB,IAAI,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,GAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAE/C,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO;YACX,CAAC;YAED,IACI,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE;gBACvC,IAAI,CAAC,oBAAoB,EAAE,EAC7B,CAAC;gBACC,MAAM,IAAI,CAAC,oBAAoB,CAC3B,IAAI,EACJ,KAAK,EACL,WAAW,EACX,KAAK,EACL,WAAW,CACd,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,IAAI,IAAU,CAAC;gBACf,IAAI,QAAQ,GAAW,oBAAoB,CAAC;gBAE5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACpB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAEtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBACnB,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC;wBAC9B,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;4BAChD,MAAM,IAAI,CAAC,iBAAiB,CACxB,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAW,CACd,CAAC;wBACN,CAAC,EAAE,WAAW,CAAC,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACJ,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;wBACrB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAC3C,IAAI,CAAC,CAAC,CAAC,CACV,CAAC;wBACF,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAkB,CAAC,EAAE;4BAChD,IAAI,EAAE,0BAA0B;yBACnC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;wBAChD,MAAM,IAAI,CAAC,iBAAiB,CACxB,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAW,CACd,CAAC;oBACN,CAAC,EAAE,WAAW,CAAC,CAAC;gBACpB,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACvB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;gBACrD,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC;IACL,CAAC;IAES,KAAK,CAAC,iBAAiB,CAC7B,eAA2D,EAC3D,WAAwB;QAExB,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,IAAI,CAAC;YACD,OAAO,IAAI,EAAE,CAAC;gBACV,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACzC,CAAC;gBACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI,EAAE,CAAC;oBACP,MAAM;gBACV,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC;gBACpB,KAAK,IAAI,KAAM,CAAC,UAAU,CAAC;YAC/B,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,GAAG,GAAG,CAAC,CAAC;YAEZ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAChB,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC;YACxB,CAAC;YACD,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC;gBACD,MAAM,CAAC,WAAW,EAAE,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,gBAAgB,CAC5B,GAAQ,EACR,WAAwB;QAExB,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAErE,OAAO,IAAA,gCAAuB,EAAC,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACzE,CAAC;IAES,KAAK,CAAC,gBAAgB,CAC5B,OAAuB,EACvB,IAA8C,EAC9C,WAAwB;QAExB,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5C,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAC3D,IAAI,CAAC,GAAG,CACX,CAAC;YACF,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC;YAEpC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;;gBACzC,MAAM,OAAO,GAAG,GAAG,EAAE;;oBACjB,MAAA,GAAG,CAAC,cAAc,oDAAG,MAAM,EAAE,MAAM,CAAC,CAAC;oBACrC,MAAA,GAAG,CAAC,cAAc,oDAAG,KAAK,EAAE,KAAK,CAAC,CAAC;oBACnC,MAAA,GAAG,CAAC,cAAc,oDAAG,OAAO,EAAE,OAAO,CAAC,CAAC;oBACvC,MAAA,KAAK,CAAC,cAAc,sDAAG,OAAO,EAAE,YAAY,CAAC,CAAC;oBAC9C,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtD,CAAC,CAAC;gBAEF,MAAM,OAAO,GAAG,GAAG,EAAE;;oBACjB,OAAO,EAAE,CAAC;oBACV,MAAA,KAAK,CAAC,OAAO,qDAAI,CAAC;oBAClB,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC3C,CAAC,CAAC;gBAEF,IAAI,KAAK,GAAG,KAAK,CAAC;gBAClB,IAAI,YAAY,GAA8B,SAAS,CAAC;gBAExD,MAAM,MAAM,GAAG,KAAK,EAAE,KAAmB,EAAE,EAAE;;oBACzC,IAAI,WAAW,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;wBAC/B,OAAO;oBACX,CAAC;oBAED,MAAA,GAAG,CAAC,KAAK,mDAAI,CAAC;oBAEd,MAAM,EAAE,GAAG,IAAI,UAAU,CACrB,KAAK,CAAC,MAAgC,CACzC,CAAC;oBAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAEjC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACZ,YAAY,GAAG,IAAI,OAAO,CAAO,YAAY,CAAC,EAAE;4BAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;wBACtC,CAAC,CAAC,CAAC;wBACH,MAAM,YAAY,CAAC;wBACnB,YAAY,GAAG,SAAS,CAAC;oBAC7B,CAAC;oBAED,IAAI,CAAC,KAAK,EAAE,CAAC;wBACT,MAAA,GAAG,CAAC,MAAM,mDAAI,CAAC;oBACnB,CAAC;gBACL,CAAC,CAAC;gBAEF,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;oBACrB,KAAK,GAAG,IAAI,CAAC;oBAEb,IAAI,YAAY,EAAE,CAAC;wBACf,MAAM,YAAY,CAAC;oBACvB,CAAC;oBAED,OAAO,EAAE,CAAC;oBACV,KAAK,CAAC,GAAG,EAAE,CAAC;oBACZ,OAAO,EAAE,CAAC;gBACd,CAAC,CAAC;gBAEF,MAAM,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE;;oBAC3B,OAAO,EAAE,CAAC;oBACV,IAAI,CAAC;wBACD,MAAA,KAAK,CAAC,OAAO,sDAAG,GAAG,CAAC,CAAC;oBACzB,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;oBACV,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC,CAAC;gBAEF,MAAM,YAAY,GAAG,CAAC,GAAU,EAAE,EAAE;oBAChC,OAAO,EAAE,CAAC;oBACV,MAAM,CACF,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CACvD,CAAC;gBACN,CAAC,CAAC;gBAEF,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;oBACtB,OAAO,OAAO,EAAE,CAAC;gBACrB,CAAC;gBACD,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE/D,MAAA,KAAK,CAAC,EAAE,sDAAG,OAAO,EAAE,YAAY,CAAC,CAAC;gBAClC,MAAA,GAAG,CAAC,EAAE,oDAAG,MAAM,EAAE,MAAM,CAAC,CAAC;gBACzB,MAAA,GAAG,CAAC,EAAE,oDAAG,KAAK,EAAE,KAAK,CAAC,CAAC;gBACvB,MAAA,GAAG,CAAC,EAAE,oDAAG,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,uBAAuB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAC7C,KAAK,CACR,CAAC;YACF,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAES,KAAK,CAAC,iBAAiB,CAC7B,OAAuB,EACvB,KAAsD,EACtD,WAAoC,EACpC,WAAwB;QAExB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAErC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;YAC7D,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;oBACxB,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,WAAW;iBACpB,CAAC,CAAC;gBAEH,KAAK,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,2BAA2B,OAAO,GAAG,EACrC,KAAK,CACR,CAAC;YACN,CAAC;QACL,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACtB,MAAM;YACV,CAAC;YACD,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,gBAAgB,CACvB,OAAO,EACP,IAAI,EACJ,WAAW,CACd,CAAC;YACV,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,uBAAuB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAC7C,KAAK,CACR,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAES,mBAAmB,CACzB,WAAwB,EACxB,eAA2D;QAE3D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAEjC,OAAO,IAAI,cAAc,CAAa;YAClC,KAAK,CACD,UAAuD;gBAEvD,MAAM,OAAO,GAAG,GAAG,EAAE;;oBACjB,IAAI,CAAC;wBACL,OAAO,CAAC,kBAAkB,EAAE,CAAC;oBAC7B,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;oBACV,IAAI,CAAC;wBACD,MAAA,OAAO,CAAC,OAAO,uDAAI,CAAC;oBACxB,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;oBACV,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtD,CAAC,CAAC;gBAEF,MAAM,OAAO,GAAG,GAAG,EAAE;oBACjB,OAAO,EAAE,CAAC;oBACV,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACrD,CAAC,CAAC;gBAEF,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;oBACtB,OAAO,EAAE,CAAC;oBACV,OAAO;gBACX,CAAC;gBAED,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE/D,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAiB,EAAE,EAAE;oBACrC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACtB,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC;wBACD,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC9B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,OAAO,EAAE,CAAC;wBACV,UAAU,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;oBACrC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;oBACrB,OAAO,EAAE,CAAC;oBACV,UAAU,CAAC,KAAK,EAAE,CAAC;gBACvB,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;oBAC1B,OAAO,EAAE,CAAC;oBACV,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC,CAAC,CAAC;gBAEH,eAAe,CAAC,OAAO,CAAC;qBACnB,IAAI,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;wBACvB,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC,CAAC;qBACD,KAAK,CAAC,KAAK,CAAC,EAAE;oBACX,OAAO,EAAE,CAAC;oBACV,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC,CAAC,CAAC;YACX,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;;gBACT,IAAI,CAAC;oBACD,MAAA,OAAO,CAAC,QAAQ,uDAAI,CAAC;oBACrB,MAAA,OAAO,CAAC,OAAO,uDAAI,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACd,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAES,KAAK,CAAC,oBAAoB,CAChC,IAAW,EACX,KAAsD,EACtD,WAAoC,EACpC,KAAmE,EACnE,WAAwB;;QAExB,IAAI,QAAQ,GAAG,oBAAoB,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjE,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,UAAgC,CAAC;QACrC,IAAI,CAAC;YACD,gCAAgC;YAChC,UAAU,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC;gBAC7C,aAAa,EAAE,QAAQ;gBACnB,KAAK,EAAE,SAAS;oBACZ,CAAC,CAAC;wBACI;4BACV,WAAW,EAAE,eAAe;4BACd,MAAM,EAAE,EAAE,mBAAmB,EAAE,CAAC,MAAM,CAAC,EAAE;yBAC5C;qBACJ;oBACH,CAAC,CAAC,SAAS;aAClB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC/D,OAAO;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;QAED,IAAI,MAAkC,CAAC;QAEvC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,GAAG,IAAI,CAAC,WAAW;gBACrB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;oBAClD,MAAM,IAAI,CAAC,iBAAiB,CACxB,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAW,CACd,CAAC;gBACN,CAAC,CAAC;gBACJ,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACJ,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;gBAC3D,MAAM,IAAI,CAAC,iBAAiB,CACxB,OAAO,EACP,KAAK,EACL,WAAW,EACX,WAAW,CACd,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;QACnD,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC;gBACD,MAAM,CAAA,MAAA,QAAQ,CAAC,KAAK,wDAAI,CAAA,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAES,YAAY,CAAC,IAAU,EAAE,QAAgB;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;QACb,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,KAAK,EAAE,CAAC;QAEV,UAAU,CAAC,GAAG,EAAE;YACZ,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;IACV,CAAC;IAES,gBAAgB,CAAC,QAAgB;QACvC,OAAO,QAAQ;aACV,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,oCAAoC;aACjE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,4CAA4C;aACnE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,yBAAyB;aAC9C,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,oCAAoC;aACxD,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC,6BAA6B;aACpE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IAES,iBAAiB,CAAC,IAAY;QACpC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAe,EAAE,EAAE,CACjD,IAAA,qBAAS,EAAC,IAAI,EAAE,OAAO,CAAC,CAC3B,CAAC;IACN,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,YAAY,CACxB,IAAW,EACX,WAAyB;;QAOzB,MAAM,KAAK,GAAoD,EAAE,CAAC;QAClE,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,KAAK,GAIN,EAAE,CAAC;QAER,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;gBACvB,MAAM;YACV,CAAC;YAED,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC7C,eAAe,EAAE,IAAI;iBACxB,CAAC,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;iBAClB,CAAC,CAAC;gBAEH,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;oBACvB,MAAM;gBACV,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;oBAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3C,SAAS,IAAI,IAAI,CAAC;oBAClB,SAAS;gBACb,CAAC;gBAED,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,CAAA,EAAE,CAAC;oBACzB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBACtC,SAAS;gBACb,CAAC;gBAED,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAEtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAClD,GAAG,EACH,IAAI,CAAC,IAAI,EACT,WAAW,CACd,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC/B,WAAW,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC3C,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,CAC/B,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAC9B,CAAC,CACJ,CAAC;YACN,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,gCAAgC,GAAG,CAAC,QAAQ,EAAE,GAAG,EACjD,KAAK,CACR,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS;oBAChC,WAAW,EAAE,KAAK;oBAClB,IAAI,EAAE,CAAC;iBACV,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,yBAAyB,CACrC,MAAW,EACX,QAAgB,EAChB,WAAyB;;QAKzB,MAAM,KAAK,GAAoD,EAAE,CAAC;QAClE,MAAM,WAAW,GAA4B,EAAE,CAAC;QAEhD,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEvD,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;gBACvB,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;YAClC,CAAC;YAED,iDAAiD;YACjD,IAAI,CAAC,CAAA,MAAA,OAAO,CAAC,QAAQ,0CAAE,MAAM,CAAA,EAAE,CAAC;gBAC5B,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;YAClC,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACnC,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;oBACvB,MAAM;gBACV,CAAC;gBAED,MAAM,SAAS,GAAG,QAAQ;oBACtB,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;oBAC7B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;gBAEjB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrC,SAAS;gBACb,CAAC;gBAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBACpB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;oBAEtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAClD,KAAK,CAAC,QAAQ,EACd,SAAS,EACT,WAAW,CACd,CAAC;oBAEF,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;oBAC/B,WAAW,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACJ,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAC5C,KAAK,CAAC,QAAQ,CACjB,CAAC;oBAEF,KAAK,CAAC,IAAI,CAAC;wBACP,GAAG,EAAE,KAAK,CAAC,QAAQ;wBACnB,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC;qBAC5B,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,0CAA0C,MAAM,CAAC,QAAQ,EAAE,GAAG,EAC9D,KAAK,CACR,CAAC;QACN,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC;CACJ,CAAA;AAvrBY,0DAAuB;AAEb;IADlB,IAAA,kBAAM,EAAC,0BAAW,CAAC;sCACY,0BAAW;4DAAC;AAGzB;IADlB,IAAA,kBAAM,EAAC,gBAAO,CAAC;;uDACmB;AAGhB;IADlB,IAAA,kBAAM,EAAC,gCAAc,CAAC;sCACY,gCAAc;+DAAC;AAG/B;IADlB,IAAA,kBAAM,EAAC,8CAAqB,CAAC;;4DACwB;kCAX7C,uBAAuB;IADnC,IAAA,sBAAU,GAAE;GACA,uBAAuB,CAurBnC"}
@@ -0,0 +1,38 @@
1
+ import { type MinimatchOptions } from 'minimatch';
2
+ import type URI from '@theia/core/lib/common/uri';
3
+ /**
4
+ * Normalizes glob patterns to be consistent with ripgrep behavior.
5
+ *
6
+ * Examples of transformations:
7
+ * - "*.js" -> "**\/*.js" (make non-root patterns match anywhere)
8
+ * - "src/" -> "src\/**" (directory patterns match all contents)
9
+ * - "!*.log" -> "!**\/*.log" (negation patterns)
10
+ * - "src/**\/**\/file.js" -> "src/**\/file.js" (collapse repeated double-star patterns)
11
+ *
12
+ * @param glob - The glob pattern to normalize
13
+ * @returns The normalized glob pattern
14
+ */
15
+ export declare function normalizeGlob(glob: string): string;
16
+ /**
17
+ * Checks if a text matches any of the minimatch patterns
18
+ * @param text - The text to check
19
+ * @param patterns - The patterns to check
20
+ * @returns True if the text matches any of the patterns, false otherwise
21
+ */
22
+ export declare function matchesPattern(text: string, patterns: string[], opts?: MinimatchOptions): boolean;
23
+ /**
24
+ * Creates a new ignore pattern matcher for managing ignore patterns.
25
+ * @returns An object with add and ignores methods
26
+ */
27
+ export declare function createIgnoreMatcher(): {
28
+ add: (patterns: string | string[]) => void;
29
+ ignores: (path: string) => boolean;
30
+ };
31
+ /**
32
+ * Processes ignore files (.gitignore, .ignore, .rgignore) in a directory.
33
+ * @param dir - The directory URI to process
34
+ * @param read - Function to read the ignore file content
35
+ * @returns Array of processed ignore patterns relative to the directory contains that ignore file
36
+ */
37
+ export declare function getIgnorePatterns(dir: URI, read: (uri: URI) => Promise<string>): Promise<string[]>;
38
+ //# sourceMappingURL=file-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-search.d.ts","sourceRoot":"","sources":["../../src/browser-only/file-search.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,KAAK,GAAG,MAAM,4BAA4B,CAAC;AAElD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyClD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAEjG;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI;IAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,CAOxH;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBxG"}