@eclipse-lyra/core 0.0.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.
- package/dist/api/base-classes.d.ts +7 -0
- package/dist/api/base-classes.d.ts.map +1 -0
- package/dist/api/constants.d.ts +2 -0
- package/dist/api/constants.d.ts.map +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +84 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/services.d.ts +28 -0
- package/dist/api/services.d.ts.map +1 -0
- package/dist/api/types.d.ts +11 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/commands/editor.d.ts +1 -0
- package/dist/commands/editor.d.ts.map +1 -0
- package/dist/commands/files.d.ts +2 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/global.d.ts +1 -0
- package/dist/commands/global.d.ts.map +1 -0
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/open-view-as-editor.d.ts +2 -0
- package/dist/commands/open-view-as-editor.d.ts.map +1 -0
- package/dist/commands/version-info.d.ts +2 -0
- package/dist/commands/version-info.d.ts.map +1 -0
- package/dist/components/app-selector.d.ts +17 -0
- package/dist/components/app-selector.d.ts.map +1 -0
- package/dist/components/app-switcher.d.ts +13 -0
- package/dist/components/app-switcher.d.ts.map +1 -0
- package/dist/components/command.d.ts +31 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/extensions.d.ts +32 -0
- package/dist/components/extensions.d.ts.map +1 -0
- package/dist/components/fastviews.d.ts +34 -0
- package/dist/components/fastviews.d.ts.map +1 -0
- package/dist/components/filebrowser.d.ts +45 -0
- package/dist/components/filebrowser.d.ts.map +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/language-selector.d.ts +12 -0
- package/dist/components/language-selector.d.ts.map +1 -0
- package/dist/components/log-terminal.d.ts +36 -0
- package/dist/components/log-terminal.d.ts.map +1 -0
- package/dist/components/part-name.d.ts +12 -0
- package/dist/components/part-name.d.ts.map +1 -0
- package/dist/components/tasks.d.ts +13 -0
- package/dist/components/tasks.d.ts.map +1 -0
- package/dist/contributions/default-ui-contributions.d.ts +2 -0
- package/dist/contributions/default-ui-contributions.d.ts.map +1 -0
- package/dist/contributions/index.d.ts +1 -0
- package/dist/contributions/index.d.ts.map +1 -0
- package/dist/contributions/marketplace-catalog-contributions.d.ts +2 -0
- package/dist/contributions/marketplace-catalog-contributions.d.ts.map +1 -0
- package/dist/core/app-host-config.d.ts +7 -0
- package/dist/core/app-host-config.d.ts.map +1 -0
- package/dist/core/apploader.d.ts +214 -0
- package/dist/core/apploader.d.ts.map +1 -0
- package/dist/core/appstate.d.ts +12 -0
- package/dist/core/appstate.d.ts.map +1 -0
- package/dist/core/commandregistry.d.ts +79 -0
- package/dist/core/commandregistry.d.ts.map +1 -0
- package/dist/core/config.d.ts +15 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/constants.d.ts +22 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/contributionregistry.d.ts +53 -0
- package/dist/core/contributionregistry.d.ts.map +1 -0
- package/dist/core/di.d.ts +18 -0
- package/dist/core/di.d.ts.map +1 -0
- package/dist/core/dialogservice.d.ts +33 -0
- package/dist/core/dialogservice.d.ts.map +1 -0
- package/dist/core/editorregistry.d.ts +87 -0
- package/dist/core/editorregistry.d.ts.map +1 -0
- package/dist/core/esmsh-service.d.ts +40 -0
- package/dist/core/esmsh-service.d.ts.map +1 -0
- package/dist/core/events.d.ts +7 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +63 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/extensionregistry.d.ts +98 -0
- package/dist/core/extensionregistry.d.ts.map +1 -0
- package/dist/core/filesys/common.d.ts +122 -0
- package/dist/core/filesys/common.d.ts.map +1 -0
- package/dist/core/filesys/fs-access.d.ts +31 -0
- package/dist/core/filesys/fs-access.d.ts.map +1 -0
- package/dist/core/filesys/index.d.ts +5 -0
- package/dist/core/filesys/index.d.ts.map +1 -0
- package/dist/core/filesys/indexeddb.d.ts +41 -0
- package/dist/core/filesys/indexeddb.d.ts.map +1 -0
- package/dist/core/filesys/opfs.d.ts +14 -0
- package/dist/core/filesys/opfs.d.ts.map +1 -0
- package/dist/core/i18n.d.ts +50 -0
- package/dist/core/i18n.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/keybindings.d.ts +67 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/logger.d.ts +44 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/marketplaceregistry.d.ts +25 -0
- package/dist/core/marketplaceregistry.d.ts.map +1 -0
- package/dist/core/packageinfoservice.d.ts +16 -0
- package/dist/core/packageinfoservice.d.ts.map +1 -0
- package/dist/core/persistenceservice.d.ts +6 -0
- package/dist/core/persistenceservice.d.ts.map +1 -0
- package/dist/core/settingsservice.d.ts +54 -0
- package/dist/core/settingsservice.d.ts.map +1 -0
- package/dist/core/signals.d.ts +3 -0
- package/dist/core/signals.d.ts.map +1 -0
- package/dist/core/taskservice.d.ts +20 -0
- package/dist/core/taskservice.d.ts.map +1 -0
- package/dist/core/toast.d.ts +4 -0
- package/dist/core/toast.d.ts.map +1 -0
- package/dist/core/tree-utils.d.ts +16 -0
- package/dist/core/tree-utils.d.ts.map +1 -0
- package/dist/dialogs/confirm-dialog.d.ts +14 -0
- package/dist/dialogs/confirm-dialog.d.ts.map +1 -0
- package/dist/dialogs/index.d.ts +5 -0
- package/dist/dialogs/index.d.ts.map +1 -0
- package/dist/dialogs/info-dialog.d.ts +13 -0
- package/dist/dialogs/info-dialog.d.ts.map +1 -0
- package/dist/dialogs/navigable-info-dialog.d.ts +33 -0
- package/dist/dialogs/navigable-info-dialog.d.ts.map +1 -0
- package/dist/dialogs/prompt-dialog.d.ts +21 -0
- package/dist/dialogs/prompt-dialog.d.ts.map +1 -0
- package/dist/externals/lit.d.ts +21 -0
- package/dist/externals/lit.d.ts.map +1 -0
- package/dist/externals/lit.js +24 -0
- package/dist/externals/lit.js.map +1 -0
- package/dist/externals/third-party.d.ts +7 -0
- package/dist/externals/third-party.d.ts.map +1 -0
- package/dist/externals/third-party.js +7 -0
- package/dist/externals/third-party.js.map +1 -0
- package/dist/externals/webawesome.d.ts +1 -0
- package/dist/externals/webawesome.d.ts.map +1 -0
- package/dist/externals/webawesome.js +75 -0
- package/dist/externals/webawesome.js.map +1 -0
- package/dist/i18n/extensions.json.d.ts +42 -0
- package/dist/i18n/fastviews.json.d.ts +13 -0
- package/dist/i18n/filebrowser.json.d.ts +29 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/logterminal.json.d.ts +45 -0
- package/dist/i18n/partname.json.d.ts +15 -0
- package/dist/i18n/tasks.json.d.ts +15 -0
- package/dist/i18n/workspace.json.d.ts +15 -0
- package/dist/icon-DN6fp0dg.js +487 -0
- package/dist/icon-DN6fp0dg.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts/standard-layout.d.ts +16 -0
- package/dist/layouts/standard-layout.d.ts.map +1 -0
- package/dist/nocontent-BhrN6yxJ.js +48 -0
- package/dist/nocontent-BhrN6yxJ.js.map +1 -0
- package/dist/parts/container.d.ts +4 -0
- package/dist/parts/container.d.ts.map +1 -0
- package/dist/parts/contextmenu.d.ts +50 -0
- package/dist/parts/contextmenu.d.ts.map +1 -0
- package/dist/parts/dialog-content.d.ts +9 -0
- package/dist/parts/dialog-content.d.ts.map +1 -0
- package/dist/parts/element.d.ts +36 -0
- package/dist/parts/element.d.ts.map +1 -0
- package/dist/parts/index.d.ts +1 -0
- package/dist/parts/index.d.ts.map +1 -0
- package/dist/parts/index.js +3 -0
- package/dist/parts/index.js.map +1 -0
- package/dist/parts/part.d.ts +96 -0
- package/dist/parts/part.d.ts.map +1 -0
- package/dist/parts/resizable-grid.d.ts +31 -0
- package/dist/parts/resizable-grid.d.ts.map +1 -0
- package/dist/parts/tabs.d.ts +75 -0
- package/dist/parts/tabs.d.ts.map +1 -0
- package/dist/parts/toolbar.d.ts +35 -0
- package/dist/parts/toolbar.d.ts.map +1 -0
- package/dist/resizable-grid-BRH3MyZK.js +3813 -0
- package/dist/resizable-grid-BRH3MyZK.js.map +1 -0
- package/dist/standard-layout-BSGa06lP.js +4907 -0
- package/dist/standard-layout-BSGa06lP.js.map +1 -0
- package/dist/widgets/icon.d.ts +10 -0
- package/dist/widgets/icon.d.ts.map +1 -0
- package/dist/widgets/index.d.ts +1 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +3 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/nocontent.d.ts +13 -0
- package/dist/widgets/nocontent.d.ts.map +1 -0
- package/dist/widgets/widget.d.ts +25 -0
- package/dist/widgets/widget.d.ts.map +1 -0
- package/package.json +81 -0
- package/src/api/base-classes.ts +10 -0
- package/src/api/constants.ts +3 -0
- package/src/api/index.ts +31 -0
- package/src/api/services.ts +58 -0
- package/src/api/types.ts +46 -0
- package/src/commands/editor.ts +1 -0
- package/src/commands/files.ts +425 -0
- package/src/commands/global.ts +198 -0
- package/src/commands/index.ts +6 -0
- package/src/commands/open-view-as-editor.ts +28 -0
- package/src/commands/version-info.ts +214 -0
- package/src/components/app-selector.ts +233 -0
- package/src/components/app-switcher.ts +126 -0
- package/src/components/command.ts +236 -0
- package/src/components/extensions.ts +615 -0
- package/src/components/fastviews.ts +314 -0
- package/src/components/filebrowser.ts +518 -0
- package/src/components/index.ts +9 -0
- package/src/components/language-selector.ts +166 -0
- package/src/components/log-terminal.ts +337 -0
- package/src/components/part-name.ts +54 -0
- package/src/components/tasks.ts +275 -0
- package/src/contributions/default-ui-contributions.ts +44 -0
- package/src/contributions/index.ts +3 -0
- package/src/contributions/marketplace-catalog-contributions.ts +6 -0
- package/src/core/app-host-config.ts +23 -0
- package/src/core/apploader.ts +630 -0
- package/src/core/appstate.ts +15 -0
- package/src/core/commandregistry.ts +210 -0
- package/src/core/config.ts +29 -0
- package/src/core/constants.ts +29 -0
- package/src/core/contributionregistry.ts +81 -0
- package/src/core/di.ts +54 -0
- package/src/core/dialogservice.ts +266 -0
- package/src/core/editorregistry.ts +347 -0
- package/src/core/esmsh-service.ts +404 -0
- package/src/core/events.ts +68 -0
- package/src/core/extensionregistry.ts +399 -0
- package/src/core/filesys/common.ts +474 -0
- package/src/core/filesys/fs-access.ts +339 -0
- package/src/core/filesys/index.ts +5 -0
- package/src/core/filesys/indexeddb.ts +596 -0
- package/src/core/filesys/opfs.ts +95 -0
- package/src/core/i18n.ts +221 -0
- package/src/core/index.ts +51 -0
- package/src/core/keybindings.ts +274 -0
- package/src/core/logger.ts +187 -0
- package/src/core/marketplaceregistry.ts +197 -0
- package/src/core/packageinfoservice.ts +56 -0
- package/src/core/persistenceservice.ts +46 -0
- package/src/core/settingsservice.ts +191 -0
- package/src/core/signals.ts +18 -0
- package/src/core/taskservice.ts +72 -0
- package/src/core/toast.ts +21 -0
- package/src/core/tree-utils.ts +24 -0
- package/src/dialogs/confirm-dialog.ts +72 -0
- package/src/dialogs/index.ts +4 -0
- package/src/dialogs/info-dialog.ts +67 -0
- package/src/dialogs/navigable-info-dialog.ts +256 -0
- package/src/dialogs/prompt-dialog.ts +123 -0
- package/src/externals/lit.ts +36 -0
- package/src/externals/third-party.ts +10 -0
- package/src/externals/webawesome.ts +76 -0
- package/src/i18n/extensions.json +39 -0
- package/src/i18n/fastviews.json +10 -0
- package/src/i18n/filebrowser.json +27 -0
- package/src/i18n/index.ts +25 -0
- package/src/i18n/logterminal.json +42 -0
- package/src/i18n/partname.json +12 -0
- package/src/i18n/tasks.json +12 -0
- package/src/i18n/workspace.json +12 -0
- package/src/icons/icons.txt +3 -0
- package/src/icons/js.svg +6 -0
- package/src/icons/jupyter.svg +18 -0
- package/src/icons/python.svg +15 -0
- package/src/index.ts +3 -0
- package/src/layouts/standard-layout.ts +174 -0
- package/src/parts/container.ts +4 -0
- package/src/parts/contextmenu.ts +266 -0
- package/src/parts/dialog-content.ts +31 -0
- package/src/parts/element.ts +100 -0
- package/src/parts/index.ts +5 -0
- package/src/parts/part.ts +158 -0
- package/src/parts/resizable-grid.ts +366 -0
- package/src/parts/tabs.ts +581 -0
- package/src/parts/toolbar.ts +260 -0
- package/src/vite-env.d.ts +16 -0
- package/src/widgets/icon.ts +38 -0
- package/src/widgets/index.ts +2 -0
- package/src/widgets/nocontent.ts +40 -0
- package/src/widgets/widget.ts +92 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { publish } from "../events";
|
|
2
|
+
import {
|
|
3
|
+
File,
|
|
4
|
+
Directory,
|
|
5
|
+
FileContentType,
|
|
6
|
+
FileContentEncoding,
|
|
7
|
+
type FileContentsOptions,
|
|
8
|
+
type GetResourceOptions,
|
|
9
|
+
type Resource,
|
|
10
|
+
type ResourceMap,
|
|
11
|
+
TOPIC_WORKSPACE_CHANGED,
|
|
12
|
+
workspaceService,
|
|
13
|
+
} from "./common";
|
|
14
|
+
|
|
15
|
+
export class FileSysFileHandleResource extends File {
|
|
16
|
+
private fileHandle: FileSystemFileHandle;
|
|
17
|
+
private parent: Directory;
|
|
18
|
+
|
|
19
|
+
constructor(fileHandle: FileSystemFileHandle, parent: Directory) {
|
|
20
|
+
super();
|
|
21
|
+
this.fileHandle = fileHandle;
|
|
22
|
+
this.parent = parent;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
getName(): string {
|
|
26
|
+
return this.fileHandle.name;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
getParent(): Directory {
|
|
30
|
+
return this.parent;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async delete() {
|
|
34
|
+
return this.getParent().delete(this.getName());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async getContents(options?: FileContentsOptions): Promise<any> {
|
|
38
|
+
const file = await this.fileHandle.getFile();
|
|
39
|
+
|
|
40
|
+
if (!options || options?.contentType == FileContentType.TEXT) {
|
|
41
|
+
return await file.text();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (options?.encoding == FileContentEncoding.BASE64 || options?.uri) {
|
|
45
|
+
return URL.createObjectURL(file);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (options?.blob) {
|
|
49
|
+
return file;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return file.stream();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async size(): Promise<number | null> {
|
|
56
|
+
try {
|
|
57
|
+
const file = await this.fileHandle.getFile();
|
|
58
|
+
return file.size;
|
|
59
|
+
} catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async saveContents(contents: any, _options?: FileContentsOptions) {
|
|
65
|
+
const writable = await this.fileHandle.createWritable();
|
|
66
|
+
|
|
67
|
+
if (contents && typeof contents.pipeTo === 'function') {
|
|
68
|
+
await contents.pipeTo(writable);
|
|
69
|
+
} else {
|
|
70
|
+
const writer = writable.getWriter();
|
|
71
|
+
try {
|
|
72
|
+
await writer.write(contents);
|
|
73
|
+
} finally {
|
|
74
|
+
await writer.close();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async copyTo(targetPath: string): Promise<void> {
|
|
80
|
+
const contents = await this.getContents({ blob: true });
|
|
81
|
+
const targetFile = await this.getWorkspace().getResource(targetPath, { create: true }) as File;
|
|
82
|
+
await targetFile.saveContents(contents);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async rename(newName: string): Promise<void> {
|
|
86
|
+
const parent = this.getParent() as FileSysDirHandleResource;
|
|
87
|
+
if (!parent) {
|
|
88
|
+
throw new Error('Cannot rename root resource');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (this.getName() === newName) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (!('move' in this.fileHandle) || typeof (this.fileHandle as any).move !== 'function') {
|
|
96
|
+
throw new Error('File rename not supported in this browser. Please use a browser with File System Access API move() support.');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
await (this.fileHandle as any).move(newName);
|
|
101
|
+
} catch (error: any) {
|
|
102
|
+
if (error.name === 'NotAllowedError' ||
|
|
103
|
+
error.message?.includes('not allowed') ||
|
|
104
|
+
error.message?.includes('user agent')) {
|
|
105
|
+
throw new Error('File rename failed: The operation took too long and user activation expired. Please try again.');
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
await parent.listChildren(true);
|
|
111
|
+
publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export class FileSysDirHandleResource extends Directory {
|
|
116
|
+
private dirHandle: FileSystemDirectoryHandle;
|
|
117
|
+
private files?: ResourceMap;
|
|
118
|
+
private parent?: Directory;
|
|
119
|
+
private loadingPromise?: Promise<Resource[]>;
|
|
120
|
+
|
|
121
|
+
constructor(dirHandle: FileSystemDirectoryHandle, parent?: Directory) {
|
|
122
|
+
super();
|
|
123
|
+
this.dirHandle = dirHandle;
|
|
124
|
+
this.parent = parent;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
getHandle() {
|
|
128
|
+
return this.dirHandle;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
getParent(): Directory | undefined {
|
|
132
|
+
return this.parent;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
getName(): string {
|
|
136
|
+
return this.dirHandle.name;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async listChildren(forceRefresh: boolean = false): Promise<Resource[]> {
|
|
140
|
+
if (forceRefresh || !this.files) {
|
|
141
|
+
if (this.loadingPromise) {
|
|
142
|
+
return this.loadingPromise;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
this.loadingPromise = (async () => {
|
|
146
|
+
try {
|
|
147
|
+
const files: ResourceMap = {};
|
|
148
|
+
|
|
149
|
+
try {
|
|
150
|
+
// @ts-ignore
|
|
151
|
+
for await (const entry of this.dirHandle.values()) {
|
|
152
|
+
const isFile = (<FileSystemHandle>entry).kind === "file";
|
|
153
|
+
const child = isFile
|
|
154
|
+
? new FileSysFileHandleResource(entry, this)
|
|
155
|
+
: new FileSysDirHandleResource(entry, this);
|
|
156
|
+
files[child.getName()] = child;
|
|
157
|
+
}
|
|
158
|
+
} catch (error: any) {
|
|
159
|
+
if (error.name === 'NotFoundError') {
|
|
160
|
+
this.files = {};
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
this.files = files;
|
|
167
|
+
return Object.values(this.files);
|
|
168
|
+
} finally {
|
|
169
|
+
this.loadingPromise = undefined;
|
|
170
|
+
}
|
|
171
|
+
})();
|
|
172
|
+
|
|
173
|
+
return this.loadingPromise;
|
|
174
|
+
}
|
|
175
|
+
return Object.values(this.files);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {
|
|
179
|
+
if (!path) {
|
|
180
|
+
throw new Error("No path provided");
|
|
181
|
+
}
|
|
182
|
+
const segments = path.split("/");
|
|
183
|
+
let currentResource: Resource = this;
|
|
184
|
+
let workspaceChanged = false;
|
|
185
|
+
try {
|
|
186
|
+
for (let i = 0; i < segments.length; i++) {
|
|
187
|
+
let segment = segments[i];
|
|
188
|
+
if (segment) {
|
|
189
|
+
segment = segment.trim();
|
|
190
|
+
}
|
|
191
|
+
if (!segment) {
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
if (currentResource instanceof FileSysDirHandleResource) {
|
|
195
|
+
await currentResource.listChildren();
|
|
196
|
+
if (!currentResource.files) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
const next = currentResource.files[segment];
|
|
200
|
+
if (!next) {
|
|
201
|
+
if (options?.create) {
|
|
202
|
+
workspaceChanged = true;
|
|
203
|
+
if (i < segments.length - 1) {
|
|
204
|
+
try {
|
|
205
|
+
const newDirHandle = await currentResource.dirHandle.getDirectoryHandle(segment, { create: true });
|
|
206
|
+
const nextResource = new FileSysDirHandleResource(newDirHandle, currentResource);
|
|
207
|
+
currentResource.files[segment] = nextResource;
|
|
208
|
+
currentResource = nextResource;
|
|
209
|
+
if (currentResource instanceof FileSysDirHandleResource) {
|
|
210
|
+
await currentResource.listChildren();
|
|
211
|
+
}
|
|
212
|
+
continue;
|
|
213
|
+
} catch (error: any) {
|
|
214
|
+
if (error.name === 'NotFoundError') {
|
|
215
|
+
throw new Error(`Directory not found or not accessible: ${segments.slice(0, i + 1).join('/')}`);
|
|
216
|
+
}
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
} else {
|
|
220
|
+
try {
|
|
221
|
+
const newFileHandle = await currentResource.dirHandle.getFileHandle(segment, { create: true });
|
|
222
|
+
const nextResource = new FileSysFileHandleResource(newFileHandle, currentResource);
|
|
223
|
+
currentResource.files[segment] = nextResource;
|
|
224
|
+
return nextResource;
|
|
225
|
+
} catch (error: any) {
|
|
226
|
+
if (error.name === 'NotFoundError') {
|
|
227
|
+
throw new Error(`File not found or not accessible: ${segments.join('/')}`);
|
|
228
|
+
}
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
} else {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
} else {
|
|
236
|
+
currentResource = next;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
} finally {
|
|
241
|
+
if (workspaceChanged) {
|
|
242
|
+
publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return currentResource;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
public touch() {
|
|
249
|
+
publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
async delete(name?: string, recursive: boolean = true) {
|
|
253
|
+
if (!name) {
|
|
254
|
+
const parent = this.getParent();
|
|
255
|
+
if (parent instanceof FileSysDirHandleResource) {
|
|
256
|
+
await parent.listChildren();
|
|
257
|
+
if (parent.files) {
|
|
258
|
+
delete parent.files[this.getName()];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
this.files = undefined;
|
|
262
|
+
this.loadingPromise = undefined;
|
|
263
|
+
return parent?.delete(this.getName());
|
|
264
|
+
}
|
|
265
|
+
return this.dirHandle.removeEntry(name, {
|
|
266
|
+
recursive: recursive
|
|
267
|
+
}).then(async () => {
|
|
268
|
+
if (this.files) {
|
|
269
|
+
delete this.files[name];
|
|
270
|
+
}
|
|
271
|
+
publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
async copyTo(targetPath: string) {
|
|
276
|
+
for (const resource of (await this.listChildren())) {
|
|
277
|
+
const targetResourceName = [targetPath, resource.getName()].join("/");
|
|
278
|
+
await resource.copyTo(targetResourceName);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async rename(newName: string): Promise<void> {
|
|
283
|
+
const parent = this.getParent() as FileSysDirHandleResource;
|
|
284
|
+
if (!parent) {
|
|
285
|
+
throw new Error('Cannot rename workspace root');
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (this.getName() === newName) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (!('move' in this.dirHandle) || typeof (this.dirHandle as any).move !== 'function') {
|
|
293
|
+
throw new Error('Directory rename not supported in this browser. Please use a browser with File System Access API move() support.');
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
try {
|
|
297
|
+
await (this.dirHandle as any).move(newName);
|
|
298
|
+
} catch (error: any) {
|
|
299
|
+
if (error.name === 'NotAllowedError' ||
|
|
300
|
+
error.message?.includes('not allowed') ||
|
|
301
|
+
error.message?.includes('user agent')) {
|
|
302
|
+
throw new Error('Directory rename failed: The operation took too long and user activation expired. Please try again.');
|
|
303
|
+
}
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
await parent.listChildren(true);
|
|
308
|
+
publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Register default filesystem contribution
|
|
313
|
+
workspaceService.registerContribution({
|
|
314
|
+
type: 'filesystem',
|
|
315
|
+
name: 'fs',
|
|
316
|
+
|
|
317
|
+
canHandle(input: any): boolean {
|
|
318
|
+
return input && 'kind' in input && input.kind === 'directory';
|
|
319
|
+
},
|
|
320
|
+
|
|
321
|
+
async connect(input: FileSystemDirectoryHandle): Promise<Directory> {
|
|
322
|
+
return new FileSysDirHandleResource(input);
|
|
323
|
+
},
|
|
324
|
+
|
|
325
|
+
async restore(data: any): Promise<Directory | undefined> {
|
|
326
|
+
if (data && 'kind' in data && data.kind === 'directory') {
|
|
327
|
+
return new FileSysDirHandleResource(data, undefined);
|
|
328
|
+
}
|
|
329
|
+
return undefined;
|
|
330
|
+
},
|
|
331
|
+
|
|
332
|
+
async persist(workspace: Directory): Promise<any> {
|
|
333
|
+
if (workspace instanceof FileSysDirHandleResource) {
|
|
334
|
+
return workspace.getHandle();
|
|
335
|
+
}
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
|