@mnaoumov/obsidian-lib 10.8.0 → 10.9.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 +4 -0
- package/dist/lib/cjs/__merged.cjs +15 -1
- package/dist/lib/cjs/__merged.d.cts +3 -1
- package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
- package/dist/lib/cjs/community-plugins.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
- package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
- package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
- package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
- package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +15 -4
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
- package/dist/lib/cjs/folder-note.cjs +5 -5
- package/dist/lib/cjs/formula-function.cjs +152 -0
- package/dist/lib/cjs/formula-function.d.cts +98 -0
- package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/index.cjs +7 -1
- package/dist/lib/cjs/index.d.cts +2 -0
- package/dist/lib/cjs/link.cjs +12 -12
- package/dist/lib/cjs/markdown.cjs +7 -7
- package/dist/lib/cjs/vault.cjs +2 -2
- package/dist/lib/cjs/virtual-file.cjs +340 -0
- package/dist/lib/cjs/virtual-file.d.cts +48 -0
- package/dist/lib/esm/__merged.d.mts +3 -1
- package/dist/lib/esm/__merged.mjs +18 -2
- package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
- package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
- package/dist/lib/esm/community-plugins.mjs +2 -2
- package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
- package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
- package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
- package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
- package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
- package/dist/lib/esm/data-stores/shared-data-store.mjs +15 -4
- package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
- package/dist/lib/esm/folder-note.mjs +5 -5
- package/dist/lib/esm/formula-function.d.mts +98 -0
- package/dist/lib/esm/formula-function.mjs +62 -0
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/index.d.mts +2 -0
- package/dist/lib/esm/index.mjs +5 -1
- package/dist/lib/esm/link.mjs +12 -12
- package/dist/lib/esm/markdown.mjs +7 -7
- package/dist/lib/esm/vault.mjs +2 -2
- package/dist/lib/esm/virtual-file.d.mts +48 -0
- package/dist/lib/esm/virtual-file.mjs +264 -0
- package/package.json +5 -5
|
@@ -0,0 +1,264 @@
|
|
|
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 ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
7
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
|
|
8
|
+
symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function ensureBrowserProcess() {
|
|
12
|
+
const browserProcess = {
|
|
13
|
+
browser: true,
|
|
14
|
+
cwd() {
|
|
15
|
+
return "/";
|
|
16
|
+
},
|
|
17
|
+
env: {},
|
|
18
|
+
platform: "android"
|
|
19
|
+
};
|
|
20
|
+
const existingProcess = globalThis.process;
|
|
21
|
+
if (!existingProcess) {
|
|
22
|
+
globalThis.process = browserProcess;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (existingProcess.versions?.node) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const existingProcessRecord = existingProcess;
|
|
29
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
30
|
+
existingProcessRecord[key] ??= value;
|
|
31
|
+
}
|
|
32
|
+
existingProcessRecord["browser"] = true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
ensureDisposeSymbols();
|
|
36
|
+
ensureBrowserProcess();
|
|
37
|
+
})();
|
|
38
|
+
|
|
39
|
+
import {
|
|
40
|
+
EditorState,
|
|
41
|
+
StateEffect
|
|
42
|
+
} from "@codemirror/state";
|
|
43
|
+
import {
|
|
44
|
+
CallbackDisposable,
|
|
45
|
+
MultipleDisposeBehavior
|
|
46
|
+
} from "@mnaoumov/typescript-lib/disposable";
|
|
47
|
+
import { parentFolderPath } from "@obsidian-typings/obsidian-public-latest/implementations";
|
|
48
|
+
import {
|
|
49
|
+
MarkdownView,
|
|
50
|
+
normalizePath
|
|
51
|
+
} from "obsidian";
|
|
52
|
+
import { MonkeyAroundComponent } from "./components/monkey-around-component.mjs";
|
|
53
|
+
import { toggleEditorReadOnly } from "./editor.mjs";
|
|
54
|
+
import { getFile } from "./file-system.mjs";
|
|
55
|
+
import {
|
|
56
|
+
parseMetadata,
|
|
57
|
+
registerFileCacheForNonExistingFile
|
|
58
|
+
} from "./metadata-cache.mjs";
|
|
59
|
+
import { getObsidianLibState } from "./obsidian-lib-state.mjs";
|
|
60
|
+
async function registerVirtualFile(params) {
|
|
61
|
+
const { app, content } = params;
|
|
62
|
+
const path = normalizePath(params.path);
|
|
63
|
+
if (!path || path === "/" || params.path.split(/[\\/]/).some((part) => part === "." || part === "..") || /^[\\/]|:/.test(params.path)) {
|
|
64
|
+
throw new Error("A virtual file requires a vault-relative file path");
|
|
65
|
+
}
|
|
66
|
+
const reservations = getObsidianLibState("virtualFilePathsV1", /* @__PURE__ */ new Set()).value;
|
|
67
|
+
const key = path.toLowerCase();
|
|
68
|
+
if (reservations.has(key) || app.vault.getAbstractFileByPathInsensitive(path)) {
|
|
69
|
+
throw new Error(`File already exists: ${path}`);
|
|
70
|
+
}
|
|
71
|
+
const parent = parentFolderPath(path);
|
|
72
|
+
if (parent && parent !== "/" && !app.vault.getFolderByPath(parent)) {
|
|
73
|
+
throw new Error(`Parent folder does not exist: ${parent}`);
|
|
74
|
+
}
|
|
75
|
+
reservations.add(key);
|
|
76
|
+
try {
|
|
77
|
+
if (await app.vault.adapter.exists(path)) {
|
|
78
|
+
throw new Error(`File already exists: ${path}`);
|
|
79
|
+
}
|
|
80
|
+
const cache = path.endsWith(".md") ? await parseMetadata(app, content) : {};
|
|
81
|
+
if (app.vault.getAbstractFileByPathInsensitive(path)) {
|
|
82
|
+
throw new Error(`File already exists: ${path}`);
|
|
83
|
+
}
|
|
84
|
+
return installVirtualFile({ app, cache, content, path, reservations });
|
|
85
|
+
} catch (error) {
|
|
86
|
+
reservations.delete(key);
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function installVirtualFile(params) {
|
|
91
|
+
const { app, cache, content, path, reservations } = params;
|
|
92
|
+
const file = getFile({ app, pathOrFile: path, shouldIncludeNonExisting: true });
|
|
93
|
+
const bytes = new TextEncoder().encode(content);
|
|
94
|
+
file.stat = { ctime: Date.now(), mtime: Date.now(), size: bytes.byteLength };
|
|
95
|
+
const url = window.URL.createObjectURL(new Blob([bytes], { type: path.endsWith(".md") ? "text/markdown;charset=utf-8" : "text/plain;charset=utf-8" }));
|
|
96
|
+
const patches = new MonkeyAroundComponent();
|
|
97
|
+
patches.load();
|
|
98
|
+
const metadata = registerFileCacheForNonExistingFile({ app, cache, pathOrFile: file });
|
|
99
|
+
app.vault.fileMap[path] = file;
|
|
100
|
+
app.metadataCache.uniqueFileLookup.add(file.name.toLowerCase(), file);
|
|
101
|
+
patches.registerMethodPatch({ $object: app.vault, methodName: "read", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(content) : fallback() });
|
|
102
|
+
patches.registerMethodPatch({ $object: app.vault, methodName: "cachedRead", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(content) : fallback() });
|
|
103
|
+
patches.registerMethodPatch({ $object: app.vault, methodName: "readBinary", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(new Uint8Array(bytes).buffer) : fallback() });
|
|
104
|
+
patches.registerMethodPatch({ $object: app.vault, methodName: "getResourcePath", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? url : fallback() });
|
|
105
|
+
patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "read", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? Promise.resolve(content) : fallback() });
|
|
106
|
+
patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "readBinary", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? Promise.resolve(new Uint8Array(bytes).buffer) : fallback() });
|
|
107
|
+
patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "getResourcePath", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? url : fallback() });
|
|
108
|
+
for (const methodName of ["append", "appendBinary", "modify", "modifyBinary", "process", "delete", "trash"]) {
|
|
109
|
+
patches.registerMethodPatch({
|
|
110
|
+
$object: app.vault,
|
|
111
|
+
methodName,
|
|
112
|
+
patchHandler: ({ fallback, originalArguments: [target] }) => {
|
|
113
|
+
assertWritable(target.path);
|
|
114
|
+
return fallback();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
patches.registerMethodPatch({
|
|
119
|
+
$object: app.vault,
|
|
120
|
+
methodName: "rename",
|
|
121
|
+
patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
|
|
122
|
+
assertWritable(target.path);
|
|
123
|
+
assertWritable(destination);
|
|
124
|
+
return fallback();
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
for (const methodName of ["create", "createBinary", "createFolder"]) {
|
|
128
|
+
patches.registerMethodPatch({
|
|
129
|
+
$object: app.vault,
|
|
130
|
+
methodName,
|
|
131
|
+
patchHandler: ({ fallback, originalArguments: [target] }) => {
|
|
132
|
+
assertWritable(target);
|
|
133
|
+
return fallback();
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
patches.registerMethodPatch({
|
|
138
|
+
$object: app.vault,
|
|
139
|
+
methodName: "copy",
|
|
140
|
+
patchHandler: ({ fallback, originalArguments: [, destination] }) => {
|
|
141
|
+
assertWritable(destination);
|
|
142
|
+
return fallback();
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
for (const methodName of ["write", "writeBinary", "append", "appendBinary", "process", "remove", "rmdir", "trashLocal", "trashSystem", "mkdir"]) {
|
|
146
|
+
patches.registerMethodPatch({
|
|
147
|
+
$object: app.vault.adapter,
|
|
148
|
+
methodName,
|
|
149
|
+
patchHandler: ({ fallback, originalArguments: [target] }) => {
|
|
150
|
+
assertWritable(target);
|
|
151
|
+
return fallback();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
patches.registerMethodPatch({
|
|
156
|
+
$object: app.vault.adapter,
|
|
157
|
+
methodName: "rename",
|
|
158
|
+
patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
|
|
159
|
+
assertWritable(target);
|
|
160
|
+
assertWritable(destination);
|
|
161
|
+
return fallback();
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
patches.registerMethodPatch({
|
|
165
|
+
$object: app.vault.adapter,
|
|
166
|
+
methodName: "copy",
|
|
167
|
+
patchHandler: ({ fallback, originalArguments: [, destination] }) => {
|
|
168
|
+
assertWritable(destination);
|
|
169
|
+
return fallback();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
patches.registerMethodPatch({
|
|
173
|
+
$object: app.fileManager,
|
|
174
|
+
methodName: "renameFile",
|
|
175
|
+
patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
|
|
176
|
+
assertWritable(target.path);
|
|
177
|
+
assertWritable(destination);
|
|
178
|
+
return fallback();
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
patches.registerMethodPatch({
|
|
182
|
+
$object: app.fileManager,
|
|
183
|
+
methodName: "trashFile",
|
|
184
|
+
patchHandler: ({ fallback, originalArguments: [target] }) => {
|
|
185
|
+
assertWritable(target.path);
|
|
186
|
+
return fallback();
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
patches.registerMethodPatch({
|
|
190
|
+
$object: MarkdownView.prototype,
|
|
191
|
+
methodName: "setViewData",
|
|
192
|
+
patchHandler: ({ fallback, originalThis }) => {
|
|
193
|
+
fallback();
|
|
194
|
+
if (originalThis.file === file) {
|
|
195
|
+
protectEditor(originalThis);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
patches.registerMethodPatch({
|
|
200
|
+
$object: MarkdownView.prototype,
|
|
201
|
+
methodName: "onLoadFile",
|
|
202
|
+
patchHandler: async ({ fallback, originalThis }) => {
|
|
203
|
+
await fallback();
|
|
204
|
+
if (originalThis.file === file) {
|
|
205
|
+
protectEditor(originalThis);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
patches.registerMethodPatch({
|
|
210
|
+
$object: MarkdownView.prototype,
|
|
211
|
+
methodName: "setMode",
|
|
212
|
+
patchHandler: async ({ fallback, originalThis }) => {
|
|
213
|
+
const result = await fallback();
|
|
214
|
+
if (originalThis.file === file) {
|
|
215
|
+
protectEditor(originalThis);
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
const disposable = new CallbackDisposable({
|
|
221
|
+
callback: () => {
|
|
222
|
+
app.workspace.iterateAllLeaves((leaf) => {
|
|
223
|
+
if ("file" in leaf.view && leaf.view.file === file) {
|
|
224
|
+
leaf.detach();
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
app.metadataCache.uniqueFileLookup.remove(file.name.toLowerCase(), file);
|
|
228
|
+
if (app.vault.fileMap[path] === file) {
|
|
229
|
+
Reflect.deleteProperty(app.vault.fileMap, path);
|
|
230
|
+
metadata[Symbol.dispose]();
|
|
231
|
+
}
|
|
232
|
+
patches.unload();
|
|
233
|
+
window.URL.revokeObjectURL(url);
|
|
234
|
+
reservations.delete(path.toLowerCase());
|
|
235
|
+
},
|
|
236
|
+
multipleDisposeBehavior: MultipleDisposeBehavior.Ignore
|
|
237
|
+
});
|
|
238
|
+
return {
|
|
239
|
+
content,
|
|
240
|
+
file,
|
|
241
|
+
[Symbol.dispose]: () => {
|
|
242
|
+
disposable[Symbol.dispose]();
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
function isMatching(target) {
|
|
246
|
+
return normalizePath(target).toLowerCase() === path.toLowerCase();
|
|
247
|
+
}
|
|
248
|
+
function protectEditor(view) {
|
|
249
|
+
toggleEditorReadOnly(view.editor, true);
|
|
250
|
+
view.editor.cm.dispatch({
|
|
251
|
+
effects: StateEffect.appendConfig.of(EditorState.changeFilter.of(() => view.file !== file))
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function assertWritable(target) {
|
|
255
|
+
const normalized = normalizePath(target).toLowerCase();
|
|
256
|
+
if (isMatching(target) || path.toLowerCase().startsWith(`${normalized}/`) || normalized === "/") {
|
|
257
|
+
throw new Error(`Virtual file is read-only: ${path}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
export {
|
|
262
|
+
registerVirtualFile
|
|
263
|
+
};
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92aXJ0dWFsLWZpbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICogRGlzcG9zYWJsZSwgcmVhZC1vbmx5IGZpbGVzIGJhY2tlZCBieSBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgdmF1bHQgYWRhcHRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBFZGl0b3JTdGF0ZSxcbiAgU3RhdGVFZmZlY3Rcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBub3JtYWxpemVQYXRoXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHRvZ2dsZUVkaXRvclJlYWRPbmx5IH0gZnJvbSAnLi9lZGl0b3IudHMnO1xuaW1wb3J0IHsgZ2V0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGVcbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuXG4vKipcblBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlclZpcnR1YWxGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclZpcnR1YWxGaWxlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBhcHAgd2hvc2UgcmVzb2x2ZXIgYW5kIHJlYWQgbWV0aG9kcyBzZXJ2ZSB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgSW1tdXRhYmxlIFVURi04IHRleHQsIGFsc28gYXZhaWxhYmxlIHN5bmNocm9ub3VzbHkgb24gdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbiAgLyoqXG4gIFVub2NjdXBpZWQgdmF1bHQtcmVsYXRpdmUgZmlsZSBwYXRoIGluIGFuIGV4aXN0aW5nIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG5BIG1lbW9yeSBmaWxlIGFuZCBpdHMgbGlmZXRpbWUuIERpc3Bvc2UgaXQgYmVmb3JlIGl0cyBvd25pbmcgcGx1Z2luIHVubG9hZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbEZpbGUgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gIFRoZSBpbW11dGFibGUgdGV4dDsgYWNjZXNzaW5nIGl0IHJlcXVpcmVzIG5vIGFzeW5jaHJvbm91cyByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICAvKipcbiAgVGhlIGZpbGUgYWNjZXB0ZWQgYnkgT2JzaWRpYW4ncyBsaW5rIHJlc29sdmVyIGFuZCBmaWxlIHZpZXdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogVEZpbGU7XG59XG5cbmludGVyZmFjZSBJbnN0YWxsVmlydHVhbEZpbGVQYXJhbXMgZXh0ZW5kcyBSZWdpc3RlclZpcnR1YWxGaWxlUGFyYW1zIHtcbiAgcmVhZG9ubHkgY2FjaGU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VNZXRhZGF0YT4+IHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuICByZWFkb25seSByZXNlcnZhdGlvbnM6IFNldDxzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBpbW11dGFibGUgdGV4dCBhcyBhIGZpbGUgd2l0aG91dCB3cml0aW5nIHRvIHRoZSBhZGFwdGVyLlxuICpcbiAqIFRoZSBwYXJlbnQgZm9sZGVyIG11c3QgZXhpc3QuIE1hcmtkb3duIHZpZXdzIGFyZSByZWFkLW9ubHk7IHZhdWx0IGFuZCBhZGFwdGVyIG11dGF0aW9ucyBvZiB0aGVcbiAqIHBhdGggb3IgaXRzIGFuY2VzdG9ycyB0aHJvdy4gUmF3IGZpbGVzeXN0ZW0gYWNjZXNzIGFuZCB0aGlyZC1wYXJ0eSB2aWV3cyBhcmUgb3V0c2lkZSB0aGlzIGNvbnRyYWN0LlxuICogUmVzb3VyY2UgVVJMcyB1c2UgVVRGLTggYmxvYnMuIERpc3Bvc2luZyBjbG9zZXMgdmlld3Mgb2YgdGhpcyBmaWxlIGFuZCByZXZva2VzIGl0cyBVUkwuIE5vIGNyZWF0ZVxuICogb3IgZGVsZXRlIGV2ZW50cyBhcmUgZW1pdHRlZCwgc28gaW5kZXhlcnMgYW5kIHN5bmNocm9uaXphdGlvbiBuZXZlciB0cmVhdCBpdCBhcyBhIHBlcnNpc3RlZCBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgYXBwLCBwYXRoIGFuZCBpbW11dGFibGUgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIGZpbGUsIHN5bmNocm9ub3VzIGNvbnRlbnQgYW5kIGlkZW1wb3RlbnQgZGlzcG9zYWwgY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlclZpcnR1YWxGaWxlKHBhcmFtczogUmVnaXN0ZXJWaXJ0dWFsRmlsZVBhcmFtcyk6IFByb21pc2U8VmlydHVhbEZpbGU+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgY29uc3QgcGF0aCA9IG5vcm1hbGl6ZVBhdGgocGFyYW1zLnBhdGgpO1xuICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gJy8nIHx8IHBhcmFtcy5wYXRoLnNwbGl0KC9bXFxcXC9dLykuc29tZSgocGFydCkgPT4gcGFydCA9PT0gJy4nIHx8IHBhcnQgPT09ICcuLicpIHx8IC9eW1xcXFwvXXw6Ly50ZXN0KHBhcmFtcy5wYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQSB2aXJ0dWFsIGZpbGUgcmVxdWlyZXMgYSB2YXVsdC1yZWxhdGl2ZSBmaWxlIHBhdGgnKTtcbiAgfVxuICBjb25zdCByZXNlcnZhdGlvbnMgPSBnZXRPYnNpZGlhbkxpYlN0YXRlKCd2aXJ0dWFsRmlsZVBhdGhzVjEnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gIGNvbnN0IGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJlc2VydmF0aW9ucy5oYXMoa2V5KSB8fCBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoSW5zZW5zaXRpdmUocGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgfVxuICBjb25zdCBwYXJlbnQgPSBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpO1xuICBpZiAocGFyZW50ICYmIHBhcmVudCAhPT0gJy8nICYmICFhcHAudmF1bHQuZ2V0Rm9sZGVyQnlQYXRoKHBhcmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBmb2xkZXIgZG9lcyBub3QgZXhpc3Q6ICR7cGFyZW50fWApO1xuICB9XG4gIHJlc2VydmF0aW9ucy5hZGQoa2V5KTtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSBwYXRoLmVuZHNXaXRoKCcubWQnKSA/IGF3YWl0IHBhcnNlTWV0YWRhdGEoYXBwLCBjb250ZW50KSA6IHt9O1xuICAgIC8vIFJlY2hlY2sgYWZ0ZXIgYXN5bmNocm9ub3VzIHdvcmssIGJlZm9yZSBwdWJsaXNoaW5nIGFueXRoaW5nIHRvIHRoZSByZXNvbHZlci5cbiAgICBpZiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aEluc2Vuc2l0aXZlKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbGxWaXJ0dWFsRmlsZSh7IGFwcCwgY2FjaGUsIGNvbnRlbnQsIHBhdGgsIHJlc2VydmF0aW9ucyB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXNlcnZhdGlvbnMuZGVsZXRlKGtleSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbFZpcnR1YWxGaWxlKHBhcmFtczogSW5zdGFsbFZpcnR1YWxGaWxlUGFyYW1zKTogVmlydHVhbEZpbGUge1xuICBjb25zdCB7IGFwcCwgY2FjaGUsIGNvbnRlbnQsIHBhdGgsIHJlc2VydmF0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjb250ZW50KTtcbiAgZmlsZS5zdGF0ID0geyBjdGltZTogRGF0ZS5ub3coKSwgbXRpbWU6IERhdGUubm93KCksIHNpemU6IGJ5dGVzLmJ5dGVMZW5ndGggfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGlzIGlzIHRoZSBicm93c2VyJ3MgQmxvYiBVUkwgQVBJIGluIE9ic2lkaWFuLCBub3QgTm9kZSdzIGltcGxlbWVudGF0aW9uLlxuICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYnl0ZXNdLCB7IHR5cGU6IHBhdGguZW5kc1dpdGgoJy5tZCcpID8gJ3RleHQvbWFya2Rvd247Y2hhcnNldD11dGYtOCcgOiAndGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04JyB9KSk7XG4gIGNvbnN0IHBhdGNoZXMgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gIHBhdGNoZXMubG9hZCgpO1xuICBjb25zdCBtZXRhZGF0YSA9IHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZTogZmlsZSB9KTtcbiAgYXBwLnZhdWx0LmZpbGVNYXBbcGF0aF0gPSBmaWxlO1xuICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG5cbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LCBtZXRob2ROYW1lOiAncmVhZCcsIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB0YXJnZXQgPT09IGZpbGUgPyBQcm9taXNlLnJlc29sdmUoY29udGVudCkgOiBmYWxsYmFjaygpIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goeyAkb2JqZWN0OiBhcHAudmF1bHQsIG1ldGhvZE5hbWU6ICdjYWNoZWRSZWFkJywgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHRhcmdldCA9PT0gZmlsZSA/IFByb21pc2UucmVzb2x2ZShjb250ZW50KSA6IGZhbGxiYWNrKCkgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7ICRvYmplY3Q6IGFwcC52YXVsdCwgbWV0aG9kTmFtZTogJ3JlYWRCaW5hcnknLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gdGFyZ2V0ID09PSBmaWxlID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXIpIDogZmFsbGJhY2soKSB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LCBtZXRob2ROYW1lOiAnZ2V0UmVzb3VyY2VQYXRoJywgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHRhcmdldCA9PT0gZmlsZSA/IHVybCA6IGZhbGxiYWNrKCkgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7ICRvYmplY3Q6IGFwcC52YXVsdC5hZGFwdGVyLCBtZXRob2ROYW1lOiAncmVhZCcsIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiBpc01hdGNoaW5nKHRhcmdldCkgPyBQcm9taXNlLnJlc29sdmUoY29udGVudCkgOiBmYWxsYmFjaygpIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goeyAkb2JqZWN0OiBhcHAudmF1bHQuYWRhcHRlciwgbWV0aG9kTmFtZTogJ3JlYWRCaW5hcnknLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gaXNNYXRjaGluZyh0YXJnZXQpID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXIpIDogZmFsbGJhY2soKSB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LmFkYXB0ZXIsIG1ldGhvZE5hbWU6ICdnZXRSZXNvdXJjZVBhdGgnLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gaXNNYXRjaGluZyh0YXJnZXQpID8gdXJsIDogZmFsbGJhY2soKSB9KTtcblxuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgWydhcHBlbmQnLCAnYXBwZW5kQmluYXJ5JywgJ21vZGlmeScsICdtb2RpZnlCaW5hcnknLCAncHJvY2VzcycsICdkZWxldGUnLCAndHJhc2gnXSBhcyBjb25zdCkge1xuICAgIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiBhcHAudmF1bHQsXG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGFibGUodGFyZ2V0LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC52YXVsdCxcbiAgICBtZXRob2ROYW1lOiAncmVuYW1lJyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldCwgZGVzdGluYXRpb25dIH0pID0+IHtcbiAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldC5wYXRoKTtcbiAgICAgIGFzc2VydFdyaXRhYmxlKGRlc3RpbmF0aW9uKTtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBbJ2NyZWF0ZScsICdjcmVhdGVCaW5hcnknLCAnY3JlYXRlRm9sZGVyJ10gYXMgY29uc3QpIHtcbiAgICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogYXBwLnZhdWx0LFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogYXBwLnZhdWx0LFxuICAgIG1ldGhvZE5hbWU6ICdjb3B5JyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogWywgZGVzdGluYXRpb25dIH0pID0+IHtcbiAgICAgIGFzc2VydFdyaXRhYmxlKGRlc3RpbmF0aW9uKTtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBbJ3dyaXRlJywgJ3dyaXRlQmluYXJ5JywgJ2FwcGVuZCcsICdhcHBlbmRCaW5hcnknLCAncHJvY2VzcycsICdyZW1vdmUnLCAncm1kaXInLCAndHJhc2hMb2NhbCcsICd0cmFzaFN5c3RlbScsICdta2RpciddIGFzIGNvbnN0KSB7XG4gICAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IGFwcC52YXVsdC5hZGFwdGVyLFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogYXBwLnZhdWx0LmFkYXB0ZXIsXG4gICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXQsIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZSh0YXJnZXQpO1xuICAgICAgYXNzZXJ0V3JpdGFibGUoZGVzdGluYXRpb24pO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAkb2JqZWN0OiBhcHAudmF1bHQuYWRhcHRlcixcbiAgICBtZXRob2ROYW1lOiAnY29weScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFssIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZShkZXN0aW5hdGlvbik7XG4gICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC5maWxlTWFuYWdlcixcbiAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXQsIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZSh0YXJnZXQucGF0aCk7XG4gICAgICBhc3NlcnRXcml0YWJsZShkZXN0aW5hdGlvbik7XG4gICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC5maWxlTWFuYWdlcixcbiAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4ge1xuICAgICAgYXNzZXJ0V3JpdGFibGUodGFyZ2V0LnBhdGgpO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAkb2JqZWN0OiBNYXJrZG93blZpZXcucHJvdG90eXBlLFxuICAgIG1ldGhvZE5hbWU6ICdzZXRWaWV3RGF0YScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogTWFya2Rvd25WaWV3LnByb3RvdHlwZSxcbiAgICBtZXRob2ROYW1lOiAnb25Mb2FkRmlsZScsXG4gICAgcGF0Y2hIYW5kbGVyOiBhc3luYyAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogTWFya2Rvd25WaWV3LnByb3RvdHlwZSxcbiAgICBtZXRob2ROYW1lOiAnc2V0TW9kZScsXG4gICAgcGF0Y2hIYW5kbGVyOiBhc3luYyAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAtLSBPYnNpZGlhbiByZXR1cm5zIGEgYm9vbGVhbiBkZXNwaXRlIGl0cyB2b2lkIGRlY2xhcmF0aW9uOyBzZXRTdGF0ZSBjb25zdW1lcyB0aGF0IHJlc3VsdC5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGRpc3Bvc2FibGUgPSBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XG4gICAgICAgIGlmICgnZmlsZScgaW4gbGVhZi52aWV3ICYmIGxlYWYudmlldy5maWxlID09PSBmaWxlKSB7XG4gICAgICAgICAgbGVhZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLnJlbW92ZShmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICBpZiAoYXBwLnZhdWx0LmZpbGVNYXBbcGF0aF0gPT09IGZpbGUpIHtcbiAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShhcHAudmF1bHQuZmlsZU1hcCwgcGF0aCk7XG4gICAgICAgIG1ldGFkYXRhW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgICAgfVxuICAgICAgcGF0Y2hlcy51bmxvYWQoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlIFVSTCBiZWxvbmdzIHRvIHRoZSBicm93c2VyIHJlYWxtIHRoYXQgY3JlYXRlZCBpdC5cbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICByZXNlcnZhdGlvbnMuZGVsZXRlKHBhdGgudG9Mb3dlckNhc2UoKSk7XG4gICAgfSxcbiAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQsXG4gICAgZmlsZSxcbiAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICBkaXNwb3NhYmxlW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBpc01hdGNoaW5nKHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgodGFyZ2V0KS50b0xvd2VyQ2FzZSgpID09PSBwYXRoLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBwcm90ZWN0RWRpdG9yKHZpZXc6IE1hcmtkb3duVmlldyk6IHZvaWQge1xuICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAvLyBBIHZpcnR1YWwgZmlsZSBpcyBpbW11dGFibGUgZXZlbiB0byBwcm9ncmFtbWF0aWMgZWRpdG9yIHRyYW5zYWN0aW9ucy4gVGhlIG9yZGluYXJ5IHJlc291cmNlXG4gICAgLy8gbG9jayBwZXJtaXRzIHRob3NlIGZvciByb2xsYmFjazsgdGhpcyByZWdpc3RyYXRpb24gaGFzIG5vIHdyaXRhYmxlIGJ1ZmZlciB0byByb2xsIGJhY2suXG4gICAgdmlldy5lZGl0b3IuY20uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnLm9mKEVkaXRvclN0YXRlLmNoYW5nZUZpbHRlci5vZigoKSA9PiB2aWV3LmZpbGUgIT09IGZpbGUpKVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNzZXJ0V3JpdGFibGUodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aCh0YXJnZXQpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGlzTWF0Y2hpbmcodGFyZ2V0KSB8fCBwYXRoLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChgJHtub3JtYWxpemVkfS9gKSB8fCBub3JtYWxpemVkID09PSAnLycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmlydHVhbCBmaWxlIGlzIHJlYWQtb25seTogJHtwYXRofWApO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHdCQUF3QjtBQUNqQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsZUFBZTtBQUN4QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMkJBQTJCO0FBa0RwQyxlQUFzQixvQkFBb0IsUUFBeUQ7QUFDakcsUUFBTSxFQUFFLEtBQUssUUFBUSxJQUFJO0FBQ3pCLFFBQU0sT0FBTyxjQUFjLE9BQU8sSUFBSTtBQUN0QyxNQUFJLENBQUMsUUFBUSxTQUFTLE9BQU8sT0FBTyxLQUFLLE1BQU0sT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLFNBQVMsT0FBTyxTQUFTLElBQUksS0FBSyxXQUFXLEtBQUssT0FBTyxJQUFJLEdBQUc7QUFDckksVUFBTSxJQUFJLE1BQU0sb0RBQW9EO0FBQUEsRUFDdEU7QUFDQSxRQUFNLGVBQWUsb0JBQW9CLHNCQUFzQixvQkFBSSxJQUFZLENBQUMsRUFBRTtBQUNsRixRQUFNLE1BQU0sS0FBSyxZQUFZO0FBQzdCLE1BQUksYUFBYSxJQUFJLEdBQUcsS0FBSyxJQUFJLE1BQU0saUNBQWlDLElBQUksR0FBRztBQUM3RSxVQUFNLElBQUksTUFBTSx3QkFBd0IsSUFBSSxFQUFFO0FBQUEsRUFDaEQ7QUFDQSxRQUFNLFNBQVMsaUJBQWlCLElBQUk7QUFDcEMsTUFBSSxVQUFVLFdBQVcsT0FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mnaoumov/obsidian-lib",
|
|
3
|
-
"version": "10.
|
|
3
|
+
"version": "10.9.0",
|
|
4
4
|
"description": "Runtime library for Obsidian plugin development: plugin base classes, components, settings, modals, vault and metadata helpers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian",
|
|
@@ -390,10 +390,10 @@
|
|
|
390
390
|
"@commitlint/cli": "^21.2.2",
|
|
391
391
|
"@commitlint/config-conventional": "^21.2.2",
|
|
392
392
|
"@lezer/common": "1.5.2",
|
|
393
|
-
"@mnaoumov/obsidian-dev-toolkit": "^
|
|
394
|
-
"@mnaoumov/typescript-dev-toolkit": "^
|
|
393
|
+
"@mnaoumov/obsidian-dev-toolkit": "^8.2.1",
|
|
394
|
+
"@mnaoumov/typescript-dev-toolkit": "^6.1.0",
|
|
395
395
|
"@mnaoumov/typescript-test-toolkit": "^1.0.3",
|
|
396
|
-
"@obsidian-typings/obsidian-public-latest": "^6.
|
|
396
|
+
"@obsidian-typings/obsidian-public-latest": "^6.59.0",
|
|
397
397
|
"@resvg/resvg-js": "^2.6.2",
|
|
398
398
|
"@stryker-mutator/core": "^10.1.1",
|
|
399
399
|
"@stryker-mutator/vitest-runner": "^10.1.1",
|
|
@@ -437,7 +437,7 @@
|
|
|
437
437
|
"@codemirror/state": "^6.7.6",
|
|
438
438
|
"@codemirror/view": "^6.43.13",
|
|
439
439
|
"@lezer/common": "^1.5.2",
|
|
440
|
-
"@obsidian-typings/obsidian-public-latest": "^6.
|
|
440
|
+
"@obsidian-typings/obsidian-public-latest": "^6.58.0",
|
|
441
441
|
"obsidian": "^1.14.4",
|
|
442
442
|
"obsidian-integration-testing": "^17.7.4"
|
|
443
443
|
},
|