obsidian-dev-utils 88.2.0 → 88.4.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/CHANGELOG.md +22 -4
- package/dist/lib/cjs/__merged.cjs +27 -1
- package/dist/lib/cjs/__merged.d.cts +8 -4
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/html-element.cjs +7 -1
- package/dist/lib/cjs/html-element.d.cts +12 -0
- package/dist/lib/cjs/obsidian/attachment-path.cjs +10 -5
- package/dist/lib/cjs/obsidian/attachment-path.d.cts +11 -1
- package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +159 -0
- package/dist/lib/cjs/obsidian/components/pointer-position-component.d.cts +29 -0
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +35 -5
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +7 -0
- package/dist/lib/cjs/obsidian/css-class.cjs +2 -1
- package/dist/lib/cjs/obsidian/css-class.d.cts +4 -0
- package/dist/lib/cjs/obsidian/file-system.cjs +20 -1
- package/dist/lib/cjs/obsidian/file-system.d.cts +25 -0
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +4 -1
- package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +3 -0
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +3 -0
- package/dist/lib/cjs/obsidian/index.cjs +7 -1
- package/dist/lib/cjs/obsidian/index.d.cts +2 -0
- package/dist/lib/cjs/obsidian/link-update-progress.cjs +124 -0
- package/dist/lib/cjs/obsidian/link-update-progress.d.cts +32 -0
- package/dist/lib/cjs/obsidian/link.cjs +11 -2
- package/dist/lib/cjs/obsidian/link.d.cts +6 -0
- package/dist/lib/cjs/obsidian/path-settings.cjs +19 -5
- package/dist/lib/cjs/obsidian/path-settings.d.cts +13 -1
- package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +175 -0
- package/dist/lib/cjs/obsidian/popovers/field-popover.d.cts +75 -0
- package/dist/lib/cjs/obsidian/popovers/index.cjs +152 -0
- package/dist/lib/cjs/obsidian/popovers/index.d.cts +4 -0
- package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +178 -0
- package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +67 -0
- package/dist/lib/cjs/obsidian/popovers/popover.cjs +221 -0
- package/dist/lib/cjs/obsidian/popovers/popover.d.cts +78 -0
- package/dist/lib/cjs/obsidian/resource-lock.cjs +6 -1
- package/dist/lib/cjs/obsidian/resource-lock.d.cts +15 -0
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
- package/dist/lib/cjs/script-utils/version.cjs +11 -2
- package/dist/lib/cjs/script-utils/version.d.cts +14 -0
- package/dist/lib/esm/__merged.d.mts +8 -4
- package/dist/lib/esm/__merged.mjs +28 -2
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/html-element.d.mts +12 -0
- package/dist/lib/esm/html-element.mjs +6 -1
- package/dist/lib/esm/obsidian/attachment-path.d.mts +11 -1
- package/dist/lib/esm/obsidian/attachment-path.mjs +11 -5
- package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/components/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/pointer-position-component.d.mts +29 -0
- package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +51 -0
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +7 -0
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +35 -5
- package/dist/lib/esm/obsidian/css-class.d.mts +4 -0
- package/dist/lib/esm/obsidian/css-class.mjs +2 -1
- package/dist/lib/esm/obsidian/file-system.d.mts +25 -0
- package/dist/lib/esm/obsidian/file-system.mjs +20 -1
- package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +3 -0
- package/dist/lib/esm/obsidian/i18n/locales/en.mjs +4 -1
- package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.d.mts +2 -0
- package/dist/lib/esm/obsidian/index.mjs +5 -1
- package/dist/lib/esm/obsidian/link-update-progress.d.mts +32 -0
- package/dist/lib/esm/obsidian/link-update-progress.mjs +24 -0
- package/dist/lib/esm/obsidian/link.d.mts +6 -0
- package/dist/lib/esm/obsidian/link.mjs +11 -2
- package/dist/lib/esm/obsidian/path-settings.d.mts +13 -1
- package/dist/lib/esm/obsidian/path-settings.mjs +18 -4
- package/dist/lib/esm/obsidian/popovers/field-popover.d.mts +75 -0
- package/dist/lib/esm/obsidian/popovers/field-popover.mjs +70 -0
- package/dist/lib/esm/obsidian/popovers/index.d.mts +4 -0
- package/dist/lib/esm/obsidian/popovers/index.mjs +32 -0
- package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +67 -0
- package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +67 -0
- package/dist/lib/esm/obsidian/popovers/popover.d.mts +78 -0
- package/dist/lib/esm/obsidian/popovers/popover.mjs +113 -0
- package/dist/lib/esm/obsidian/resource-lock.d.mts +15 -0
- package/dist/lib/esm/obsidian/resource-lock.mjs +5 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
- package/dist/lib/esm/script-utils/version.d.mts +14 -0
- package/dist/lib/esm/script-utils/version.mjs +10 -2
- package/dist/styles.css +25 -1
- package/obsidian/components/pointer-position-component/package.json +6 -0
- package/obsidian/link-update-progress/package.json +6 -0
- package/obsidian/popovers/field-popover/package.json +6 -0
- package/obsidian/popovers/index/package.json +6 -0
- package/obsidian/popovers/package.json +6 -0
- package/obsidian/popovers/popover/package.json +6 -0
- package/obsidian/popovers/popover-anchor/package.json +6 -0
- package/package.json +43 -17
- package/patches/brace-expansion-callable/package.json +8 -0
- package/dist/dev/main.js +0 -37725
- package/dist/dev/manifest.json +0 -9
|
@@ -0,0 +1,221 @@
|
|
|
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
|
+
|
|
6
|
+
(function initCjs() {
|
|
7
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
8
|
+
const globalThisRecord = globalThis;
|
|
9
|
+
globalThisRecord['__name'] ??= name;
|
|
10
|
+
const originalRequire = require;
|
|
11
|
+
if (originalRequire && !originalRequire.__isPatched) {
|
|
12
|
+
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
13
|
+
require = Object.assign(
|
|
14
|
+
(id) => requirePatched(id),
|
|
15
|
+
originalRequire,
|
|
16
|
+
{
|
|
17
|
+
__isPatched: true
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const newFuncs = {
|
|
23
|
+
__extractDefault() {
|
|
24
|
+
return extractDefault;
|
|
25
|
+
},
|
|
26
|
+
process() {
|
|
27
|
+
const browserProcess = {
|
|
28
|
+
browser: true,
|
|
29
|
+
cwd() {
|
|
30
|
+
return '/';
|
|
31
|
+
},
|
|
32
|
+
env: {},
|
|
33
|
+
platform: 'android'
|
|
34
|
+
};
|
|
35
|
+
return browserProcess;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
for (const key of Object.keys(newFuncs)) {
|
|
40
|
+
globalThisRecord[key] ??= newFuncs[key]?.();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function name(obj) {
|
|
44
|
+
return obj;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function extractDefault(module) {
|
|
48
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
52
|
+
'obsidian',
|
|
53
|
+
'@codemirror/autocomplete',
|
|
54
|
+
'@codemirror/collab',
|
|
55
|
+
'@codemirror/commands',
|
|
56
|
+
'@codemirror/language',
|
|
57
|
+
'@codemirror/lint',
|
|
58
|
+
'@codemirror/search',
|
|
59
|
+
'@codemirror/state',
|
|
60
|
+
'@codemirror/text',
|
|
61
|
+
'@codemirror/view',
|
|
62
|
+
'@lezer/common',
|
|
63
|
+
'@lezer/lr',
|
|
64
|
+
'@lezer/highlight'];
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
68
|
+
'@codemirror/closebrackets',
|
|
69
|
+
'@codemirror/comment',
|
|
70
|
+
'@codemirror/fold',
|
|
71
|
+
'@codemirror/gutter',
|
|
72
|
+
'@codemirror/highlight',
|
|
73
|
+
'@codemirror/history',
|
|
74
|
+
'@codemirror/matchbrackets',
|
|
75
|
+
'@codemirror/panel',
|
|
76
|
+
'@codemirror/rangeset',
|
|
77
|
+
'@codemirror/rectangular-selection',
|
|
78
|
+
'@codemirror/stream-parser',
|
|
79
|
+
'@codemirror/tooltip'];
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
function requirePatched(id) {
|
|
83
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
|
|
84
|
+
return originalRequire?.(id);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
88
|
+
if (globalThis.app.isMobile) {
|
|
89
|
+
if (id === 'process' || id === 'node:process') {
|
|
90
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
91
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
92
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
93
|
+
return globalThis.process;
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
const module = originalRequire?.(id);
|
|
97
|
+
if (module) {
|
|
98
|
+
return extractDefault(module);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
103
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
})();
|
|
107
|
+
|
|
108
|
+
"use strict";
|
|
109
|
+
var __defProp = Object.defineProperty;
|
|
110
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
111
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
112
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
113
|
+
var __export = (target, all) => {
|
|
114
|
+
for (var name in all)
|
|
115
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
116
|
+
};
|
|
117
|
+
var __copyProps = (to, from, except, desc) => {
|
|
118
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
119
|
+
for (let key of __getOwnPropNames(from))
|
|
120
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
121
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
122
|
+
}
|
|
123
|
+
return to;
|
|
124
|
+
};
|
|
125
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
126
|
+
var popover_exports = {};
|
|
127
|
+
__export(popover_exports, {
|
|
128
|
+
showPopover: () => showPopover
|
|
129
|
+
});
|
|
130
|
+
module.exports = __toCommonJS(popover_exports);
|
|
131
|
+
var import_obsidian = require('obsidian');
|
|
132
|
+
var import_html_element = require('../../html-element.cjs');
|
|
133
|
+
var import_css_class = require('../css-class.cjs');
|
|
134
|
+
var import_i18n = require('../i18n/i18n.cjs');
|
|
135
|
+
var import_plugin_context = require('../plugin/plugin-context.cjs');
|
|
136
|
+
const ANCHOR_GAP_IN_PIXELS = 4;
|
|
137
|
+
const VIEWPORT_MARGIN_IN_PIXELS = 8;
|
|
138
|
+
async function showPopover(params) {
|
|
139
|
+
const {
|
|
140
|
+
anchor,
|
|
141
|
+
build,
|
|
142
|
+
cancelButtonText,
|
|
143
|
+
cssClasses,
|
|
144
|
+
okButtonText
|
|
145
|
+
} = params;
|
|
146
|
+
const doc = anchor.doc;
|
|
147
|
+
const win = (0, import_html_element.getDocumentWindow)(doc);
|
|
148
|
+
const popoverEl = doc.body.createDiv({ cls: "menu" });
|
|
149
|
+
(0, import_plugin_context.addPluginCssClasses)(popoverEl, [import_css_class.CssClass.Popover, ...cssClasses ?? []]);
|
|
150
|
+
return await new Promise((resolve) => {
|
|
151
|
+
const state = { isClosed: false };
|
|
152
|
+
function close(result) {
|
|
153
|
+
if (state.isClosed) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
state.isClosed = true;
|
|
157
|
+
doc.removeEventListener("pointerdown", handlePointerDown, true);
|
|
158
|
+
popoverEl.remove();
|
|
159
|
+
resolve(result);
|
|
160
|
+
}
|
|
161
|
+
function handleCancel() {
|
|
162
|
+
close(null);
|
|
163
|
+
}
|
|
164
|
+
function handleOk() {
|
|
165
|
+
close(getValue());
|
|
166
|
+
}
|
|
167
|
+
function handlePointerDown(evt) {
|
|
168
|
+
if (evt.composedPath().includes(popoverEl)) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
close(null);
|
|
172
|
+
}
|
|
173
|
+
const getValue = build({
|
|
174
|
+
cancel: handleCancel,
|
|
175
|
+
confirm: handleOk,
|
|
176
|
+
contentEl: popoverEl
|
|
177
|
+
});
|
|
178
|
+
popoverEl.addEventListener("keydown", (evt) => {
|
|
179
|
+
if (evt.key === "Enter") {
|
|
180
|
+
evt.preventDefault();
|
|
181
|
+
handleOk();
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (evt.key === "Escape") {
|
|
185
|
+
evt.preventDefault();
|
|
186
|
+
handleCancel();
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
const buttonsSetting = new import_obsidian.Setting(popoverEl);
|
|
190
|
+
buttonsSetting.addButton((button) => {
|
|
191
|
+
button.setButtonText(okButtonText ?? (0, import_i18n.t)(($) => $.obsidianDevUtils.buttons.ok)).setCta().setClass(import_css_class.CssClass.OkButton).onClick(handleOk);
|
|
192
|
+
});
|
|
193
|
+
buttonsSetting.addButton((button) => {
|
|
194
|
+
button.setButtonText(cancelButtonText ?? (0, import_i18n.t)(($) => $.obsidianDevUtils.buttons.cancel)).setClass(import_css_class.CssClass.CancelButton).onClick(handleCancel);
|
|
195
|
+
});
|
|
196
|
+
doc.addEventListener("pointerdown", handlePointerDown, true);
|
|
197
|
+
positionAtAnchor(popoverEl, anchor, win);
|
|
198
|
+
focusFirstInput(popoverEl);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
function focusFirstInput(popoverEl) {
|
|
202
|
+
const inputEl = popoverEl.querySelector("input");
|
|
203
|
+
if (!inputEl) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
inputEl.focus();
|
|
207
|
+
inputEl.select();
|
|
208
|
+
}
|
|
209
|
+
function positionAtAnchor(popoverEl, anchor, win) {
|
|
210
|
+
const maxLeft = Math.max(VIEWPORT_MARGIN_IN_PIXELS, win.innerWidth - popoverEl.offsetWidth - VIEWPORT_MARGIN_IN_PIXELS);
|
|
211
|
+
const maxTop = Math.max(VIEWPORT_MARGIN_IN_PIXELS, win.innerHeight - popoverEl.offsetHeight - VIEWPORT_MARGIN_IN_PIXELS);
|
|
212
|
+
const left = Math.min(Math.max(anchor.left, VIEWPORT_MARGIN_IN_PIXELS), maxLeft);
|
|
213
|
+
const top = Math.min(Math.max(anchor.bottom + ANCHOR_GAP_IN_PIXELS, VIEWPORT_MARGIN_IN_PIXELS), maxTop);
|
|
214
|
+
popoverEl.style.left = `${String(Math.round(left + win.scrollX))}px`;
|
|
215
|
+
popoverEl.style.top = `${String(Math.round(top + win.scrollY))}px`;
|
|
216
|
+
}
|
|
217
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
218
|
+
0 && (module.exports = {
|
|
219
|
+
showPopover
|
|
220
|
+
});
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BvcG92ZXJzL3BvcG92ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHNtYWxsIGZsb2F0aW5nIHBhbmVsIGFuY2hvcmVkIGF0IGEgcG9pbnQsIGNvbGxlY3RpbmcgYSB2YWx1ZSBhbmQgcmVzb2x2aW5nIGEgcHJvbWlzZSB3aXRoIGl0LlxuICpcbiAqIFRoaXMgaXMgdGhlIHBvcG92ZXIgY291bnRlcnBhcnQgb2YgYG1vZGFscy9tb2RhbC50c2A6IHRoZSBzYW1lIFwiYXNrIHRoZSB1c2VyIGZvciBhIHZhbHVlLCByZXNvbHZlIGFcbiAqIHByb21pc2VcIiBzaGFwZSwgZm9yIHRoZSBjYXNlcyBhIG1vZGFsIGNhbm5vdCBzZXJ2ZS4gQSBtb2RhbCBkaW1zIHRoZSBzY3JlZW4gYW5kIGlzIHBvc2l0aW9uZWQgYnlcbiAqIE9ic2lkaWFuLCBuZWl0aGVyIG9mIHdoaWNoIHN1aXRzIGFuIGVkaXRvciB0aGF0IG11c3QgYXBwZWFyICphdCogdGhlIHRoaW5nIGl0IGVkaXRzIFx1MjAxNCBhIGNsaWNrZWRcbiAqIGxpbmssIHRoZSBjYXJldCwgb3Igd2hlcmV2ZXIgYSBjb250ZXh0IG1lbnUgd2FzIHJhaXNlZC5cbiAqXG4gKiBUaGUgcGFuZWwgcmlkZXMgT2JzaWRpYW4ncyBgLm1lbnVgIGNsYXNzIGZvciBpdHMgYmFja2dyb3VuZCwgYm9yZGVyIGFuZCBzaGFkb3csIHNvIG9ubHkgbGF5b3V0IGlzXG4gKiBzdHlsZWQgYnkgdGhpcyBsaWJyYXJ5LlxuICovXG5cbmltcG9ydCB7IFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUG9wb3ZlckFuY2hvciB9IGZyb20gJy4vcG9wb3Zlci1hbmNob3IudHMnO1xuXG5pbXBvcnQgeyBnZXREb2N1bWVudFdpbmRvdyB9IGZyb20gJy4uLy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIFRoZSBnYXAgaW4gcGl4ZWxzIGJldHdlZW4gdGhlIGFuY2hvciBhbmQgdGhlIHBvcG92ZXIuXG4gKi9cbmNvbnN0IEFOQ0hPUl9HQVBfSU5fUElYRUxTID0gNDtcblxuLyoqXG4gKiBUaGUgbWluaW11bSBnYXAgaW4gcGl4ZWxzIHRoZSBwb3BvdmVyIGtlZXBzIGZyb20gdGhlIGVkZ2VzIG9mIHRoZSB3aW5kb3cgd2hlbiBpdCBoYXMgdG8gYmUgY2xhbXBlZFxuICogYmFjayBpbnRvIHZpZXcuXG4gKi9cbmNvbnN0IFZJRVdQT1JUX01BUkdJTl9JTl9QSVhFTFMgPSA4O1xuXG4vKipcbiAqIFJlYWRzIHRoZSB2YWx1ZSB0aGUgcG9wb3ZlciByZXNvbHZlcyB3aXRoIHdoZW4gaXQgaXMgY29uZmlybWVkLlxuICpcbiAqIEB0eXBlUGFyYW0gVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcmVzb2x2ZWQgYnkgdGhlIHBvcG92ZXIuXG4gKiBAcmV0dXJucyBUaGUgY3VycmVudCB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUG9wb3ZlclZhbHVlR2V0dGVyPFZhbHVlPiA9ICh0aGlzOiB2b2lkKSA9PiBWYWx1ZTtcblxuLyoqXG4gKiBUaGUgdG9vbHMgaGFuZGVkIHRvIHtAbGluayBTaG93UG9wb3ZlclBhcmFtcy5idWlsZH0gZm9yIHBvcHVsYXRpbmcgYSBwb3BvdmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3dQb3BvdmVyQnVpbGRQYXJhbXMge1xuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBwb3BvdmVyLCByZXNvbHZpbmcgaXQgd2l0aCBgbnVsbGAsIGFzIHRoZSBDYW5jZWwgYnV0dG9uIGRvZXMuXG4gICAqL1xuICBjYW5jZWwodGhpczogdm9pZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvbmZpcm1zIHRoZSBwb3BvdmVyLCByZXNvbHZpbmcgaXQgd2l0aCB0aGUgYnVpbHQgdmFsdWUsIGFzIHRoZSBPSyBidXR0b24gZG9lcy5cbiAgICovXG4gIGNvbmZpcm0odGhpczogdm9pZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGFkZCB0aGUgcG9wb3ZlcidzIGNvbnRlbnQgdG8uIFRoZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYXJlIGFwcGVuZGVkIGFmdGVyIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudEVsOiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2hvd1BvcG92ZXJ9LlxuICpcbiAqIEB0eXBlUGFyYW0gVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcmVzb2x2ZWQgYnkgdGhlIHBvcG92ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvd1BvcG92ZXJQYXJhbXM8VmFsdWU+IHtcbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBwb3BvdmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYW5jaG9yOiBQb3BvdmVyQW5jaG9yO1xuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZXMgdGhlIHBvcG92ZXIncyBjb250ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHRvb2xzIGZvciBwb3B1bGF0aW5nIHRoZSBwb3BvdmVyLlxuICAgKiBAcmV0dXJucyBBIGdldHRlciByZWFkIHdoZW4gdGhlIHBvcG92ZXIgaXMgY29uZmlybWVkLlxuICAgKi9cbiAgYnVpbGQodGhpczogdm9pZCwgcGFyYW1zOiBTaG93UG9wb3ZlckJ1aWxkUGFyYW1zKTogUG9wb3ZlclZhbHVlR2V0dGVyPFZhbHVlPjtcblxuICAvKipcbiAgICogQSB0ZXh0IGZvciB0aGUgXCJDYW5jZWxcIiBidXR0b24uXG4gICAqL1xuICByZWFkb25seSBjYW5jZWxCdXR0b25UZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzIHRvIGFwcGx5IHRvIHRoZSBwb3BvdmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY3NzQ2xhc3Nlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgZm9yIHRoZSBcIk9LXCIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb2tCdXR0b25UZXh0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpc3BsYXlzIGEgcG9wb3ZlciBhdCB0aGUgZ2l2ZW4gYW5jaG9yIGFuZCByZXNvbHZlcyB3aXRoIHRoZSBidWlsdCB2YWx1ZSwgb3IgYG51bGxgIGlmIGl0IHdhc1xuICogZGlzbWlzc2VkIHdpdGhvdXQgY29uZmlybWluZy5cbiAqXG4gKiBAdHlwZVBhcmFtIFZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJlc29sdmVkIGJ5IHRoZSBwb3BvdmVyLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9wb3Zlci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYnVpbHQgdmFsdWUsIG9yIGBudWxsYCBpZiBkaXNtaXNzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93UG9wb3ZlcjxWYWx1ZT4ocGFyYW1zOiBTaG93UG9wb3ZlclBhcmFtczxWYWx1ZT4pOiBQcm9taXNlPG51bGwgfCBWYWx1ZT4ge1xuICBjb25zdCB7XG4gICAgYW5jaG9yLFxuICAgIGJ1aWxkLFxuICAgIGNhbmNlbEJ1dHRvblRleHQsXG4gICAgY3NzQ2xhc3NlcyxcbiAgICBva0J1dHRvblRleHRcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBkb2MgPSBhbmNob3IuZG9jO1xuICBjb25zdCB3aW4gPSBnZXREb2N1bWVudFdpbmRvdyhkb2MpO1xuICBjb25zdCBwb3BvdmVyRWwgPSBkb2MuYm9keS5jcmVhdGVEaXYoeyBjbHM6ICdtZW51JyB9KTtcbiAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhwb3BvdmVyRWwsIFtDc3NDbGFzcy5Qb3BvdmVyLCAuLi5jc3NDbGFzc2VzID8/IFtdXSk7XG5cbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPG51bGwgfCBWYWx1ZT4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHsgaXNDbG9zZWQ6IGZhbHNlIH07XG5cbiAgICBmdW5jdGlvbiBjbG9zZShyZXN1bHQ6IG51bGwgfCBWYWx1ZSk6IHZvaWQge1xuICAgICAgaWYgKHN0YXRlLmlzQ2xvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGhhbmRsZVBvaW50ZXJEb3duLCB0cnVlKTtcbiAgICAgIHBvcG92ZXJFbC5yZW1vdmUoKTtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVDYW5jZWwoKTogdm9pZCB7XG4gICAgICBjbG9zZShudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVPaygpOiB2b2lkIHtcbiAgICAgIGNsb3NlKGdldFZhbHVlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc21pc3NlcyB0aGUgcG9wb3ZlciB3aGVuIHRoZSBuZXh0IGdlc3R1cmUgc3RhcnRzIG91dHNpZGUgaXQuIExpc3RlbmluZyBmb3IgYHBvaW50ZXJkb3duYFxuICAgICAqIHJhdGhlciB0aGFuIGBjbGlja2AgbWF0dGVyczogYSBwb3BvdmVyIGlzIHR5cGljYWxseSBvcGVuZWQgZnJvbSBhIGBjbGlja2AgaGFuZGxlciwgYW5kIHRoZSB2ZXJ5XG4gICAgICogc2FtZSBjbGljayB3b3VsZCBvdGhlcndpc2UgcmVhY2ggdGhpcyBsaXN0ZW5lciBhbmQgY2xvc2UgdGhlIHBvcG92ZXIgdGhlIGluc3RhbnQgaXQgYXBwZWFycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldnQgLSBUaGUgcG9pbnRlciBldmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyRG93bihldnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgICAgaWYgKGV2dC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhwb3BvdmVyRWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNsb3NlKG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IGdldFZhbHVlID0gYnVpbGQoe1xuICAgICAgY2FuY2VsOiBoYW5kbGVDYW5jZWwsXG4gICAgICBjb25maXJtOiBoYW5kbGVPayxcbiAgICAgIGNvbnRlbnRFbDogcG9wb3ZlckVsXG4gICAgfSk7XG5cbiAgICBwb3BvdmVyRWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChldnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBoYW5kbGVPaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaGFuZGxlQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBidXR0b25zU2V0dGluZyA9IG5ldyBTZXR0aW5nKHBvcG92ZXJFbCk7XG4gICAgYnV0dG9uc1NldHRpbmcuYWRkQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvblxuICAgICAgICAuc2V0QnV0dG9uVGV4dChva0J1dHRvblRleHQgPz8gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmJ1dHRvbnMub2spKVxuICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgLnNldENsYXNzKENzc0NsYXNzLk9rQnV0dG9uKVxuICAgICAgICAub25DbGljayhoYW5kbGVPayk7XG4gICAgfSk7XG4gICAgYnV0dG9uc1NldHRpbmcuYWRkQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvblxuICAgICAgICAuc2V0QnV0dG9uVGV4dChjYW5jZWxCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLmNhbmNlbCkpXG4gICAgICAgIC5zZXRDbGFzcyhDc3NDbGFzcy5DYW5jZWxCdXR0b24pXG4gICAgICAgIC5vbkNsaWNrKGhhbmRsZUNhbmNlbCk7XG4gICAgfSk7XG5cbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVQb2ludGVyRG93biwgdHJ1ZSk7XG4gICAgcG9zaXRpb25BdEFuY2hvcihwb3BvdmVyRWwsIGFuY2hvciwgd2luKTtcbiAgICBmb2N1c0ZpcnN0SW5wdXQocG9wb3ZlckVsKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRm9jdXNlcyBhbmQgc2VsZWN0cyB0aGUgcG9wb3ZlcidzIGZpcnN0IHRleHQgaW5wdXQsIHNvIHRoZSB1c2VyIGNhbiB0eXBlIHN0cmFpZ2h0IGF3YXkuXG4gKlxuICogQHBhcmFtIHBvcG92ZXJFbCAtIFRoZSBwb3BvdmVyIHRvIGZvY3VzIHdpdGhpbi5cbiAqL1xuZnVuY3Rpb24gZm9jdXNGaXJzdElucHV0KHBvcG92ZXJFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgY29uc3QgaW5wdXRFbCA9IHBvcG92ZXJFbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICBpZiAoIWlucHV0RWwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbnB1dEVsLmZvY3VzKCk7XG4gIGlucHV0RWwuc2VsZWN0KCk7XG59XG5cbi8qKlxuICogUGxhY2VzIHRoZSBwb3BvdmVyIGp1c3QgYmVsb3cgdGhlIGFuY2hvciwgcHVsbGluZyBpdCBiYWNrIGluc2lkZSB0aGUgd2luZG93IHdoZW4gaXQgd291bGQgb3RoZXJ3aXNlXG4gKiBvdmVyZmxvdyBcdTIwMTQgYW4gYW5jaG9yIG5lYXIgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlIGlzIGV4YWN0bHkgd2hlcmUgYW4gdW5jbGFtcGVkIHBvcG92ZXIgd291bGRcbiAqIHJlbmRlciBvZmYtc2NyZWVuLlxuICpcbiAqIEBwYXJhbSBwb3BvdmVyRWwgLSBUaGUgcG9wb3ZlciB0byBwb3NpdGlvbi5cbiAqIEBwYXJhbSBhbmNob3IgLSBXaGVyZSB0aGUgcG9wb3ZlciBiZWxvbmdzLlxuICogQHBhcmFtIHdpbiAtIFRoZSB3aW5kb3cgdGhlIGFuY2hvciBsaXZlcyBpbiAoYSBwb3Atb3V0IHdpbmRvdyBoYXMgaXRzIG93bikuXG4gKi9cbmZ1bmN0aW9uIHBvc2l0aW9uQXRBbmNob3IocG9wb3ZlckVsOiBIVE1MRWxlbWVudCwgYW5jaG9yOiBQb3BvdmVyQW5jaG9yLCB3aW46IFdpbmRvdyk6IHZvaWQge1xuICBjb25zdCBtYXhMZWZ0ID0gTWF0aC5tYXgoVklFV1BPUlRfTUFSR0lOX0lOX1BJWEVMUywgd2luLmlubmVyV2lkdGggLSBwb3BvdmVyRWwub2Zmc2V0V2lkdGggLSBWSUVXUE9SVF9NQVJHSU5fSU5fUElYRUxTKTtcbiAgY29uc3QgbWF4VG9wID0gTWF0aC5tYXgoVklFV1BPUlRfTUFSR0lOX0lOX1BJWEVMUywgd2luLmlubmVySGVpZ2h0IC0gcG9wb3ZlckVsLm9mZnNldEhlaWdodCAtIFZJRVdQT1JUX01BUkdJTl9JTl9QSVhFTFMpO1xuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLm1pbihNYXRoLm1heChhbmNob3IubGVmdCwgVklFV1BPUlRfTUFSR0lOX0lOX1BJWEVMUyksIG1heExlZnQpO1xuICBjb25zdCB0b3AgPSBNYXRoLm1pbihNYXRoLm1heChhbmNob3IuYm90dG9tICsgQU5DSE9SX0dBUF9JTl9QSVhFTFMsIFZJRVdQT1JUX01BUkdJTl9JTl9QSVhFTFMpLCBtYXhUb3ApO1xuXG4gIHBvcG92ZXJFbC5zdHlsZS5sZWZ0ID0gYCR7U3RyaW5nKE1hdGgucm91bmQobGVmdCArIHdpbi5zY3JvbGxYKSl9cHhgO1xuICBwb3BvdmVyRWwuc3R5bGUudG9wID0gYCR7U3RyaW5nKE1hdGgucm91bmQodG9wICsgd2luLnNjcm9sbFkpKX1weGA7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSxzQkFBd0I7QUFJeEIsMEJBQWtDO0FBQ2xDLHVCQUF5QjtBQUN6QixrQkFBa0I7QUFDbEIsNEJBQW9DO0FBS3BDLE1BQU0sdUJBQXVCO0FBTTdCLE1BQU0sNEJBQTRCO0FBeUVsQyxlQUFzQixZQUFtQixRQUF5RDtBQUNoRyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLE1BQU0sT0FBTztBQUNuQixRQUFNLFVBQU0sdUNBQWtCLEdBQUc7QUFDakMsUUFBTSxZQUFZLElBQUksS0FBSyxVQUFVLEVBQUUsS0FBSyxPQUFPLENBQUM7QUFDcEQsaURBQW9CLFdBQVcsQ0FBQywwQkFBUyxTQUFTLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUV0RSxTQUFPLE1BQU0sSUFBSSxRQUFzQixDQUFDLFlBQVk7QUFDbEQsVUFBTSxRQUFRLEVBQUUsVUFBVSxNQUFNO0FBRWhDLGFBQVMsTUFBTSxRQUE0QjtBQUN6QyxVQUFJLE1BQU0sVUFBVTtBQUNsQjtBQUFBLE1BQ0Y7QUFDQSxZQUFNLFdBQVc7QUFDakIsVUFBSSxvQkFBb0IsZUFBZSxtQkFBbUIsSUFBSTtBQUM5RCxnQkFBVSxPQUFPO0FBQ2pCLGNBQVEsTUFBTTtBQUFBLElBQ2hCO0FBRUEsYUFBUyxlQUFxQjtBQUM1QixZQUFNLElBQUk7QUFBQSxJQUNaO0FBRUEsYUFBUyxXQUFpQjtBQUN4QixZQUFNLFNBQVMsQ0FBQztBQUFBLElBQ2xCO0FBU0EsYUFBUyxrQkFBa0IsS0FBeUI7QUFDbEQsVUFBSSxJQUFJLGFBQWEsRUFBRSxTQUFTLFNBQVMsR0FBRztBQUMxQztBQUFBLE1BQ0Y7QUFDQSxZQUFNLElBQUk7QUFBQSxJQUNaO0FBRUEsVUFBTSxXQUFXLE1BQU07QUFBQSxNQUNyQixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsTUFDVCxXQUFXO0FBQUEsSUFDYixDQUFDO0FBRUQsY0FBVSxpQkFBaUIsV0FBVyxDQUFDLFFBQXVCO0FBQzVELFVBQUksSUFBSSxRQUFRLFNBQVM7QUFDdkIsWUFBSSxlQUFlO0FBQ25CLGlCQUFTO0FBQ1Q7QUFBQSxNQUNGO0FBRUEsVUFBSSxJQUFJLFFBQVEsVUFBVTtBQUN4QixZQUFJLGVBQWU7QUFDbkIscUJBQWE7QUFBQSxNQUNmO0FBQUEsSUFDRixDQUFDO0FBRUQsVUFBTSxpQkFBaUIsSUFBSSx3QkFBUSxTQUFTO0FBQzVDLG1CQUFlLFVBQVUsQ0FBQyxXQUFXO0FBQ25DLGFBQ0csY0FBYyxvQkFBZ0IsZUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsUUFBUSxFQUFFLENBQUMsRUFDckUsT0FBTyxFQUNQLFNBQVMsMEJBQVMsUUFBUSxFQUMxQixRQUFRLFFBQVE7QUFBQSxJQUNyQixDQUFDO0FBQ0QsbUJBQWUsVUFBVSxDQUFDLFdBQVc7QUFDbkMsYUFDRyxjQUFjLHdCQUFvQixlQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixRQUFRLE1BQU0sQ0FBQyxFQUM3RSxTQUFTLDBCQUFTLFlBQVksRUFDOUIsUUFBUSxZQUFZO0FBQUEsSUFDekIsQ0FBQztBQUVELFFBQUksaUJBQWlCLGVBQWUsbUJBQW1CLElBQUk7QUFDM0QscUJBQWlCLFdBQVcsUUFBUSxHQUFHO0FBQ3ZDLG9CQUFnQixTQUFTO0FBQUEsRUFDM0IsQ0FBQztBQUNIO0FBT0EsU0FBUyxnQkFBZ0IsV0FBOEI7QUFDckQsUUFBTSxVQUFVLFVBQVUsY0FBYyxPQUFPO0FBQy9DLE1BQUksQ0FBQyxTQUFTO0FBQ1o7QUFBQSxFQUNGO0FBRUEsVUFBUSxNQUFNO0FBQ2QsVUFBUSxPQUFPO0FBQ2pCO0FBV0EsU0FBUyxpQkFBaUIsV0FBd0IsUUFBdUIsS0FBbUI7QUFDMUYsUUFBTSxVQUFVLEtBQUssSUFBSSwyQkFBMkIsSUFBSSxhQUFhLFVBQVUsY0FBYyx5QkFBeUI7QUFDdEgsUUFBTSxTQUFTLEtBQUssSUFBSSwyQkFBMkIsSUFBSSxjQUFjLFVBQVUsZUFBZSx5QkFBeUI7QUFFdkgsUUFBTSxPQUFPLEtBQUssSUFBSSxLQUFLLElBQUksT0FBTyxNQUFNLHlCQUF5QixHQUFHLE9BQU87QUFDL0UsUUFBTSxNQUFNLEtBQUssSUFBSSxLQUFLLElBQUksT0FBTyxTQUFTLHNCQUFzQix5QkFBeUIsR0FBRyxNQUFNO0FBRXRHLFlBQVUsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLE1BQU0sT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFLFlBQVUsTUFBTSxNQUFNLEdBQUcsT0FBTyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/// <reference path="../../library.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* A small floating panel anchored at a point, collecting a value and resolving a promise with it.
|
|
6
|
+
*
|
|
7
|
+
* This is the popover counterpart of `modals/modal.ts`: the same "ask the user for a value, resolve a
|
|
8
|
+
* promise" shape, for the cases a modal cannot serve. A modal dims the screen and is positioned by
|
|
9
|
+
* Obsidian, neither of which suits an editor that must appear *at* the thing it edits — a clicked
|
|
10
|
+
* link, the caret, or wherever a context menu was raised.
|
|
11
|
+
*
|
|
12
|
+
* The panel rides Obsidian's `.menu` class for its background, border and shadow, so only layout is
|
|
13
|
+
* styled by this library.
|
|
14
|
+
*/
|
|
15
|
+
import type { PopoverAnchor } from './popover-anchor.cjs';
|
|
16
|
+
/**
|
|
17
|
+
* Reads the value the popover resolves with when it is confirmed.
|
|
18
|
+
*
|
|
19
|
+
* @typeParam Value - The type of the value resolved by the popover.
|
|
20
|
+
* @returns The current value.
|
|
21
|
+
*/
|
|
22
|
+
export type PopoverValueGetter<Value> = (this: void) => Value;
|
|
23
|
+
/**
|
|
24
|
+
* The tools handed to {@link ShowPopoverParams.build} for populating a popover.
|
|
25
|
+
*/
|
|
26
|
+
export interface ShowPopoverBuildParams {
|
|
27
|
+
/**
|
|
28
|
+
* Dismisses the popover, resolving it with `null`, as the Cancel button does.
|
|
29
|
+
*/
|
|
30
|
+
cancel(this: void): void;
|
|
31
|
+
/**
|
|
32
|
+
* Confirms the popover, resolving it with the built value, as the OK button does.
|
|
33
|
+
*/
|
|
34
|
+
confirm(this: void): void;
|
|
35
|
+
/**
|
|
36
|
+
* The element to add the popover's content to. The OK and Cancel buttons are appended after it.
|
|
37
|
+
*/
|
|
38
|
+
readonly contentEl: HTMLElement;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parameters for {@link showPopover}.
|
|
42
|
+
*
|
|
43
|
+
* @typeParam Value - The type of the value resolved by the popover.
|
|
44
|
+
*/
|
|
45
|
+
export interface ShowPopoverParams<Value> {
|
|
46
|
+
/**
|
|
47
|
+
* Where to place the popover.
|
|
48
|
+
*/
|
|
49
|
+
readonly anchor: PopoverAnchor;
|
|
50
|
+
/**
|
|
51
|
+
* Populates the popover's content.
|
|
52
|
+
*
|
|
53
|
+
* @param params - The tools for populating the popover.
|
|
54
|
+
* @returns A getter read when the popover is confirmed.
|
|
55
|
+
*/
|
|
56
|
+
build(this: void, params: ShowPopoverBuildParams): PopoverValueGetter<Value>;
|
|
57
|
+
/**
|
|
58
|
+
* A text for the "Cancel" button.
|
|
59
|
+
*/
|
|
60
|
+
readonly cancelButtonText?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Additional CSS classes to apply to the popover.
|
|
63
|
+
*/
|
|
64
|
+
readonly cssClasses?: string[];
|
|
65
|
+
/**
|
|
66
|
+
* A text for the "OK" button.
|
|
67
|
+
*/
|
|
68
|
+
readonly okButtonText?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Displays a popover at the given anchor and resolves with the built value, or `null` if it was
|
|
72
|
+
* dismissed without confirming.
|
|
73
|
+
*
|
|
74
|
+
* @typeParam Value - The type of the value resolved by the popover.
|
|
75
|
+
* @param params - The parameters for the popover.
|
|
76
|
+
* @returns A {@link Promise} that resolves with the built value, or `null` if dismissed.
|
|
77
|
+
*/
|
|
78
|
+
export declare function showPopover<Value>(params: ShowPopoverParams<Value>): Promise<null | Value>;
|