@mnaoumov/obsidian-lib 6.2.1 → 6.3.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/dist/lib/cjs/__merged.cjs +8 -1
- package/dist/lib/cjs/__merged.d.cts +1 -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/generated-during-build.cjs +1 -1
- package/dist/lib/esm/__merged.d.mts +1 -0
- package/dist/lib/esm/__merged.mjs +9 -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/generated-during-build.mjs +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,343 @@
|
|
|
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
|
+
(function patchObsidianRequire() {
|
|
33
|
+
const originalRequire = require;
|
|
34
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
require = Object.assign(
|
|
38
|
+
(id) => requirePatched(id),
|
|
39
|
+
originalRequire,
|
|
40
|
+
{
|
|
41
|
+
__isPatched: true
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
function extractDefault(module) {
|
|
45
|
+
return module && module.__esModule && "default" in module ? module.default : module;
|
|
46
|
+
}
|
|
47
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
48
|
+
"@codemirror/autocomplete",
|
|
49
|
+
"@codemirror/collab",
|
|
50
|
+
"@codemirror/commands",
|
|
51
|
+
"@codemirror/language",
|
|
52
|
+
"@codemirror/lint",
|
|
53
|
+
"@codemirror/search",
|
|
54
|
+
"@codemirror/state",
|
|
55
|
+
"@codemirror/text",
|
|
56
|
+
"@codemirror/view",
|
|
57
|
+
"@lezer/common",
|
|
58
|
+
"@lezer/highlight",
|
|
59
|
+
"@lezer/lr",
|
|
60
|
+
"obsidian"
|
|
61
|
+
]);
|
|
62
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
63
|
+
"@codemirror/closebrackets",
|
|
64
|
+
"@codemirror/comment",
|
|
65
|
+
"@codemirror/fold",
|
|
66
|
+
"@codemirror/gutter",
|
|
67
|
+
"@codemirror/highlight",
|
|
68
|
+
"@codemirror/history",
|
|
69
|
+
"@codemirror/matchbrackets",
|
|
70
|
+
"@codemirror/panel",
|
|
71
|
+
"@codemirror/rangeset",
|
|
72
|
+
"@codemirror/rectangular-selection",
|
|
73
|
+
"@codemirror/stream-parser",
|
|
74
|
+
"@codemirror/tooltip"
|
|
75
|
+
]);
|
|
76
|
+
function requirePatched(id) {
|
|
77
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
78
|
+
return originalRequire?.(id);
|
|
79
|
+
}
|
|
80
|
+
const app = globalThis.app;
|
|
81
|
+
if (app?.isMobile) {
|
|
82
|
+
if (id === "process" || id === "node:process") {
|
|
83
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
84
|
+
return process;
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
const module = originalRequire?.(id);
|
|
88
|
+
if (module) {
|
|
89
|
+
return extractDefault(module);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
})();
|
|
96
|
+
|
|
97
|
+
"use strict";
|
|
98
|
+
var __defProp = Object.defineProperty;
|
|
99
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
100
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
101
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
102
|
+
var __export = (target, all) => {
|
|
103
|
+
for (var name in all)
|
|
104
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
105
|
+
};
|
|
106
|
+
var __copyProps = (to, from, except, desc) => {
|
|
107
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
108
|
+
for (let key of __getOwnPropNames(from))
|
|
109
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
110
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
111
|
+
}
|
|
112
|
+
return to;
|
|
113
|
+
};
|
|
114
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
115
|
+
var file_explorer_root_menu_component_exports = {};
|
|
116
|
+
__export(file_explorer_root_menu_component_exports, {
|
|
117
|
+
FileExplorerRootMenuComponent: () => FileExplorerRootMenuComponent,
|
|
118
|
+
FileExplorerRootMenuSpot: () => FileExplorerRootMenuSpot,
|
|
119
|
+
VAULT_NAME_SELECTORS: () => VAULT_NAME_SELECTORS
|
|
120
|
+
});
|
|
121
|
+
module.exports = __toCommonJS(file_explorer_root_menu_component_exports);
|
|
122
|
+
var import_async = require('@mnaoumov/typescript-lib/async');
|
|
123
|
+
var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
|
|
124
|
+
var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
|
|
125
|
+
var import_obsidian = require('obsidian');
|
|
126
|
+
var import_obsidian_lib_state = require('../obsidian-lib-state.cjs');
|
|
127
|
+
var import_component_ex = require('./component-ex.cjs');
|
|
128
|
+
var import_monkey_around_component = require('./monkey-around-component.cjs');
|
|
129
|
+
const VAULT_NAME_SELECTORS = [
|
|
130
|
+
".workspace-drawer-vault-switcher",
|
|
131
|
+
".workspace-drawer-header-name"
|
|
132
|
+
];
|
|
133
|
+
const FILE_EXPLORER_MENU_SOURCE = "file-explorer-context-menu";
|
|
134
|
+
const ROOT_UNSAFE_ITEM_TITLE_KEYS = [
|
|
135
|
+
"plugins.file-explorer.action-move-folder",
|
|
136
|
+
"plugins.file-explorer.menu-opt-delete",
|
|
137
|
+
"plugins.file-explorer.menu-opt-make-copy",
|
|
138
|
+
"plugins.file-explorer.menu-opt-rename",
|
|
139
|
+
"plugins.search.menu-opt-search-in-folder"
|
|
140
|
+
];
|
|
141
|
+
const SHARED_STATE_KEY = "fileExplorerRootMenuByAppV1";
|
|
142
|
+
var FileExplorerRootMenuSpot = /* @__PURE__ */ ((FileExplorerRootMenuSpot2) => {
|
|
143
|
+
FileExplorerRootMenuSpot2["EmptyArea"] = "empty-area";
|
|
144
|
+
FileExplorerRootMenuSpot2["VaultName"] = "vault-name";
|
|
145
|
+
return FileExplorerRootMenuSpot2;
|
|
146
|
+
})(FileExplorerRootMenuSpot || {});
|
|
147
|
+
class FileExplorerRootMenuComponent extends import_component_ex.ComponentEx {
|
|
148
|
+
/**
|
|
149
|
+
* The Obsidian app instance.
|
|
150
|
+
*/
|
|
151
|
+
app;
|
|
152
|
+
/**
|
|
153
|
+
* Called each time the vault-root menu is about to be shown.
|
|
154
|
+
*/
|
|
155
|
+
handler;
|
|
156
|
+
/**
|
|
157
|
+
* Whether the root is presented as an ordinary folder while its menu is built.
|
|
158
|
+
*/
|
|
159
|
+
shouldPresentRootAsFolder;
|
|
160
|
+
/**
|
|
161
|
+
* Creates a new file explorer root menu component.
|
|
162
|
+
*
|
|
163
|
+
* @param params - The parameters.
|
|
164
|
+
*/
|
|
165
|
+
constructor(params) {
|
|
166
|
+
super();
|
|
167
|
+
this.app = params.app;
|
|
168
|
+
this.handler = params.handler;
|
|
169
|
+
this.shouldPresentRootAsFolder = params.shouldPresentRootAsFolder ?? false;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Subscribes to the shared installation, installing it when nobody has yet.
|
|
173
|
+
*/
|
|
174
|
+
onload() {
|
|
175
|
+
super.onload();
|
|
176
|
+
const state = getSharedState(this.app);
|
|
177
|
+
const subscription = {
|
|
178
|
+
handler: this.handler,
|
|
179
|
+
install: () => installRootMenu(this.app, state),
|
|
180
|
+
shouldPresentRootAsFolder: this.shouldPresentRootAsFolder
|
|
181
|
+
};
|
|
182
|
+
state.subscriptions.push(subscription);
|
|
183
|
+
state.installation ??= { owner: subscription, uninstall: subscription.install() };
|
|
184
|
+
this.register(() => {
|
|
185
|
+
state.subscriptions.splice(state.subscriptions.indexOf(subscription), 1);
|
|
186
|
+
if (state.installation?.owner !== subscription) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
state.installation.uninstall();
|
|
190
|
+
const nextOwner = state.subscriptions[0];
|
|
191
|
+
state.installation = nextOwner ? { owner: nextOwner, uninstall: nextOwner.install() } : null;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function dispatch(state, params) {
|
|
196
|
+
if (state.subscriptions.some((subscription) => subscription.shouldPresentRootAsFolder)) {
|
|
197
|
+
removeRootUnsafeItems(params.menu);
|
|
198
|
+
}
|
|
199
|
+
for (const subscription of [...state.subscriptions]) {
|
|
200
|
+
try {
|
|
201
|
+
subscription.handler(params);
|
|
202
|
+
} catch (error) {
|
|
203
|
+
console.error("A file explorer root menu handler failed", error);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function dispatchBeforeShow(state, params) {
|
|
208
|
+
const uninstallShowPatch = (0, import_monkey_around_component.around)(params.menu, {
|
|
209
|
+
showAtMouseEvent: (next) => function patchedShowAtMouseEvent(showMouseEvent) {
|
|
210
|
+
uninstallShowPatch();
|
|
211
|
+
dispatch(state, params);
|
|
212
|
+
return params.menu.items.length === 0 ? this : next.call(this, showMouseEvent);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function getFileExplorerLeaf(app) {
|
|
217
|
+
return app.workspace.getLeavesOfType(import_implementations.ViewType.FileExplorer)[0] ?? null;
|
|
218
|
+
}
|
|
219
|
+
function getSharedState(app) {
|
|
220
|
+
const statesByApp = (0, import_obsidian_lib_state.getObsidianLibState)(SHARED_STATE_KEY, /* @__PURE__ */ new WeakMap()).value;
|
|
221
|
+
let state = statesByApp.get(app);
|
|
222
|
+
if (!state) {
|
|
223
|
+
state = { installation: null, subscriptions: [] };
|
|
224
|
+
statesByApp.set(app, state);
|
|
225
|
+
}
|
|
226
|
+
return state;
|
|
227
|
+
}
|
|
228
|
+
function installRootMenu(app, state) {
|
|
229
|
+
let isUninstalled = false;
|
|
230
|
+
let pendingSpot = null;
|
|
231
|
+
let uninstallPatch = null;
|
|
232
|
+
function tryPatch() {
|
|
233
|
+
if (isUninstalled || uninstallPatch) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const view = getFileExplorerLeaf(app)?.view;
|
|
237
|
+
if (!isFileExplorerView(view)) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
uninstallPatch = (0, import_monkey_around_component.around)((0, import_object_utils.getPrototypeOf)(view), {
|
|
241
|
+
onFileContextMenu: (next) => function patchedOnFileContextMenu(mouseEvent, file) {
|
|
242
|
+
if (!(file instanceof import_obsidian.TFolder) || !file.isRoot()) {
|
|
243
|
+
next.call(this, mouseEvent, file);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
openRootMenu({
|
|
247
|
+
mouseEvent,
|
|
248
|
+
openNative: () => {
|
|
249
|
+
next.call(this, mouseEvent, file);
|
|
250
|
+
},
|
|
251
|
+
rootFolder: file,
|
|
252
|
+
spot: pendingSpot ?? "empty-area" /* EmptyArea */
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
function openRootMenu(params) {
|
|
258
|
+
const { mouseEvent, openNative, rootFolder, spot } = params;
|
|
259
|
+
const eventRef = app.workspace.on("file-menu", (menu, file, source) => {
|
|
260
|
+
if (file !== rootFolder || source !== FILE_EXPLORER_MENU_SOURCE) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
app.workspace.offref(eventRef);
|
|
264
|
+
dispatchBeforeShow(state, { menu, mouseEvent, rootFolder, spot });
|
|
265
|
+
});
|
|
266
|
+
const restoreIsRoot = state.subscriptions.some((subscription) => subscription.shouldPresentRootAsFolder) ? presentAsFolder(rootFolder) : null;
|
|
267
|
+
try {
|
|
268
|
+
openNative();
|
|
269
|
+
} finally {
|
|
270
|
+
restoreIsRoot?.();
|
|
271
|
+
app.workspace.offref(eventRef);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function openFromVaultName(mouseEvent) {
|
|
275
|
+
const isOnVaultName = mouseEvent.composedPath().some((target) => target instanceof HTMLElement && VAULT_NAME_SELECTORS.some((selector) => target.matches(selector)));
|
|
276
|
+
if (!isOnVaultName) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const vaultMenu = import_obsidian.Menu.forEvent(mouseEvent);
|
|
280
|
+
const rootFolder = app.vault.getRoot();
|
|
281
|
+
const leaf = getFileExplorerLeaf(app);
|
|
282
|
+
if (!leaf || state.subscriptions.every((subscription) => !subscription.shouldPresentRootAsFolder)) {
|
|
283
|
+
dispatchBeforeShow(state, { menu: vaultMenu, mouseEvent, rootFolder, spot: "vault-name" /* VaultName */ });
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
function suppressVaultMenuShow() {
|
|
287
|
+
uninstallVaultMenuShowPatch();
|
|
288
|
+
return vaultMenu;
|
|
289
|
+
}
|
|
290
|
+
const uninstallVaultMenuShowPatch = (0, import_monkey_around_component.around)(vaultMenu, { showAtMouseEvent: () => suppressVaultMenuShow });
|
|
291
|
+
(0, import_async.invokeAsyncSafely)(async () => {
|
|
292
|
+
await leaf.loadIfDeferred();
|
|
293
|
+
const view = leaf.view;
|
|
294
|
+
if (isUninstalled || !isFileExplorerView(view)) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
tryPatch();
|
|
298
|
+
view.tree.clearSelectedDoms();
|
|
299
|
+
pendingSpot = "vault-name" /* VaultName */;
|
|
300
|
+
try {
|
|
301
|
+
view.onFileContextMenu(mouseEvent, rootFolder);
|
|
302
|
+
} finally {
|
|
303
|
+
pendingSpot = null;
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
tryPatch();
|
|
308
|
+
const layoutChangeEventRef = app.workspace.on("layout-change", tryPatch);
|
|
309
|
+
app.workspace.onLayoutReady(tryPatch);
|
|
310
|
+
const doc = app.workspace.containerEl.doc;
|
|
311
|
+
doc.addEventListener("contextmenu", openFromVaultName, { capture: true });
|
|
312
|
+
return () => {
|
|
313
|
+
isUninstalled = true;
|
|
314
|
+
uninstallPatch?.();
|
|
315
|
+
app.workspace.offref(layoutChangeEventRef);
|
|
316
|
+
doc.removeEventListener("contextmenu", openFromVaultName, { capture: true });
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function isFileExplorerView(view) {
|
|
320
|
+
return typeof view?.onFileContextMenu === "function";
|
|
321
|
+
}
|
|
322
|
+
function presentAsFolder(rootFolder) {
|
|
323
|
+
const ownIsRootDescriptor = Object.getOwnPropertyDescriptor(rootFolder, "isRoot");
|
|
324
|
+
rootFolder.isRoot = () => false;
|
|
325
|
+
return () => {
|
|
326
|
+
if (ownIsRootDescriptor) {
|
|
327
|
+
Object.defineProperty(rootFolder, "isRoot", ownIsRootDescriptor);
|
|
328
|
+
} else {
|
|
329
|
+
delete rootFolder.isRoot;
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function removeRootUnsafeItems(menu) {
|
|
334
|
+
const unsafeTitles = new Set(ROOT_UNSAFE_ITEM_TITLE_KEYS.map((key) => activeWindow.i18next.t(key)));
|
|
335
|
+
menu.items = menu.items.filter((item) => !(item instanceof import_obsidian.MenuItem) || !unsafeTitles.has(item.titleEl.textContent));
|
|
336
|
+
}
|
|
337
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
338
|
+
0 && (module.exports = {
|
|
339
|
+
FileExplorerRootMenuComponent,
|
|
340
|
+
FileExplorerRootMenuSpot,
|
|
341
|
+
VAULT_NAME_SELECTORS
|
|
342
|
+
});
|
|
343
|
+
//# 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+KFJPT1RfVU5TQUZFX0lURU1fVElUTEVfS0VZUy5tYXAoKGtleSkgPT4gYWN0aXZlV2luZG93LmkxOG5leHQudChrZXkpKSk7XG4gIG1lbnUuaXRlbXMgPSBtZW51Lml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gIShpdGVtIGluc3RhbmNlb2YgTWVudUl0ZW0pIHx8ICF1bnNhZmVUaXRsZXMuaGFzKGl0ZW0udGl0bGVFbC50ZXh0Q29udGVudCkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTZCQSxtQkFBa0M7QUFDbEMsMEJBQStCO0FBQy9CLDZCQUF5QjtBQUN6QixzQkFJTztBQUVQLGdDQUFvQztBQUNwQywwQkFB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
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
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' with { 'resolution-mode': 'import' };
|
|
25
|
+
import { Menu, TFolder } from 'obsidian';
|
|
26
|
+
import { ComponentEx } from './component-ex.cjs';
|
|
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
|
+
}
|
|
@@ -107,6 +107,7 @@ __export(components_exports, {
|
|
|
107
107
|
"core-plugin-toggle-component": () => core_plugin_toggle_component,
|
|
108
108
|
"disposable-component": () => disposable_component,
|
|
109
109
|
"embed-extensions-component": () => embed_extensions_component,
|
|
110
|
+
"file-explorer-root-menu-component": () => file_explorer_root_menu_component,
|
|
110
111
|
"generate-markdown-link-default-params-component": () => generate_markdown_link_default_params_component,
|
|
111
112
|
"layout-ready-component": () => layout_ready_component,
|
|
112
113
|
"menu-event-registrar-component": () => menu_event_registrar_component,
|
|
@@ -138,6 +139,7 @@ var console_debug_component = __toESM(((module) => module && module.__esModule &
|
|
|
138
139
|
var core_plugin_toggle_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./core-plugin-toggle-component.cjs')), 1);
|
|
139
140
|
var disposable_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./disposable-component.cjs')), 1);
|
|
140
141
|
var embed_extensions_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./embed-extensions-component.cjs')), 1);
|
|
142
|
+
var file_explorer_root_menu_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./file-explorer-root-menu-component.cjs')), 1);
|
|
141
143
|
var generate_markdown_link_default_params_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./generate-markdown-link-default-params-component.cjs')), 1);
|
|
142
144
|
var layout_ready_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./layout-ready-component.cjs')), 1);
|
|
143
145
|
var menu_event_registrar_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./menu-event-registrar-component.cjs')), 1);
|
|
@@ -169,6 +171,7 @@ var templates_language_component = __toESM(((module) => module && module.__esMod
|
|
|
169
171
|
"core-plugin-toggle-component": null,
|
|
170
172
|
"disposable-component": null,
|
|
171
173
|
"embed-extensions-component": null,
|
|
174
|
+
"file-explorer-root-menu-component": null,
|
|
172
175
|
"generate-markdown-link-default-params-component": null,
|
|
173
176
|
"layout-ready-component": null,
|
|
174
177
|
"menu-event-registrar-component": null,
|
|
@@ -189,4 +192,4 @@ var templates_language_component = __toESM(((module) => module && module.__esMod
|
|
|
189
192
|
"syntax-highlighting-component": null,
|
|
190
193
|
"templates-language-component": null
|
|
191
194
|
});
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50JyBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvbXBvbmVudC1leCcgZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NvbnNvbGUtZGVidWctY29tcG9uZW50JyBmcm9tICcuL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdjb3JlLXBsdWdpbi10b2dnbGUtY29tcG9uZW50JyBmcm9tICcuL2NvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2Rpc3Bvc2FibGUtY29tcG9uZW50JyBmcm9tICcuL2Rpc3Bvc2FibGUtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdlbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudCcgZnJvbSAnLi9lbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50JyBmcm9tICcuL2ZpbGUtZXhwbG9yZXItcm9vdC1tZW51LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQnIGZyb20gJy4vZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2xheW91dC1yZWFkeS1jb21wb25lbnQnIGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50JyBmcm9tICcuL21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbW9ua2V5LWFyb3VuZC1jb21wb25lbnQnIGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ25vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQnIGZyb20gJy4vbm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWNvbnRleHQtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWdhdGUtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLW5vdGljZS1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50JyBmcm9tICcuL3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWdpc3RyeS1jb21wb25lbnQnIGZyb20gJy4vcmVnaXN0cnktY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWxlYXNlLW5vdGVzLWNvbXBvbmVudCcgZnJvbSAnLi9yZWxlYXNlLW5vdGVzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9yZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdybWRpci1ndWFyZC1jb21wb25lbnQnIGZyb20gJy4vcm1kaXItZ3VhcmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdzZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50JyBmcm9tICcuL3NldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50JyBmcm9tICcuL3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICd0ZW1wbGF0ZXMtbGFuZ3VhZ2UtY29tcG9uZW50JyBmcm9tICcuL3RlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQudHMnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLGtDQUFBQTtBQUFBLEVBQUEscUNBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEsK0NBQUFDO0FBQUEsRUFBQSxzQkFBQUM7QUFBQSxFQUFBLGlDQUFBQztBQUFBLEVBQUEsc0NBQUFDO0FBQUEsRUFBQSw4QkFBQUM7QUFBQSxFQUFBLG9DQUFBQztBQUFBLEVBQUEsMkNBQUFDO0FBQUEsRUFBQSx5REFBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEsd0NBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLDJEQUFBQztBQUFBLEVBQUEsa0NBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBLGlDQUFBQztBQUFBLEVBQUEsbUNBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLHFDQUFBQztBQUFBLEVBQUEsb0NBQUFDO0FBQUEsRUFBQSw0QkFBQUM7QUFBQSxFQUFBLGlDQUFBQztBQUFBLEVBQUEseUNBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBLHNDQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSxzQ0FBQUM7QUFBQTtBQUFBO0FBRUEsSUFBQTdCLHlCQUEwQztBQUMxQyxJQUFBQyw4QkFBK0M7QUFDL0MsSUFBQUMsZ0NBQWlEO0FBQ2pELElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyx3Q0FBeUQ7QUFDekQsSUFBQUMsZUFBZ0M7QUFDaEMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLCtCQUFnRDtBQUNoRCxJQUFBQyx1QkFBd0M7QUFDeEMsSUFBQUMsNkJBQThDO0FBQzlDLElBQUFDLG9DQUFxRDtBQUNyRCxJQUFBQyxrREFBbUU7QUFDbkUsSUFBQUMseUJBQTBDO0FBQzFDLElBQUFDLGlDQUFrRDtBQUNsRCxJQUFBQywwQkFBMkM7QUFDM0MsSUFBQUMsb0RBQXFFO0FBQ3JFLElBQUFDLDJCQUE0QztBQUM1QyxJQUFBQyx3QkFBeUM7QUFDekMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLDRCQUE2QztBQUM3QyxJQUFBQyxnQ0FBaUQ7QUFDakQsSUFBQUMsOEJBQStDO0FBQy9DLElBQUFDLDZCQUE4QztBQUM5QyxJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLGtDQUFtRDtBQUNuRCxJQUFBQyx3QkFBeUM7QUFDekMsSUFBQUMsK0JBQWdEO0FBQ2hELElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQywrQkFBZ0Q7IiwibmFtZXMiOlsiYWJvcnQtc2lnbmFsLWNvbXBvbmVudCIsImFsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudCIsImFzeW5jLWVycm9yLWhhbmRsZXItY29tcG9uZW50IiwiYXN5bmMtZXZlbnRzLWNvbXBvbmVudCIsImNhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQiLCJjb21wb25lbnQtZXgiLCJjb25zb2xlLWRlYnVnLWNvbXBvbmVudCIsImNvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQiLCJkaXNwb3NhYmxlLWNvbXBvbmVudCIsImVtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50IiwiZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50IiwiZ2VuZXJhdGUtbWFya2Rvd24tbGluay1kZWZhdWx0LXBhcmFtcy1jb21wb25lbnQiLCJsYXlvdXQtcmVhZHktY29tcG9uZW50IiwibWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50IiwibW9ua2V5LWFyb3VuZC1jb21wb25lbnQiLCJub3RlYm9vay1uYXZpZ2F0b3ItbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50IiwicGx1Z2luLWNvbnRleHQtY29tcG9uZW50IiwicGx1Z2luLWdhdGUtY29tcG9uZW50IiwicGx1Z2luLW5vdGljZS1jb21wb25lbnQiLCJwbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50IiwicGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQiLCJwbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQiLCJwb2ludGVyLXBvc2l0aW9uLWNvbXBvbmVudCIsInJlZ2lzdHJ5LWNvbXBvbmVudCIsInJlbGVhc2Utbm90ZXMtY29tcG9uZW50IiwicmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCIsInJtZGlyLWd1YXJkLWNvbXBvbmVudCIsInNldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQiLCJzeW50YXgtaGlnaGxpZ2h0aW5nLWNvbXBvbmVudCIsInRlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQiXX0=
|
|
@@ -9,6 +9,7 @@ export * as 'console-debug-component' from './console-debug-component.cjs';
|
|
|
9
9
|
export * as 'core-plugin-toggle-component' from './core-plugin-toggle-component.cjs';
|
|
10
10
|
export * as 'disposable-component' from './disposable-component.cjs';
|
|
11
11
|
export * as 'embed-extensions-component' from './embed-extensions-component.cjs';
|
|
12
|
+
export * as 'file-explorer-root-menu-component' from './file-explorer-root-menu-component.cjs';
|
|
12
13
|
export * as 'generate-markdown-link-default-params-component' from './generate-markdown-link-default-params-component.cjs';
|
|
13
14
|
export * as 'layout-ready-component' from './layout-ready-component.cjs';
|
|
14
15
|
export * as 'menu-event-registrar-component' from './menu-event-registrar-component.cjs';
|