@eclipse-docks/core 0.7.122 → 0.7.125

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 (58) hide show
  1. package/dist/api/index.js +4 -4
  2. package/dist/{api-N5AbUtyH.js → api-CTU-FxEv.js} +35 -21
  3. package/dist/api-CTU-FxEv.js.map +1 -0
  4. package/dist/components/command.d.ts +2 -2
  5. package/dist/components/command.d.ts.map +1 -1
  6. package/dist/components/fastviews.d.ts +1 -1
  7. package/dist/components/fastviews.d.ts.map +1 -1
  8. package/dist/components/filebrowser.d.ts +3 -1
  9. package/dist/components/filebrowser.d.ts.map +1 -1
  10. package/dist/core/commandregistry.d.ts +2 -2
  11. package/dist/core/commandregistry.d.ts.map +1 -1
  12. package/dist/core/dropdown-menu-utils.d.ts +9 -0
  13. package/dist/core/dropdown-menu-utils.d.ts.map +1 -0
  14. package/dist/core/toast.d.ts.map +1 -1
  15. package/dist/externals/webawesome.d.ts.map +1 -1
  16. package/dist/externals/webawesome.js +1 -1
  17. package/dist/fs-access-CzOh5ot8.js +2 -0
  18. package/dist/{fs-access-D-fDaJ8V.js → fs-access-DTXPsV1W.js} +2 -2
  19. package/dist/{fs-access-D-fDaJ8V.js.map → fs-access-DTXPsV1W.js.map} +1 -1
  20. package/dist/index.js +4 -4
  21. package/dist/parts/contextmenu.d.ts +5 -4
  22. package/dist/parts/contextmenu.d.ts.map +1 -1
  23. package/dist/parts/index.js +1 -1
  24. package/dist/parts/tabs.d.ts +2 -2
  25. package/dist/parts/tabs.d.ts.map +1 -1
  26. package/dist/parts/toolbar.d.ts +2 -1
  27. package/dist/parts/toolbar.d.ts.map +1 -1
  28. package/dist/{parts-BvITdiV3.js → parts-BRaXx8PD.js} +95 -46
  29. package/dist/parts-BRaXx8PD.js.map +1 -0
  30. package/dist/{webawesome-CJyhVNu_.js → webawesome-Y1_HnKa_.js} +11 -1
  31. package/dist/{webawesome-CJyhVNu_.js.map → webawesome-Y1_HnKa_.js.map} +1 -1
  32. package/dist/{widget-DFbJNLqB.js → widget-DbLusgAH.js} +21 -27
  33. package/dist/widget-DbLusgAH.js.map +1 -0
  34. package/dist/widgets/index.js +1 -1
  35. package/dist/{widgets-CuO5lmjL.js → widgets-DnnSZhsi.js} +2 -2
  36. package/dist/{widgets-CuO5lmjL.js.map → widgets-DnnSZhsi.js.map} +1 -1
  37. package/package.json +5 -6
  38. package/src/components/command.ts +23 -9
  39. package/src/components/extensions.ts +2 -2
  40. package/src/components/fastviews.ts +1 -1
  41. package/src/components/filebrowser.ts +25 -10
  42. package/src/components/language-selector.ts +1 -1
  43. package/src/components/layout-switcher.ts +2 -2
  44. package/src/components/part-name.ts +1 -1
  45. package/src/core/commandregistry.ts +2 -2
  46. package/src/core/dropdown-menu-utils.ts +39 -0
  47. package/src/core/toast.ts +31 -8
  48. package/src/externals/webawesome.ts +10 -0
  49. package/src/layouts/standard-layout.ts +2 -2
  50. package/src/parts/contextmenu.ts +35 -9
  51. package/src/parts/part.ts +2 -2
  52. package/src/parts/tabs.ts +10 -10
  53. package/src/parts/toolbar.ts +5 -3
  54. package/src/vite-env.d.ts +0 -14
  55. package/dist/api-N5AbUtyH.js.map +0 -1
  56. package/dist/fs-access-CnQJX8W1.js +0 -2
  57. package/dist/parts-BvITdiV3.js.map +0 -1
  58. package/dist/widget-DFbJNLqB.js.map +0 -1
