@mnaoumov/obsidian-lib 6.2.1 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/file-explorer-root-menu-component/package.json +6 -0
- package/data-stores/data-store-replica/package.json +6 -0
- package/data-stores/data-store-seeds/package.json +6 -0
- package/data-stores/data-store-transport/package.json +6 -0
- package/data-stores/index/package.json +6 -0
- package/data-stores/local-data-store/package.json +6 -0
- package/data-stores/package.json +6 -0
- package/data-stores/shared-data-store/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +29 -1
- package/dist/lib/cjs/__merged.d.cts +6 -0
- package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +343 -0
- package/dist/lib/cjs/components/file-explorer-root-menu-component.d.cts +125 -0
- package/dist/lib/cjs/components/index.cjs +4 -1
- package/dist/lib/cjs/components/index.d.cts +1 -0
- package/dist/lib/cjs/data-stores/data-store-replica.cjs +263 -0
- package/dist/lib/cjs/data-stores/data-store-replica.d.cts +112 -0
- package/dist/lib/cjs/data-stores/data-store-seeds.cjs +204 -0
- package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +133 -0
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +347 -0
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +125 -0
- package/dist/lib/cjs/data-stores/index.cjs +120 -0
- package/dist/lib/cjs/data-stores/index.d.cts +6 -0
- package/dist/lib/cjs/data-stores/local-data-store.cjs +258 -0
- package/dist/lib/cjs/data-stores/local-data-store.d.cts +119 -0
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +431 -0
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +137 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/esm/__merged.d.mts +6 -0
- package/dist/lib/esm/__merged.mjs +29 -1
- package/dist/lib/esm/components/file-explorer-root-menu-component.d.mts +125 -0
- package/dist/lib/esm/components/file-explorer-root-menu-component.mjs +257 -0
- package/dist/lib/esm/components/index.d.mts +1 -0
- package/dist/lib/esm/components/index.mjs +3 -1
- package/dist/lib/esm/data-stores/data-store-replica.d.mts +112 -0
- package/dist/lib/esm/data-stores/data-store-replica.mjs +173 -0
- package/dist/lib/esm/data-stores/data-store-seeds.d.mts +133 -0
- package/dist/lib/esm/data-stores/data-store-seeds.mjs +115 -0
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +125 -0
- package/dist/lib/esm/data-stores/data-store-transport.mjs +259 -0
- package/dist/lib/esm/data-stores/index.d.mts +6 -0
- package/dist/lib/esm/data-stores/index.mjs +18 -0
- package/dist/lib/esm/data-stores/local-data-store.d.mts +119 -0
- package/dist/lib/esm/data-stores/local-data-store.mjs +170 -0
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +137 -0
- package/dist/lib/esm/data-stores/shared-data-store.mjs +346 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/package.json +38 -17
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/// <reference lib="dom" />
|
|
3
|
+
/**
|
|
4
|
+
* @file
|
|
5
|
+
*
|
|
6
|
+
* Opens and extends the core File Explorer's context menu for the vault root, at the two spots that stand for it: the
|
|
7
|
+
* vault name at the top of the left sidebar, and the empty area below the file list.
|
|
8
|
+
*
|
|
9
|
+
* Obsidian already opens a menu for the empty area: the view's own `contextmenu` listener on its files container calls
|
|
10
|
+
* `onFileContextMenu(evt, vault.getRoot())`, which builds a {@link Menu}, triggers `file-menu` with the root folder and
|
|
11
|
+
* the source `file-explorer-context-menu`, and shows it. The vault name (`.workspace-drawer-vault-switcher` on desktop,
|
|
12
|
+
* `.workspace-drawer-header-name` on mobile, where Obsidian builds no switcher) opens a different menu: on desktop
|
|
13
|
+
* Obsidian adds `Show in system explorer` and `Copy path` to the per-event menu `Menu.forEvent` hands out. The handlers
|
|
14
|
+
* get that menu, so a right-click there never opens a second one. A subscriber that presents the root as a folder
|
|
15
|
+
* replaces it with the root's folder menu instead. Read from Obsidian `1.15.0`.
|
|
16
|
+
*
|
|
17
|
+
* Every plugin bundles its own copy of this library, and several of them may want this menu. Two copies patching the
|
|
18
|
+
* same prototype and listening on the same element would open it twice, so there is ONE installation per {@link App},
|
|
19
|
+
* kept in the shared-state bag under a versioned key and owned by one subscriber. When the owner unloads while others
|
|
20
|
+
* remain, the next subscriber installs it again from its own copy. What crosses that boundary is a wire format between
|
|
21
|
+
* copies of different versions: plain objects and plain functions only, read structurally, and a change to what a field
|
|
22
|
+
* means moves to a new key rather than reinterpreting the old one.
|
|
23
|
+
*/
|
|
24
|
+
import type { App } from 'obsidian';
|
|
25
|
+
import { Menu, TFolder } from 'obsidian';
|
|
26
|
+
import { ComponentEx } from './component-ex.mjs';
|
|
27
|
+
/**
|
|
28
|
+
* The elements that stand for the vault root at the top of the left sidebar, in priority order. Obsidian builds
|
|
29
|
+
* `.workspace-drawer-vault-switcher` only on desktop; on mobile the vault name is the drawer header instead.
|
|
30
|
+
*/
|
|
31
|
+
export declare const VAULT_NAME_SELECTORS: readonly [".workspace-drawer-vault-switcher", ".workspace-drawer-header-name"];
|
|
32
|
+
/**
|
|
33
|
+
* Which spot of the File Explorer the vault-root menu was opened from.
|
|
34
|
+
*/
|
|
35
|
+
export declare enum FileExplorerRootMenuSpot {
|
|
36
|
+
/**
|
|
37
|
+
* The empty area below the file list.
|
|
38
|
+
*/
|
|
39
|
+
EmptyArea = "empty-area",
|
|
40
|
+
/**
|
|
41
|
+
* The vault name at the top of the left sidebar.
|
|
42
|
+
*/
|
|
43
|
+
VaultName = "vault-name"
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parameters for {@link FileExplorerRootMenuComponent}.
|
|
47
|
+
*/
|
|
48
|
+
export interface FileExplorerRootMenuComponentConstructorParams {
|
|
49
|
+
/**
|
|
50
|
+
* The Obsidian app instance.
|
|
51
|
+
*/
|
|
52
|
+
readonly app: App;
|
|
53
|
+
/**
|
|
54
|
+
* Called each time the vault-root menu is about to be shown.
|
|
55
|
+
*/
|
|
56
|
+
readonly handler: FileExplorerRootMenuHandler;
|
|
57
|
+
/**
|
|
58
|
+
* Whether the root is presented as an ordinary folder while its menu is built, so that Obsidian and other plugins add
|
|
59
|
+
* the items they add to any folder. The items that must not act on the root (rename, delete, move, make a copy and
|
|
60
|
+
* search in folder) are removed again before the menu is shown. On the vault name, the root's folder menu then replaces
|
|
61
|
+
* Obsidian's vault menu. It holds while any subscriber asks for it.
|
|
62
|
+
*
|
|
63
|
+
* @default `false`
|
|
64
|
+
*/
|
|
65
|
+
readonly shouldPresentRootAsFolder?: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A handler of the vault-root menu.
|
|
69
|
+
*
|
|
70
|
+
* @param params - The parameters.
|
|
71
|
+
*/
|
|
72
|
+
export type FileExplorerRootMenuHandler = (params: FileExplorerRootMenuHandlerParams) => void;
|
|
73
|
+
/**
|
|
74
|
+
* Parameters for a {@link FileExplorerRootMenuHandler}.
|
|
75
|
+
*
|
|
76
|
+
* The shape is part of the wire format between copies of this library: fields are only ever added.
|
|
77
|
+
*/
|
|
78
|
+
export interface FileExplorerRootMenuHandlerParams {
|
|
79
|
+
/**
|
|
80
|
+
* The menu, about to be shown: the root's folder menu, after every `file-menu` handler has run, or on the vault name the
|
|
81
|
+
* vault menu Obsidian builds there. A menu still empty after every handler is not shown.
|
|
82
|
+
*/
|
|
83
|
+
readonly menu: Menu;
|
|
84
|
+
/**
|
|
85
|
+
* The right-click or long-press that opened the menu.
|
|
86
|
+
*/
|
|
87
|
+
readonly mouseEvent: MouseEvent;
|
|
88
|
+
/**
|
|
89
|
+
* The vault root.
|
|
90
|
+
*/
|
|
91
|
+
readonly rootFolder: TFolder;
|
|
92
|
+
/**
|
|
93
|
+
* Which spot the menu was opened from.
|
|
94
|
+
*/
|
|
95
|
+
readonly spot: FileExplorerRootMenuSpot;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Hands the core File Explorer's vault-root menu to a handler, and opens that menu from the vault name too.
|
|
99
|
+
*
|
|
100
|
+
* Any number of these, in any number of plugins, share one installation per {@link App}.
|
|
101
|
+
*/
|
|
102
|
+
export declare class FileExplorerRootMenuComponent extends ComponentEx {
|
|
103
|
+
/**
|
|
104
|
+
* The Obsidian app instance.
|
|
105
|
+
*/
|
|
106
|
+
protected readonly app: App;
|
|
107
|
+
/**
|
|
108
|
+
* Called each time the vault-root menu is about to be shown.
|
|
109
|
+
*/
|
|
110
|
+
protected readonly handler: FileExplorerRootMenuHandler;
|
|
111
|
+
/**
|
|
112
|
+
* Whether the root is presented as an ordinary folder while its menu is built.
|
|
113
|
+
*/
|
|
114
|
+
protected readonly shouldPresentRootAsFolder: boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Creates a new file explorer root menu component.
|
|
117
|
+
*
|
|
118
|
+
* @param params - The parameters.
|
|
119
|
+
*/
|
|
120
|
+
constructor(params: FileExplorerRootMenuComponentConstructorParams);
|
|
121
|
+
/**
|
|
122
|
+
* Subscribes to the shared installation, installing it when nobody has yet.
|
|
123
|
+
*/
|
|
124
|
+
onload(): void;
|
|
125
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
|
|
33
|
+
import { invokeAsyncSafely } from "@mnaoumov/typescript-lib/async";
|
|
34
|
+
import { getPrototypeOf } from "@mnaoumov/typescript-lib/object-utils";
|
|
35
|
+
import { ViewType } from "@obsidian-typings/obsidian-public-latest/implementations";
|
|
36
|
+
import {
|
|
37
|
+
Menu,
|
|
38
|
+
MenuItem,
|
|
39
|
+
TFolder
|
|
40
|
+
} from "obsidian";
|
|
41
|
+
import { getObsidianLibState } from "../obsidian-lib-state.mjs";
|
|
42
|
+
import { ComponentEx } from "./component-ex.mjs";
|
|
43
|
+
import { around } from "./monkey-around-component.mjs";
|
|
44
|
+
const VAULT_NAME_SELECTORS = [
|
|
45
|
+
".workspace-drawer-vault-switcher",
|
|
46
|
+
".workspace-drawer-header-name"
|
|
47
|
+
];
|
|
48
|
+
const FILE_EXPLORER_MENU_SOURCE = "file-explorer-context-menu";
|
|
49
|
+
const ROOT_UNSAFE_ITEM_TITLE_KEYS = [
|
|
50
|
+
"plugins.file-explorer.action-move-folder",
|
|
51
|
+
"plugins.file-explorer.menu-opt-delete",
|
|
52
|
+
"plugins.file-explorer.menu-opt-make-copy",
|
|
53
|
+
"plugins.file-explorer.menu-opt-rename",
|
|
54
|
+
"plugins.search.menu-opt-search-in-folder"
|
|
55
|
+
];
|
|
56
|
+
const SHARED_STATE_KEY = "fileExplorerRootMenuByAppV1";
|
|
57
|
+
var FileExplorerRootMenuSpot = /* @__PURE__ */ ((FileExplorerRootMenuSpot2) => {
|
|
58
|
+
FileExplorerRootMenuSpot2["EmptyArea"] = "empty-area";
|
|
59
|
+
FileExplorerRootMenuSpot2["VaultName"] = "vault-name";
|
|
60
|
+
return FileExplorerRootMenuSpot2;
|
|
61
|
+
})(FileExplorerRootMenuSpot || {});
|
|
62
|
+
class FileExplorerRootMenuComponent extends ComponentEx {
|
|
63
|
+
/**
|
|
64
|
+
* The Obsidian app instance.
|
|
65
|
+
*/
|
|
66
|
+
app;
|
|
67
|
+
/**
|
|
68
|
+
* Called each time the vault-root menu is about to be shown.
|
|
69
|
+
*/
|
|
70
|
+
handler;
|
|
71
|
+
/**
|
|
72
|
+
* Whether the root is presented as an ordinary folder while its menu is built.
|
|
73
|
+
*/
|
|
74
|
+
shouldPresentRootAsFolder;
|
|
75
|
+
/**
|
|
76
|
+
* Creates a new file explorer root menu component.
|
|
77
|
+
*
|
|
78
|
+
* @param params - The parameters.
|
|
79
|
+
*/
|
|
80
|
+
constructor(params) {
|
|
81
|
+
super();
|
|
82
|
+
this.app = params.app;
|
|
83
|
+
this.handler = params.handler;
|
|
84
|
+
this.shouldPresentRootAsFolder = params.shouldPresentRootAsFolder ?? false;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Subscribes to the shared installation, installing it when nobody has yet.
|
|
88
|
+
*/
|
|
89
|
+
onload() {
|
|
90
|
+
super.onload();
|
|
91
|
+
const state = getSharedState(this.app);
|
|
92
|
+
const subscription = {
|
|
93
|
+
handler: this.handler,
|
|
94
|
+
install: () => installRootMenu(this.app, state),
|
|
95
|
+
shouldPresentRootAsFolder: this.shouldPresentRootAsFolder
|
|
96
|
+
};
|
|
97
|
+
state.subscriptions.push(subscription);
|
|
98
|
+
state.installation ??= { owner: subscription, uninstall: subscription.install() };
|
|
99
|
+
this.register(() => {
|
|
100
|
+
state.subscriptions.splice(state.subscriptions.indexOf(subscription), 1);
|
|
101
|
+
if (state.installation?.owner !== subscription) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
state.installation.uninstall();
|
|
105
|
+
const nextOwner = state.subscriptions[0];
|
|
106
|
+
state.installation = nextOwner ? { owner: nextOwner, uninstall: nextOwner.install() } : null;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function dispatch(state, params) {
|
|
111
|
+
if (state.subscriptions.some((subscription) => subscription.shouldPresentRootAsFolder)) {
|
|
112
|
+
removeRootUnsafeItems(params.menu);
|
|
113
|
+
}
|
|
114
|
+
for (const subscription of [...state.subscriptions]) {
|
|
115
|
+
try {
|
|
116
|
+
subscription.handler(params);
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.error("A file explorer root menu handler failed", error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function dispatchBeforeShow(state, params) {
|
|
123
|
+
const uninstallShowPatch = around(params.menu, {
|
|
124
|
+
showAtMouseEvent: (next) => function patchedShowAtMouseEvent(showMouseEvent) {
|
|
125
|
+
uninstallShowPatch();
|
|
126
|
+
dispatch(state, params);
|
|
127
|
+
return params.menu.items.length === 0 ? this : next.call(this, showMouseEvent);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function getFileExplorerLeaf(app) {
|
|
132
|
+
return app.workspace.getLeavesOfType(ViewType.FileExplorer)[0] ?? null;
|
|
133
|
+
}
|
|
134
|
+
function getSharedState(app) {
|
|
135
|
+
const statesByApp = getObsidianLibState(SHARED_STATE_KEY, /* @__PURE__ */ new WeakMap()).value;
|
|
136
|
+
let state = statesByApp.get(app);
|
|
137
|
+
if (!state) {
|
|
138
|
+
state = { installation: null, subscriptions: [] };
|
|
139
|
+
statesByApp.set(app, state);
|
|
140
|
+
}
|
|
141
|
+
return state;
|
|
142
|
+
}
|
|
143
|
+
function installRootMenu(app, state) {
|
|
144
|
+
let isUninstalled = false;
|
|
145
|
+
let pendingSpot = null;
|
|
146
|
+
let uninstallPatch = null;
|
|
147
|
+
function tryPatch() {
|
|
148
|
+
if (isUninstalled || uninstallPatch) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const view = getFileExplorerLeaf(app)?.view;
|
|
152
|
+
if (!isFileExplorerView(view)) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
uninstallPatch = around(getPrototypeOf(view), {
|
|
156
|
+
onFileContextMenu: (next) => function patchedOnFileContextMenu(mouseEvent, file) {
|
|
157
|
+
if (!(file instanceof TFolder) || !file.isRoot()) {
|
|
158
|
+
next.call(this, mouseEvent, file);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
openRootMenu({
|
|
162
|
+
mouseEvent,
|
|
163
|
+
openNative: () => {
|
|
164
|
+
next.call(this, mouseEvent, file);
|
|
165
|
+
},
|
|
166
|
+
rootFolder: file,
|
|
167
|
+
spot: pendingSpot ?? "empty-area" /* EmptyArea */
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function openRootMenu(params) {
|
|
173
|
+
const { mouseEvent, openNative, rootFolder, spot } = params;
|
|
174
|
+
const eventRef = app.workspace.on("file-menu", (menu, file, source) => {
|
|
175
|
+
if (file !== rootFolder || source !== FILE_EXPLORER_MENU_SOURCE) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
app.workspace.offref(eventRef);
|
|
179
|
+
dispatchBeforeShow(state, { menu, mouseEvent, rootFolder, spot });
|
|
180
|
+
});
|
|
181
|
+
const restoreIsRoot = state.subscriptions.some((subscription) => subscription.shouldPresentRootAsFolder) ? presentAsFolder(rootFolder) : null;
|
|
182
|
+
try {
|
|
183
|
+
openNative();
|
|
184
|
+
} finally {
|
|
185
|
+
restoreIsRoot?.();
|
|
186
|
+
app.workspace.offref(eventRef);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function openFromVaultName(mouseEvent) {
|
|
190
|
+
const isOnVaultName = mouseEvent.composedPath().some((target) => target instanceof HTMLElement && VAULT_NAME_SELECTORS.some((selector) => target.matches(selector)));
|
|
191
|
+
if (!isOnVaultName) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const vaultMenu = Menu.forEvent(mouseEvent);
|
|
195
|
+
const rootFolder = app.vault.getRoot();
|
|
196
|
+
const leaf = getFileExplorerLeaf(app);
|
|
197
|
+
if (!leaf || state.subscriptions.every((subscription) => !subscription.shouldPresentRootAsFolder)) {
|
|
198
|
+
dispatchBeforeShow(state, { menu: vaultMenu, mouseEvent, rootFolder, spot: "vault-name" /* VaultName */ });
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
function suppressVaultMenuShow() {
|
|
202
|
+
uninstallVaultMenuShowPatch();
|
|
203
|
+
return vaultMenu;
|
|
204
|
+
}
|
|
205
|
+
const uninstallVaultMenuShowPatch = around(vaultMenu, { showAtMouseEvent: () => suppressVaultMenuShow });
|
|
206
|
+
invokeAsyncSafely(async () => {
|
|
207
|
+
await leaf.loadIfDeferred();
|
|
208
|
+
const view = leaf.view;
|
|
209
|
+
if (isUninstalled || !isFileExplorerView(view)) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
tryPatch();
|
|
213
|
+
view.tree.clearSelectedDoms();
|
|
214
|
+
pendingSpot = "vault-name" /* VaultName */;
|
|
215
|
+
try {
|
|
216
|
+
view.onFileContextMenu(mouseEvent, rootFolder);
|
|
217
|
+
} finally {
|
|
218
|
+
pendingSpot = null;
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
tryPatch();
|
|
223
|
+
const layoutChangeEventRef = app.workspace.on("layout-change", tryPatch);
|
|
224
|
+
app.workspace.onLayoutReady(tryPatch);
|
|
225
|
+
const doc = app.workspace.containerEl.doc;
|
|
226
|
+
doc.addEventListener("contextmenu", openFromVaultName, { capture: true });
|
|
227
|
+
return () => {
|
|
228
|
+
isUninstalled = true;
|
|
229
|
+
uninstallPatch?.();
|
|
230
|
+
app.workspace.offref(layoutChangeEventRef);
|
|
231
|
+
doc.removeEventListener("contextmenu", openFromVaultName, { capture: true });
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
function isFileExplorerView(view) {
|
|
235
|
+
return typeof view?.onFileContextMenu === "function";
|
|
236
|
+
}
|
|
237
|
+
function presentAsFolder(rootFolder) {
|
|
238
|
+
const ownIsRootDescriptor = Object.getOwnPropertyDescriptor(rootFolder, "isRoot");
|
|
239
|
+
rootFolder.isRoot = () => false;
|
|
240
|
+
return () => {
|
|
241
|
+
if (ownIsRootDescriptor) {
|
|
242
|
+
Object.defineProperty(rootFolder, "isRoot", ownIsRootDescriptor);
|
|
243
|
+
} else {
|
|
244
|
+
delete rootFolder.isRoot;
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function removeRootUnsafeItems(menu) {
|
|
249
|
+
const unsafeTitles = new Set(ROOT_UNSAFE_ITEM_TITLE_KEYS.map((key) => activeWindow.i18next.t(key)));
|
|
250
|
+
menu.items = menu.items.filter((item) => !(item instanceof MenuItem) || !unsafeTitles.has(item.titleEl.textContent));
|
|
251
|
+
}
|
|
252
|
+
export {
|
|
253
|
+
FileExplorerRootMenuComponent,
|
|
254
|
+
FileExplorerRootMenuSpot,
|
|
255
|
+
VAULT_NAME_SELECTORS
|
|
256
|
+
};
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ZpbGUtZXhwbG9yZXItcm9vdC1tZW51LWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgYW5kIGV4dGVuZHMgdGhlIGNvcmUgRmlsZSBFeHBsb3JlcidzIGNvbnRleHQgbWVudSBmb3IgdGhlIHZhdWx0IHJvb3QsIGF0IHRoZSB0d28gc3BvdHMgdGhhdCBzdGFuZCBmb3IgaXQ6IHRoZVxuICogdmF1bHQgbmFtZSBhdCB0aGUgdG9wIG9mIHRoZSBsZWZ0IHNpZGViYXIsIGFuZCB0aGUgZW1wdHkgYXJlYSBiZWxvdyB0aGUgZmlsZSBsaXN0LlxuICpcbiAqIE9ic2lkaWFuIGFscmVhZHkgb3BlbnMgYSBtZW51IGZvciB0aGUgZW1wdHkgYXJlYTogdGhlIHZpZXcncyBvd24gYGNvbnRleHRtZW51YCBsaXN0ZW5lciBvbiBpdHMgZmlsZXMgY29udGFpbmVyIGNhbGxzXG4gKiBgb25GaWxlQ29udGV4dE1lbnUoZXZ0LCB2YXVsdC5nZXRSb290KCkpYCwgd2hpY2ggYnVpbGRzIGEge0BsaW5rIE1lbnV9LCB0cmlnZ2VycyBgZmlsZS1tZW51YCB3aXRoIHRoZSByb290IGZvbGRlciBhbmRcbiAqIHRoZSBzb3VyY2UgYGZpbGUtZXhwbG9yZXItY29udGV4dC1tZW51YCwgYW5kIHNob3dzIGl0LiBUaGUgdmF1bHQgbmFtZSAoYC53b3Jrc3BhY2UtZHJhd2VyLXZhdWx0LXN3aXRjaGVyYCBvbiBkZXNrdG9wLFxuICogYC53b3Jrc3BhY2UtZHJhd2VyLWhlYWRlci1uYW1lYCBvbiBtb2JpbGUsIHdoZXJlIE9ic2lkaWFuIGJ1aWxkcyBubyBzd2l0Y2hlcikgb3BlbnMgYSBkaWZmZXJlbnQgbWVudTogb24gZGVza3RvcFxuICogT2JzaWRpYW4gYWRkcyBgU2hvdyBpbiBzeXN0ZW0gZXhwbG9yZXJgIGFuZCBgQ29weSBwYXRoYCB0byB0aGUgcGVyLWV2ZW50IG1lbnUgYE1lbnUuZm9yRXZlbnRgIGhhbmRzIG91dC4gVGhlIGhhbmRsZXJzXG4gKiBnZXQgdGhhdCBtZW51LCBzbyBhIHJpZ2h0LWNsaWNrIHRoZXJlIG5ldmVyIG9wZW5zIGEgc2Vjb25kIG9uZS4gQSBzdWJzY3JpYmVyIHRoYXQgcHJlc2VudHMgdGhlIHJvb3QgYXMgYSBmb2xkZXJcbiAqIHJlcGxhY2VzIGl0IHdpdGggdGhlIHJvb3QncyBmb2xkZXIgbWVudSBpbnN0ZWFkLiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMGAuXG4gKlxuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIG93biBjb3B5IG9mIHRoaXMgbGlicmFyeSwgYW5kIHNldmVyYWwgb2YgdGhlbSBtYXkgd2FudCB0aGlzIG1lbnUuIFR3byBjb3BpZXMgcGF0Y2hpbmcgdGhlXG4gKiBzYW1lIHByb3RvdHlwZSBhbmQgbGlzdGVuaW5nIG9uIHRoZSBzYW1lIGVsZW1lbnQgd291bGQgb3BlbiBpdCB0d2ljZSwgc28gdGhlcmUgaXMgT05FIGluc3RhbGxhdGlvbiBwZXIge0BsaW5rIEFwcH0sXG4gKiBrZXB0IGluIHRoZSBzaGFyZWQtc3RhdGUgYmFnIHVuZGVyIGEgdmVyc2lvbmVkIGtleSBhbmQgb3duZWQgYnkgb25lIHN1YnNjcmliZXIuIFdoZW4gdGhlIG93bmVyIHVubG9hZHMgd2hpbGUgb3RoZXJzXG4gKiByZW1haW4sIHRoZSBuZXh0IHN1YnNjcmliZXIgaW5zdGFsbHMgaXQgYWdhaW4gZnJvbSBpdHMgb3duIGNvcHkuIFdoYXQgY3Jvc3NlcyB0aGF0IGJvdW5kYXJ5IGlzIGEgd2lyZSBmb3JtYXQgYmV0d2VlblxuICogY29waWVzIG9mIGRpZmZlcmVudCB2ZXJzaW9uczogcGxhaW4gb2JqZWN0cyBhbmQgcGxhaW4gZnVuY3Rpb25zIG9ubHksIHJlYWQgc3RydWN0dXJhbGx5LCBhbmQgYSBjaGFuZ2UgdG8gd2hhdCBhIGZpZWxkXG4gKiBtZWFucyBtb3ZlcyB0byBhIG5ldyBrZXkgcmF0aGVyIHRoYW4gcmVpbnRlcnByZXRpbmcgdGhlIG9sZCBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGaWxlRXhwbG9yZXJWaWV3IH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEFic3RyYWN0RmlsZSxcbiAgV29ya3NwYWNlTGVhZlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldFByb3RvdHlwZU9mIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIE1lbnUsXG4gIE1lbnVJdGVtLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IGFyb3VuZCB9IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFRoZSBlbGVtZW50cyB0aGF0IHN0YW5kIGZvciB0aGUgdmF1bHQgcm9vdCBhdCB0aGUgdG9wIG9mIHRoZSBsZWZ0IHNpZGViYXIsIGluIHByaW9yaXR5IG9yZGVyLiBPYnNpZGlhbiBidWlsZHNcbiAqIGAud29ya3NwYWNlLWRyYXdlci12YXVsdC1zd2l0Y2hlcmAgb25seSBvbiBkZXNrdG9wOyBvbiBtb2JpbGUgdGhlIHZhdWx0IG5hbWUgaXMgdGhlIGRyYXdlciBoZWFkZXIgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBVUxUX05BTUVfU0VMRUNUT1JTID0gW1xuICAnLndvcmtzcGFjZS1kcmF3ZXItdmF1bHQtc3dpdGNoZXInLFxuICAnLndvcmtzcGFjZS1kcmF3ZXItaGVhZGVyLW5hbWUnXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFRoZSBgc291cmNlYCBPYnNpZGlhbiBwYXNzZXMgd2l0aCBgZmlsZS1tZW51YCB3aGVuIHRoZSBGaWxlIEV4cGxvcmVyIG9wZW5zIGEgbWVudS5cbiAqL1xuY29uc3QgRklMRV9FWFBMT1JFUl9NRU5VX1NPVVJDRSA9ICdmaWxlLWV4cGxvcmVyLWNvbnRleHQtbWVudSc7XG5cbi8qKlxuICogVGhlIG1lbnUgaXRlbXMgdGhhdCBtdXN0IG5vdCBhY3Qgb24gdGhlIHZhdWx0IHJvb3QsIGJ5IHRoZSBsb2NhbGl6YXRpb24ga2V5IG9mIHRoZWlyIHRpdGxlLiBUaGV5IGFwcGVhciBvbmx5IHdoZW5cbiAqIHRoZSByb290IGlzIHByZXNlbnRlZCBhcyBhbiBvcmRpbmFyeSBmb2xkZXIsIGZyb20gT2JzaWRpYW4gaXRzZWxmIG9yIGZyb20gYW5vdGhlciBwbHVnaW4ncyBgZmlsZS1tZW51YCBoYW5kbGVyLlxuICovXG5jb25zdCBST09UX1VOU0FGRV9JVEVNX1RJVExFX0tFWVMgPSBbXG4gICdwbHVnaW5zLmZpbGUtZXhwbG9yZXIuYWN0aW9uLW1vdmUtZm9sZGVyJyxcbiAgJ3BsdWdpbnMuZmlsZS1leHBsb3Jlci5tZW51LW9wdC1kZWxldGUnLFxuICAncGx1Z2lucy5maWxlLWV4cGxvcmVyLm1lbnUtb3B0LW1ha2UtY29weScsXG4gICdwbHVnaW5zLmZpbGUtZXhwbG9yZXIubWVudS1vcHQtcmVuYW1lJyxcbiAgJ3BsdWdpbnMuc2VhcmNoLm1lbnUtb3B0LXNlYXJjaC1pbi1mb2xkZXInXG5dIGFzIGNvbnN0O1xuXG5jb25zdCBTSEFSRURfU1RBVEVfS0VZID0gJ2ZpbGVFeHBsb3JlclJvb3RNZW51QnlBcHBWMSc7XG5cbi8qKlxuICogV2hpY2ggc3BvdCBvZiB0aGUgRmlsZSBFeHBsb3JlciB0aGUgdmF1bHQtcm9vdCBtZW51IHdhcyBvcGVuZWQgZnJvbS5cbiAqL1xuZXhwb3J0IGVudW0gRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90IHtcbiAgLyoqXG4gICAqIFRoZSBlbXB0eSBhcmVhIGJlbG93IHRoZSBmaWxlIGxpc3QuXG4gICAqL1xuICBFbXB0eUFyZWEgPSAnZW1wdHktYXJlYScsXG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBuYW1lIGF0IHRoZSB0b3Agb2YgdGhlIGxlZnQgc2lkZWJhci5cbiAgICovXG4gIFZhdWx0TmFtZSA9ICd2YXVsdC1uYW1lJ1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBGaWxlRXhwbG9yZXJSb290TWVudUNvbXBvbmVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUV4cGxvcmVyUm9vdE1lbnVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBlYWNoIHRpbWUgdGhlIHZhdWx0LXJvb3QgbWVudSBpcyBhYm91dCB0byBiZSBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZXI6IEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcm9vdCBpcyBwcmVzZW50ZWQgYXMgYW4gb3JkaW5hcnkgZm9sZGVyIHdoaWxlIGl0cyBtZW51IGlzIGJ1aWx0LCBzbyB0aGF0IE9ic2lkaWFuIGFuZCBvdGhlciBwbHVnaW5zIGFkZFxuICAgKiB0aGUgaXRlbXMgdGhleSBhZGQgdG8gYW55IGZvbGRlci4gVGhlIGl0ZW1zIHRoYXQgbXVzdCBub3QgYWN0IG9uIHRoZSByb290IChyZW5hbWUsIGRlbGV0ZSwgbW92ZSwgbWFrZSBhIGNvcHkgYW5kXG4gICAqIHNlYXJjaCBpbiBmb2xkZXIpIGFyZSByZW1vdmVkIGFnYWluIGJlZm9yZSB0aGUgbWVudSBpcyBzaG93bi4gT24gdGhlIHZhdWx0IG5hbWUsIHRoZSByb290J3MgZm9sZGVyIG1lbnUgdGhlbiByZXBsYWNlc1xuICAgKiBPYnNpZGlhbidzIHZhdWx0IG1lbnUuIEl0IGhvbGRzIHdoaWxlIGFueSBzdWJzY3JpYmVyIGFza3MgZm9yIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgb2YgdGhlIHZhdWx0LXJvb3QgbWVudS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlciA9IChwYXJhbXM6IEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlclBhcmFtcykgPT4gdm9pZDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBhIHtAbGluayBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJ9LlxuICpcbiAqIFRoZSBzaGFwZSBpcyBwYXJ0IG9mIHRoZSB3aXJlIGZvcm1hdCBiZXR3ZWVuIGNvcGllcyBvZiB0aGlzIGxpYnJhcnk6IGZpZWxkcyBhcmUgb25seSBldmVyIGFkZGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWVudSwgYWJvdXQgdG8gYmUgc2hvd246IHRoZSByb290J3MgZm9sZGVyIG1lbnUsIGFmdGVyIGV2ZXJ5IGBmaWxlLW1lbnVgIGhhbmRsZXIgaGFzIHJ1biwgb3Igb24gdGhlIHZhdWx0IG5hbWUgdGhlXG4gICAqIHZhdWx0IG1lbnUgT2JzaWRpYW4gYnVpbGRzIHRoZXJlLiBBIG1lbnUgc3RpbGwgZW1wdHkgYWZ0ZXIgZXZlcnkgaGFuZGxlciBpcyBub3Qgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBtZW51OiBNZW51O1xuXG4gIC8qKlxuICAgKiBUaGUgcmlnaHQtY2xpY2sgb3IgbG9uZy1wcmVzcyB0aGF0IG9wZW5lZCB0aGUgbWVudS5cbiAgICovXG4gIHJlYWRvbmx5IG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogVEZvbGRlcjtcblxuICAvKipcbiAgICogV2hpY2ggc3BvdCB0aGUgbWVudSB3YXMgb3BlbmVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzcG90OiBGaWxlRXhwbG9yZXJSb290TWVudVNwb3Q7XG59XG5cbmludGVyZmFjZSBGaWxlRXhwbG9yZXJSb290TWVudUluc3RhbGxhdGlvbiB7XG4gIHJlYWRvbmx5IG93bmVyOiBGaWxlRXhwbG9yZXJSb290TWVudVN1YnNjcmlwdGlvbjtcbiAgdW5pbnN0YWxsOiAoKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSB7XG4gIGluc3RhbGxhdGlvbjogRmlsZUV4cGxvcmVyUm9vdE1lbnVJbnN0YWxsYXRpb24gfCBudWxsO1xuICByZWFkb25seSBzdWJzY3JpcHRpb25zOiBGaWxlRXhwbG9yZXJSb290TWVudVN1YnNjcmlwdGlvbltdO1xufVxuXG5pbnRlcmZhY2UgRmlsZUV4cGxvcmVyUm9vdE1lbnVTdWJzY3JpcHRpb24ge1xuICBoYW5kbGVyOiAocGFyYW1zOiBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJQYXJhbXMpID0+IHZvaWQ7XG4gIGluc3RhbGw6ICgpID0+ICgpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHNob3VsZFByZXNlbnRSb290QXNGb2xkZXI6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBGaWxlRXhwbG9yZXJWaWV3V2l0aENvbnRleHRNZW51IGV4dGVuZHMgRmlsZUV4cGxvcmVyVmlldyB7XG4gIG9uRmlsZUNvbnRleHRNZW51OiAobW91c2VFdmVudDogTW91c2VFdmVudCwgZmlsZTogVEFic3RyYWN0RmlsZSkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIE9wZW5Sb290TWVudVBhcmFtcyB7XG4gIHJlYWRvbmx5IG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIHJlYWRvbmx5IG9wZW5OYXRpdmU6ICgpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IFRGb2xkZXI7XG4gIHJlYWRvbmx5IHNwb3Q6IEZpbGVFeHBsb3JlclJvb3RNZW51U3BvdDtcbn1cblxuLyoqXG4gKiBIYW5kcyB0aGUgY29yZSBGaWxlIEV4cGxvcmVyJ3MgdmF1bHQtcm9vdCBtZW51IHRvIGEgaGFuZGxlciwgYW5kIG9wZW5zIHRoYXQgbWVudSBmcm9tIHRoZSB2YXVsdCBuYW1lIHRvby5cbiAqXG4gKiBBbnkgbnVtYmVyIG9mIHRoZXNlLCBpbiBhbnkgbnVtYmVyIG9mIHBsdWdpbnMsIHNoYXJlIG9uZSBpbnN0YWxsYXRpb24gcGVyIHtAbGluayBBcHB9LlxuICovXG5leHBvcnQgY2xhc3MgRmlsZUV4cGxvcmVyUm9vdE1lbnVDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgZWFjaCB0aW1lIHRoZSB2YXVsdC1yb290IG1lbnUgaXMgYWJvdXQgdG8gYmUgc2hvd24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFuZGxlcjogRmlsZUV4cGxvcmVyUm9vdE1lbnVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByb290IGlzIHByZXNlbnRlZCBhcyBhbiBvcmRpbmFyeSBmb2xkZXIgd2hpbGUgaXRzIG1lbnUgaXMgYnVpbHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIGV4cGxvcmVyIHJvb3QgbWVudSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVFeHBsb3JlclJvb3RNZW51Q29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmhhbmRsZXIgPSBwYXJhbXMuaGFuZGxlcjtcbiAgICB0aGlzLnNob3VsZFByZXNlbnRSb290QXNGb2xkZXIgPSBwYXJhbXMuc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlciA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBzaGFyZWQgaW5zdGFsbGF0aW9uLCBpbnN0YWxsaW5nIGl0IHdoZW4gbm9ib2R5IGhhcyB5ZXQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgY29uc3Qgc3RhdGUgPSBnZXRTaGFyZWRTdGF0ZSh0aGlzLmFwcCk7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uOiBGaWxlRXhwbG9yZXJSb290TWVudVN1YnNjcmlwdGlvbiA9IHtcbiAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlcixcbiAgICAgIGluc3RhbGw6ICgpID0+IGluc3RhbGxSb290TWVudSh0aGlzLmFwcCwgc3RhdGUpLFxuICAgICAgc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlcjogdGhpcy5zaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyXG4gICAgfTtcbiAgICBzdGF0ZS5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICBzdGF0ZS5pbnN0YWxsYXRpb24gPz89IHsgb3duZXI6IHN1YnNjcmlwdGlvbiwgdW5pbnN0YWxsOiBzdWJzY3JpcHRpb24uaW5zdGFsbCgpIH07XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHN0YXRlLnN1YnNjcmlwdGlvbnMuc3BsaWNlKHN0YXRlLnN1YnNjcmlwdGlvbnMuaW5kZXhPZihzdWJzY3JpcHRpb24pLCAxKTtcbiAgICAgIGlmIChzdGF0ZS5pbnN0YWxsYXRpb24/Lm93bmVyICE9PSBzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5pbnN0YWxsYXRpb24udW5pbnN0YWxsKCk7XG4gICAgICBjb25zdCBuZXh0T3duZXIgPSBzdGF0ZS5zdWJzY3JpcHRpb25zWzBdO1xuICAgICAgc3RhdGUuaW5zdGFsbGF0aW9uID0gbmV4dE93bmVyID8geyBvd25lcjogbmV4dE93bmVyLCB1bmluc3RhbGw6IG5leHRPd25lci5pbnN0YWxsKCkgfSA6IG51bGw7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2goc3RhdGU6IEZpbGVFeHBsb3JlclJvb3RNZW51U2hhcmVkU3RhdGUsIHBhcmFtczogRmlsZUV4cGxvcmVyUm9vdE1lbnVIYW5kbGVyUGFyYW1zKTogdm9pZCB7XG4gIGlmIChzdGF0ZS5zdWJzY3JpcHRpb25zLnNvbWUoKHN1YnNjcmlwdGlvbikgPT4gc3Vic2NyaXB0aW9uLnNob3VsZFByZXNlbnRSb290QXNGb2xkZXIpKSB7XG4gICAgcmVtb3ZlUm9vdFVuc2FmZUl0ZW1zKHBhcmFtcy5tZW51KTtcbiAgfVxuXG4gIC8vIEEgc25hcHNob3Q6IGEgaGFuZGxlciBtYXkgdW5sb2FkIGl0cyBvd24gY29tcG9uZW50LCBvciBhbm90aGVyIG9uZSwgd2hpbGUgdGhlIG1lbnUgaXMgZGlzcGF0Y2hlZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdXNlbGVzcy1zcHJlYWQgLS0gVGhlIGNvcHkgaXMgdGhlIHBvaW50OiB0aGUgbGlzdCBtYXkgY2hhbmdlIGR1cmluZyB0aGUgbG9vcC5cbiAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgWy4uLnN0YXRlLnN1YnNjcmlwdGlvbnNdKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmlwdGlvbi5oYW5kbGVyKHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0EgZmlsZSBleHBsb3JlciByb290IG1lbnUgaGFuZGxlciBmYWlsZWQnLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQmVmb3JlU2hvdyhzdGF0ZTogRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSwgcGFyYW1zOiBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgdW5pbnN0YWxsU2hvd1BhdGNoID0gYXJvdW5kKHBhcmFtcy5tZW51LCB7XG4gICAgc2hvd0F0TW91c2VFdmVudDogKG5leHQpID0+XG4gICAgICBmdW5jdGlvbiBwYXRjaGVkU2hvd0F0TW91c2VFdmVudCh0aGlzOiBNZW51LCBzaG93TW91c2VFdmVudDogTW91c2VFdmVudCk6IE1lbnUge1xuICAgICAgICB1bmluc3RhbGxTaG93UGF0Y2goKTtcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUsIHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBwYXJhbXMubWVudS5pdGVtcy5sZW5ndGggPT09IDAgPyB0aGlzIDogbmV4dC5jYWxsKHRoaXMsIHNob3dNb3VzZUV2ZW50KTtcbiAgICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVFeHBsb3JlckxlYWYoYXBwOiBBcHApOiBudWxsIHwgV29ya3NwYWNlTGVhZiB7XG4gIHJldHVybiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5GaWxlRXhwbG9yZXIpWzBdID8/IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFNoYXJlZFN0YXRlKGFwcDogQXBwKTogRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSB7XG4gIGNvbnN0IHN0YXRlc0J5QXBwID0gZ2V0T2JzaWRpYW5MaWJTdGF0ZShTSEFSRURfU1RBVEVfS0VZLCBuZXcgV2Vha01hcDxBcHAsIEZpbGVFeHBsb3JlclJvb3RNZW51U2hhcmVkU3RhdGU+KCkpLnZhbHVlO1xuICBsZXQgc3RhdGUgPSBzdGF0ZXNCeUFwcC5nZXQoYXBwKTtcbiAgaWYgKCFzdGF0ZSkge1xuICAgIHN0YXRlID0geyBpbnN0YWxsYXRpb246IG51bGwsIHN1YnNjcmlwdGlvbnM6IFtdIH07XG4gICAgc3RhdGVzQnlBcHAuc2V0KGFwcCwgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbFJvb3RNZW51KGFwcDogQXBwLCBzdGF0ZTogRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSk6ICgpID0+IHZvaWQge1xuICBsZXQgaXNVbmluc3RhbGxlZCA9IGZhbHNlO1xuICBsZXQgcGVuZGluZ1Nwb3Q6IEZpbGVFeHBsb3JlclJvb3RNZW51U3BvdCB8IG51bGwgPSBudWxsO1xuICBsZXQgdW5pbnN0YWxsUGF0Y2g6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHRyeVBhdGNoKCk6IHZvaWQge1xuICAgIGlmIChpc1VuaW5zdGFsbGVkIHx8IHVuaW5zdGFsbFBhdGNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmlldyA9IGdldEZpbGVFeHBsb3JlckxlYWYoYXBwKT8udmlldztcbiAgICBpZiAoIWlzRmlsZUV4cGxvcmVyVmlldyh2aWV3KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVuaW5zdGFsbFBhdGNoID0gYXJvdW5kKGdldFByb3RvdHlwZU9mKHZpZXcpLCB7XG4gICAgICBvbkZpbGVDb250ZXh0TWVudTogKG5leHQpID0+XG4gICAgICAgIGZ1bmN0aW9uIHBhdGNoZWRPbkZpbGVDb250ZXh0TWVudSh0aGlzOiBGaWxlRXhwbG9yZXJWaWV3V2l0aENvbnRleHRNZW51LCBtb3VzZUV2ZW50OiBNb3VzZUV2ZW50LCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgICAgICAgaWYgKCEoZmlsZSBpbnN0YW5jZW9mIFRGb2xkZXIpIHx8ICFmaWxlLmlzUm9vdCgpKSB7XG4gICAgICAgICAgICBuZXh0LmNhbGwodGhpcywgbW91c2VFdmVudCwgZmlsZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb3BlblJvb3RNZW51KHtcbiAgICAgICAgICAgIG1vdXNlRXZlbnQsXG4gICAgICAgICAgICBvcGVuTmF0aXZlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIG5leHQuY2FsbCh0aGlzLCBtb3VzZUV2ZW50LCBmaWxlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb290Rm9sZGVyOiBmaWxlLFxuICAgICAgICAgICAgc3BvdDogcGVuZGluZ1Nwb3QgPz8gRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90LkVtcHR5QXJlYVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuUm9vdE1lbnUocGFyYW1zOiBPcGVuUm9vdE1lbnVQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1vdXNlRXZlbnQsIG9wZW5OYXRpdmUsIHJvb3RGb2xkZXIsIHNwb3QgfSA9IHBhcmFtcztcbiAgICBjb25zdCBldmVudFJlZiA9IGFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtbWVudScsIChtZW51LCBmaWxlLCBzb3VyY2UpID0+IHtcbiAgICAgIGlmIChmaWxlICE9PSByb290Rm9sZGVyIHx8IHNvdXJjZSAhPT0gRklMRV9FWFBMT1JFUl9NRU5VX1NPVVJDRSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFwcC53b3Jrc3BhY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgIGRpc3BhdGNoQmVmb3JlU2hvdyhzdGF0ZSwgeyBtZW51LCBtb3VzZUV2ZW50LCByb290Rm9sZGVyLCBzcG90IH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdG9yZUlzUm9vdCA9IHN0YXRlLnN1YnNjcmlwdGlvbnMuc29tZSgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24uc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlcilcbiAgICAgID8gcHJlc2VudEFzRm9sZGVyKHJvb3RGb2xkZXIpXG4gICAgICA6IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgb3Blbk5hdGl2ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXN0b3JlSXNSb290Py4oKTtcbiAgICAgIGFwcC53b3Jrc3BhY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuRnJvbVZhdWx0TmFtZShtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaXNPblZhdWx0TmFtZSA9IG1vdXNlRXZlbnQuY29tcG9zZWRQYXRoKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBWQVVMVF9OQU1FX1NFTEVDVE9SUy5zb21lKChzZWxlY3RvcikgPT4gdGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSk7XG4gICAgaWYgKCFpc09uVmF1bHROYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYE1lbnUuZm9yRXZlbnRgIGhhbmRzIGV2ZXJ5IGxpc3RlbmVyIG9mIG9uZSBldmVudCB0aGUgc2FtZSBtZW51IGFuZCBzaG93cyBpdCBvbiB0aGUgbmV4dCB0YXNrLiBPYnNpZGlhbidzIG93blxuICAgIC8vIGxpc3RlbmVyIG9uIHRoZSB2YXVsdCBuYW1lIGFkZHMgaXRzIHZhdWx0IGl0ZW1zIHRvIGl0IGFmdGVyIHRoaXMgY2FwdHVyZS1waGFzZSBvbmUgaGFzIHJ1bi5cbiAgICBjb25zdCB2YXVsdE1lbnUgPSBNZW51LmZvckV2ZW50KG1vdXNlRXZlbnQpO1xuICAgIGNvbnN0IHJvb3RGb2xkZXIgPSBhcHAudmF1bHQuZ2V0Um9vdCgpO1xuICAgIGNvbnN0IGxlYWYgPSBnZXRGaWxlRXhwbG9yZXJMZWFmKGFwcCk7XG4gICAgaWYgKCFsZWFmIHx8IHN0YXRlLnN1YnNjcmlwdGlvbnMuZXZlcnkoKHN1YnNjcmlwdGlvbikgPT4gIXN1YnNjcmlwdGlvbi5zaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyKSkge1xuICAgICAgZGlzcGF0Y2hCZWZvcmVTaG93KHN0YXRlLCB7IG1lbnU6IHZhdWx0TWVudSwgbW91c2VFdmVudCwgcm9vdEZvbGRlciwgc3BvdDogRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90LlZhdWx0TmFtZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVzZW50ZWQgYXMgYSBmb2xkZXIsIHRoZSByb290J3MgZm9sZGVyIG1lbnUgcmVwbGFjZXMgdGhlIHZhdWx0IG1lbnUgcmF0aGVyIHRoYW4gb3BlbmluZyBvbiB0b3Agb2YgaXQuXG4gICAgZnVuY3Rpb24gc3VwcHJlc3NWYXVsdE1lbnVTaG93KCk6IE1lbnUge1xuICAgICAgdW5pbnN0YWxsVmF1bHRNZW51U2hvd1BhdGNoKCk7XG4gICAgICByZXR1cm4gdmF1bHRNZW51O1xuICAgIH1cbiAgICBjb25zdCB1bmluc3RhbGxWYXVsdE1lbnVTaG93UGF0Y2ggPSBhcm91bmQodmF1bHRNZW51LCB7IHNob3dBdE1vdXNlRXZlbnQ6ICgpID0+IHN1cHByZXNzVmF1bHRNZW51U2hvdyB9KTtcbiAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBsZWFmLmxvYWRJZkRlZmVycmVkKCk7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKGlzVW5pbnN0YWxsZWQgfHwgIWlzRmlsZUV4cGxvcmVyVmlldyh2aWV3KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeVBhdGNoKCk7XG4gICAgICB2aWV3LnRyZWUuY2xlYXJTZWxlY3RlZERvbXMoKTtcbiAgICAgIHBlbmRpbmdTcG90ID0gRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90LlZhdWx0TmFtZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZpZXcub25GaWxlQ29udGV4dE1lbnUobW91c2VFdmVudCwgcm9vdEZvbGRlcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBwZW5kaW5nU3BvdCA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB0cnlQYXRjaCgpO1xuICBjb25zdCBsYXlvdXRDaGFuZ2VFdmVudFJlZiA9IGFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0cnlQYXRjaCk7XG4gIGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSh0cnlQYXRjaCk7XG4gIGNvbnN0IGRvYyA9IGFwcC53b3Jrc3BhY2UuY29udGFpbmVyRWwuZG9jO1xuICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvcGVuRnJvbVZhdWx0TmFtZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgaXNVbmluc3RhbGxlZCA9IHRydWU7XG4gICAgdW5pbnN0YWxsUGF0Y2g/LigpO1xuICAgIGFwcC53b3Jrc3BhY2Uub2ZmcmVmKGxheW91dENoYW5nZUV2ZW50UmVmKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvcGVuRnJvbVZhdWx0TmFtZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc0ZpbGVFeHBsb3JlclZpZXcodmlldzogdW5rbm93bik6IHZpZXcgaXMgRmlsZUV4cGxvcmVyVmlld1dpdGhDb250ZXh0TWVudSB7XG4gIHJldHVybiB0eXBlb2YgKHZpZXcgYXMgUGFydGlhbDxGaWxlRXhwbG9yZXJWaWV3V2l0aENvbnRleHRNZW51PiB8IHVuZGVmaW5lZCk/Lm9uRmlsZUNvbnRleHRNZW51ID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBwcmVzZW50QXNGb2xkZXIocm9vdEZvbGRlcjogVEZvbGRlcik6ICgpID0+IHZvaWQge1xuICBjb25zdCBvd25Jc1Jvb3REZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyb290Rm9sZGVyLCAnaXNSb290Jyk7XG4gIHJvb3RGb2xkZXIuaXNSb290ID0gKCk6IGJvb2xlYW4gPT4gZmFsc2U7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKG93bklzUm9vdERlc2NyaXB0b3IpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyb290Rm9sZGVyLCAnaXNSb290Jywgb3duSXNSb290RGVzY3JpcHRvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSAocm9vdEZvbGRlciBhcyBQYXJ0aWFsPFRGb2xkZXI+KS5pc1Jvb3Q7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZW1vdmVSb290VW5zYWZlSXRlbXMobWVudTogTWVudSk6IHZvaWQge1xuICBjb25zdCB1bnNhZmVUaXRsZXMgPSBuZXcgU2V0PG51bGwgfCBzdHJpbmc+KFJPT1RfVU5TQUZFX0lURU1fVElUTEVfS0VZUy5tYXAoKGtleSkgPT4gYWN0aXZlV2luZG93LmkxOG5leHQudChrZXkpKSk7XG4gIG1lbnUuaXRlbXMgPSBtZW51Lml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gIShpdGVtIGluc3RhbmNlb2YgTWVudUl0ZW0pIHx8ICF1bnNhZmVUaXRsZXMuaGFzKGl0ZW0udGl0bGVFbC50ZXh0Q29udGVudCkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGNBQWM7QUFNaEIsTUFBTSx1QkFBdUI7QUFBQSxFQUNsQztBQUFBLEVBQ0E7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
|
|
@@ -9,6 +9,7 @@ export * as 'console-debug-component' from './console-debug-component.mjs';
|
|
|
9
9
|
export * as 'core-plugin-toggle-component' from './core-plugin-toggle-component.mjs';
|
|
10
10
|
export * as 'disposable-component' from './disposable-component.mjs';
|
|
11
11
|
export * as 'embed-extensions-component' from './embed-extensions-component.mjs';
|
|
12
|
+
export * as 'file-explorer-root-menu-component' from './file-explorer-root-menu-component.mjs';
|
|
12
13
|
export * as 'generate-markdown-link-default-params-component' from './generate-markdown-link-default-params-component.mjs';
|
|
13
14
|
export * as 'layout-ready-component' from './layout-ready-component.mjs';
|
|
14
15
|
export * as 'menu-event-registrar-component' from './menu-event-registrar-component.mjs';
|
|
@@ -13,6 +13,7 @@ import * as console_debug_component from "./console-debug-component.mjs";
|
|
|
13
13
|
import * as core_plugin_toggle_component from "./core-plugin-toggle-component.mjs";
|
|
14
14
|
import * as disposable_component from "./disposable-component.mjs";
|
|
15
15
|
import * as embed_extensions_component from "./embed-extensions-component.mjs";
|
|
16
|
+
import * as file_explorer_root_menu_component from "./file-explorer-root-menu-component.mjs";
|
|
16
17
|
import * as generate_markdown_link_default_params_component from "./generate-markdown-link-default-params-component.mjs";
|
|
17
18
|
import * as layout_ready_component from "./layout-ready-component.mjs";
|
|
18
19
|
import * as menu_event_registrar_component from "./menu-event-registrar-component.mjs";
|
|
@@ -43,6 +44,7 @@ export {
|
|
|
43
44
|
core_plugin_toggle_component as "core-plugin-toggle-component",
|
|
44
45
|
disposable_component as "disposable-component",
|
|
45
46
|
embed_extensions_component as "embed-extensions-component",
|
|
47
|
+
file_explorer_root_menu_component as "file-explorer-root-menu-component",
|
|
46
48
|
generate_markdown_link_default_params_component as "generate-markdown-link-default-params-component",
|
|
47
49
|
layout_ready_component as "layout-ready-component",
|
|
48
50
|
menu_event_registrar_component as "menu-event-registrar-component",
|
|
@@ -63,4 +65,4 @@ export {
|
|
|
63
65
|
syntax_highlighting_component as "syntax-highlighting-component",
|
|
64
66
|
templates_language_component as "templates-language-component"
|
|
65
67
|
};
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50JyBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvbXBvbmVudC1leCcgZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NvbnNvbGUtZGVidWctY29tcG9uZW50JyBmcm9tICcuL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjb3JlLXBsdWdpbi10b2dnbGUtY29tcG9uZW50JyBmcm9tICcuL2NvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2Rpc3Bvc2FibGUtY29tcG9uZW50JyBmcm9tICcuL2Rpc3Bvc2FibGUtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdlbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudCcgZnJvbSAnLi9lbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50JyBmcm9tICcuL2ZpbGUtZXhwbG9yZXItcm9vdC1tZW51LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQnIGZyb20gJy4vZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2xheW91dC1yZWFkeS1jb21wb25lbnQnIGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50JyBmcm9tICcuL21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbW9ua2V5LWFyb3VuZC1jb21wb25lbnQnIGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ25vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQnIGZyb20gJy4vbm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWNvbnRleHQtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWdhdGUtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLW5vdGljZS1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50JyBmcm9tICcuL3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWdpc3RyeS1jb21wb25lbnQnIGZyb20gJy4vcmVnaXN0cnktY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWxlYXNlLW5vdGVzLWNvbXBvbmVudCcgZnJvbSAnLi9yZWxlYXNlLW5vdGVzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9yZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdybWRpci1ndWFyZC1jb21wb25lbnQnIGZyb20gJy4vcm1kaXItZ3VhcmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdzZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50JyBmcm9tICcuL3NldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50JyBmcm9tICcuL3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICd0ZW1wbGF0ZXMtbGFuZ3VhZ2UtY29tcG9uZW50JyBmcm9tICcuL3RlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSw0QkFBOEI7QUFDMUMsWUFBWUMsaUNBQW1DO0FBQy9DLFlBQVlDLG1DQUFxQztBQUNqRCxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsMkNBQTZDO0FBQ3pELFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyw2QkFBK0I7QUFDM0MsWUFBWUMsa0NBQW9DO0FBQ2hELFlBQVlDLDBCQUE0QjtBQUN4QyxZQUFZQyxnQ0FBa0M7QUFDOUMsWUFBWUMsdUNBQXlDO0FBQ3JELFlBQVlDLHFEQUF1RDtBQUNuRSxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsb0NBQXNDO0FBQ2xELFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQyx1REFBeUQ7QUFDckUsWUFBWUMsOEJBQWdDO0FBQzVDLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZQyw2QkFBK0I7QUFDM0MsWUFBWUMsK0JBQWlDO0FBQzdDLFlBQVlDLG1DQUFxQztBQUNqRCxZQUFZQyxpQ0FBbUM7QUFDL0MsWUFBWUMsZ0NBQWtDO0FBQzlDLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZQyw2QkFBK0I7QUFDM0MsWUFBWUMscUNBQXVDO0FBQ25ELFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZQyxrQ0FBb0M7QUFDaEQsWUFBWUMsbUNBQXFDO0FBQ2pELFlBQVlDLGtDQUFvQzsiLAogICJuYW1lcyI6IFsiYWJvcnQtc2lnbmFsLWNvbXBvbmVudCIsICJhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQiLCAiYXN5bmMtZXJyb3ItaGFuZGxlci1jb21wb25lbnQiLCAiYXN5bmMtZXZlbnRzLWNvbXBvbmVudCIsICJjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50IiwgImNvbXBvbmVudC1leCIsICJjb25zb2xlLWRlYnVnLWNvbXBvbmVudCIsICJjb3JlLXBsdWdpbi10b2dnbGUtY29tcG9uZW50IiwgImRpc3Bvc2FibGUtY29tcG9uZW50IiwgImVtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50IiwgImZpbGUtZXhwbG9yZXItcm9vdC1tZW51LWNvbXBvbmVudCIsICJnZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudCIsICJsYXlvdXQtcmVhZHktY29tcG9uZW50IiwgIm1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCIsICJtb25rZXktYXJvdW5kLWNvbXBvbmVudCIsICJub3RlYm9vay1uYXZpZ2F0b3ItbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50IiwgInBsdWdpbi1jb250ZXh0LWNvbXBvbmVudCIsICJwbHVnaW4tZ2F0ZS1jb21wb25lbnQiLCAicGx1Z2luLW5vdGljZS1jb21wb25lbnQiLCAicGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudCIsICJwbHVnaW4tc2V0dGluZ3MtdGFiLWNvbXBvbmVudCIsICJwbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQiLCAicG9pbnRlci1wb3NpdGlvbi1jb21wb25lbnQiLCAicmVnaXN0cnktY29tcG9uZW50IiwgInJlbGVhc2Utbm90ZXMtY29tcG9uZW50IiwgInJlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQiLCAicm1kaXItZ3VhcmQtY29tcG9uZW50IiwgInNldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQiLCAic3ludGF4LWhpZ2hsaWdodGluZy1jb21wb25lbnQiLCAidGVtcGxhdGVzLWxhbmd1YWdlLWNvbXBvbmVudCJdCn0K
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Merge-safe registers and observed-remove sets used by shared data stores.
|
|
6
|
+
*/
|
|
7
|
+
import type { JsonValue } from 'type-fest';
|
|
8
|
+
/**
|
|
9
|
+
* A store fixes its merge rule for its entire lifetime and schema version.
|
|
10
|
+
*/
|
|
11
|
+
export type DataStoreMergeKind = 'last-write-wins' | 'maximum' | 'minimum' | 'observed-remove-set';
|
|
12
|
+
/**
|
|
13
|
+
* A version-one journal operation. These fields form a published wire format.
|
|
14
|
+
*/
|
|
15
|
+
export interface DataStoreOperation {
|
|
16
|
+
/**
|
|
17
|
+
* Logical counter within the wall-clock millisecond.
|
|
18
|
+
*/
|
|
19
|
+
readonly counter: number;
|
|
20
|
+
/**
|
|
21
|
+
* Whether this is a removal.
|
|
22
|
+
*/
|
|
23
|
+
readonly deleted: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Unique writer incarnation, stored locally rather than in plugin settings.
|
|
26
|
+
*/
|
|
27
|
+
readonly device: string;
|
|
28
|
+
/**
|
|
29
|
+
* Record key, or set member.
|
|
30
|
+
*/
|
|
31
|
+
readonly key: string;
|
|
32
|
+
/**
|
|
33
|
+
* Strictly increasing writer sequence, starting at one.
|
|
34
|
+
*/
|
|
35
|
+
readonly sequence: number;
|
|
36
|
+
/**
|
|
37
|
+
* Observed addition tags removed by a set operation.
|
|
38
|
+
*/
|
|
39
|
+
readonly tags?: readonly string[];
|
|
40
|
+
/**
|
|
41
|
+
* Hybrid logical clock wall time.
|
|
42
|
+
*/
|
|
43
|
+
readonly time: number;
|
|
44
|
+
/**
|
|
45
|
+
* JSON-compatible value; set members use `true`.
|
|
46
|
+
*/
|
|
47
|
+
readonly value: unknown;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* In-memory CRDT state. Exported operations can be joined in any order, repeatedly.
|
|
51
|
+
*/
|
|
52
|
+
export declare class DataStoreReplica {
|
|
53
|
+
protected readonly kind: DataStoreMergeKind;
|
|
54
|
+
private readonly additions;
|
|
55
|
+
private readonly registers;
|
|
56
|
+
private readonly removals;
|
|
57
|
+
/**
|
|
58
|
+
* Creates an empty replica.
|
|
59
|
+
*
|
|
60
|
+
* @param kind - Immutable merge rule for the store.
|
|
61
|
+
*/
|
|
62
|
+
constructor(kind: DataStoreMergeKind);
|
|
63
|
+
/**
|
|
64
|
+
* Validates and joins one journal or snapshot operation.
|
|
65
|
+
*
|
|
66
|
+
* @param value - Untrusted parsed operation.
|
|
67
|
+
*/
|
|
68
|
+
apply(value: unknown): void;
|
|
69
|
+
/**
|
|
70
|
+
* Reads visible records, detached from internal state.
|
|
71
|
+
*
|
|
72
|
+
* @returns Pairs in deterministic key order.
|
|
73
|
+
*/
|
|
74
|
+
entries(): [string, unknown][];
|
|
75
|
+
/**
|
|
76
|
+
* Exports mergeable state, retaining tombstones for late or retired replicas.
|
|
77
|
+
*
|
|
78
|
+
* @returns Deterministically ordered operations sufficient to reconstruct this state.
|
|
79
|
+
*/
|
|
80
|
+
export(): DataStoreOperation[];
|
|
81
|
+
/**
|
|
82
|
+
* Reads a register or set membership without enumerating register keys.
|
|
83
|
+
*
|
|
84
|
+
* @param key - Record key or set member.
|
|
85
|
+
* @returns A detached value, or `undefined` when absent or deleted.
|
|
86
|
+
*/
|
|
87
|
+
get(key: string): unknown;
|
|
88
|
+
/**
|
|
89
|
+
* Finds additions observed for a set member, for an observed removal.
|
|
90
|
+
*
|
|
91
|
+
* @param key - Set member.
|
|
92
|
+
* @returns Addition identities. Concurrent unseen additions survive removal.
|
|
93
|
+
*/
|
|
94
|
+
observedTags(key: string): string[];
|
|
95
|
+
private activeAdditions;
|
|
96
|
+
private applySet;
|
|
97
|
+
private wins;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Checks that a value survives JSON transport without changing its meaning.
|
|
101
|
+
*
|
|
102
|
+
* @param value - Candidate data-store value.
|
|
103
|
+
* @returns Whether it is finite, acyclic JSON data.
|
|
104
|
+
*/
|
|
105
|
+
export declare function isDataStoreJsonValue(value: unknown): value is JsonValue;
|
|
106
|
+
/**
|
|
107
|
+
* Checks the version-one operation wire shape.
|
|
108
|
+
*
|
|
109
|
+
* @param value - Parsed JSON.
|
|
110
|
+
* @returns Whether the operation has valid identity and clock fields.
|
|
111
|
+
*/
|
|
112
|
+
export declare function isDataStoreOperation(value: unknown): value is DataStoreOperation;
|