@mnaoumov/obsidian-lib 10.10.0 → 10.12.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/README.md +26 -0
- package/components/all-windows-status-bar-item-component/package.json +6 -0
- package/components/shared-component-pool-component/package.json +6 -0
- package/components/workspace-layout-state-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +90 -1
- package/dist/lib/cjs/__merged.d.cts +13 -4
- package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
- package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
- package/dist/lib/cjs/bug-report.cjs +36 -10
- package/dist/lib/cjs/bug-report.d.cts +65 -0
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +93 -2
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
- package/dist/lib/cjs/components/embed-extensions-component.cjs +20 -3
- package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +16 -2
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
- package/dist/lib/cjs/components/index.cjs +12 -3
- package/dist/lib/cjs/components/index.d.cts +3 -0
- package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -9
- package/dist/lib/cjs/components/plugin-settings-component.cjs +7 -2
- package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
- package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
- package/dist/lib/cjs/css-class.cjs +5 -1
- package/dist/lib/cjs/css-class.d.cts +16 -0
- package/dist/lib/cjs/data-handler.cjs +156 -5
- package/dist/lib/cjs/data-handler.d.cts +128 -2
- package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
- package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/git-rename-history.cjs +1 -1
- package/dist/lib/cjs/git-rename-history.d.cts +2 -2
- package/dist/lib/cjs/i18n/locales/en.cjs +29 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +28 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +28 -0
- package/dist/lib/cjs/index.cjs +10 -1
- package/dist/lib/cjs/index.d.cts +3 -0
- package/dist/lib/cjs/link.cjs +40 -1
- package/dist/lib/cjs/link.d.cts +37 -1
- package/dist/lib/cjs/markdown-view.cjs +191 -3
- package/dist/lib/cjs/markdown-view.d.cts +48 -1
- package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
- package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
- package/dist/lib/cjs/modals/index.cjs +7 -1
- package/dist/lib/cjs/modals/index.d.cts +2 -0
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
- package/dist/lib/cjs/plugin/index.cjs +4 -1
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +13 -4
- package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
- package/dist/lib/cjs/plugin/plugin-install-state.cjs +46 -1
- package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
- package/dist/lib/cjs/plugin/plugin-instance.cjs +448 -0
- package/dist/lib/cjs/plugin/plugin-instance.d.cts +251 -0
- package/dist/lib/cjs/plugin/plugin.cjs +16 -1
- package/dist/lib/cjs/plugin/plugin.d.cts +7 -0
- package/dist/lib/cjs/reference-definition.cjs +234 -0
- package/dist/lib/cjs/reference-definition.d.cts +47 -0
- package/dist/lib/cjs/release-asset.cjs +279 -0
- package/dist/lib/cjs/release-asset.d.cts +190 -0
- package/dist/lib/cjs/workspace.cjs +3 -2
- package/dist/lib/cjs/workspace.d.cts +6 -0
- package/dist/lib/esm/__merged.d.mts +13 -4
- package/dist/lib/esm/__merged.mjs +97 -3
- package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
- package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
- package/dist/lib/esm/bug-report.d.mts +65 -0
- package/dist/lib/esm/bug-report.mjs +33 -10
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
- package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
- package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
- package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
- package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
- package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
- package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
- package/dist/lib/esm/components/index.d.mts +3 -0
- package/dist/lib/esm/components/index.mjs +8 -2
- package/dist/lib/esm/components/plugin-gate-component.mjs +5 -13
- package/dist/lib/esm/components/plugin-settings-component.mjs +7 -2
- package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
- package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
- package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
- package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
- package/dist/lib/esm/css-class.d.mts +16 -0
- package/dist/lib/esm/css-class.mjs +5 -1
- package/dist/lib/esm/data-handler.d.mts +128 -2
- package/dist/lib/esm/data-handler.mjs +152 -4
- package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
- package/dist/lib/esm/desktop-git-runner.mjs +3 -3
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/git-rename-history.d.mts +2 -2
- package/dist/lib/esm/git-rename-history.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +28 -0
- package/dist/lib/esm/i18n/locales/en.mjs +29 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +28 -0
- package/dist/lib/esm/index.d.mts +3 -0
- package/dist/lib/esm/index.mjs +7 -1
- package/dist/lib/esm/link.d.mts +37 -1
- package/dist/lib/esm/link.mjs +40 -1
- package/dist/lib/esm/markdown-view.d.mts +48 -1
- package/dist/lib/esm/markdown-view.mjs +192 -2
- package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
- package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
- package/dist/lib/esm/modals/index.d.mts +2 -0
- package/dist/lib/esm/modals/index.mjs +5 -1
- package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
- package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
- package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
- package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
- package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
- package/dist/lib/esm/plugin/plugin-instance.d.mts +251 -0
- package/dist/lib/esm/plugin/plugin-instance.mjs +366 -0
- package/dist/lib/esm/plugin/plugin.d.mts +7 -0
- package/dist/lib/esm/plugin/plugin.mjs +16 -1
- package/dist/lib/esm/reference-definition.d.mts +47 -0
- package/dist/lib/esm/reference-definition.mjs +146 -0
- package/dist/lib/esm/release-asset.d.mts +190 -0
- package/dist/lib/esm/release-asset.mjs +187 -0
- package/dist/lib/esm/workspace.d.mts +6 -0
- package/dist/lib/esm/workspace.mjs +3 -2
- package/dist/styles.css +16 -1
- package/modals/copy-text-manually/package.json +6 -0
- package/modals/review-bug-report-diagnostics/package.json +6 -0
- package/package.json +2 -1
- package/plugin/plugin-instance/package.json +6 -0
|
@@ -0,0 +1,245 @@
|
|
|
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 all_windows_status_bar_item_component_exports = {};
|
|
116
|
+
__export(all_windows_status_bar_item_component_exports, {
|
|
117
|
+
AllWindowsStatusBarItemComponent: () => AllWindowsStatusBarItemComponent,
|
|
118
|
+
WINDOW_STATUS_BAR_CSS_CLASS: () => WINDOW_STATUS_BAR_CSS_CLASS,
|
|
119
|
+
getPluginStatusBarItemCssClass: () => getPluginStatusBarItemCssClass,
|
|
120
|
+
registerAllWindowsStatusBarItem: () => registerAllWindowsStatusBarItem
|
|
121
|
+
});
|
|
122
|
+
module.exports = __toCommonJS(all_windows_status_bar_item_component_exports);
|
|
123
|
+
var import_obsidian = require('obsidian');
|
|
124
|
+
var import_all_windows_event_component = require('./all-windows-event-component.cjs');
|
|
125
|
+
var import_component_ex = require('./component-ex.cjs');
|
|
126
|
+
const WINDOW_STATUS_BAR_CSS_CLASS = "obsidian-lib-window-status-bar";
|
|
127
|
+
const APP_CONTAINER_CSS_CLASS = "app-container";
|
|
128
|
+
const STATUS_BAR_CSS_CLASS = "status-bar";
|
|
129
|
+
const STATUS_BAR_ITEM_CSS_CLASS = "status-bar-item";
|
|
130
|
+
class AllWindowsStatusBarItemComponent extends import_component_ex.ComponentEx {
|
|
131
|
+
/**
|
|
132
|
+
* The Obsidian app instance.
|
|
133
|
+
*/
|
|
134
|
+
app;
|
|
135
|
+
/**
|
|
136
|
+
* The CSS classes added to each item.
|
|
137
|
+
*/
|
|
138
|
+
itemClasses;
|
|
139
|
+
/**
|
|
140
|
+
* Renders the item of one window.
|
|
141
|
+
*/
|
|
142
|
+
renderItem;
|
|
143
|
+
/**
|
|
144
|
+
* Whether a status bar is created in a window that has none.
|
|
145
|
+
*/
|
|
146
|
+
shouldCreateMissingStatusBar;
|
|
147
|
+
itemElsByWindow = /* @__PURE__ */ new Map();
|
|
148
|
+
/**
|
|
149
|
+
* Creates a new instance of the `AllWindowsStatusBarItemComponent` class.
|
|
150
|
+
*
|
|
151
|
+
* @param params - The {@link AllWindowsStatusBarItemComponentConstructorParams}.
|
|
152
|
+
*/
|
|
153
|
+
constructor(params) {
|
|
154
|
+
super();
|
|
155
|
+
this.app = params.app;
|
|
156
|
+
this.renderItem = params.render;
|
|
157
|
+
this.shouldCreateMissingStatusBar = params.shouldCreateMissingStatusBar ?? true;
|
|
158
|
+
this.itemClasses = [
|
|
159
|
+
STATUS_BAR_ITEM_CSS_CLASS,
|
|
160
|
+
...params.pluginId === void 0 ? [] : [getPluginStatusBarItemCssClass(params.pluginId)],
|
|
161
|
+
...params.cls ?? []
|
|
162
|
+
];
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Gets the item of a window.
|
|
166
|
+
*
|
|
167
|
+
* @param win - The window.
|
|
168
|
+
* @returns The item, or `null` when the window has none.
|
|
169
|
+
*/
|
|
170
|
+
getItemEl(win) {
|
|
171
|
+
return this.itemElsByWindow.get(win) ?? null;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Gets the items of every window that has one.
|
|
175
|
+
*
|
|
176
|
+
* @returns The items.
|
|
177
|
+
*/
|
|
178
|
+
getItemEls() {
|
|
179
|
+
return [...this.itemElsByWindow.values()];
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Creates the item in every window, now and as popouts open. A no-op on mobile.
|
|
183
|
+
*/
|
|
184
|
+
onload() {
|
|
185
|
+
super.onload();
|
|
186
|
+
if (import_obsidian.Platform.isMobile) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const allWindowsEventComponent = this.addChild(new import_all_windows_event_component.AllWindowsEventComponent(this.app));
|
|
190
|
+
allWindowsEventComponent.registerAllWindowsHandler((win) => this.attach(win));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Renders the item of every window again.
|
|
194
|
+
*/
|
|
195
|
+
refresh() {
|
|
196
|
+
for (const [win, el] of this.itemElsByWindow) {
|
|
197
|
+
this.renderItem({ el, win });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
attach(win) {
|
|
201
|
+
const statusBarEl = this.findOrCreateStatusBar(win.document);
|
|
202
|
+
if (!statusBarEl) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
const el = statusBarEl.createDiv({ cls: [...this.itemClasses] });
|
|
206
|
+
this.itemElsByWindow.set(win, el);
|
|
207
|
+
this.renderItem({ el, win });
|
|
208
|
+
return () => {
|
|
209
|
+
this.itemElsByWindow.delete(win);
|
|
210
|
+
el.remove();
|
|
211
|
+
if (statusBarEl.classList.contains(WINDOW_STATUS_BAR_CSS_CLASS) && !statusBarEl.querySelector(`:scope > .${STATUS_BAR_ITEM_CSS_CLASS}`)) {
|
|
212
|
+
statusBarEl.remove();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
findOrCreateStatusBar(doc) {
|
|
217
|
+
const appContainerEl = doc.body.querySelector(`:scope > .${APP_CONTAINER_CSS_CLASS}`);
|
|
218
|
+
if (!appContainerEl) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
const statusBarEl = appContainerEl.querySelector(`:scope > .${STATUS_BAR_CSS_CLASS}`);
|
|
222
|
+
if (statusBarEl) {
|
|
223
|
+
return statusBarEl;
|
|
224
|
+
}
|
|
225
|
+
if (!this.shouldCreateMissingStatusBar) {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
return appContainerEl.createDiv({ cls: [STATUS_BAR_CSS_CLASS, WINDOW_STATUS_BAR_CSS_CLASS] });
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function getPluginStatusBarItemCssClass(pluginId) {
|
|
232
|
+
return `plugin-${pluginId.toLowerCase().replace(/[^_a-zA-Z0-9-]/, "-")}`;
|
|
233
|
+
}
|
|
234
|
+
function registerAllWindowsStatusBarItem(params) {
|
|
235
|
+
const { component, ...constructorParams } = params;
|
|
236
|
+
return component.addChild(new AllWindowsStatusBarItemComponent(constructorParams));
|
|
237
|
+
}
|
|
238
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
239
|
+
0 && (module.exports = {
|
|
240
|
+
AllWindowsStatusBarItemComponent,
|
|
241
|
+
WINDOW_STATUS_BAR_CSS_CLASS,
|
|
242
|
+
getPluginStatusBarItemCssClass,
|
|
243
|
+
registerAllWindowsStatusBarItem
|
|
244
|
+
});
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2FsbC13aW5kb3dzLXN0YXR1cy1iYXItaXRlbS1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNob3dzIG9uZSBzdGF0dXMtYmFyIGl0ZW0gaW4gdGhlIG1haW4gd2luZG93IGFuZCBpbiBldmVyeSBkZXNrdG9wIHBvcG91dCwgaW5jbHVkaW5nIHBvcG91dHMgb3BlbmVkIGxhdGVyLCBhbmRcbiAqIHJlbW92ZXMgb25seSBpdHMgb3duIGl0ZW1zIHdoZW4gYSB3aW5kb3cgY2xvc2VzIG9yIHRoZSBjb21wb25lbnQgdW5sb2Fkcy5cbiAqXG4gKiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMWA6IHRoZSBtYWluIHdpbmRvdyBidWlsZHMgYGJvZHkgPiAuYXBwLWNvbnRhaW5lciA+IC5zdGF0dXMtYmFyYCwgYW5kXG4gKiBgUGx1Z2luLmFkZFN0YXR1c0Jhckl0ZW1gIGlzIGEgYC5zdGF0dXMtYmFyLWl0ZW1gIGNyZWF0ZWQgaW4gaXQuIEEgcG9wb3V0IGJ1aWxkcyBgYm9keSA+IC5hcHAtY29udGFpbmVyYCB3aXRoIHRoZVxuICogd29ya3NwYWNlIG9ubHksIGFuZCAqKm5vIHN0YXR1cyBiYXIqKi4gYGFwcC5jc3NgIHN0eWxlcyBgLnN0YXR1cy1iYXJgIHdpdGhvdXQgc2NvcGluZyBpdCB0byBhIHdpbmRvdywgc28gYVxuICogYC5zdGF0dXMtYmFyYCBjcmVhdGVkIGluc2lkZSBhIHBvcG91dCdzIGAuYXBwLWNvbnRhaW5lcmAgbG9va3MgYW5kIHNpdHMgZXhhY3RseSBsaWtlIHRoZSBtYWluIG9uZS4gQnkgZGVmYXVsdFxuICogdGhpcyBjb21wb25lbnQgY3JlYXRlcyB0aGF0IGJhciBpbiBhIHBvcG91dCB0aGF0IGxhY2tzIG9uZSwgYW5kIG1hcmtzIGl0IHdpdGhcbiAqIHtAbGluayBXSU5ET1dfU1RBVFVTX0JBUl9DU1NfQ0xBU1N9LiBUaGUgbWFya2VyIGlzIGEgd2lyZSBjb25zdGFudCBzaGFyZWQgYnkgZXZlcnkgY29weSBvZiB0aGlzIGxpYnJhcnk6IGFueSBjb3B5XG4gKiByZXVzZXMgYSBtYXJrZWQgYmFyLCBhbmQgd2hpY2hldmVyIGNvcHkgcmVtb3ZlcyB0aGUgbGFzdCBpdGVtIGZyb20gaXQgcmVtb3ZlcyB0aGUgYmFyIHRvby5cbiAqXG4gKiBNb2JpbGUgaGFzIG5vIHBvcG91dHMsIGFuZCBgYXBwLmNzc2AgaGlkZXMgYC5zdGF0dXMtYmFyYCB1bmRlciBgLmlzLW1vYmlsZWAsIHNvIG9uIG1vYmlsZSB0aGUgY29tcG9uZW50IGNyZWF0ZXNcbiAqIG5vdGhpbmcgYW5kIG5ldmVyIGNhbGxzIHRoZSByZW5kZXIgY2FsbGJhY2suXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENvbXBvbmVudFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgfSBmcm9tICcuL2FsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuLyoqXG4gKiBUaGUgY2xhc3MgdGhhdCBtYXJrcyBhIHN0YXR1cyBiYXIgdGhpcyBsaWJyYXJ5IGNyZWF0ZWQgaW4gYSB3aW5kb3cgdGhhdCBoYWQgbm9uZS5cbiAqIE90aGVyIGNvcGllcyBvZiB0aGUgbGlicmFyeSBtYXRjaCBpdCwgc28gaXRzIHZhbHVlIG11c3QgbmV2ZXIgY2hhbmdlLlxuICovXG5leHBvcnQgY29uc3QgV0lORE9XX1NUQVRVU19CQVJfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWxpYi13aW5kb3ctc3RhdHVzLWJhcic7XG5cbmNvbnN0IEFQUF9DT05UQUlORVJfQ1NTX0NMQVNTID0gJ2FwcC1jb250YWluZXInO1xuY29uc3QgU1RBVFVTX0JBUl9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhcic7XG5jb25zdCBTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTID0gJ3N0YXR1cy1iYXItaXRlbSc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBBbGxXaW5kb3dzU3RhdHVzQmFySXRlbUNvbXBvbmVudH0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxsV2luZG93c1N0YXR1c0Jhckl0ZW1Db21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEV4dHJhIENTUyBjbGFzc2VzIGZvciBlYWNoIGl0ZW0uXG4gICAqL1xuICByZWFkb25seSBjbHM/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZC4gV2hlbiBnaXZlbiwgZWFjaCBpdGVtIGdldHMgdGhlIGBwbHVnaW4tPGlkPmAgY2xhc3MgdGhhdCBgUGx1Z2luLmFkZFN0YXR1c0Jhckl0ZW1gIGFkZHMsIHNvXG4gICAqIHRoZW1lcyBhbmQgQ1NTIHNuaXBwZXRzIHRoYXQgdGFyZ2V0IHRoZSBwbHVnaW4ncyBzdGF0dXMtYmFyIGl0ZW1zIG1hdGNoIHRoZXNlIHRvby5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBpdGVtIG9mIG9uZSB3aW5kb3cuIENhbGxlZCB3aGVuIHRoZSBpdGVtIGlzIGNyZWF0ZWQgYW5kIGFnYWluIGJ5XG4gICAqIHtAbGluayBBbGxXaW5kb3dzU3RhdHVzQmFySXRlbUNvbXBvbmVudC5yZWZyZXNofSwgc28gaXQgbXVzdCBiZSBzYWZlIHRvIGNhbGwgcmVwZWF0ZWRseSBvbiB0aGUgc2FtZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGl0ZW0gYW5kIGl0cyB3aW5kb3cuXG4gICAqL1xuICByZWFkb25seSByZW5kZXI6IChwYXJhbXM6IEFsbFdpbmRvd3NTdGF0dXNCYXJJdGVtUmVuZGVyUGFyYW1zKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNyZWF0ZSBhIHN0YXR1cyBiYXIgaW4gYSB3aW5kb3cgdGhhdCBoYXMgbm9uZSwgYXMgZXZlcnkgcG9wb3V0IGluIE9ic2lkaWFuIGAxLjE1LjFgIGRvZXMuXG4gICAqIFdoZW4gYGZhbHNlYCwgc3VjaCBhIHdpbmRvdyBnZXRzIG5vIGl0ZW0uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENyZWF0ZU1pc3NpbmdTdGF0dXNCYXI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgcGFzc2VkIHRvIHtAbGluayBBbGxXaW5kb3dzU3RhdHVzQmFySXRlbUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zLnJlbmRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxsV2luZG93c1N0YXR1c0Jhckl0ZW1SZW5kZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHN0YXR1cy1iYXIgaXRlbSBvd25lZCBieSB0aGlzIGNvbXBvbmVudCBpbiB7QGxpbmsgd2lufS5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdyB0aGUgaXRlbSBpcyBpbi4gVXNlIGl0cyBkb2N1bWVudCBmb3IgYW55dGhpbmcgdGhlIHJlbmRlciBjcmVhdGVzIG91dHNpZGUgdGhlIGl0ZW0uXG4gICAqL1xuICByZWFkb25seSB3aW46IFdpbmRvdztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJBbGxXaW5kb3dzU3RhdHVzQmFySXRlbX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJBbGxXaW5kb3dzU3RhdHVzQmFySXRlbVBhcmFtcyBleHRlbmRzIEFsbFdpbmRvd3NTdGF0dXNCYXJJdGVtQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB0aGF0IG93bnMgdGhlIGl0ZW1zOiB0aGV5IGFyZSByZW1vdmVkIHdoZW4gaXQgdW5sb2Fkcy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudDogQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIFNob3dzIG9uZSBzdGF0dXMtYmFyIGl0ZW0gaW4gdGhlIG1haW4gd2luZG93IGFuZCBpbiBldmVyeSBkZXNrdG9wIHBvcG91dCB3aGlsZSBsb2FkZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbGxXaW5kb3dzU3RhdHVzQmFySXRlbUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBDU1MgY2xhc3NlcyBhZGRlZCB0byBlYWNoIGl0ZW0uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbUNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBpdGVtIG9mIG9uZSB3aW5kb3cuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVuZGVySXRlbTogKHBhcmFtczogQWxsV2luZG93c1N0YXR1c0Jhckl0ZW1SZW5kZXJQYXJhbXMpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBzdGF0dXMgYmFyIGlzIGNyZWF0ZWQgaW4gYSB3aW5kb3cgdGhhdCBoYXMgbm9uZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG91bGRDcmVhdGVNaXNzaW5nU3RhdHVzQmFyOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlbUVsc0J5V2luZG93ID0gbmV3IE1hcDxXaW5kb3csIEhUTUxFbGVtZW50PigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBgQWxsV2luZG93c1N0YXR1c0Jhckl0ZW1Db21wb25lbnRgIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBbGxXaW5kb3dzU3RhdHVzQmFySXRlbUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zfS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEFsbFdpbmRvd3NTdGF0dXNCYXJJdGVtQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlbmRlckl0ZW0gPSBwYXJhbXMucmVuZGVyO1xuICAgIHRoaXMuc2hvdWxkQ3JlYXRlTWlzc2luZ1N0YXR1c0JhciA9IHBhcmFtcy5zaG91bGRDcmVhdGVNaXNzaW5nU3RhdHVzQmFyID8/IHRydWU7XG4gICAgdGhpcy5pdGVtQ2xhc3NlcyA9IFtcbiAgICAgIFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsXG4gICAgICAuLi5wYXJhbXMucGx1Z2luSWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2dldFBsdWdpblN0YXR1c0Jhckl0ZW1Dc3NDbGFzcyhwYXJhbXMucGx1Z2luSWQpXSxcbiAgICAgIC4uLnBhcmFtcy5jbHMgPz8gW11cbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGl0ZW0gb2YgYSB3aW5kb3cuXG4gICAqXG4gICAqIEBwYXJhbSB3aW4gLSBUaGUgd2luZG93LlxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSwgb3IgYG51bGxgIHdoZW4gdGhlIHdpbmRvdyBoYXMgbm9uZS5cbiAgICovXG4gIHB1YmxpYyBnZXRJdGVtRWwod2luOiBXaW5kb3cpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLml0ZW1FbHNCeVdpbmRvdy5nZXQod2luKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGl0ZW1zIG9mIGV2ZXJ5IHdpbmRvdyB0aGF0IGhhcyBvbmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpdGVtcy5cbiAgICovXG4gIHB1YmxpYyBnZXRJdGVtRWxzKCk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5pdGVtRWxzQnlXaW5kb3cudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGl0ZW0gaW4gZXZlcnkgd2luZG93LCBub3cgYW5kIGFzIHBvcG91dHMgb3Blbi4gQSBuby1vcCBvbiBtb2JpbGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChuZXcgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50KHRoaXMuYXBwKSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0hhbmRsZXIoKHdpbikgPT4gdGhpcy5hdHRhY2god2luKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgaXRlbSBvZiBldmVyeSB3aW5kb3cgYWdhaW4uXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFt3aW4sIGVsXSBvZiB0aGlzLml0ZW1FbHNCeVdpbmRvdykge1xuICAgICAgdGhpcy5yZW5kZXJJdGVtKHsgZWwsIHdpbiB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaCh3aW46IFdpbmRvdyk6ICgoKSA9PiB2b2lkKSB8IG51bGwge1xuICAgIGNvbnN0IHN0YXR1c0JhckVsID0gdGhpcy5maW5kT3JDcmVhdGVTdGF0dXNCYXIod2luLmRvY3VtZW50KTtcbiAgICBpZiAoIXN0YXR1c0JhckVsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogWy4uLnRoaXMuaXRlbUNsYXNzZXNdIH0pO1xuICAgIHRoaXMuaXRlbUVsc0J5V2luZG93LnNldCh3aW4sIGVsKTtcbiAgICB0aGlzLnJlbmRlckl0ZW0oeyBlbCwgd2luIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuaXRlbUVsc0J5V2luZG93LmRlbGV0ZSh3aW4pO1xuICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICBpZiAoc3RhdHVzQmFyRWwuY2xhc3NMaXN0LmNvbnRhaW5zKFdJTkRPV19TVEFUVVNfQkFSX0NTU19DTEFTUykgJiYgIXN0YXR1c0JhckVsLnF1ZXJ5U2VsZWN0b3IoYDpzY29wZSA+IC4ke1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1N9YCkpIHtcbiAgICAgICAgc3RhdHVzQmFyRWwucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE9yQ3JlYXRlU3RhdHVzQmFyKGRvYzogRG9jdW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGFwcENvbnRhaW5lckVsID0gZG9jLmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYDpzY29wZSA+IC4ke0FQUF9DT05UQUlORVJfQ1NTX0NMQVNTfWApO1xuICAgIGlmICghYXBwQ29udGFpbmVyRWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYXBwQ29udGFpbmVyRWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYDpzY29wZSA+IC4ke1NUQVRVU19CQVJfQ1NTX0NMQVNTfWApO1xuICAgIGlmIChzdGF0dXNCYXJFbCkge1xuICAgICAgcmV0dXJuIHN0YXR1c0JhckVsO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG91bGRDcmVhdGVNaXNzaW5nU3RhdHVzQmFyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBwQ29udGFpbmVyRWwuY3JlYXRlRGl2KHsgY2xzOiBbU1RBVFVTX0JBUl9DU1NfQ0xBU1MsIFdJTkRPV19TVEFUVVNfQkFSX0NTU19DTEFTU10gfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjbGFzcyBgUGx1Z2luLmFkZFN0YXR1c0Jhckl0ZW1gIGFkZHMgdG8gYSBwbHVnaW4ncyBzdGF0dXMtYmFyIGl0ZW1zLlxuICogSXQgY29waWVzIE9ic2lkaWFuIGAxLjE1LjFgIGV4YWN0bHksIGluY2x1ZGluZyB0aGF0IG9ubHkgdGhlIGZpcnN0IGRpc2FsbG93ZWQgY2hhcmFjdGVyIGlzIHJlcGxhY2VkLlxuICpcbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBwbHVnaW4gaWQuXG4gKiBAcmV0dXJucyBUaGUgQ1NTIGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGx1Z2luU3RhdHVzQmFySXRlbUNzc0NsYXNzKHBsdWdpbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHBsdWdpbi0ke3BsdWdpbklkLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15fYS16QS1aMC05LV0vLCAnLScpfWA7XG59XG5cbi8qKlxuICogU2hvd3Mgb25lIHN0YXR1cy1iYXIgaXRlbSBpbiB0aGUgbWFpbiB3aW5kb3cgYW5kIGluIGV2ZXJ5IGRlc2t0b3AgcG9wb3V0LCBpbmNsdWRpbmcgcG9wb3V0cyBvcGVuZWQgbGF0ZXIsIHVudGlsXG4gKiB0aGUgb3duaW5nIGNvbXBvbmVudCB1bmxvYWRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlZ2lzdGVyQWxsV2luZG93c1N0YXR1c0Jhckl0ZW1QYXJhbXN9LiBUaGUgb3duZXIgbXVzdCBiZSBsb2FkZWQuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIEFsbFdpbmRvd3NTdGF0dXNCYXJJdGVtQ29tcG9uZW50fS4gQ2FsbCBpdHMge0BsaW5rIEFsbFdpbmRvd3NTdGF0dXNCYXJJdGVtQ29tcG9uZW50LnJlZnJlc2h9IHRvXG4gKiAgIHJlbmRlciBldmVyeSBpdGVtIGFnYWluLCBvciByZW1vdmUgaXQgZnJvbSB0aGUgb3duZXIgdG8gc3RvcCBlYXJseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWxsV2luZG93c1N0YXR1c0Jhckl0ZW0ocGFyYW1zOiBSZWdpc3RlckFsbFdpbmRvd3NTdGF0dXNCYXJJdGVtUGFyYW1zKTogQWxsV2luZG93c1N0YXR1c0Jhckl0ZW1Db21wb25lbnQge1xuICBjb25zdCB7IGNvbXBvbmVudCwgLi4uY29uc3RydWN0b3JQYXJhbXMgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGNvbXBvbmVudC5hZGRDaGlsZChuZXcgQWxsV2luZG93c1N0YXR1c0Jhckl0ZW1Db21wb25lbnQoY29uc3RydWN0b3JQYXJhbXMpKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVCQSxzQkFBeUI7QUFFekIseUNBQXlDO0FBQ3pDLDBCQUE0QjtBQU1yQixNQUFNLDhCQUE4QjtBQUUzQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLHVCQUF1QjtBQUM3QixNQUFNLDRCQUE0QjtBQWlFM0IsTUFBTSx5Q0FBeUMsZ0NBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUk3QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBLEVBRUYsa0JBQWtCLG9CQUFJLElBQXlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT3pELFlBQVksUUFBMkQ7QUFDNUUsVUFBTTtBQUNOLFNBQUssTUFBTSxPQUFPO0FB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
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/// <reference lib="dom" />
|
|
3
|
+
/**
|
|
4
|
+
* @file
|
|
5
|
+
*
|
|
6
|
+
* Shows one status-bar item in the main window and in every desktop popout, including popouts opened later, and
|
|
7
|
+
* removes only its own items when a window closes or the component unloads.
|
|
8
|
+
*
|
|
9
|
+
* Read from Obsidian `1.15.1`: the main window builds `body > .app-container > .status-bar`, and
|
|
10
|
+
* `Plugin.addStatusBarItem` is a `.status-bar-item` created in it. A popout builds `body > .app-container` with the
|
|
11
|
+
* workspace only, and **no status bar**. `app.css` styles `.status-bar` without scoping it to a window, so a
|
|
12
|
+
* `.status-bar` created inside a popout's `.app-container` looks and sits exactly like the main one. By default
|
|
13
|
+
* this component creates that bar in a popout that lacks one, and marks it with
|
|
14
|
+
* {@link WINDOW_STATUS_BAR_CSS_CLASS}. The marker is a wire constant shared by every copy of this library: any copy
|
|
15
|
+
* reuses a marked bar, and whichever copy removes the last item from it removes the bar too.
|
|
16
|
+
*
|
|
17
|
+
* Mobile has no popouts, and `app.css` hides `.status-bar` under `.is-mobile`, so on mobile the component creates
|
|
18
|
+
* nothing and never calls the render callback.
|
|
19
|
+
*/
|
|
20
|
+
import type { App, Component } from 'obsidian' with { 'resolution-mode': 'import' };
|
|
21
|
+
import { ComponentEx } from './component-ex.cjs';
|
|
22
|
+
/**
|
|
23
|
+
* The class that marks a status bar this library created in a window that had none.
|
|
24
|
+
* Other copies of the library match it, so its value must never change.
|
|
25
|
+
*/
|
|
26
|
+
export declare const WINDOW_STATUS_BAR_CSS_CLASS = "obsidian-lib-window-status-bar";
|
|
27
|
+
/**
|
|
28
|
+
* Parameters for the {@link AllWindowsStatusBarItemComponent} constructor.
|
|
29
|
+
*/
|
|
30
|
+
export interface AllWindowsStatusBarItemComponentConstructorParams {
|
|
31
|
+
/**
|
|
32
|
+
* The Obsidian app instance.
|
|
33
|
+
*/
|
|
34
|
+
readonly app: App;
|
|
35
|
+
/**
|
|
36
|
+
* Extra CSS classes for each item.
|
|
37
|
+
*/
|
|
38
|
+
readonly cls?: readonly string[];
|
|
39
|
+
/**
|
|
40
|
+
* The plugin id. When given, each item gets the `plugin-<id>` class that `Plugin.addStatusBarItem` adds, so
|
|
41
|
+
* themes and CSS snippets that target the plugin's status-bar items match these too.
|
|
42
|
+
*/
|
|
43
|
+
readonly pluginId?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Renders the item of one window. Called when the item is created and again by
|
|
46
|
+
* {@link AllWindowsStatusBarItemComponent.refresh}, so it must be safe to call repeatedly on the same element.
|
|
47
|
+
*
|
|
48
|
+
* @param params - The item and its window.
|
|
49
|
+
*/
|
|
50
|
+
readonly render: (params: AllWindowsStatusBarItemRenderParams) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Whether to create a status bar in a window that has none, as every popout in Obsidian `1.15.1` does.
|
|
53
|
+
* When `false`, such a window gets no item. Defaults to `true`.
|
|
54
|
+
*/
|
|
55
|
+
readonly shouldCreateMissingStatusBar?: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parameters passed to {@link AllWindowsStatusBarItemComponentConstructorParams.render}.
|
|
59
|
+
*/
|
|
60
|
+
export interface AllWindowsStatusBarItemRenderParams {
|
|
61
|
+
/**
|
|
62
|
+
* The status-bar item owned by this component in {@link win}.
|
|
63
|
+
*/
|
|
64
|
+
readonly el: HTMLElement;
|
|
65
|
+
/**
|
|
66
|
+
* The window the item is in. Use its document for anything the render creates outside the item.
|
|
67
|
+
*/
|
|
68
|
+
readonly win: Window;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parameters for {@link registerAllWindowsStatusBarItem}.
|
|
72
|
+
*/
|
|
73
|
+
export interface RegisterAllWindowsStatusBarItemParams extends AllWindowsStatusBarItemComponentConstructorParams {
|
|
74
|
+
/**
|
|
75
|
+
* The component that owns the items: they are removed when it unloads.
|
|
76
|
+
*/
|
|
77
|
+
readonly component: Component;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Shows one status-bar item in the main window and in every desktop popout while loaded.
|
|
81
|
+
*/
|
|
82
|
+
export declare class AllWindowsStatusBarItemComponent extends ComponentEx {
|
|
83
|
+
/**
|
|
84
|
+
* The Obsidian app instance.
|
|
85
|
+
*/
|
|
86
|
+
protected readonly app: App;
|
|
87
|
+
/**
|
|
88
|
+
* The CSS classes added to each item.
|
|
89
|
+
*/
|
|
90
|
+
protected readonly itemClasses: readonly string[];
|
|
91
|
+
/**
|
|
92
|
+
* Renders the item of one window.
|
|
93
|
+
*/
|
|
94
|
+
protected readonly renderItem: (params: AllWindowsStatusBarItemRenderParams) => void;
|
|
95
|
+
/**
|
|
96
|
+
* Whether a status bar is created in a window that has none.
|
|
97
|
+
*/
|
|
98
|
+
protected readonly shouldCreateMissingStatusBar: boolean;
|
|
99
|
+
private readonly itemElsByWindow;
|
|
100
|
+
/**
|
|
101
|
+
* Creates a new instance of the `AllWindowsStatusBarItemComponent` class.
|
|
102
|
+
*
|
|
103
|
+
* @param params - The {@link AllWindowsStatusBarItemComponentConstructorParams}.
|
|
104
|
+
*/
|
|
105
|
+
constructor(params: AllWindowsStatusBarItemComponentConstructorParams);
|
|
106
|
+
/**
|
|
107
|
+
* Gets the item of a window.
|
|
108
|
+
*
|
|
109
|
+
* @param win - The window.
|
|
110
|
+
* @returns The item, or `null` when the window has none.
|
|
111
|
+
*/
|
|
112
|
+
getItemEl(win: Window): HTMLElement | null;
|
|
113
|
+
/**
|
|
114
|
+
* Gets the items of every window that has one.
|
|
115
|
+
*
|
|
116
|
+
* @returns The items.
|
|
117
|
+
*/
|
|
118
|
+
getItemEls(): HTMLElement[];
|
|
119
|
+
/**
|
|
120
|
+
* Creates the item in every window, now and as popouts open. A no-op on mobile.
|
|
121
|
+
*/
|
|
122
|
+
onload(): void;
|
|
123
|
+
/**
|
|
124
|
+
* Renders the item of every window again.
|
|
125
|
+
*/
|
|
126
|
+
refresh(): void;
|
|
127
|
+
private attach;
|
|
128
|
+
private findOrCreateStatusBar;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Gets the class `Plugin.addStatusBarItem` adds to a plugin's status-bar items.
|
|
132
|
+
* It copies Obsidian `1.15.1` exactly, including that only the first disallowed character is replaced.
|
|
133
|
+
*
|
|
134
|
+
* @param pluginId - The plugin id.
|
|
135
|
+
* @returns The CSS class.
|
|
136
|
+
*/
|
|
137
|
+
export declare function getPluginStatusBarItemCssClass(pluginId: string): string;
|
|
138
|
+
/**
|
|
139
|
+
* Shows one status-bar item in the main window and in every desktop popout, including popouts opened later, until
|
|
140
|
+
* the owning component unloads.
|
|
141
|
+
*
|
|
142
|
+
* @param params - The {@link RegisterAllWindowsStatusBarItemParams}. The owner must be loaded.
|
|
143
|
+
* @returns The {@link AllWindowsStatusBarItemComponent}. Call its {@link AllWindowsStatusBarItemComponent.refresh} to
|
|
144
|
+
* render every item again, or remove it from the owner to stop early.
|
|
145
|
+
*/
|
|
146
|
+
export declare function registerAllWindowsStatusBarItem(params: RegisterAllWindowsStatusBarItemParams): AllWindowsStatusBarItemComponent;
|
|
@@ -106,6 +106,14 @@ class EmbedExtensionsComponent extends import_component_ex.ComponentEx {
|
|
|
106
106
|
* Registers the specified file extensions with the given embed type in the Obsidian app.
|
|
107
107
|
* The extensions will be automatically unregistered when the component is unloaded.
|
|
108
108
|
*
|
|
109
|
+
* The registration is all or nothing: Obsidian throws for an extension that is already registered (by the core or by
|
|
110
|
+
* another plugin), and in that case every extension this call registered before the conflict is unregistered again
|
|
111
|
+
* before the error is rethrown. An extension registered by someone else is never unregistered.
|
|
112
|
+
*
|
|
113
|
+
* The creator serves every surface that loads an embed: `![[file.ext#subpath]]` in Reading view and Live Preview,
|
|
114
|
+
* canvas file nodes and the page-preview hover popover. It receives the link's subpath with its leading `#`, or an
|
|
115
|
+
* empty string. Returning `null` makes Obsidian fall back to its generic file embed.
|
|
116
|
+
*
|
|
109
117
|
* @param extensions - An array of file extensions to register.
|
|
110
118
|
* @param embedCreator - The embed creator function to associate with the extensions.
|
|
111
119
|
*
|
|
@@ -116,9 +124,18 @@ class EmbedExtensionsComponent extends import_component_ex.ComponentEx {
|
|
|
116
124
|
*/
|
|
117
125
|
registerExtensions(extensions, embedCreator) {
|
|
118
126
|
this.ensureLoaded();
|
|
119
|
-
|
|
127
|
+
const registeredExtensions = [];
|
|
128
|
+
try {
|
|
129
|
+
for (const extension of extensions) {
|
|
130
|
+
this.app.embedRegistry.registerExtension(extension, embedCreator);
|
|
131
|
+
registeredExtensions.push(extension);
|
|
132
|
+
}
|
|
133
|
+
} catch (error) {
|
|
134
|
+
this.app.embedRegistry.unregisterExtensions(registeredExtensions);
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
120
137
|
this.register(() => {
|
|
121
|
-
this.app.embedRegistry.unregisterExtensions(
|
|
138
|
+
this.app.embedRegistry.unregisterExtensions(registeredExtensions);
|
|
122
139
|
});
|
|
123
140
|
}
|
|
124
141
|
}
|
|
@@ -126,4 +143,4 @@ class EmbedExtensionsComponent extends import_component_ex.ComponentEx {
|
|
|
126
143
|
0 && (module.exports = {
|
|
127
144
|
EmbedExtensionsComponent
|
|
128
145
|
});
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyBjbGFzcyB7QGxpbmsgRW1iZWRFeHRlbnNpb25zQ29tcG9uZW50fSB0aGF0IHJlZ2lzdGVycyBlbWJlZCBleHRlbnNpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRW1iZWRDcmVhdG9yIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbi8qKlxuICogQSBjb21wb25lbnQgdGhhdCByZWdpc3RlcnMgYW5kIHVucmVnaXN0ZXJzIGVtYmVkIGV4dGVuc2lvbnMuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgY29tcG9uZW50IGlzIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IHdhbnQgdG8gcmVnaXN0ZXIgY3VzdG9tIGVtYmVkIHR5cGVzIGZvciBzcGVjaWZpYyBmaWxlIGV4dGVuc2lvbnMuXG4gKiBJdCBlbnN1cmVzIHRoYXQgdGhlIGV4dGVuc2lvbnMgYXJlIHJlZ2lzdGVyZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGxvYWRlZCBhbmQgdW5yZWdpc3RlcmVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyB1bmxvYWRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkRXh0ZW5zaW9uc0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBFbWJlZEV4dGVuc2lvbnNDb21wb25lbnR9IGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIGZpbGUgZXh0ZW5zaW9ucyB3aXRoIHRoZSBnaXZlbiBlbWJlZCB0eXBlIGluIHRoZSBPYnNpZGlhbiBhcHAuXG4gICAqIFRoZSBleHRlbnNpb25zIHdpbGwgYmUgYXV0b21hdGljYWxseSB1bnJlZ2lzdGVyZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHVubG9hZGVkLlxuICAgKlxuICAgKiBUaGUgcmVnaXN0cmF0aW9uIGlzIGFsbCBvciBub3RoaW5nOiBPYnNpZGlhbiB0aHJvd3MgZm9yIGFuIGV4dGVuc2lvbiB0aGF0IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAoYnkgdGhlIGNvcmUgb3IgYnlcbiAgICogYW5vdGhlciBwbHVnaW4pLCBhbmQgaW4gdGhhdCBjYXNlIGV2ZXJ5IGV4dGVuc2lvbiB0aGlzIGNhbGwgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNvbmZsaWN0IGlzIHVucmVnaXN0ZXJlZCBhZ2FpblxuICAgKiBiZWZvcmUgdGhlIGVycm9yIGlzIHJldGhyb3duLiBBbiBleHRlbnNpb24gcmVnaXN0ZXJlZCBieSBzb21lb25lIGVsc2UgaXMgbmV2ZXIgdW5yZWdpc3RlcmVkLlxuICAgKlxuICAgKiBUaGUgY3JlYXRvciBzZXJ2ZXMgZXZlcnkgc3VyZmFjZSB0aGF0IGxvYWRzIGFuIGVtYmVkOiBgIVtbZmlsZS5leHQjc3VicGF0aF1dYCBpbiBSZWFkaW5nIHZpZXcgYW5kIExpdmUgUHJldmlldyxcbiAgICogY2FudmFzIGZpbGUgbm9kZXMgYW5kIHRoZSBwYWdlLXByZXZpZXcgaG92ZXIgcG9wb3Zlci4gSXQgcmVjZWl2ZXMgdGhlIGxpbmsncyBzdWJwYXRoIHdpdGggaXRzIGxlYWRpbmcgYCNgLCBvciBhblxuICAgKiBlbXB0eSBzdHJpbmcuIFJldHVybmluZyBgbnVsbGAgbWFrZXMgT2JzaWRpYW4gZmFsbCBiYWNrIHRvIGl0cyBnZW5lcmljIGZpbGUgZW1iZWQuXG4gICAqXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gQW4gYXJyYXkgb2YgZmlsZSBleHRlbnNpb25zIHRvIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0gZW1iZWRDcmVhdG9yIC0gVGhlIGVtYmVkIGNyZWF0b3IgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIHdpdGggdGhlIGV4dGVuc2lvbnMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGNvbXBvbmVudC5yZWdpc3RlckV4dGVuc2lvbnMoWydleHQxJywgJ2V4dDInXSwgKGNvbnRleHQsIGZpbGUsIHN1YnBhdGgpID0+IG5ldyBNeUVtYmVkQ29tcG9uZW50KGNvbnRleHQsIGZpbGUsIHN1YnBhdGgpKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdLCBlbWJlZENyZWF0b3I6IEVtYmVkQ3JlYXRvcik6IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG5cbiAgICBjb25zdCByZWdpc3RlcmVkRXh0ZW5zaW9uczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICB0aGlzLmFwcC5lbWJlZFJlZ2lzdHJ5LnJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbiwgZW1iZWRDcmVhdG9yKTtcbiAgICAgICAgcmVnaXN0ZXJlZEV4dGVuc2lvbnMucHVzaChleHRlbnNpb24pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFwcC5lbWJlZFJlZ2lzdHJ5LnVucmVnaXN0ZXJFeHRlbnNpb25zKHJlZ2lzdGVyZWRFeHRlbnNpb25zKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRoaXMucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgdGhpcy5hcHAuZW1iZWRSZWdpc3RyeS51bnJlZ2lzdGVyRXh0ZW5zaW9ucyhyZWdpc3RlcmVkRXh0ZW5zaW9ucyk7XG4gICAgfSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLDBCQUE0QjtBQVNyQixNQUFNLGlDQUFpQyxnQ0FBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1qRCxZQUErQixLQUFVO0FBQzlDLFVBQU07QUFEOEI7QUFBQSxFQUV0QztBQUFBLEVBRnNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBd0IvQixtQkFBbUIsWUFBc0IsY0FBa0M7QUFDaEYsU0FBSyxhQUFhO0FBRWxCLFVBQU0sdUJBQWlDLENBQUM7QUFDeEMsUUFBSTtBQUNGLGlCQUFXLGFBQWEsWUFBWTtBQUNsQyxhQUFLLElBQUksY0FBYyxrQkFBa0IsV0FBVyxZQUFZO0FBQ2hFLDZCQUFxQixLQUFLLFNBQVM7QUFBQSxNQUNyQztBQUFBLElBQ0YsU0FBUyxPQUFPO0FBQ2QsV0FBSyxJQUFJLGNBQWMscUJBQXFCLG9CQUFvQjtBQUNoRSxZQUFNO0FBQUEsSUFDUjtBQUVBLFNBQUssU0FBUyxNQUFNO0FBQ2xCLFdBQUssSUFBSSxjQUFjLHFCQUFxQixvQkFBb0I7QUFBQSxJQUNsRSxDQUFDO0FBQUEsRUFDSDtBQUNGOyIsIm5hbWVzIjpbXX0=
|
|
@@ -26,6 +26,14 @@ export declare class EmbedExtensionsComponent extends ComponentEx {
|
|
|
26
26
|
* Registers the specified file extensions with the given embed type in the Obsidian app.
|
|
27
27
|
* The extensions will be automatically unregistered when the component is unloaded.
|
|
28
28
|
*
|
|
29
|
+
* The registration is all or nothing: Obsidian throws for an extension that is already registered (by the core or by
|
|
30
|
+
* another plugin), and in that case every extension this call registered before the conflict is unregistered again
|
|
31
|
+
* before the error is rethrown. An extension registered by someone else is never unregistered.
|
|
32
|
+
*
|
|
33
|
+
* The creator serves every surface that loads an embed: `![[file.ext#subpath]]` in Reading view and Live Preview,
|
|
34
|
+
* canvas file nodes and the page-preview hover popover. It receives the link's subpath with its leading `#`, or an
|
|
35
|
+
* empty string. Returning `null` makes Obsidian fall back to its generic file embed.
|
|
36
|
+
*
|
|
29
37
|
* @param extensions - An array of file extensions to register.
|
|
30
38
|
* @param embedCreator - The embed creator function to associate with the extensions.
|
|
31
39
|
*
|