@@ -8,7 +8,7 @@ export declare class DocksCommand extends DocksWidget {
8
8
  disabled: boolean;
9
9
  appearance: 'default' | 'plain' | 'outline' | 'accent' | 'filled-outlined' | 'filled' | 'outlined';
10
10
  variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger';
11
- size: 'small' | 'medium' | 'large';
11
+ size: 's' | 'm' | 'l';
12
12
  params: Record<string, any>;
13
13
  dropdown?: string;
14
14
  withCaret: boolean;
@@ -21,7 +21,7 @@ export declare class DocksCommand extends DocksWidget {
21
21
  private isInDropdown;
22
22
  private getKeybinding;
23
23
  protected doBeforeUI(): void;
24
- private loadDropdownContributions;
24
+ protected willUpdate(changedProperties: Map<PropertyKey, unknown>): void;
25
25
  private renderContribution;
26
26
  render(): import('lit-html').TemplateResult<1>;
27
27
  static styles: import('lit').CSSResult;
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/components/command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAgB/C,qBACa,YAAa,SAAQ,WAAW;IAEzC,GAAG,EAAE,MAAM,CAAK;IAGhB,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;IAGhC,KAAK,EAAE,MAAM,CAAK;IAGlB,KAAK,CAAC,EAAE,OAAO,CAAQ;IAGvB,IAAI,CAAC,EAAE,MAAM,CAAA;IAGb,QAAQ,EAAE,OAAO,CAAQ;IAGzB,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAAU;IAG5G,OAAO,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAY;IAG3E,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAU;IAG5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAK;IAGhC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAGjB,SAAS,EAAE,OAAO,CAAO;IAGzB,SAAS,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,CAAiB;IAGnL,OAAO,CAAC,qBAAqB,CAAqB;IAElD,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAMrB,SAAS,CAAC,UAAU;IAapB,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,kBAAkB;IA8B1B,MAAM;IAsEN,MAAM,CAAC,MAAM,0BAoBZ;CACJ;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,eAAe,EAAE,YAAY,CAAA;KAChC;CACJ"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/components/command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAgB/C,qBACa,YAAa,SAAQ,WAAW;IAEzC,GAAG,EAAE,MAAM,CAAK;IAGhB,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;IAGhC,KAAK,EAAE,MAAM,CAAK;IAGlB,KAAK,CAAC,EAAE,OAAO,CAAQ;IAGvB,IAAI,CAAC,EAAE,MAAM,CAAA;IAGb,QAAQ,EAAE,OAAO,CAAQ;IAGzB,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAAU;IAG5G,OAAO,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAY;IAG3E,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAM;IAG3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAK;IAGhC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAGjB,SAAS,EAAE,OAAO,CAAO;IAGzB,SAAS,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,CAAiB;IAGnL,OAAO,CAAC,qBAAqB,CAAqB;IAElD,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAMrB,SAAS,CAAC,UAAU;IAYpB,SAAS,CAAC,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC;IAOjE,OAAO,CAAC,kBAAkB;IA+B1B,MAAM;IAmFN,MAAM,CAAC,MAAM,0BAoBZ;CACJ;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,eAAe,EAAE,YAAY,CAAA;KAChC;CACJ"}
@@ -6,7 +6,7 @@ export declare class DocksFastViews extends DocksWidget {
6
6
  icon?: string;
7
7
  disabled: boolean;
8
8
  appearance: 'default' | 'plain' | 'outline';
9
- size: 'small' | 'medium' | 'large';
9
+ size: 's' | 'm' | 'l';
10
10
  placement: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
11
11
  containerId?: string;
12
12
  private tabContributions;
@@ -1 +1 @@
1
- {"version":3,"file":"fastviews.d.ts","sourceRoot":"","sources":["../../src/components/fastviews.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,OAAO,EAAE,MAAM,KAAK,CAAA;AAGxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,qBACa,cAAe,SAAQ,WAAW;IAE3C,MAAM,EAAE,MAAM,CAAK;IAGnB,KAAK,EAAE,MAAM,CAAK;IAGlB,IAAI,CAAC,EAAE,MAAM,CAAA;IAGb,QAAQ,EAAE,OAAO,CAAQ;IAGzB,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAU;IAGrD,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAU;IAG5C,SAAS,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,CAAiB;IAGnL,WAAW,CAAC,EAAE,MAAM,CAAA;IAGpB,OAAO,CAAC,gBAAgB,CAAwB;IAGhD,OAAO,CAAC,UAAU,CAAiB;IAGnC,OAAO,CAAC,UAAU,CAAiB;IAEnC,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,QAAQ,CAMD;IAEf,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,WAAW;IAiGnB,SAAS,CAAC,UAAU;IAYpB,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,qBAAqB;IAU7B,MAAM;IAsDN,MAAM,CAAC,MAAM,0BAkCZ;CACJ;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,iBAAiB,EAAE,cAAc,CAAA;KACpC;CACJ"}
1
+ {"version":3,"file":"fastviews.d.ts","sourceRoot":"","sources":["../../src/components/fastviews.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,OAAO,EAAE,MAAM,KAAK,CAAA;AAGxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,qBACa,cAAe,SAAQ,WAAW;IAE3C,MAAM,EAAE,MAAM,CAAK;IAGnB,KAAK,EAAE,MAAM,CAAK;IAGlB,IAAI,CAAC,EAAE,MAAM,CAAA;IAGb,QAAQ,EAAE,OAAO,CAAQ;IAGzB,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAU;IAGrD,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAM;IAG3B,SAAS,EAAE,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,CAAiB;IAGnL,WAAW,CAAC,EAAE,MAAM,CAAA;IAGpB,OAAO,CAAC,gBAAgB,CAAwB;IAGhD,OAAO,CAAC,UAAU,CAAiB;IAGnC,OAAO,CAAC,UAAU,CAAiB;IAEnC,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,QAAQ,CAMD;IAEf,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,WAAW;IAiGnB,SAAS,CAAC,UAAU;IAYpB,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,qBAAqB;IAU7B,MAAM;IAsDN,MAAM,CAAC,MAAM,0BAkCZ;CACJ;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,iBAAiB,EAAE,cAAc,CAAA;KACpC;CACJ"}
@@ -7,7 +7,6 @@ export declare class DocksFileBrowser extends DocksPart {
7
7
  private static readonly SETTINGS_KEY_SELECTED_PATH;
8
8
  private settingsLoaded;
9
9
  private root?;
10
- private fileEditorOptions;
11
10
  private workspaceDir?;
12
11
  private treeRef;
13
12
  private loadingNodes;
@@ -15,6 +14,7 @@ export declare class DocksFileBrowser extends DocksPart {
15
14
  private treeBuildGeneration;
16
15
  private workspaceChangedDebounceId;
17
16
  private pendingWorkspaceDir;
17
+ private treeContextMenuAbort?;
18
18
  protected doBeforeUI(): void;
19
19
  disconnectedCallback(): void;
20
20
  protected firstUpdated(changedProperties: Map<string, any>): void;
@@ -40,6 +40,8 @@ export declare class DocksFileBrowser extends DocksPart {
40
40
  onSelectionChanged(event: Event): void;
41
41
  private currentDropTarget?;
42
42
  private getDirectoryDropTargetFromEvent;
43
+ private syncContextMenuTarget;
44
+ private attachTreeContextMenuSync;
43
45
  private setupDragAndDrop;
44
46
  private handleWorkspaceDrop;
45
47
  private handleFilesDrop;
@@ -1 +1 @@
1
- {"version":3,"file":"filebrowser.d.ts","sourceRoot":"","sources":["../../src/components/filebrowser.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,cAAc,EAAW,MAAM,KAAK,CAAA;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EACH,SAAS,EAET,QAAQ,EAKX,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAAE,QAAQ,EAAsB,MAAM,oBAAoB,CAAC;AAiBlE,qBACa,gBAAiB,SAAQ,SAAS;IAE3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAkB;IACpE,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,IAAI,CAAC,CAAW;IAExB,OAAO,CAAC,iBAAiB,CAAiE;IAC1F,OAAO,CAAC,YAAY,CAAC,CAAW;IAChC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAAuB;IAC3C,gHAAgH;IAChH,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,0BAA0B,CAA4C;IAC9E,OAAO,CAAC,mBAAmB,CAAwB;IAEnD,SAAS,CAAC,UAAU;IAapB,oBAAoB;IASpB,SAAS,CAAC,YAAY,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAK1D,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;YAOvC,mBAAmB;IAKjC,SAAS,CAAC,aAAa;IAQvB,SAAS,CAAC,iBAAiB;IAyB3B,kBAAkB,CAAC,YAAY,EAAE,SAAS,GAAG,SAAS;YAcxC,oBAAoB;IAM5B,oBAAoB,CAAC,YAAY,EAAE,SAAS,GAAG,SAAS;IAKxD,aAAa,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,YAAY,UAAQ;YAuBpD,mBAAmB;YAOnB,4BAA4B;YAiC5B,cAAc;YAWd,0BAA0B;YAW1B,iBAAiB;IAWzB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,UAAQ,EAAE,oBAAoB,UAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwEnH,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,UAAQ,GAAG,cAAc;IAmDjE,OAAO,CAAC,WAAW;YAsDL,UAAU;YAOV,gBAAgB;IA6CxB,mBAAmB,CAAC,KAAK,EAAE,KAAK;IAmBtC,kBAAkB,CAAC,KAAK,EAAE,KAAK;IA0B/B,OAAO,CAAC,iBAAiB,CAAC,CAAc;IAExC,OAAO,CAAC,+BAA+B;IAsBvC,OAAO,CAAC,gBAAgB;YA8GV,mBAAmB;YAkHnB,eAAe;IAsC7B,OAAO,CAAC,eAAe;IAKvB,SAAS,CAAC,aAAa;IAavB,MAAM,CAAC,MAAM,0BA4EX;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,mBAAmB,EAAE,gBAAgB,CAAA;KACxC;CACJ"}
1
+ {"version":3,"file":"filebrowser.d.ts","sourceRoot":"","sources":["../../src/components/filebrowser.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,cAAc,EAAW,MAAM,KAAK,CAAA;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EACH,SAAS,EAET,QAAQ,EAKX,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAAE,QAAQ,EAAsB,MAAM,oBAAoB,CAAC;AAiBlE,qBACa,gBAAiB,SAAQ,SAAS;IAE3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAkB;IACpE,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,IAAI,CAAC,CAAW;IACxB,OAAO,CAAC,YAAY,CAAC,CAAW;IAChC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAAuB;IAC3C,gHAAgH;IAChH,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,0BAA0B,CAA4C;IAC9E,OAAO,CAAC,mBAAmB,CAAwB;IACnD,OAAO,CAAC,oBAAoB,CAAC,CAAkB;IAE/C,SAAS,CAAC,UAAU;IAapB,oBAAoB;IAWpB,SAAS,CAAC,YAAY,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAK1D,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;YAOvC,mBAAmB;IAKjC,SAAS,CAAC,aAAa;IAQvB,SAAS,CAAC,iBAAiB;IA0B3B,kBAAkB,CAAC,YAAY,EAAE,SAAS,GAAG,SAAS;YAcxC,oBAAoB;IAM5B,oBAAoB,CAAC,YAAY,EAAE,SAAS,GAAG,SAAS;IAKxD,aAAa,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,YAAY,UAAQ;YAuBpD,mBAAmB;YAOnB,4BAA4B;YAiC5B,cAAc;YAWd,0BAA0B;YAW1B,iBAAiB;IAWzB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,UAAQ,EAAE,oBAAoB,UAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwEnH,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,UAAQ,GAAG,cAAc;IAmDjE,OAAO,CAAC,WAAW;YAsDL,UAAU;YAOV,gBAAgB;IA6CxB,mBAAmB,CAAC,KAAK,EAAE,KAAK;IAmBtC,kBAAkB,CAAC,KAAK,EAAE,KAAK;IAoB/B,OAAO,CAAC,iBAAiB,CAAC,CAAc;IAExC,OAAO,CAAC,+BAA+B;IAsBvC,OAAO,CAAC,qBAAqB,CAK3B;IAEF,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,gBAAgB;YA+GV,mBAAmB;YAkHnB,eAAe;IAsC7B,OAAO,CAAC,eAAe;IAKvB,SAAS,CAAC,aAAa;IAavB,MAAM,CAAC,MAAM,0BA4EX;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,mBAAmB,EAAE,gBAAgB,CAAA;KACxC;CACJ"}
@@ -1,4 +1,4 @@
1
- import { Contribution } from './contributionregistry';
1
+ import { CommandContribution } from './contributionregistry';
2
2
  export declare const TOPIC_COMMAND_REGISTERED = "events/commandregistry/commandRegistered";
3
3
  export interface Parameter {
4
4
  name: string;
@@ -73,7 +73,7 @@ export declare const commandRegistry: CommandRegistry;
73
73
  export interface RegisterOptions {
74
74
  command: Command;
75
75
  handler?: Handler;
76
- contribution?: Contribution;
76
+ contribution?: Omit<CommandContribution, 'command'>;
77
77
  }
78
78
  export declare const registerAll: (options: RegisterOptions) => void;
79
79
  //# sourceMappingURL=commandregistry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commandregistry.d.ts","sourceRoot":"","sources":["../../src/core/commandregistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commandregistry.d.ts","sourceRoot":"","sources":["../../src/core/commandregistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type DropdownItemElement = HTMLElement & {
2
+ submenuOpen?: boolean;
3
+ };
4
+ /** Collect wa-dropdown-item elements under a menu root, including shadow DOM. */
5
+ export declare function collectDropdownItems(root: Element): DropdownItemElement[];
6
+ /** Close every open submenu except the one being activated. */
7
+ export declare function closeSiblingSubmenus(activeItem: Element, menuRoot: Element): void;
8
+ export {};
9
+ //# sourceMappingURL=dropdown-menu-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-menu-utils.d.ts","sourceRoot":"","sources":["../../src/core/dropdown-menu-utils.ts"],"names":[],"mappings":"AAAA,KAAK,mBAAmB,GAAG,WAAW,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAkBnE,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,mBAAmB,EAAE,CAQzE;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAQjF"}
@@ -1 +1 @@
1
- {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../src/core/toast.ts"],"names":[],"mappings":"AACA,OAAO,8BAA8B,CAAC;AAYtC,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,SAGpC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,SAGrC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,SAGvC,CAAC"}
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../src/core/toast.ts"],"names":[],"mappings":"AAAA,OAAO,uDAAuD,CAAC;AAoC/D,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,SAGpC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,SAGrC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,SAGvC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"webawesome.d.ts","sourceRoot":"","sources":["../../src/externals/webawesome.ts"],"names":[],"mappings":"AACA,OAAO,yEAAyE,CAAC;AACjF,OAAO,+DAA+D,CAAC;AACvE,OAAO,yDAAyD,CAAC;AACjE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,iEAAiE,CAAC;AACzE,OAAO,2EAA2E,CAAC;AACnF,OAAO,yDAAyD,CAAC;AACjE,OAAO,qEAAqE,CAAC;AAC7E,OAAO,2DAA2D,CAAC;AACnE,OAAO,qDAAqD,CAAC;AAC7D,OAAO,6DAA6D,CAAC;AACrE,OAAO,uEAAuE,CAAC;AAC/E,OAAO,6DAA6D,CAAC;AACrE,OAAO,qEAAqE,CAAC;AAC7E,OAAO,iEAAiE,CAAC;AACzE,OAAO,mEAAmE,CAAC;AAC3E,OAAO,2DAA2D,CAAC;AACnE,OAAO,yDAAyD,CAAC;AACjE,OAAO,2DAA2D,CAAC;AACnE,OAAO,yDAAyD,CAAC;AACjE,OAAO,6DAA6D,CAAC;AACrE,OAAO,uEAAuE,CAAC;AAC/E,OAAO,qEAAqE,CAAC;AAC7E,OAAO,mEAAmE,CAAC;AAC3E,OAAO,uEAAuE,CAAC;AAC/E,OAAO,qDAAqD,CAAC;AAC7D,OAAO,2DAA2D,CAAC;AACnE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,uFAAuF,CAAC;AAC/F,OAAO,6DAA6D,CAAC;AACrE,OAAO,+EAA+E,CAAC;AACvF,OAAO,qEAAqE,CAAC;AAC7E,OAAO,yDAAyD,CAAC;AACjE,OAAO,qDAAqD,CAAC;AAC7D,OAAO,2DAA2D,CAAC;AACnE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,qEAAqE,CAAC;AAC7E,OAAO,uEAAuE,CAAC;AAC/E,OAAO,2DAA2D,CAAC;AACnE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,mEAAmE,CAAC;AAC3E,OAAO,yDAAyD,CAAC;AACjE,OAAO,uEAAuE,CAAC;AAC/E,OAAO,2EAA2E,CAAC;AACnF,OAAO,6DAA6D,CAAC;AACrE,OAAO,yDAAyD,CAAC;AACjE,OAAO,6DAA6D,CAAC;AACrE,OAAO,yDAAyD,CAAC;AACjE,OAAO,2DAA2D,CAAC;AACnE,OAAO,mEAAmE,CAAC;AAC3E,OAAO,yDAAyD,CAAC;AACjE,OAAO,mDAAmD,CAAC;AAC3D,OAAO,+DAA+D,CAAC;AACvE,OAAO,+DAA+D,CAAC;AACvE,OAAO,mDAAmD,CAAC;AAC3D,OAAO,6DAA6D,CAAC;AACrE,OAAO,2DAA2D,CAAC;AACnE,OAAO,qDAAqD,CAAC;AAC7D,OAAO,+DAA+D,CAAC;AACvE,OAAO,yEAAyE,CAAC;AAGjF,OAAO,+CAA+C,CAAC;AACvD,OAAO,kDAAkD,CAAC;AAC1D,OAAO,uDAAuD,CAAC;AAE/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAA;AAY1D,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"webawesome.d.ts","sourceRoot":"","sources":["../../src/externals/webawesome.ts"],"names":[],"mappings":"AACA,OAAO,+DAA+D,CAAC;AACvE,OAAO,yEAAyE,CAAC;AACjF,OAAO,yEAAyE,CAAC;AACjF,OAAO,+DAA+D,CAAC;AACvE,OAAO,yDAAyD,CAAC;AACjE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,iEAAiE,CAAC;AACzE,OAAO,2EAA2E,CAAC;AACnF,OAAO,yDAAyD,CAAC;AACjE,OAAO,qEAAqE,CAAC;AAC7E,OAAO,2DAA2D,CAAC;AACnE,OAAO,qDAAqD,CAAC;AAC7D,OAAO,6DAA6D,CAAC;AACrE,OAAO,uEAAuE,CAAC;AAC/E,OAAO,6DAA6D,CAAC;AACrE,OAAO,yEAAyE,CAAC;AACjF,OAAO,qEAAqE,CAAC;AAC7E,OAAO,iEAAiE,CAAC;AACzE,OAAO,mEAAmE,CAAC;AAC3E,OAAO,2DAA2D,CAAC;AACnE,OAAO,yDAAyD,CAAC;AACjE,OAAO,2DAA2D,CAAC;AACnE,OAAO,yDAAyD,CAAC;AACjE,OAAO,6DAA6D,CAAC;AACrE,OAAO,uEAAuE,CAAC;AAC/E,OAAO,qEAAqE,CAAC;AAC7E,OAAO,mEAAmE,CAAC;AAC3E,OAAO,uEAAuE,CAAC;AAC/E,OAAO,qDAAqD,CAAC;AAC7D,OAAO,2DAA2D,CAAC;AACnE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,uFAAuF,CAAC;AAC/F,OAAO,iEAAiE,CAAC;AACzE,OAAO,6DAA6D,CAAC;AACrE,OAAO,+EAA+E,CAAC;AACvF,OAAO,qEAAqE,CAAC;AAC7E,OAAO,yDAAyD,CAAC;AACjE,OAAO,+DAA+D,CAAC;AACvE,OAAO,qDAAqD,CAAC;AAC7D,OAAO,iEAAiE,CAAC;AACzE,OAAO,2DAA2D,CAAC;AACnE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,qEAAqE,CAAC;AAC7E,OAAO,uEAAuE,CAAC;AAC/E,OAAO,2DAA2D,CAAC;AACnE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,mEAAmE,CAAC;AAC3E,OAAO,yDAAyD,CAAC;AACjE,OAAO,yEAAyE,CAAC;AACjF,OAAO,uEAAuE,CAAC;AAC/E,OAAO,2EAA2E,CAAC;AACnF,OAAO,6DAA6D,CAAC;AACrE,OAAO,yDAAyD,CAAC;AACjE,OAAO,6DAA6D,CAAC;AACrE,OAAO,yDAAyD,CAAC;AACjE,OAAO,2DAA2D,CAAC;AACnE,OAAO,mEAAmE,CAAC;AAC3E,OAAO,yDAAyD,CAAC;AACjE,OAAO,mDAAmD,CAAC;AAC3D,OAAO,+DAA+D,CAAC;AACvE,OAAO,+DAA+D,CAAC;AACvE,OAAO,mDAAmD,CAAC;AAC3D,OAAO,6DAA6D,CAAC;AACrE,OAAO,iEAAiE,CAAC;AACzE,OAAO,uDAAuD,CAAC;AAC/D,OAAO,iEAAiE,CAAC;AACzE,OAAO,2DAA2D,CAAC;AACnE,OAAO,qDAAqD,CAAC;AAC7D,OAAO,+DAA+D,CAAC;AACvE,OAAO,yEAAyE,CAAC;AAGjF,OAAO,+CAA+C,CAAC;AACvD,OAAO,kDAAkD,CAAC;AAC1D,OAAO,uDAAuD,CAAC;AAE/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAA;AAY1D,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -1,2 +1,2 @@
1
- import { t as registerIconLibrary } from "../webawesome-CJyhVNu_.js";
1
+ import { t as registerIconLibrary } from "../webawesome-Y1_HnKa_.js";
2
2
  export { registerIconLibrary };
@@ -0,0 +1,2 @@
1
+ import { t as FileSysDirHandleResource } from "./fs-access-DTXPsV1W.js";
2
+ export { FileSysDirHandleResource };
@@ -808,6 +808,6 @@ workspaceService.registerContribution({
808
808
  }
809
809
  });
810
810
  //#endregion
811
- export { File as a, TOPIC_WORKSPACE_CHANGED as c, WorkspaceService as d, workspaceService as f, Directory as i, TOPIC_WORKSPACE_CONNECTED as l, FileSysFileHandleResource as n, FileContentType as o, persistenceService as p, CompositeDirectory as r, StringFile as s, FileSysDirHandleResource as t, UnavailableWorkspaceFolderDirectory as u };
811
+ export { File as a, StringFile as c, UnavailableWorkspaceFolderDirectory as d, WorkspaceService as f, Directory as i, TOPIC_WORKSPACE_CHANGED as l, persistenceService as m, FileSysFileHandleResource as n, FileContentType as o, workspaceService as p, CompositeDirectory as r, Resource as s, FileSysDirHandleResource as t, TOPIC_WORKSPACE_CONNECTED as u };
812
812
 
813
- //# sourceMappingURL=fs-access-D-fDaJ8V.js.map
813
+ //# sourceMappingURL=fs-access-DTXPsV1W.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs-access-D-fDaJ8V.js","names":[],"sources":["../src/core/persistenceservice.ts","../src/core/filesys/common.ts","../src/core/filesys/fs-access.ts"],"sourcesContent":["import {rootContext} from \"./di\";\n\nconst DB_NAME = 'eclipse-docks-persistence';\nconst STORE_NAME = 'keyval';\nconst DB_VERSION = 1;\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction getDB(): Promise<IDBDatabase> {\n if (!dbPromise) {\n dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n request.onupgradeneeded = (e) => {\n (e.target as IDBOpenDBRequest).result.createObjectStore(STORE_NAME);\n };\n });\n }\n return dbPromise;\n}\n\nexport class PersistenceService {\n /**\n * Persists a value under the given key. When value is null or undefined,\n * the entry for that key is removed (delete semantics).\n */\n async persistObject(key: string, value: unknown): Promise<void> {\n const db = await getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const req =\n value === null || value === undefined\n ? store.delete(key)\n : store.put(value, key);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n }\n\n async getObject(key: string): Promise<any> {\n const db = await getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const req = tx.objectStore(STORE_NAME).get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n }\n}\n\nexport const persistenceService = new PersistenceService();\nrootContext.put(\"persistenceService\", persistenceService);\n","import { persistenceService } from \"../persistenceservice\";\nimport { publish } from \"../events\";\nimport { rootContext } from \"../di\";\nimport { createLogger } from \"../logger\";\n\nexport const TOPIC_WORKSPACE_CHANGED = \"events/filesys/workspaceChanged\"\nexport const TOPIC_WORKSPACE_CONNECTED = \"events/filesys/workspaceConnected\"\n\nconst logger = createLogger('WorkspaceService');\n\nexport abstract class Resource {\n public state: { [p: string]: any } = {};\n\n public abstract getName(): string;\n\n public abstract getParent(): Directory | undefined;\n\n public abstract delete(name?: string, recursive?: boolean): Promise<void>;\n\n public abstract copyTo(targetPath: string): Promise<void>;\n\n public abstract rename(newName: string): Promise<void>;\n\n public getWorkspacePath(): string {\n const paths: string[] = []\n let current: Resource | undefined = this\n let root: Directory | undefined\n while (current) {\n paths.push(current.getName())\n const parent = current.getParent()\n if (!parent) root = current as Directory\n current = parent\n }\n paths.reverse()\n const workspace = typeof workspaceService?.getWorkspaceSync === 'function' ? workspaceService.getWorkspaceSync() : undefined\n if (workspace && root && 'isDirectChild' in workspace && typeof (workspace as any).isDirectChild === 'function' && (workspace as any).isDirectChild(root)) {\n const folderName = (workspace as any).getFolderNameForDirectory(root)\n if (folderName && paths.length > 0) return paths.length > 1 ? folderName + '/' + paths.slice(1).join('/') : folderName\n }\n paths.shift()\n return paths.join(\"/\");\n }\n\n public getWorkspace(): Directory {\n let current: Resource | undefined = this\n while (current) {\n const parent: any = current.getParent()\n if (parent) {\n current = parent\n } else {\n break\n }\n }\n return current as Directory\n }\n}\n\nexport const resourceComparator = (c1: Resource, c2: Resource) => {\n if (c1 instanceof Directory && c2 instanceof File) {\n return -1\n }\n if (c1 instanceof File && c2 instanceof Directory) {\n return 1\n }\n return c1.getName().localeCompare(c2.getName())\n}\n\nexport enum FileContentType {\n TEXT, BINARY\n}\n\nexport enum FileContentEncoding {\n BASE64\n}\n\n/**\n * Options for reading file contents. Backend implementors are encouraged to\n * preserve MIME information when possible – for example, by returning the\n * native Blob from remote HTTP/WebDAV responses (via response.blob()) and\n * passing it through unchanged for { blob: true } / { uri: true } usages,\n * instead of recreating typeless Blobs from raw ArrayBuffers.\n */\nexport interface FileContentsOptions {\n contentType?: FileContentType;\n encoding?: FileContentEncoding;\n uri?: boolean;\n blob?: boolean;\n}\n\nexport interface GetResourceOptions {\n /**\n * When true, missing path segments MUST be created.\n *\n * Creation intent is encoded in the path:\n * - `path` without trailing slash => file intent for the last segment\n * - `path/` with trailing slash => directory intent for the last segment\n *\n * Backend implementations MUST preserve this behavior so callers (e.g. `mkdir`)\n * can force directory creation consistently across all backends.\n */\n create?: boolean\n}\n\nexport abstract class File extends Resource {\n public abstract getContents(options?: FileContentsOptions): Promise<any>;\n\n public abstract saveContents(contents: any, options?: FileContentsOptions): Promise<void>;\n\n public abstract size(): Promise<number | null>;\n}\n\nexport abstract class Directory extends Resource {\n public abstract listChildren(forceRefresh: boolean): Promise<Resource[]>;\n\n /**\n * Resolve a resource relative to this directory.\n *\n * Contract for backend implementations:\n * - Empty/invalid input should throw (or return null by backend convention).\n * - With `{ create: true }`, missing segments must be created.\n * - Trailing slash (`path.endsWith('/')`) means directory intent for final segment.\n * - No trailing slash means file intent for final segment when creation is needed.\n * - If the resolved/created resource type conflicts with intent, return null.\n * - If creation mutates workspace contents, publish `TOPIC_WORKSPACE_CHANGED`.\n */\n public abstract getResource(path: string, options?: GetResourceOptions): Promise<Resource | null>;\n\n public abstract touch(): void;\n}\n\nexport class StringFile extends File {\n private contents: string;\n private name: string;\n\n constructor(contents: string, name: string) {\n super();\n this.contents = contents\n this.name = name\n }\n\n async getContents(_options?: FileContentsOptions): Promise<any> {\n return this.contents\n }\n\n async saveContents(contents: any, _options?: FileContentsOptions): Promise<void> {\n this.contents = contents\n }\n\n async size(): Promise<number | null> {\n return this.contents.length || null;\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw Error(`Not supported`);\n }\n\n delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw Error(`Not supported`);\n }\n\n async rename(_newName: string): Promise<void> {\n throw Error(`Not supported`);\n }\n\n getName(): string {\n return this.name;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n}\n\nexport interface ResourceMap {\n [key: string]: Resource;\n}\n\n\nexport class CompositeDirectory extends Directory {\n private readonly entriesByName: Map<string, Directory>;\n\n constructor(\n directories: Directory[],\n private readonly displayName: string = '/'\n ) {\n super();\n this.entriesByName = new Map(directories.map(d => [d.getName(), d]));\n }\n\n getFolderNameForDirectory(dir: Directory): string | undefined {\n for (const [name, d] of this.entriesByName) {\n if (d === dir) return name;\n }\n return undefined;\n }\n\n isDirectChild(dir: Directory): boolean {\n return this.getFolderNameForDirectory(dir) !== undefined;\n }\n\n getName(): string {\n return this.displayName;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n\n async listChildren(_forceRefresh: boolean): Promise<Resource[]> {\n return Array.from(this.entriesByName.values());\n }\n\n async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {\n const normalized = path?.replace(/^\\/+/, \"\").trim();\n if (!normalized) {\n return null;\n }\n const idx = normalized.indexOf('/');\n const folderName = idx >= 0 ? normalized.slice(0, idx).trim() : normalized.trim();\n const rest = idx >= 0 ? normalized.slice(idx + 1).trim() : '';\n const dir = this.entriesByName.get(folderName);\n if (!dir) {\n return null;\n }\n if (!rest) {\n return dir;\n }\n return dir.getResource(rest, options);\n }\n\n touch(): void {\n for (const dir of this.entriesByName.values()) {\n dir.touch();\n }\n }\n\n async delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw new Error('Delete not supported on workspace root');\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw new Error('Copy not supported on workspace root');\n }\n\n async rename(_newName: string): Promise<void> {\n throw new Error('Rename not supported on workspace root');\n }\n\n getFolderByName(name: string): Directory | undefined {\n return this.entriesByName.get(name);\n }\n}\n\n/**\n * Placeholder directory used when a persisted workspace folder references\n * a backend type for which no contribution is currently registered.\n *\n * This allows the UI to surface a metadata node instead of silently\n * dropping the folder, and it can be replaced later once the real\n * contribution is loaded.\n */\nexport class MissingContributionDirectory extends Directory {\n private readonly backendType: string;\n private readonly persistedData: any;\n private readonly name: string;\n\n constructor(options: { backendType: string; name: string; data: any }) {\n super();\n this.backendType = options.backendType;\n this.persistedData = options.data;\n this.name = options.name;\n }\n\n getName(): string {\n return this.name;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n\n async listChildren(_forceRefresh: boolean): Promise<Resource[]> {\n return [];\n }\n\n async getResource(_path: string, _options?: GetResourceOptions): Promise<Resource | null> {\n throw new Error(`Workspace backend \"${this.backendType}\" is not available in this environment.`);\n }\n\n touch(): void {\n // No-op: without a real backend there is nothing to refresh.\n }\n\n async delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw new Error(`Cannot modify workspace folder for missing backend \"${this.backendType}\".`);\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw new Error(`Cannot copy from workspace folder for missing backend \"${this.backendType}\".`);\n }\n\n async rename(_newName: string): Promise<void> {\n throw new Error(`Cannot rename workspace folder for missing backend \"${this.backendType}\".`);\n }\n}\n\nfunction workspaceFolderDisplayNameFromPersisted(folder: { type: string; data: any }): string {\n const fromData =\n folder.data && typeof folder.data === 'object' && (folder.data as { name?: string }).name;\n if (typeof fromData === 'string' && fromData.length > 0) {\n return fromData;\n }\n return folder.type;\n}\n\nfunction formatRestoreFailureReason(error: unknown): string {\n if (error instanceof Error && error.message.trim()) {\n return error.message;\n }\n return 'Could not connect to this workspace folder.';\n}\n\nconst RESTORE_RETURNED_NOTHING = 'Could not restore this workspace folder.';\n\n/**\n * Placeholder when a contribution exists but restore/connect cannot produce a usable root\n * (network, auth, invalid persisted data). Treated like {@link MissingContributionDirectory}\n * for late registration retries via {@link isWorkspaceFolderPlaceholder}.\n */\nexport class UnavailableWorkspaceFolderDirectory extends Directory {\n private readonly backendType: string;\n private readonly name: string;\n private readonly reason: string;\n\n constructor(options: { backendType: string; name: string; data: any; reason: string }) {\n super();\n this.backendType = options.backendType;\n this.name = options.name;\n this.reason = options.reason;\n }\n\n getFailureReason(): string {\n return this.reason;\n }\n\n getName(): string {\n return this.name;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n\n async listChildren(_forceRefresh: boolean): Promise<Resource[]> {\n return [];\n }\n\n async getResource(_path: string, _options?: GetResourceOptions): Promise<Resource | null> {\n throw new Error(\n `Workspace folder \"${this.name}\" (${this.backendType}) is unavailable: ${this.reason}`\n );\n }\n\n touch(): void {\n // No-op\n }\n\n async delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw new Error(`Cannot modify unavailable workspace folder \"${this.name}\" (${this.backendType}).`);\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw new Error(`Cannot copy from unavailable workspace folder \"${this.name}\" (${this.backendType}).`);\n }\n\n async rename(_newName: string): Promise<void> {\n throw new Error(`Cannot rename unavailable workspace folder \"${this.name}\" (${this.backendType}).`);\n }\n}\n\nexport function isWorkspaceFolderPlaceholder(directory: Directory): boolean {\n return (\n directory instanceof MissingContributionDirectory ||\n directory instanceof UnavailableWorkspaceFolderDirectory\n );\n}\n\n/**\n * Runs a contribution's restore; returns a real directory or an {@link UnavailableWorkspaceFolderDirectory}.\n * Invokes onCaughtError only when restore threw (not when it returned undefined).\n */\nasync function restorePersistedFolderToDirectory(\n type: string,\n data: any,\n restore: (data: any) => Promise<Directory | undefined>,\n onCaughtError?: (error: unknown) => void\n): Promise<Directory> {\n const displayName = workspaceFolderDisplayNameFromPersisted({ type, data });\n try {\n const dir = await restore(data);\n if (dir) {\n return dir;\n }\n return new UnavailableWorkspaceFolderDirectory({\n backendType: type,\n name: displayName,\n data,\n reason: RESTORE_RETURNED_NOTHING\n });\n } catch (error) {\n onCaughtError?.(error);\n return new UnavailableWorkspaceFolderDirectory({\n backendType: type,\n name: displayName,\n data,\n reason: formatRestoreFailureReason(error)\n });\n }\n}\n\nexport interface WorkspaceContribution {\n type: string;\n name: string;\n canHandle(input: any): boolean;\n connect(input: any): Promise<Directory>;\n restore?(data: any): Promise<Directory | undefined>;\n persist?(workspace: Directory): Promise<any>;\n}\n\ninterface PersistedWorkspaceData {\n type?: string;\n data?: any;\n folders?: Array<{ type: string; data: any }>;\n}\n\nconst LEGACY_WORKSPACE_KEY = \"workspace_data\";\n\nexport class WorkspaceService {\n private workspace?: Promise<Directory | undefined>;\n private _currentWorkspace: Directory | undefined = undefined;\n private folders: Array<{ type: string; data: any; directory: Directory }> = [];\n private currentType?: string;\n private contributions: Map<string, WorkspaceContribution> = new Map();\n private initPromise: Promise<void>;\n private restoredTypes: Set<string> = new Set();\n\n getWorkspaceSync(): Directory | undefined {\n return this._currentWorkspace;\n }\n\n constructor() {\n let resolveInit!: () => void;\n this.initPromise = new Promise<void>((resolve) => {\n resolveInit = resolve;\n });\n this.loadPersistedWorkspace(resolveInit);\n }\n\n registerContribution(contribution: WorkspaceContribution): void {\n this.contributions.set(contribution.type, contribution);\n void this.tryRestoreForContribution(contribution);\n }\n\n getContributions(): WorkspaceContribution[] {\n return Array.from(this.contributions.values());\n }\n\n private static readonly DEFAULT_INDEXEDDB_FOLDER_NAME = 'My Folder';\n\n private async tryRestoreForContribution(contribution: WorkspaceContribution): Promise<void> {\n await this.initPromise;\n\n if (this.restoredTypes.has(contribution.type)) {\n return;\n }\n\n const existingForType = this.folders.filter(f => f.type === contribution.type);\n const hasRealFoldersForType = existingForType.some(f => !isWorkspaceFolderPlaceholder(f.directory));\n if (hasRealFoldersForType) {\n this.restoredTypes.add(contribution.type);\n return;\n }\n\n const raw = await persistenceService.getObject(LEGACY_WORKSPACE_KEY) as PersistedWorkspaceData | null;\n if (!raw?.folders || !Array.isArray(raw.folders)) {\n this.restoredTypes.add(contribution.type);\n return;\n }\n\n const toRestore = raw.folders.filter(f => f.type === contribution.type);\n if (toRestore.length === 0) {\n this.restoredTypes.add(contribution.type);\n return;\n }\n\n // Remove any placeholder folders for this type; we'll replace them with\n // real directories if restoration succeeds.\n this.folders = this.folders.filter(\n f => !(f.type === contribution.type && isWorkspaceFolderPlaceholder(f.directory))\n );\n\n for (const folder of toRestore) {\n if (!contribution.restore) {\n continue;\n }\n\n const directory = await restorePersistedFolderToDirectory(\n contribution.type,\n folder.data,\n contribution.restore,\n (error) =>\n logger.warn(\n `Failed to restore folder (${contribution.type}) on contribution registration:`,\n error\n )\n );\n this.folders.push({ type: contribution.type, data: folder.data, directory });\n }\n\n if (this.folders.length === 0) {\n this.restoredTypes.add(contribution.type);\n return;\n }\n\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n await this.persistFolders();\n if (composite) {\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n logger.debug(`Workspace folders restored for contribution type: ${contribution.type}`);\n }\n\n this.restoredTypes.add(contribution.type);\n }\n\n private async loadPersistedWorkspace(resolveInit: () => void): Promise<void> {\n logger.debug('Restoring workspace from persistence');\n try {\n const raw = await persistenceService.getObject(LEGACY_WORKSPACE_KEY) as PersistedWorkspaceData | null;\n if (!raw) {\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n }\n\n if (raw?.folders && Array.isArray(raw.folders) && raw.folders.length > 0) {\n const normalized = raw.folders.map((f: { type: string; data: any }) => ({ type: f.type, data: f.data }));\n await this.resolveFolders(normalized);\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n if (composite) {\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n logger.debug('Workspace restored from persisted folders');\n }\n resolveInit();\n return;\n }\n\n if (raw && raw.type && raw.data !== undefined) {\n const contribution = this.contributions.get(raw.type);\n if (contribution?.restore) {\n try {\n const dir = await contribution.restore!(raw.data);\n if (dir) {\n this.folders = [{ type: raw.type, data: raw.data, directory: dir }];\n const comp = this.buildComposite();\n this.workspace = Promise.resolve(comp);\n this._currentWorkspace = comp ?? undefined;\n this.currentType = raw.type;\n await this.persistFolders();\n publish(TOPIC_WORKSPACE_CONNECTED, comp);\n logger.debug('Workspace restored from legacy format');\n }\n } catch (error) {\n logger.error('Failed to restore legacy workspace:', error);\n }\n }\n }\n if (!this.workspace) {\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n }\n\n resolveInit();\n } finally {\n if (this.folders.length === 0) {\n try {\n await this.connectFolder({ indexeddb: true, name: WorkspaceService.DEFAULT_INDEXEDDB_FOLDER_NAME });\n logger.debug('Connected default IndexedDB workspace');\n } catch (e) {\n logger.warn('Failed to connect default IndexedDB folder', e);\n }\n }\n }\n }\n\n private async resolveFolders(persisted: Array<{ type: string; data: any }>): Promise<void> {\n this.folders = [];\n for (const folder of persisted) {\n const contribution = this.contributions.get(folder.type);\n if (!contribution?.restore) {\n const displayName =\n (folder.data && typeof folder.data === 'object' && (folder.data as any).name) ||\n `${folder.type} (missing)`;\n const placeholder = new MissingContributionDirectory({\n backendType: folder.type,\n name: displayName,\n data: folder.data\n });\n this.folders.push({ type: folder.type, data: folder.data, directory: placeholder });\n continue;\n }\n const directory = await restorePersistedFolderToDirectory(\n folder.type,\n folder.data,\n contribution.restore,\n (error) => logger.warn(`Failed to restore folder (${folder.type}):`, error)\n );\n this.folders.push({ type: folder.type, data: folder.data, directory });\n }\n }\n\n private buildComposite(): CompositeDirectory | undefined {\n if (this.folders.length === 0) {\n return undefined;\n }\n return new CompositeDirectory(this.folders.map(f => f.directory));\n }\n\n private async persistFolders(): Promise<void> {\n const toPersist = this.folders.length > 0\n ? { folders: this.folders.map(f => ({ type: f.type, data: f.data })) }\n : null;\n await persistenceService.persistObject(LEGACY_WORKSPACE_KEY, toPersist);\n await persistenceService.persistObject(\"workspace\", null);\n logger.debug(`Persisted ${this.folders.length} folder(s)`);\n }\n\n async getFolders(): Promise<Array<{ name: string; type: string }>> {\n await this.initPromise;\n return this.folders.map(f => ({ name: f.directory.getName(), type: f.type }));\n }\n\n async getFolderInfoForDirectory(directory: Directory): Promise<{ name: string; type: string; backendName: string } | undefined> {\n await this.initPromise;\n const folder = this.folders.find(f => f.directory === directory);\n if (!folder) {\n return undefined;\n }\n const name =\n (folder.data && typeof folder.data === 'object' && (folder.data as any).name) ||\n folder.directory.getName();\n const contribution = this.contributions.get(folder.type);\n const backendName = contribution?.name ?? folder.type;\n return { name, type: folder.type, backendName };\n }\n\n /**\n * Whether {@link resource} still belongs to the current workspace (walks up to the backend root).\n * After {@link disconnectFolder}, the root is no longer listed, so in-flight listChildren errors can be ignored.\n */\n async isResourceInCurrentWorkspace(resource: Resource): Promise<boolean> {\n await this.initPromise;\n let current: Resource | undefined = resource;\n while (current) {\n const parent = current.getParent();\n if (!parent) {\n if (!(current instanceof Directory)) {\n return false;\n }\n return this.folders.some(f => f.directory === current);\n }\n current = parent;\n }\n return false;\n }\n\n /**\n * Update persisted metadata for a workspace root directory.\n * Currently used to keep display names of roots (e.g. IndexedDB) in sync\n * with their in-memory Directory instances.\n */\n async updateFolderName(directory: Directory, name: string): Promise<void> {\n await this.initPromise;\n const folder = this.folders.find(f => f.directory === directory);\n if (!folder) {\n return;\n }\n if (folder.data && typeof folder.data === 'object') {\n folder.data = { ...(folder.data as any), name };\n } else {\n folder.data = { name };\n }\n await this.persistFolders();\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n logger.debug(`Updated folder name: ${name}`);\n }\n\n async connectFolder(input: any): Promise<Directory> {\n await this.initPromise;\n const contribution = Array.from(this.contributions.values()).find(c => c.canHandle(input));\n if (!contribution) {\n throw new Error('No workspace contribution can handle this input');\n }\n const name = (input?.name as string) ?? contribution.type;\n logger.debug(`Connecting workspace: ${contribution.type}, ${name}`);\n const directory = await contribution.connect(input);\n const data = contribution.persist ? await contribution.persist(directory) : input;\n this.folders.push({ type: contribution.type, data, directory });\n await this.persistFolders();\n this.currentType = this.folders.length === 1 ? contribution.type : undefined;\n const composite = this.buildComposite()!;\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n const displayName = directory.getName();\n logger.info(`Workspace connected: ${contribution.type} (${displayName})`);\n return composite;\n }\n\n async disconnectFolder(directory: Directory): Promise<void> {\n await this.initPromise;\n const idx = this.folders.findIndex(f => f.directory === directory);\n if (idx < 0) {\n return;\n }\n const folder = this.folders[idx];\n logger.debug(`Disconnecting folder: ${folder.directory.getName()} (${folder.type})`);\n this.folders.splice(idx, 1);\n await this.persistFolders();\n if (this.folders.length > 0) {\n this.currentType = this.folders[0].type;\n } else {\n this.currentType = undefined;\n logger.info('Workspace disconnected');\n }\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n }\n\n async connectWorkspace(input: any): Promise<Directory> {\n return this.connectFolder(input);\n }\n\n public async getWorkspace(): Promise<Directory | undefined> {\n await this.initPromise;\n if (!this.workspace) {\n throw new Error('No workspace connected.');\n }\n return await this.workspace;\n }\n\n public isConnected(): boolean {\n return this.folders.length > 0;\n }\n\n public getWorkspaceType(): string | undefined {\n return this.currentType;\n }\n\n public async disconnectWorkspace(): Promise<void> {\n await this.initPromise;\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n this.folders = [];\n this.currentType = undefined;\n await this.persistFolders();\n publish(TOPIC_WORKSPACE_CONNECTED, undefined as any);\n logger.info('Workspace disconnected');\n }\n\n /**\n * Copy (and optionally move) a resource into a target directory within the\n * current workspace. This helper is connection-agnostic: it always resolves\n * paths via the composite workspace root so it can copy across different\n * backend folders.\n */\n public async copyResource(\n src: Resource,\n destDir: Directory,\n options?: { move?: boolean; newName?: string }\n ): Promise<void> {\n await this.initPromise;\n const workspace = this._currentWorkspace;\n if (!workspace) {\n throw new Error('No workspace connected.');\n }\n\n const targetName = options?.newName ?? src.getName();\n const destDirPath = destDir.getWorkspacePath();\n const targetBasePath = destDirPath ? `${destDirPath}/${targetName}` : targetName;\n\n const copyFileToPath = async (file: File, targetPath: string): Promise<void> => {\n const contents = await file.getContents({ blob: true });\n const targetFile = await workspace.getResource(targetPath, { create: true }) as File | null;\n if (!targetFile) {\n throw new Error(`Failed to create target file: ${targetPath}`);\n }\n await targetFile.saveContents(contents);\n };\n\n const copyDirectoryToPath = async (dir: Directory, targetPath: string): Promise<void> => {\n for (const child of await dir.listChildren(false)) {\n const childTargetPath = `${targetPath}/${child.getName()}`;\n if (child instanceof File) {\n await copyFileToPath(child, childTargetPath);\n } else if (child instanceof Directory) {\n await copyDirectoryToPath(child, childTargetPath);\n }\n }\n };\n\n if (src instanceof File) {\n await copyFileToPath(src, targetBasePath);\n } else if (src instanceof Directory) {\n await copyDirectoryToPath(src, targetBasePath);\n } else {\n throw new Error('Unsupported resource type for copy operation.');\n }\n\n if (options?.move) {\n await src.delete(undefined, true);\n }\n }\n}\n\nexport const workspaceService = new WorkspaceService();\nrootContext.put(\"workspaceService\", workspaceService);\n\n\n","import { publish } from \"../events\";\nimport {\n File,\n Directory,\n FileContentType,\n FileContentEncoding,\n type FileContentsOptions,\n type GetResourceOptions,\n type Resource,\n type ResourceMap,\n TOPIC_WORKSPACE_CHANGED,\n workspaceService,\n} from \"./common\";\n\nexport class FileSysFileHandleResource extends File {\n private fileHandle: FileSystemFileHandle;\n private parent: Directory;\n\n constructor(fileHandle: FileSystemFileHandle, parent: Directory) {\n super();\n this.fileHandle = fileHandle;\n this.parent = parent;\n }\n\n getName(): string {\n return this.fileHandle.name;\n }\n\n getParent(): Directory {\n return this.parent;\n }\n\n async delete() {\n return this.getParent().delete(this.getName());\n }\n\n async getContents(options?: FileContentsOptions): Promise<any> {\n const file = await this.fileHandle.getFile();\n\n if (!options || options?.contentType == FileContentType.TEXT) {\n return await file.text();\n }\n\n if (options?.encoding == FileContentEncoding.BASE64 || options?.uri) {\n return URL.createObjectURL(file);\n }\n\n if (options?.blob) {\n return file;\n }\n\n return file.stream();\n }\n\n async size(): Promise<number | null> {\n try {\n const file = await this.fileHandle.getFile();\n return file.size;\n } catch {\n return null;\n }\n }\n\n async saveContents(contents: any, _options?: FileContentsOptions): Promise<void> {\n const writable = await this.fileHandle.createWritable();\n\n if (contents && typeof contents.pipeTo === 'function') {\n await contents.pipeTo(writable);\n } else {\n const writer = writable.getWriter();\n try {\n await writer.write(contents);\n } finally {\n await writer.close();\n }\n }\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async copyTo(targetPath: string): Promise<void> {\n const contents = await this.getContents({ blob: true });\n const targetFile = await this.getWorkspace().getResource(targetPath, { create: true }) as File;\n await targetFile.saveContents(contents);\n }\n\n async rename(newName: string): Promise<void> {\n const parent = this.getParent() as FileSysDirHandleResource;\n if (!parent) {\n throw new Error('Cannot rename root resource');\n }\n\n if (this.getName() === newName) {\n return;\n }\n\n if (!('move' in this.fileHandle) || typeof (this.fileHandle as any).move !== 'function') {\n throw new Error('File rename not supported in this browser. Please use a browser with File System Access API move() support.');\n }\n\n try {\n await (this.fileHandle as any).move(newName);\n } catch (error: any) {\n if (error.name === 'NotAllowedError' ||\n error.message?.includes('not allowed') ||\n error.message?.includes('user agent')) {\n throw new Error('File rename failed: The operation took too long and user activation expired. Please try again.');\n }\n throw error;\n }\n\n await parent.listChildren(true);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n}\n\nexport class FileSysDirHandleResource extends Directory {\n private dirHandle: FileSystemDirectoryHandle;\n private files?: ResourceMap;\n private parent?: Directory;\n private loadingPromise?: Promise<Resource[]>;\n\n constructor(dirHandle: FileSystemDirectoryHandle, parent?: Directory) {\n super();\n this.dirHandle = dirHandle;\n this.parent = parent;\n }\n\n getHandle() {\n return this.dirHandle;\n }\n\n getParent(): Directory | undefined {\n return this.parent;\n }\n\n getName(): string {\n return this.dirHandle.name;\n }\n\n async listChildren(forceRefresh: boolean = false): Promise<Resource[]> {\n if (forceRefresh || !this.files) {\n if (this.loadingPromise) {\n return this.loadingPromise;\n }\n\n this.loadingPromise = (async () => {\n try {\n const files: ResourceMap = {};\n\n try {\n // @ts-ignore -- TS 6 lib.dom provides `values()` via merged FileSystemDirectoryHandle declarations;\n // IDE/lint can miss the merge and falsely report it missing while tsc is correct.\n for await (const entry of this.dirHandle.values()) {\n const child =\n entry.kind === \"file\"\n ? new FileSysFileHandleResource(entry, this)\n : new FileSysDirHandleResource(entry, this);\n files[child.getName()] = child;\n }\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n this.files = {};\n return [];\n }\n throw error;\n }\n\n this.files = files;\n return Object.values(this.files);\n } finally {\n this.loadingPromise = undefined;\n }\n })();\n\n return this.loadingPromise;\n }\n return Object.values(this.files);\n }\n\n async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {\n if (!path) {\n throw new Error(\"No path provided\");\n }\n const segments = path.split(\"/\").filter(s => s.trim());\n let currentResource: Resource = this;\n let workspaceChanged = false;\n try {\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i].trim();\n if (currentResource instanceof FileSysDirHandleResource) {\n await currentResource.listChildren();\n if (!currentResource.files) {\n return null;\n }\n const next = currentResource.files[segment];\n if (!next) {\n if (options?.create) {\n workspaceChanged = true;\n if (i < segments.length - 1) {\n try {\n const newDirHandle = await currentResource.dirHandle.getDirectoryHandle(segment, { create: true });\n const nextResource = new FileSysDirHandleResource(newDirHandle, currentResource);\n currentResource.files[segment] = nextResource;\n currentResource = nextResource;\n if (currentResource instanceof FileSysDirHandleResource) {\n await currentResource.listChildren();\n }\n continue;\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n throw new Error(`Directory not found or not accessible: ${segments.slice(0, i + 1).join('/')}`);\n }\n throw error;\n }\n } else {\n try {\n const newFileHandle = await currentResource.dirHandle.getFileHandle(segment, { create: true });\n const nextResource = new FileSysFileHandleResource(newFileHandle, currentResource);\n currentResource.files[segment] = nextResource;\n return nextResource;\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n throw new Error(`File not found or not accessible: ${segments.join('/')}`);\n }\n throw error;\n }\n }\n } else {\n return null;\n }\n } else {\n currentResource = next;\n }\n } else {\n return null;\n }\n }\n } finally {\n if (workspaceChanged) {\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n }\n return currentResource;\n }\n\n public touch() {\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async delete(name?: string, recursive: boolean = true) {\n if (!name) {\n const parent = this.getParent();\n if (parent instanceof FileSysDirHandleResource) {\n await parent.listChildren();\n if (parent.files) {\n delete parent.files[this.getName()];\n }\n }\n this.files = undefined;\n this.loadingPromise = undefined;\n return parent?.delete(this.getName());\n }\n return this.dirHandle.removeEntry(name, {\n recursive: recursive\n }).then(async () => {\n if (this.files) {\n delete this.files[name];\n }\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n });\n }\n\n async copyTo(targetPath: string) {\n for (const resource of (await this.listChildren())) {\n const targetResourceName = [targetPath, resource.getName()].join(\"/\");\n await resource.copyTo(targetResourceName);\n }\n }\n\n async rename(newName: string): Promise<void> {\n const parent = this.getParent() as FileSysDirHandleResource;\n if (!parent) {\n throw new Error('Cannot rename workspace root');\n }\n\n if (this.getName() === newName) {\n return;\n }\n\n if (!('move' in this.dirHandle) || typeof (this.dirHandle as any).move !== 'function') {\n throw new Error('Directory rename not supported in this browser. Please use a browser with File System Access API move() support.');\n }\n\n try {\n await (this.dirHandle as any).move(newName);\n } catch (error: any) {\n if (error.name === 'NotAllowedError' ||\n error.message?.includes('not allowed') ||\n error.message?.includes('user agent')) {\n throw new Error('Directory rename failed: The operation took too long and user activation expired. Please try again.');\n }\n throw error;\n }\n\n await parent.listChildren(true);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n}\n\n// Register default filesystem contribution\nworkspaceService.registerContribution({\n type: 'filesystem',\n name: 'fs',\n\n canHandle(input: any): boolean {\n return input && 'kind' in input && input.kind === 'directory';\n },\n\n async connect(input: FileSystemDirectoryHandle): Promise<Directory> {\n return new FileSysDirHandleResource(input);\n },\n\n async restore(data: any): Promise<Directory | undefined> {\n if (data && 'kind' in data && data.kind === 'directory') {\n return new FileSysDirHandleResource(data, undefined);\n }\n return undefined;\n },\n\n async persist(workspace: Directory): Promise<any> {\n if (workspace instanceof FileSysDirHandleResource) {\n return workspace.getHandle();\n }\n return null;\n }\n});\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"fs-access-DTXPsV1W.js","names":[],"sources":["../src/core/persistenceservice.ts","../src/core/filesys/common.ts","../src/core/filesys/fs-access.ts"],"sourcesContent":["import {rootContext} from \"./di\";\n\nconst DB_NAME = 'eclipse-docks-persistence';\nconst STORE_NAME = 'keyval';\nconst DB_VERSION = 1;\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\n\nfunction getDB(): Promise<IDBDatabase> {\n if (!dbPromise) {\n dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n request.onupgradeneeded = (e) => {\n (e.target as IDBOpenDBRequest).result.createObjectStore(STORE_NAME);\n };\n });\n }\n return dbPromise;\n}\n\nexport class PersistenceService {\n /**\n * Persists a value under the given key. When value is null or undefined,\n * the entry for that key is removed (delete semantics).\n */\n async persistObject(key: string, value: unknown): Promise<void> {\n const db = await getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const store = tx.objectStore(STORE_NAME);\n const req =\n value === null || value === undefined\n ? store.delete(key)\n : store.put(value, key);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n }\n\n async getObject(key: string): Promise<any> {\n const db = await getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly');\n const req = tx.objectStore(STORE_NAME).get(key);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n }\n}\n\nexport const persistenceService = new PersistenceService();\nrootContext.put(\"persistenceService\", persistenceService);\n","import { persistenceService } from \"../persistenceservice\";\nimport { publish } from \"../events\";\nimport { rootContext } from \"../di\";\nimport { createLogger } from \"../logger\";\n\nexport const TOPIC_WORKSPACE_CHANGED = \"events/filesys/workspaceChanged\"\nexport const TOPIC_WORKSPACE_CONNECTED = \"events/filesys/workspaceConnected\"\n\nconst logger = createLogger('WorkspaceService');\n\nexport abstract class Resource {\n public state: { [p: string]: any } = {};\n\n public abstract getName(): string;\n\n public abstract getParent(): Directory | undefined;\n\n public abstract delete(name?: string, recursive?: boolean): Promise<void>;\n\n public abstract copyTo(targetPath: string): Promise<void>;\n\n public abstract rename(newName: string): Promise<void>;\n\n public getWorkspacePath(): string {\n const paths: string[] = []\n let current: Resource | undefined = this\n let root: Directory | undefined\n while (current) {\n paths.push(current.getName())\n const parent = current.getParent()\n if (!parent) root = current as Directory\n current = parent\n }\n paths.reverse()\n const workspace = typeof workspaceService?.getWorkspaceSync === 'function' ? workspaceService.getWorkspaceSync() : undefined\n if (workspace && root && 'isDirectChild' in workspace && typeof (workspace as any).isDirectChild === 'function' && (workspace as any).isDirectChild(root)) {\n const folderName = (workspace as any).getFolderNameForDirectory(root)\n if (folderName && paths.length > 0) return paths.length > 1 ? folderName + '/' + paths.slice(1).join('/') : folderName\n }\n paths.shift()\n return paths.join(\"/\");\n }\n\n public getWorkspace(): Directory {\n let current: Resource | undefined = this\n while (current) {\n const parent: any = current.getParent()\n if (parent) {\n current = parent\n } else {\n break\n }\n }\n return current as Directory\n }\n}\n\nexport const resourceComparator = (c1: Resource, c2: Resource) => {\n if (c1 instanceof Directory && c2 instanceof File) {\n return -1\n }\n if (c1 instanceof File && c2 instanceof Directory) {\n return 1\n }\n return c1.getName().localeCompare(c2.getName())\n}\n\nexport enum FileContentType {\n TEXT, BINARY\n}\n\nexport enum FileContentEncoding {\n BASE64\n}\n\n/**\n * Options for reading file contents. Backend implementors are encouraged to\n * preserve MIME information when possible – for example, by returning the\n * native Blob from remote HTTP/WebDAV responses (via response.blob()) and\n * passing it through unchanged for { blob: true } / { uri: true } usages,\n * instead of recreating typeless Blobs from raw ArrayBuffers.\n */\nexport interface FileContentsOptions {\n contentType?: FileContentType;\n encoding?: FileContentEncoding;\n uri?: boolean;\n blob?: boolean;\n}\n\nexport interface GetResourceOptions {\n /**\n * When true, missing path segments MUST be created.\n *\n * Creation intent is encoded in the path:\n * - `path` without trailing slash => file intent for the last segment\n * - `path/` with trailing slash => directory intent for the last segment\n *\n * Backend implementations MUST preserve this behavior so callers (e.g. `mkdir`)\n * can force directory creation consistently across all backends.\n */\n create?: boolean\n}\n\nexport abstract class File extends Resource {\n public abstract getContents(options?: FileContentsOptions): Promise<any>;\n\n public abstract saveContents(contents: any, options?: FileContentsOptions): Promise<void>;\n\n public abstract size(): Promise<number | null>;\n}\n\nexport abstract class Directory extends Resource {\n public abstract listChildren(forceRefresh: boolean): Promise<Resource[]>;\n\n /**\n * Resolve a resource relative to this directory.\n *\n * Contract for backend implementations:\n * - Empty/invalid input should throw (or return null by backend convention).\n * - With `{ create: true }`, missing segments must be created.\n * - Trailing slash (`path.endsWith('/')`) means directory intent for final segment.\n * - No trailing slash means file intent for final segment when creation is needed.\n * - If the resolved/created resource type conflicts with intent, return null.\n * - If creation mutates workspace contents, publish `TOPIC_WORKSPACE_CHANGED`.\n */\n public abstract getResource(path: string, options?: GetResourceOptions): Promise<Resource | null>;\n\n public abstract touch(): void;\n}\n\nexport class StringFile extends File {\n private contents: string;\n private name: string;\n\n constructor(contents: string, name: string) {\n super();\n this.contents = contents\n this.name = name\n }\n\n async getContents(_options?: FileContentsOptions): Promise<any> {\n return this.contents\n }\n\n async saveContents(contents: any, _options?: FileContentsOptions): Promise<void> {\n this.contents = contents\n }\n\n async size(): Promise<number | null> {\n return this.contents.length || null;\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw Error(`Not supported`);\n }\n\n delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw Error(`Not supported`);\n }\n\n async rename(_newName: string): Promise<void> {\n throw Error(`Not supported`);\n }\n\n getName(): string {\n return this.name;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n}\n\nexport interface ResourceMap {\n [key: string]: Resource;\n}\n\n\nexport class CompositeDirectory extends Directory {\n private readonly entriesByName: Map<string, Directory>;\n\n constructor(\n directories: Directory[],\n private readonly displayName: string = '/'\n ) {\n super();\n this.entriesByName = new Map(directories.map(d => [d.getName(), d]));\n }\n\n getFolderNameForDirectory(dir: Directory): string | undefined {\n for (const [name, d] of this.entriesByName) {\n if (d === dir) return name;\n }\n return undefined;\n }\n\n isDirectChild(dir: Directory): boolean {\n return this.getFolderNameForDirectory(dir) !== undefined;\n }\n\n getName(): string {\n return this.displayName;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n\n async listChildren(_forceRefresh: boolean): Promise<Resource[]> {\n return Array.from(this.entriesByName.values());\n }\n\n async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {\n const normalized = path?.replace(/^\\/+/, \"\").trim();\n if (!normalized) {\n return null;\n }\n const idx = normalized.indexOf('/');\n const folderName = idx >= 0 ? normalized.slice(0, idx).trim() : normalized.trim();\n const rest = idx >= 0 ? normalized.slice(idx + 1).trim() : '';\n const dir = this.entriesByName.get(folderName);\n if (!dir) {\n return null;\n }\n if (!rest) {\n return dir;\n }\n return dir.getResource(rest, options);\n }\n\n touch(): void {\n for (const dir of this.entriesByName.values()) {\n dir.touch();\n }\n }\n\n async delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw new Error('Delete not supported on workspace root');\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw new Error('Copy not supported on workspace root');\n }\n\n async rename(_newName: string): Promise<void> {\n throw new Error('Rename not supported on workspace root');\n }\n\n getFolderByName(name: string): Directory | undefined {\n return this.entriesByName.get(name);\n }\n}\n\n/**\n * Placeholder directory used when a persisted workspace folder references\n * a backend type for which no contribution is currently registered.\n *\n * This allows the UI to surface a metadata node instead of silently\n * dropping the folder, and it can be replaced later once the real\n * contribution is loaded.\n */\nexport class MissingContributionDirectory extends Directory {\n private readonly backendType: string;\n private readonly persistedData: any;\n private readonly name: string;\n\n constructor(options: { backendType: string; name: string; data: any }) {\n super();\n this.backendType = options.backendType;\n this.persistedData = options.data;\n this.name = options.name;\n }\n\n getName(): string {\n return this.name;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n\n async listChildren(_forceRefresh: boolean): Promise<Resource[]> {\n return [];\n }\n\n async getResource(_path: string, _options?: GetResourceOptions): Promise<Resource | null> {\n throw new Error(`Workspace backend \"${this.backendType}\" is not available in this environment.`);\n }\n\n touch(): void {\n // No-op: without a real backend there is nothing to refresh.\n }\n\n async delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw new Error(`Cannot modify workspace folder for missing backend \"${this.backendType}\".`);\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw new Error(`Cannot copy from workspace folder for missing backend \"${this.backendType}\".`);\n }\n\n async rename(_newName: string): Promise<void> {\n throw new Error(`Cannot rename workspace folder for missing backend \"${this.backendType}\".`);\n }\n}\n\nfunction workspaceFolderDisplayNameFromPersisted(folder: { type: string; data: any }): string {\n const fromData =\n folder.data && typeof folder.data === 'object' && (folder.data as { name?: string }).name;\n if (typeof fromData === 'string' && fromData.length > 0) {\n return fromData;\n }\n return folder.type;\n}\n\nfunction formatRestoreFailureReason(error: unknown): string {\n if (error instanceof Error && error.message.trim()) {\n return error.message;\n }\n return 'Could not connect to this workspace folder.';\n}\n\nconst RESTORE_RETURNED_NOTHING = 'Could not restore this workspace folder.';\n\n/**\n * Placeholder when a contribution exists but restore/connect cannot produce a usable root\n * (network, auth, invalid persisted data). Treated like {@link MissingContributionDirectory}\n * for late registration retries via {@link isWorkspaceFolderPlaceholder}.\n */\nexport class UnavailableWorkspaceFolderDirectory extends Directory {\n private readonly backendType: string;\n private readonly name: string;\n private readonly reason: string;\n\n constructor(options: { backendType: string; name: string; data: any; reason: string }) {\n super();\n this.backendType = options.backendType;\n this.name = options.name;\n this.reason = options.reason;\n }\n\n getFailureReason(): string {\n return this.reason;\n }\n\n getName(): string {\n return this.name;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n\n async listChildren(_forceRefresh: boolean): Promise<Resource[]> {\n return [];\n }\n\n async getResource(_path: string, _options?: GetResourceOptions): Promise<Resource | null> {\n throw new Error(\n `Workspace folder \"${this.name}\" (${this.backendType}) is unavailable: ${this.reason}`\n );\n }\n\n touch(): void {\n // No-op\n }\n\n async delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw new Error(`Cannot modify unavailable workspace folder \"${this.name}\" (${this.backendType}).`);\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw new Error(`Cannot copy from unavailable workspace folder \"${this.name}\" (${this.backendType}).`);\n }\n\n async rename(_newName: string): Promise<void> {\n throw new Error(`Cannot rename unavailable workspace folder \"${this.name}\" (${this.backendType}).`);\n }\n}\n\nexport function isWorkspaceFolderPlaceholder(directory: Directory): boolean {\n return (\n directory instanceof MissingContributionDirectory ||\n directory instanceof UnavailableWorkspaceFolderDirectory\n );\n}\n\n/**\n * Runs a contribution's restore; returns a real directory or an {@link UnavailableWorkspaceFolderDirectory}.\n * Invokes onCaughtError only when restore threw (not when it returned undefined).\n */\nasync function restorePersistedFolderToDirectory(\n type: string,\n data: any,\n restore: (data: any) => Promise<Directory | undefined>,\n onCaughtError?: (error: unknown) => void\n): Promise<Directory> {\n const displayName = workspaceFolderDisplayNameFromPersisted({ type, data });\n try {\n const dir = await restore(data);\n if (dir) {\n return dir;\n }\n return new UnavailableWorkspaceFolderDirectory({\n backendType: type,\n name: displayName,\n data,\n reason: RESTORE_RETURNED_NOTHING\n });\n } catch (error) {\n onCaughtError?.(error);\n return new UnavailableWorkspaceFolderDirectory({\n backendType: type,\n name: displayName,\n data,\n reason: formatRestoreFailureReason(error)\n });\n }\n}\n\nexport interface WorkspaceContribution {\n type: string;\n name: string;\n canHandle(input: any): boolean;\n connect(input: any): Promise<Directory>;\n restore?(data: any): Promise<Directory | undefined>;\n persist?(workspace: Directory): Promise<any>;\n}\n\ninterface PersistedWorkspaceData {\n type?: string;\n data?: any;\n folders?: Array<{ type: string; data: any }>;\n}\n\nconst LEGACY_WORKSPACE_KEY = \"workspace_data\";\n\nexport class WorkspaceService {\n private workspace?: Promise<Directory | undefined>;\n private _currentWorkspace: Directory | undefined = undefined;\n private folders: Array<{ type: string; data: any; directory: Directory }> = [];\n private currentType?: string;\n private contributions: Map<string, WorkspaceContribution> = new Map();\n private initPromise: Promise<void>;\n private restoredTypes: Set<string> = new Set();\n\n getWorkspaceSync(): Directory | undefined {\n return this._currentWorkspace;\n }\n\n constructor() {\n let resolveInit!: () => void;\n this.initPromise = new Promise<void>((resolve) => {\n resolveInit = resolve;\n });\n this.loadPersistedWorkspace(resolveInit);\n }\n\n registerContribution(contribution: WorkspaceContribution): void {\n this.contributions.set(contribution.type, contribution);\n void this.tryRestoreForContribution(contribution);\n }\n\n getContributions(): WorkspaceContribution[] {\n return Array.from(this.contributions.values());\n }\n\n private static readonly DEFAULT_INDEXEDDB_FOLDER_NAME = 'My Folder';\n\n private async tryRestoreForContribution(contribution: WorkspaceContribution): Promise<void> {\n await this.initPromise;\n\n if (this.restoredTypes.has(contribution.type)) {\n return;\n }\n\n const existingForType = this.folders.filter(f => f.type === contribution.type);\n const hasRealFoldersForType = existingForType.some(f => !isWorkspaceFolderPlaceholder(f.directory));\n if (hasRealFoldersForType) {\n this.restoredTypes.add(contribution.type);\n return;\n }\n\n const raw = await persistenceService.getObject(LEGACY_WORKSPACE_KEY) as PersistedWorkspaceData | null;\n if (!raw?.folders || !Array.isArray(raw.folders)) {\n this.restoredTypes.add(contribution.type);\n return;\n }\n\n const toRestore = raw.folders.filter(f => f.type === contribution.type);\n if (toRestore.length === 0) {\n this.restoredTypes.add(contribution.type);\n return;\n }\n\n // Remove any placeholder folders for this type; we'll replace them with\n // real directories if restoration succeeds.\n this.folders = this.folders.filter(\n f => !(f.type === contribution.type && isWorkspaceFolderPlaceholder(f.directory))\n );\n\n for (const folder of toRestore) {\n if (!contribution.restore) {\n continue;\n }\n\n const directory = await restorePersistedFolderToDirectory(\n contribution.type,\n folder.data,\n contribution.restore,\n (error) =>\n logger.warn(\n `Failed to restore folder (${contribution.type}) on contribution registration:`,\n error\n )\n );\n this.folders.push({ type: contribution.type, data: folder.data, directory });\n }\n\n if (this.folders.length === 0) {\n this.restoredTypes.add(contribution.type);\n return;\n }\n\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n await this.persistFolders();\n if (composite) {\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n logger.debug(`Workspace folders restored for contribution type: ${contribution.type}`);\n }\n\n this.restoredTypes.add(contribution.type);\n }\n\n private async loadPersistedWorkspace(resolveInit: () => void): Promise<void> {\n logger.debug('Restoring workspace from persistence');\n try {\n const raw = await persistenceService.getObject(LEGACY_WORKSPACE_KEY) as PersistedWorkspaceData | null;\n if (!raw) {\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n }\n\n if (raw?.folders && Array.isArray(raw.folders) && raw.folders.length > 0) {\n const normalized = raw.folders.map((f: { type: string; data: any }) => ({ type: f.type, data: f.data }));\n await this.resolveFolders(normalized);\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n if (composite) {\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n logger.debug('Workspace restored from persisted folders');\n }\n resolveInit();\n return;\n }\n\n if (raw && raw.type && raw.data !== undefined) {\n const contribution = this.contributions.get(raw.type);\n if (contribution?.restore) {\n try {\n const dir = await contribution.restore!(raw.data);\n if (dir) {\n this.folders = [{ type: raw.type, data: raw.data, directory: dir }];\n const comp = this.buildComposite();\n this.workspace = Promise.resolve(comp);\n this._currentWorkspace = comp ?? undefined;\n this.currentType = raw.type;\n await this.persistFolders();\n publish(TOPIC_WORKSPACE_CONNECTED, comp);\n logger.debug('Workspace restored from legacy format');\n }\n } catch (error) {\n logger.error('Failed to restore legacy workspace:', error);\n }\n }\n }\n if (!this.workspace) {\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n }\n\n resolveInit();\n } finally {\n if (this.folders.length === 0) {\n try {\n await this.connectFolder({ indexeddb: true, name: WorkspaceService.DEFAULT_INDEXEDDB_FOLDER_NAME });\n logger.debug('Connected default IndexedDB workspace');\n } catch (e) {\n logger.warn('Failed to connect default IndexedDB folder', e);\n }\n }\n }\n }\n\n private async resolveFolders(persisted: Array<{ type: string; data: any }>): Promise<void> {\n this.folders = [];\n for (const folder of persisted) {\n const contribution = this.contributions.get(folder.type);\n if (!contribution?.restore) {\n const displayName =\n (folder.data && typeof folder.data === 'object' && (folder.data as any).name) ||\n `${folder.type} (missing)`;\n const placeholder = new MissingContributionDirectory({\n backendType: folder.type,\n name: displayName,\n data: folder.data\n });\n this.folders.push({ type: folder.type, data: folder.data, directory: placeholder });\n continue;\n }\n const directory = await restorePersistedFolderToDirectory(\n folder.type,\n folder.data,\n contribution.restore,\n (error) => logger.warn(`Failed to restore folder (${folder.type}):`, error)\n );\n this.folders.push({ type: folder.type, data: folder.data, directory });\n }\n }\n\n private buildComposite(): CompositeDirectory | undefined {\n if (this.folders.length === 0) {\n return undefined;\n }\n return new CompositeDirectory(this.folders.map(f => f.directory));\n }\n\n private async persistFolders(): Promise<void> {\n const toPersist = this.folders.length > 0\n ? { folders: this.folders.map(f => ({ type: f.type, data: f.data })) }\n : null;\n await persistenceService.persistObject(LEGACY_WORKSPACE_KEY, toPersist);\n await persistenceService.persistObject(\"workspace\", null);\n logger.debug(`Persisted ${this.folders.length} folder(s)`);\n }\n\n async getFolders(): Promise<Array<{ name: string; type: string }>> {\n await this.initPromise;\n return this.folders.map(f => ({ name: f.directory.getName(), type: f.type }));\n }\n\n async getFolderInfoForDirectory(directory: Directory): Promise<{ name: string; type: string; backendName: string } | undefined> {\n await this.initPromise;\n const folder = this.folders.find(f => f.directory === directory);\n if (!folder) {\n return undefined;\n }\n const name =\n (folder.data && typeof folder.data === 'object' && (folder.data as any).name) ||\n folder.directory.getName();\n const contribution = this.contributions.get(folder.type);\n const backendName = contribution?.name ?? folder.type;\n return { name, type: folder.type, backendName };\n }\n\n /**\n * Whether {@link resource} still belongs to the current workspace (walks up to the backend root).\n * After {@link disconnectFolder}, the root is no longer listed, so in-flight listChildren errors can be ignored.\n */\n async isResourceInCurrentWorkspace(resource: Resource): Promise<boolean> {\n await this.initPromise;\n let current: Resource | undefined = resource;\n while (current) {\n const parent = current.getParent();\n if (!parent) {\n if (!(current instanceof Directory)) {\n return false;\n }\n return this.folders.some(f => f.directory === current);\n }\n current = parent;\n }\n return false;\n }\n\n /**\n * Update persisted metadata for a workspace root directory.\n * Currently used to keep display names of roots (e.g. IndexedDB) in sync\n * with their in-memory Directory instances.\n */\n async updateFolderName(directory: Directory, name: string): Promise<void> {\n await this.initPromise;\n const folder = this.folders.find(f => f.directory === directory);\n if (!folder) {\n return;\n }\n if (folder.data && typeof folder.data === 'object') {\n folder.data = { ...(folder.data as any), name };\n } else {\n folder.data = { name };\n }\n await this.persistFolders();\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n logger.debug(`Updated folder name: ${name}`);\n }\n\n async connectFolder(input: any): Promise<Directory> {\n await this.initPromise;\n const contribution = Array.from(this.contributions.values()).find(c => c.canHandle(input));\n if (!contribution) {\n throw new Error('No workspace contribution can handle this input');\n }\n const name = (input?.name as string) ?? contribution.type;\n logger.debug(`Connecting workspace: ${contribution.type}, ${name}`);\n const directory = await contribution.connect(input);\n const data = contribution.persist ? await contribution.persist(directory) : input;\n this.folders.push({ type: contribution.type, data, directory });\n await this.persistFolders();\n this.currentType = this.folders.length === 1 ? contribution.type : undefined;\n const composite = this.buildComposite()!;\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n const displayName = directory.getName();\n logger.info(`Workspace connected: ${contribution.type} (${displayName})`);\n return composite;\n }\n\n async disconnectFolder(directory: Directory): Promise<void> {\n await this.initPromise;\n const idx = this.folders.findIndex(f => f.directory === directory);\n if (idx < 0) {\n return;\n }\n const folder = this.folders[idx];\n logger.debug(`Disconnecting folder: ${folder.directory.getName()} (${folder.type})`);\n this.folders.splice(idx, 1);\n await this.persistFolders();\n if (this.folders.length > 0) {\n this.currentType = this.folders[0].type;\n } else {\n this.currentType = undefined;\n logger.info('Workspace disconnected');\n }\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n }\n\n async connectWorkspace(input: any): Promise<Directory> {\n return this.connectFolder(input);\n }\n\n public async getWorkspace(): Promise<Directory | undefined> {\n await this.initPromise;\n if (!this.workspace) {\n throw new Error('No workspace connected.');\n }\n return await this.workspace;\n }\n\n public isConnected(): boolean {\n return this.folders.length > 0;\n }\n\n public getWorkspaceType(): string | undefined {\n return this.currentType;\n }\n\n public async disconnectWorkspace(): Promise<void> {\n await this.initPromise;\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n this.folders = [];\n this.currentType = undefined;\n await this.persistFolders();\n publish(TOPIC_WORKSPACE_CONNECTED, undefined as any);\n logger.info('Workspace disconnected');\n }\n\n /**\n * Copy (and optionally move) a resource into a target directory within the\n * current workspace. This helper is connection-agnostic: it always resolves\n * paths via the composite workspace root so it can copy across different\n * backend folders.\n */\n public async copyResource(\n src: Resource,\n destDir: Directory,\n options?: { move?: boolean; newName?: string }\n ): Promise<void> {\n await this.initPromise;\n const workspace = this._currentWorkspace;\n if (!workspace) {\n throw new Error('No workspace connected.');\n }\n\n const targetName = options?.newName ?? src.getName();\n const destDirPath = destDir.getWorkspacePath();\n const targetBasePath = destDirPath ? `${destDirPath}/${targetName}` : targetName;\n\n const copyFileToPath = async (file: File, targetPath: string): Promise<void> => {\n const contents = await file.getContents({ blob: true });\n const targetFile = await workspace.getResource(targetPath, { create: true }) as File | null;\n if (!targetFile) {\n throw new Error(`Failed to create target file: ${targetPath}`);\n }\n await targetFile.saveContents(contents);\n };\n\n const copyDirectoryToPath = async (dir: Directory, targetPath: string): Promise<void> => {\n for (const child of await dir.listChildren(false)) {\n const childTargetPath = `${targetPath}/${child.getName()}`;\n if (child instanceof File) {\n await copyFileToPath(child, childTargetPath);\n } else if (child instanceof Directory) {\n await copyDirectoryToPath(child, childTargetPath);\n }\n }\n };\n\n if (src instanceof File) {\n await copyFileToPath(src, targetBasePath);\n } else if (src instanceof Directory) {\n await copyDirectoryToPath(src, targetBasePath);\n } else {\n throw new Error('Unsupported resource type for copy operation.');\n }\n\n if (options?.move) {\n await src.delete(undefined, true);\n }\n }\n}\n\nexport const workspaceService = new WorkspaceService();\nrootContext.put(\"workspaceService\", workspaceService);\n\n\n","import { publish } from \"../events\";\nimport {\n File,\n Directory,\n FileContentType,\n FileContentEncoding,\n type FileContentsOptions,\n type GetResourceOptions,\n type Resource,\n type ResourceMap,\n TOPIC_WORKSPACE_CHANGED,\n workspaceService,\n} from \"./common\";\n\nexport class FileSysFileHandleResource extends File {\n private fileHandle: FileSystemFileHandle;\n private parent: Directory;\n\n constructor(fileHandle: FileSystemFileHandle, parent: Directory) {\n super();\n this.fileHandle = fileHandle;\n this.parent = parent;\n }\n\n getName(): string {\n return this.fileHandle.name;\n }\n\n getParent(): Directory {\n return this.parent;\n }\n\n async delete() {\n return this.getParent().delete(this.getName());\n }\n\n async getContents(options?: FileContentsOptions): Promise<any> {\n const file = await this.fileHandle.getFile();\n\n if (!options || options?.contentType == FileContentType.TEXT) {\n return await file.text();\n }\n\n if (options?.encoding == FileContentEncoding.BASE64 || options?.uri) {\n return URL.createObjectURL(file);\n }\n\n if (options?.blob) {\n return file;\n }\n\n return file.stream();\n }\n\n async size(): Promise<number | null> {\n try {\n const file = await this.fileHandle.getFile();\n return file.size;\n } catch {\n return null;\n }\n }\n\n async saveContents(contents: any, _options?: FileContentsOptions): Promise<void> {\n const writable = await this.fileHandle.createWritable();\n\n if (contents && typeof contents.pipeTo === 'function') {\n await contents.pipeTo(writable);\n } else {\n const writer = writable.getWriter();\n try {\n await writer.write(contents);\n } finally {\n await writer.close();\n }\n }\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async copyTo(targetPath: string): Promise<void> {\n const contents = await this.getContents({ blob: true });\n const targetFile = await this.getWorkspace().getResource(targetPath, { create: true }) as File;\n await targetFile.saveContents(contents);\n }\n\n async rename(newName: string): Promise<void> {\n const parent = this.getParent() as FileSysDirHandleResource;\n if (!parent) {\n throw new Error('Cannot rename root resource');\n }\n\n if (this.getName() === newName) {\n return;\n }\n\n if (!('move' in this.fileHandle) || typeof (this.fileHandle as any).move !== 'function') {\n throw new Error('File rename not supported in this browser. Please use a browser with File System Access API move() support.');\n }\n\n try {\n await (this.fileHandle as any).move(newName);\n } catch (error: any) {\n if (error.name === 'NotAllowedError' ||\n error.message?.includes('not allowed') ||\n error.message?.includes('user agent')) {\n throw new Error('File rename failed: The operation took too long and user activation expired. Please try again.');\n }\n throw error;\n }\n\n await parent.listChildren(true);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n}\n\nexport class FileSysDirHandleResource extends Directory {\n private dirHandle: FileSystemDirectoryHandle;\n private files?: ResourceMap;\n private parent?: Directory;\n private loadingPromise?: Promise<Resource[]>;\n\n constructor(dirHandle: FileSystemDirectoryHandle, parent?: Directory) {\n super();\n this.dirHandle = dirHandle;\n this.parent = parent;\n }\n\n getHandle() {\n return this.dirHandle;\n }\n\n getParent(): Directory | undefined {\n return this.parent;\n }\n\n getName(): string {\n return this.dirHandle.name;\n }\n\n async listChildren(forceRefresh: boolean = false): Promise<Resource[]> {\n if (forceRefresh || !this.files) {\n if (this.loadingPromise) {\n return this.loadingPromise;\n }\n\n this.loadingPromise = (async () => {\n try {\n const files: ResourceMap = {};\n\n try {\n // @ts-ignore -- TS 6 lib.dom provides `values()` via merged FileSystemDirectoryHandle declarations;\n // IDE/lint can miss the merge and falsely report it missing while tsc is correct.\n for await (const entry of this.dirHandle.values()) {\n const child =\n entry.kind === \"file\"\n ? new FileSysFileHandleResource(entry, this)\n : new FileSysDirHandleResource(entry, this);\n files[child.getName()] = child;\n }\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n this.files = {};\n return [];\n }\n throw error;\n }\n\n this.files = files;\n return Object.values(this.files);\n } finally {\n this.loadingPromise = undefined;\n }\n })();\n\n return this.loadingPromise;\n }\n return Object.values(this.files);\n }\n\n async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {\n if (!path) {\n throw new Error(\"No path provided\");\n }\n const segments = path.split(\"/\").filter(s => s.trim());\n let currentResource: Resource = this;\n let workspaceChanged = false;\n try {\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i].trim();\n if (currentResource instanceof FileSysDirHandleResource) {\n await currentResource.listChildren();\n if (!currentResource.files) {\n return null;\n }\n const next = currentResource.files[segment];\n if (!next) {\n if (options?.create) {\n workspaceChanged = true;\n if (i < segments.length - 1) {\n try {\n const newDirHandle = await currentResource.dirHandle.getDirectoryHandle(segment, { create: true });\n const nextResource = new FileSysDirHandleResource(newDirHandle, currentResource);\n currentResource.files[segment] = nextResource;\n currentResource = nextResource;\n if (currentResource instanceof FileSysDirHandleResource) {\n await currentResource.listChildren();\n }\n continue;\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n throw new Error(`Directory not found or not accessible: ${segments.slice(0, i + 1).join('/')}`);\n }\n throw error;\n }\n } else {\n try {\n const newFileHandle = await currentResource.dirHandle.getFileHandle(segment, { create: true });\n const nextResource = new FileSysFileHandleResource(newFileHandle, currentResource);\n currentResource.files[segment] = nextResource;\n return nextResource;\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n throw new Error(`File not found or not accessible: ${segments.join('/')}`);\n }\n throw error;\n }\n }\n } else {\n return null;\n }\n } else {\n currentResource = next;\n }\n } else {\n return null;\n }\n }\n } finally {\n if (workspaceChanged) {\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n }\n return currentResource;\n }\n\n public touch() {\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async delete(name?: string, recursive: boolean = true) {\n if (!name) {\n const parent = this.getParent();\n if (parent instanceof FileSysDirHandleResource) {\n await parent.listChildren();\n if (parent.files) {\n delete parent.files[this.getName()];\n }\n }\n this.files = undefined;\n this.loadingPromise = undefined;\n return parent?.delete(this.getName());\n }\n return this.dirHandle.removeEntry(name, {\n recursive: recursive\n }).then(async () => {\n if (this.files) {\n delete this.files[name];\n }\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n });\n }\n\n async copyTo(targetPath: string) {\n for (const resource of (await this.listChildren())) {\n const targetResourceName = [targetPath, resource.getName()].join(\"/\");\n await resource.copyTo(targetResourceName);\n }\n }\n\n async rename(newName: string): Promise<void> {\n const parent = this.getParent() as FileSysDirHandleResource;\n if (!parent) {\n throw new Error('Cannot rename workspace root');\n }\n\n if (this.getName() === newName) {\n return;\n }\n\n if (!('move' in this.dirHandle) || typeof (this.dirHandle as any).move !== 'function') {\n throw new Error('Directory rename not supported in this browser. Please use a browser with File System Access API move() support.');\n }\n\n try {\n await (this.dirHandle as any).move(newName);\n } catch (error: any) {\n if (error.name === 'NotAllowedError' ||\n error.message?.includes('not allowed') ||\n error.message?.includes('user agent')) {\n throw new Error('Directory rename failed: The operation took too long and user activation expired. Please try again.');\n }\n throw error;\n }\n\n await parent.listChildren(true);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n}\n\n// Register default filesystem contribution\nworkspaceService.registerContribution({\n type: 'filesystem',\n name: 'fs',\n\n canHandle(input: any): boolean {\n return input && 'kind' in input && input.kind === 'directory';\n },\n\n async connect(input: FileSystemDirectoryHandle): Promise<Directory> {\n return new FileSysDirHandleResource(input);\n },\n\n async restore(data: any): Promise<Directory | undefined> {\n if (data && 'kind' in data && data.kind === 'directory') {\n return new FileSysDirHandleResource(data, undefined);\n }\n return undefined;\n },\n\n async persist(workspace: Directory): Promise<any> {\n if (workspace instanceof FileSysDirHandleResource) {\n return workspace.getHandle();\n }\n return null;\n }\n});\n\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { A as EDITOR_AREA_MAIN, B as TOOLBAR_BOTTOM_CENTER, C as TOPIC_SETTINGS_CHANGED, D as MouseButton, E as HIDE_DOT_RESOURCE, F as SIDEBAR_MAIN_TOOLBAR, H as TOOLBAR_MAIN, I as SYSTEM_ATTRIBUTIONS, L as SYSTEM_LAYOUTS, M as SIDEBAR_AUXILIARY, N as SIDEBAR_MAIN, P as SIDEBAR_MAIN_BOTTOM, R as SYSTEM_VIEWS, S as taskService, T as COMMAND_SAVE, U as TOOLBAR_MAIN_CENTER, V as TOOLBAR_BOTTOM_END, W as TOOLBAR_MAIN_RIGHT, _ as DocksDialogContent, a as versionInfoDialog, b as extensionRegistry, c as confirmDialog, d as formDialogRequired, f as validateFormDialogFields, g as dialogService, i as parseIconSpec, j as PANEL_BOTTOM, k as ABOUT_TABS, l as infoDialog, m as appLoaderService, n as DocksContainer, o as filebrowserDialog, p as promptDialog, r as icon, s as navigableInfoDialog, t as DocksPart, u as formDialog, v as DocksElement, w as appSettings, x as esmShService, z as TOOLBAR_BOTTOM } from "./parts-BvITdiV3.js";
1
+ import { A as EDITOR_AREA_MAIN, B as TOOLBAR_BOTTOM_CENTER, C as TOPIC_SETTINGS_CHANGED, D as MouseButton, E as HIDE_DOT_RESOURCE, F as SIDEBAR_MAIN_TOOLBAR, H as TOOLBAR_MAIN, I as SYSTEM_ATTRIBUTIONS, L as SYSTEM_LAYOUTS, M as SIDEBAR_AUXILIARY, N as SIDEBAR_MAIN, P as SIDEBAR_MAIN_BOTTOM, R as SYSTEM_VIEWS, S as taskService, T as COMMAND_SAVE, U as TOOLBAR_MAIN_CENTER, V as TOOLBAR_BOTTOM_END, W as TOOLBAR_MAIN_RIGHT, _ as DocksDialogContent, a as versionInfoDialog, b as extensionRegistry, c as confirmDialog, d as formDialogRequired, f as validateFormDialogFields, g as dialogService, i as parseIconSpec, j as PANEL_BOTTOM, k as ABOUT_TABS, l as infoDialog, m as appLoaderService, n as DocksContainer, o as filebrowserDialog, p as promptDialog, r as icon, s as navigableInfoDialog, t as DocksPart, u as formDialog, v as DocksElement, w as appSettings, x as esmShService, z as TOOLBAR_BOTTOM } from "./parts-BRaXx8PD.js";
2
2
  import { i as setLogLevel, n as defaultLogger, o as rootContext, s as uiContext, t as createLogger } from "./logger-DT0_NW3S.js";
3
- import { C as toastError, S as overrideContributionTargets, T as toastWarning, a as TOPIC_COMMAND_REGISTERED, b as contributionTargetMappingRegistry, c as EMPTY_SIGNALPORT, d as activeSelectionSignal, f as activeTasksSignal, g as contributionRegistry, h as TOPIC_CONTRIBUTEIONS_CHANGED, i as CommandStack, l as activeEditorSignal, m as perspectiveSwitchedSignal, n as watchSignal, o as commandRegistry, p as partDirtySignal, r as CommandRegistry, s as registerAll, t as DocksWidget, u as activePartSignal, w as toastInfo, x as listContributionNameRemaps, y as applyConfigNameRemaps } from "./widget-DFbJNLqB.js";
3
+ import { C as toastError, S as overrideContributionTargets, T as toastWarning, a as TOPIC_COMMAND_REGISTERED, b as contributionTargetMappingRegistry, c as EMPTY_SIGNALPORT, d as activeSelectionSignal, f as activeTasksSignal, g as contributionRegistry, h as TOPIC_CONTRIBUTEIONS_CHANGED, i as CommandStack, l as activeEditorSignal, m as perspectiveSwitchedSignal, n as watchSignal, o as commandRegistry, p as partDirtySignal, r as CommandRegistry, s as registerAll, t as DocksWidget, u as activePartSignal, w as toastInfo, x as listContributionNameRemaps, y as applyConfigNameRemaps } from "./widget-DbLusgAH.js";
4
4
  import { n as subscribe, r as unsubscribe, t as publish } from "./events-B_ZxkU_G.js";
5
- import { a as File, c as TOPIC_WORKSPACE_CHANGED, d as WorkspaceService, f as workspaceService, i as Directory, l as TOPIC_WORKSPACE_CONNECTED, o as FileContentType, p as persistenceService, r as CompositeDirectory, s as StringFile, t as FileSysDirHandleResource } from "./fs-access-D-fDaJ8V.js";
6
- import { C as TOOLBAR_THEME_SWITCHER, D as editorRegistry, E as treeNodeComparator, O as createLazyLabel, S as TOOLBAR_TASKS, T as VIEW_LOG_TERMINAL, _ as TOOLBAR_FILEBROWSER_RENAME, a as DocksStandardLayout, b as TOOLBAR_LANGUAGE_SELECTOR, c as ABOUT_TAB_RELEASE, d as CTXMENU_FILEBROWSER_RENAME, f as SIDEBAR_TOOLBAR_EXTENSIONS, g as TOOLBAR_FILEBROWSER_DELETE, h as TOOLBAR_FAST_VIEWS, i as createJsRuntime, k as i18n, l as ATTRIBUTION_ECLIPSE_DOCKS, m as TOOLBAR_ACTIVE_PART_NAME, n as getFrameworkConfig, o as ABOUT_TAB_ATTRIBUTIONS, p as SYSTEM_DEFAULT_FILE_ICONS, r as runJavaScriptCode, s as ABOUT_TAB_PACKAGES, t as configureFramework, u as CTXMENU_FILEBROWSER_DELETE, v as TOOLBAR_FULLSCREEN, w as VIEW_FILEBROWSER, x as TOOLBAR_LAYOUT_SWITCHER, y as TOOLBAR_INFO } from "./api-N5AbUtyH.js";
5
+ import { a as File, c as StringFile, f as WorkspaceService, i as Directory, l as TOPIC_WORKSPACE_CHANGED, m as persistenceService, o as FileContentType, p as workspaceService, r as CompositeDirectory, t as FileSysDirHandleResource, u as TOPIC_WORKSPACE_CONNECTED } from "./fs-access-DTXPsV1W.js";
6
+ import { C as TOOLBAR_THEME_SWITCHER, D as editorRegistry, E as treeNodeComparator, O as createLazyLabel, S as TOOLBAR_TASKS, T as VIEW_LOG_TERMINAL, _ as TOOLBAR_FILEBROWSER_RENAME, a as DocksStandardLayout, b as TOOLBAR_LANGUAGE_SELECTOR, c as ABOUT_TAB_RELEASE, d as CTXMENU_FILEBROWSER_RENAME, f as SIDEBAR_TOOLBAR_EXTENSIONS, g as TOOLBAR_FILEBROWSER_DELETE, h as TOOLBAR_FAST_VIEWS, i as createJsRuntime, k as i18n, l as ATTRIBUTION_ECLIPSE_DOCKS, m as TOOLBAR_ACTIVE_PART_NAME, n as getFrameworkConfig, o as ABOUT_TAB_ATTRIBUTIONS, p as SYSTEM_DEFAULT_FILE_ICONS, r as runJavaScriptCode, s as ABOUT_TAB_PACKAGES, t as configureFramework, u as CTXMENU_FILEBROWSER_DELETE, v as TOOLBAR_FULLSCREEN, w as VIEW_FILEBROWSER, x as TOOLBAR_LAYOUT_SWITCHER, y as TOOLBAR_INFO } from "./api-CTU-FxEv.js";
7
7
  export { ABOUT_TABS, ABOUT_TAB_ATTRIBUTIONS, ABOUT_TAB_PACKAGES, ABOUT_TAB_RELEASE, ATTRIBUTION_ECLIPSE_DOCKS, COMMAND_SAVE, CTXMENU_FILEBROWSER_DELETE, CTXMENU_FILEBROWSER_RENAME, CommandRegistry, CommandStack, CompositeDirectory, Directory, DocksContainer, DocksDialogContent, DocksElement, DocksPart, DocksStandardLayout, DocksWidget, EDITOR_AREA_MAIN, EMPTY_SIGNALPORT, File, FileContentType, FileSysDirHandleResource, HIDE_DOT_RESOURCE, MouseButton, PANEL_BOTTOM, SIDEBAR_AUXILIARY, SIDEBAR_MAIN, SIDEBAR_MAIN_BOTTOM, SIDEBAR_MAIN_TOOLBAR, SIDEBAR_TOOLBAR_EXTENSIONS, SYSTEM_ATTRIBUTIONS, SYSTEM_DEFAULT_FILE_ICONS, SYSTEM_LAYOUTS, SYSTEM_VIEWS, StringFile, TOOLBAR_ACTIVE_PART_NAME, TOOLBAR_BOTTOM, TOOLBAR_BOTTOM_CENTER, TOOLBAR_BOTTOM_END, TOOLBAR_FAST_VIEWS, TOOLBAR_FILEBROWSER_DELETE, TOOLBAR_FILEBROWSER_RENAME, TOOLBAR_FULLSCREEN, TOOLBAR_INFO, TOOLBAR_LANGUAGE_SELECTOR, TOOLBAR_LAYOUT_SWITCHER, TOOLBAR_MAIN, TOOLBAR_MAIN_CENTER, TOOLBAR_MAIN_RIGHT, TOOLBAR_TASKS, TOOLBAR_THEME_SWITCHER, TOPIC_COMMAND_REGISTERED, TOPIC_CONTRIBUTEIONS_CHANGED, TOPIC_SETTINGS_CHANGED, TOPIC_WORKSPACE_CHANGED, TOPIC_WORKSPACE_CONNECTED, VIEW_FILEBROWSER, VIEW_LOG_TERMINAL, WorkspaceService, activeEditorSignal, activePartSignal, activeSelectionSignal, activeTasksSignal, appLoaderService, appSettings, applyConfigNameRemaps, commandRegistry, configureFramework, confirmDialog, contributionRegistry, contributionTargetMappingRegistry, createJsRuntime, createLazyLabel, createLogger, dialogService, editorRegistry, esmShService, extensionRegistry, filebrowserDialog, formDialog, formDialogRequired, getFrameworkConfig, i18n, icon, infoDialog, listContributionNameRemaps, defaultLogger as logger, navigableInfoDialog, overrideContributionTargets, parseIconSpec, partDirtySignal, persistenceService, perspectiveSwitchedSignal, promptDialog, publish, registerAll, rootContext, runJavaScriptCode, setLogLevel, subscribe, taskService, toastError, toastInfo, toastWarning, treeNodeComparator, uiContext, unsubscribe, validateFormDialogFields, versionInfoDialog, watchSignal, workspaceService };
@@ -1,4 +1,3 @@
1
- import { nothing } from 'lit';
2
1
  import { DocksElement } from './element';
3
2
  export declare class DocksContextMenu extends DocksElement {
4
3
  scopeTokens: string[];
@@ -22,7 +21,7 @@ export declare class DocksContextMenu extends DocksElement {
22
21
  */
23
22
  private handleDocumentPointerDown;
24
23
  protected doBeforeUI(): void;
25
- protected updated(changedProperties: Map<string, unknown>): void;
24
+ protected willUpdate(changedProperties: Map<string, unknown>): void;
26
25
  attributeChangedCallback(name: string, old: string | null, value: string | null): void;
27
26
  private refreshContributions;
28
27
  private matchesTarget;
@@ -34,18 +33,20 @@ export declare class DocksContextMenu extends DocksElement {
34
33
  * This is necessary because elementFromPoint() doesn't penetrate shadow roots.
35
34
  */
36
35
  private getElementFromPoint;
36
+ private getHostPart;
37
37
  /**
38
38
  * Triggers a click on the element under the cursor to update selection before showing context menu.
39
39
  */
40
40
  private triggerClickUnderCursor;
41
+ private handleSubmenuOpening;
41
42
  /** Opens the menu at `position`. Returns false when there is nothing to show (no thin empty panel). */
42
43
  show(position: {
43
44
  x: number;
44
45
  y: number;
45
- }, mouseEvent?: MouseEvent): boolean;
46
+ }, mouseEvent?: MouseEvent): Promise<boolean>;
46
47
  private onClose;
47
48
  private renderContribution;
48
- render(): typeof nothing | import('lit-html').TemplateResult<1>;
49
+ render(): import('lit-html').TemplateResult<1>;
49
50
  static styles: import('lit').CSSResult;
50
51
  }
51
52
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"contextmenu.d.ts","sourceRoot":"","sources":["../../src/parts/contextmenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,OAAO,EAAC,MAAM,KAAK,CAAA;AAEtC,OAAO,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAcvC,OAAO,uBAAuB,CAAC;AAE/B,qBACa,gBAAiB,SAAQ,YAAY;IAE9C,WAAW,EAAE,MAAM,EAAE,CAAM;IAGpB,uBAAuB,CAAC,EAAE,MAAM,GAAG,CAAa;IAGvD,OAAO,CAAC,aAAa,CAAsB;IAG3C,OAAO,CAAC,MAAM,CAAkB;IAGhC,OAAO,CAAC,QAAQ,CAA4C;IAE5D,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,8BAA8B,CAA6C;IAEnF;;;;;;;;;;OAUG;IACH,OAAO,CAAC,yBAAyB;IAWjC,SAAS,CAAC,UAAU;IAepB,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAOzD,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO/E,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,iBAAiB;IAuBzB,oFAAoF;IACpF,OAAO,CAAC,WAAW;IAOnB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoB/B,uGAAuG;IAChG,IAAI,CAAC,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO;IAajF,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,kBAAkB;IA0B1B,MAAM;IA4BN,MAAM,CAAC,MAAM,0BAmBX;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,mBAAmB,EAAE,gBAAgB,CAAA;KACxC;CACJ"}
1
+ {"version":3,"file":"contextmenu.d.ts","sourceRoot":"","sources":["../../src/parts/contextmenu.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAevC,OAAO,uBAAuB,CAAC;AAE/B,qBACa,gBAAiB,SAAQ,YAAY;IAE9C,WAAW,EAAE,MAAM,EAAE,CAAM;IAGpB,uBAAuB,CAAC,EAAE,MAAM,GAAG,CAAa;IAGvD,OAAO,CAAC,aAAa,CAAsB;IAG3C,OAAO,CAAC,MAAM,CAAkB;IAGhC,OAAO,CAAC,QAAQ,CAA4C;IAE5D,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,8BAA8B,CAA6C;IAEnF;;;;;;;;;;OAUG;IACH,OAAO,CAAC,yBAAyB;IAWjC,SAAS,CAAC,UAAU;IAepB,SAAS,CAAC,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAO5D,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO/E,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,iBAAiB;IAuBzB,oFAAoF;IACpF,OAAO,CAAC,WAAW;IAOnB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoB/B,OAAO,CAAC,oBAAoB,CAK1B;IAEF,uGAAuG;IAC1F,IAAI,CAAC,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBhG,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,kBAAkB;IA0B1B,MAAM;IA2BN,MAAM,CAAC,MAAM,0BAuBX;CACL;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,mBAAmB,EAAE,gBAAgB,CAAA;KACxC;CACJ"}
@@ -1 +1 @@
1
- import "../parts-BvITdiV3.js";
1
+ import "../parts-BRaXx8PD.js";
@@ -22,8 +22,8 @@ export declare class DocksTabs extends DocksContainer {
22
22
  */
23
23
  withToolbar: boolean;
24
24
  hideTabs: boolean;
25
- /** Tab and nav-toolbar control sizing (`small` | `medium` | `large`). */
26
- itemSize: 'small' | 'medium' | 'large';
25
+ /** Tab and nav-toolbar control sizing (`s` | `m` | `l`). */
26
+ itemSize: 's' | 'm' | 'l';
27
27
  /** Tab contributions for this container */
28
28
  private contributions;
29
29
  /** Reference to the underlying wa-tab-group element */
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/parts/tabs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAgD,eAAe,EAA+B,MAAM,8BAA8B,CAAC;AAY1I;;;;;;;;;;;;GAYG;AACH,qBACa,SAAU,SAAQ,cAAc;IAEzC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAS;IAEtD,gGAAgG;IAEhG,QAAQ,EAAE,OAAO,CAAS;IAE1B;;OAEG;IAEH,WAAW,EAAE,OAAO,CAAS;IAG7B,QAAQ,EAAE,OAAO,CAAS;IAE1B,yEAAyE;IAEzE,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAY;IAElD,2CAA2C;IAE3C,OAAO,CAAC,aAAa,CAAyB;IAE9C,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAc;IAE9B,0DAA0D;IAC1D,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,yBAAyB,CAAS;IAE1C,OAAO,CAAC,kBAAkB,CAAC,CAAa;IAIxC,SAAS,CAAC,UAAU;IAQpB,SAAS,CAAC,QAAQ;IAkBlB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAqB3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOpB,eAAe,IAAI,MAAM,GAAG,IAAI;IAKvC,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI;IAuBzC,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,GAAG,IAAI;IAMnE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQpD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAStC;;OAEG;YACW,WAAW;IAkCzB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAM7C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAO9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kCAAkC;IA+C1C,oBAAoB;IAMpB,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,+BAA+B;IAUvC,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAM;IAE3C,OAAO,CAAC,gBAAgB;IAQxB,yGAAyG;IACzG,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,gBAAgB;IAqBxB,MAAM;IA8CN,MAAM,CAAC,MAAM,0BAsNZ;CACJ"}
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/parts/tabs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAgD,eAAe,EAA+B,MAAM,8BAA8B,CAAC;AAY1I;;;;;;;;;;;;GAYG;AACH,qBACa,SAAU,SAAQ,cAAc;IAEzC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAS;IAEtD,gGAAgG;IAEhG,QAAQ,EAAE,OAAO,CAAS;IAE1B;;OAEG;IAEH,WAAW,EAAE,OAAO,CAAS;IAG7B,QAAQ,EAAE,OAAO,CAAS;IAE1B,4DAA4D;IAE5D,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAO;IAEhC,2CAA2C;IAE3C,OAAO,CAAC,aAAa,CAAyB;IAE9C,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAc;IAE9B,0DAA0D;IAC1D,OAAO,CAAC,WAAW,CAAuB;IAE1C,OAAO,CAAC,yBAAyB,CAAS;IAE1C,OAAO,CAAC,kBAAkB,CAAC,CAAa;IAIxC,SAAS,CAAC,UAAU;IAQpB,SAAS,CAAC,QAAQ;IAkBlB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAqB3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAKzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOpB,eAAe,IAAI,MAAM,GAAG,IAAI;IAKvC,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI;IAuBzC,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,GAAG,IAAI;IAMnE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQpD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAStC;;OAEG;YACW,WAAW;IAkCzB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAM7C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAO9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kCAAkC;IA+C1C,oBAAoB;IAMpB,OAAO,CAAC,wBAAwB;IAchC,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,+BAA+B;IAUvC,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAM;IAE3C,OAAO,CAAC,gBAAgB;IAQxB,yGAAyG;IACzG,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,gBAAgB;IAqBxB,MAAM;IA8CN,MAAM,CAAC,MAAM,0BAsNZ;CACJ"}
@@ -4,7 +4,7 @@ export declare class DocksToolbar extends DocksElement {
4
4
  private position;
5
5
  orientation: "horizontal" | "vertical";
6
6
  align: "start" | "center" | "end";
7
- size: "small" | "medium" | "large";
7
+ size: "s" | "m" | "l";
8
8
  scopeTokens: string[];
9
9
  partToolbarContent?: any;
10
10
  partToolbarRenderer?: () => any;
@@ -19,6 +19,7 @@ export declare class DocksToolbar extends DocksElement {
19
19
  connectedCallback(): void;
20
20
  disconnectedCallback(): void;
21
21
  updated(changedProperties: Map<string, unknown>): void;
22
+ protected willUpdate(changedProperties: Map<string, unknown>): void;
22
23
  attributeChangedCallback(name: string, old: string | null, value: string | null): void;
23
24
  protected doBeforeUI(): void;
24
25
  private refreshContributions;