@mnaoumov/obsidian-lib 10.7.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.
Files changed (69) hide show
  1. package/README.md +4 -0
  2. package/data-stores/data-store-locations/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +18 -1
  4. package/dist/lib/cjs/__merged.d.cts +4 -1
  5. package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
  6. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
  7. package/dist/lib/cjs/community-plugins.cjs +2 -2
  8. package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
  9. package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
  10. package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
  11. package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
  12. package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
  13. package/dist/lib/cjs/data-stores/data-store-locations.cjs +248 -0
  14. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +60 -0
  15. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +2 -2
  16. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +1 -1
  17. package/dist/lib/cjs/data-stores/data-store-transport.cjs +126 -21
  18. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +38 -4
  19. package/dist/lib/cjs/data-stores/index.cjs +4 -1
  20. package/dist/lib/cjs/data-stores/index.d.cts +1 -0
  21. package/dist/lib/cjs/data-stores/shared-data-store.cjs +145 -22
  22. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +53 -1
  23. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
  24. package/dist/lib/cjs/folder-note.cjs +5 -5
  25. package/dist/lib/cjs/formula-function.cjs +152 -0
  26. package/dist/lib/cjs/formula-function.d.cts +98 -0
  27. package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
  28. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  29. package/dist/lib/cjs/index.cjs +7 -1
  30. package/dist/lib/cjs/index.d.cts +2 -0
  31. package/dist/lib/cjs/link.cjs +12 -12
  32. package/dist/lib/cjs/markdown.cjs +7 -7
  33. package/dist/lib/cjs/vault.cjs +2 -2
  34. package/dist/lib/cjs/virtual-file.cjs +340 -0
  35. package/dist/lib/cjs/virtual-file.d.cts +48 -0
  36. package/dist/lib/esm/__merged.d.mts +4 -1
  37. package/dist/lib/esm/__merged.mjs +20 -2
  38. package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
  39. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
  40. package/dist/lib/esm/community-plugins.mjs +2 -2
  41. package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
  42. package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
  43. package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
  44. package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
  45. package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
  46. package/dist/lib/esm/data-stores/data-store-locations.d.mts +60 -0
  47. package/dist/lib/esm/data-stores/data-store-locations.mjs +160 -0
  48. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +1 -1
  49. package/dist/lib/esm/data-stores/data-store-seeds.mjs +2 -2
  50. package/dist/lib/esm/data-stores/data-store-transport.d.mts +38 -4
  51. package/dist/lib/esm/data-stores/data-store-transport.mjs +126 -21
  52. package/dist/lib/esm/data-stores/index.d.mts +1 -0
  53. package/dist/lib/esm/data-stores/index.mjs +3 -1
  54. package/dist/lib/esm/data-stores/shared-data-store.d.mts +53 -1
  55. package/dist/lib/esm/data-stores/shared-data-store.mjs +145 -22
  56. package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
  57. package/dist/lib/esm/folder-note.mjs +5 -5
  58. package/dist/lib/esm/formula-function.d.mts +98 -0
  59. package/dist/lib/esm/formula-function.mjs +62 -0
  60. package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
  61. package/dist/lib/esm/generated-during-build.mjs +1 -1
  62. package/dist/lib/esm/index.d.mts +2 -0
  63. package/dist/lib/esm/index.mjs +5 -1
  64. package/dist/lib/esm/link.mjs +12 -12
  65. package/dist/lib/esm/markdown.mjs +7 -7
  66. package/dist/lib/esm/vault.mjs +2 -2
  67. package/dist/lib/esm/virtual-file.d.mts +48 -0
  68. package/dist/lib/esm/virtual-file.mjs +264 -0
  69. package/package.json +5 -5
@@ -0,0 +1,340 @@
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
+ (function patchObsidianRequire() {
39
+ const originalRequire = require;
40
+ if (!originalRequire || originalRequire.__isPatched) {
41
+ return;
42
+ }
43
+ require = Object.assign(
44
+ (id) => requirePatched(id),
45
+ originalRequire,
46
+ {
47
+ __isPatched: true
48
+ }
49
+ );
50
+ function extractDefault($module) {
51
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
52
+ }
53
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
54
+ "@codemirror/autocomplete",
55
+ "@codemirror/collab",
56
+ "@codemirror/commands",
57
+ "@codemirror/language",
58
+ "@codemirror/lint",
59
+ "@codemirror/search",
60
+ "@codemirror/state",
61
+ "@codemirror/text",
62
+ "@codemirror/view",
63
+ "@lezer/common",
64
+ "@lezer/highlight",
65
+ "@lezer/lr",
66
+ "obsidian"
67
+ ]);
68
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
69
+ "@codemirror/closebrackets",
70
+ "@codemirror/comment",
71
+ "@codemirror/fold",
72
+ "@codemirror/gutter",
73
+ "@codemirror/highlight",
74
+ "@codemirror/history",
75
+ "@codemirror/matchbrackets",
76
+ "@codemirror/panel",
77
+ "@codemirror/rangeset",
78
+ "@codemirror/rectangular-selection",
79
+ "@codemirror/stream-parser",
80
+ "@codemirror/tooltip"
81
+ ]);
82
+ function requirePatched(id) {
83
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
84
+ return originalRequire?.(id);
85
+ }
86
+ const app = globalThis.app;
87
+ if (app?.isMobile) {
88
+ if (id === "process" || id === "node:process") {
89
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
90
+ return process;
91
+ }
92
+ } else {
93
+ const $module = originalRequire?.(id);
94
+ if ($module) {
95
+ return extractDefault($module);
96
+ }
97
+ }
98
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
99
+ return {};
100
+ }
101
+ })();
102
+
103
+ "use strict";
104
+ var __defProp = Object.defineProperty;
105
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
106
+ var __getOwnPropNames = Object.getOwnPropertyNames;
107
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
108
+ var __export = (target, all) => {
109
+ for (var name in all)
110
+ __defProp(target, name, { get: all[name], enumerable: true });
111
+ };
112
+ var __copyProps = (to, from, except, desc) => {
113
+ if (from && typeof from === "object" || typeof from === "function") {
114
+ for (let key of __getOwnPropNames(from))
115
+ if (!__hasOwnProp.call(to, key) && key !== except)
116
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
117
+ }
118
+ return to;
119
+ };
120
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
121
+ var virtual_file_exports = {};
122
+ __export(virtual_file_exports, {
123
+ registerVirtualFile: () => registerVirtualFile
124
+ });
125
+ module.exports = __toCommonJS(virtual_file_exports);
126
+ var import_state = require('@codemirror/state');
127
+ var import_disposable = require('@mnaoumov/typescript-lib/disposable');
128
+ var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
129
+ var import_obsidian = require('obsidian');
130
+ var import_monkey_around_component = require('./components/monkey-around-component.cjs');
131
+ var import_editor = require('./editor.cjs');
132
+ var import_file_system = require('./file-system.cjs');
133
+ var import_metadata_cache = require('./metadata-cache.cjs');
134
+ var import_obsidian_lib_state = require('./obsidian-lib-state.cjs');
135
+ async function registerVirtualFile(params) {
136
+ const { app, content } = params;
137
+ const path = (0, import_obsidian.normalizePath)(params.path);
138
+ if (!path || path === "/" || params.path.split(/[\\/]/).some((part) => part === "." || part === "..") || /^[\\/]|:/.test(params.path)) {
139
+ throw new Error("A virtual file requires a vault-relative file path");
140
+ }
141
+ const reservations = (0, import_obsidian_lib_state.getObsidianLibState)("virtualFilePathsV1", /* @__PURE__ */ new Set()).value;
142
+ const key = path.toLowerCase();
143
+ if (reservations.has(key) || app.vault.getAbstractFileByPathInsensitive(path)) {
144
+ throw new Error(`File already exists: ${path}`);
145
+ }
146
+ const parent = (0, import_implementations.parentFolderPath)(path);
147
+ if (parent && parent !== "/" && !app.vault.getFolderByPath(parent)) {
148
+ throw new Error(`Parent folder does not exist: ${parent}`);
149
+ }
150
+ reservations.add(key);
151
+ try {
152
+ if (await app.vault.adapter.exists(path)) {
153
+ throw new Error(`File already exists: ${path}`);
154
+ }
155
+ const cache = path.endsWith(".md") ? await (0, import_metadata_cache.parseMetadata)(app, content) : {};
156
+ if (app.vault.getAbstractFileByPathInsensitive(path)) {
157
+ throw new Error(`File already exists: ${path}`);
158
+ }
159
+ return installVirtualFile({ app, cache, content, path, reservations });
160
+ } catch (error) {
161
+ reservations.delete(key);
162
+ throw error;
163
+ }
164
+ }
165
+ function installVirtualFile(params) {
166
+ const { app, cache, content, path, reservations } = params;
167
+ const file = (0, import_file_system.getFile)({ app, pathOrFile: path, shouldIncludeNonExisting: true });
168
+ const bytes = new TextEncoder().encode(content);
169
+ file.stat = { ctime: Date.now(), mtime: Date.now(), size: bytes.byteLength };
170
+ const url = window.URL.createObjectURL(new Blob([bytes], { type: path.endsWith(".md") ? "text/markdown;charset=utf-8" : "text/plain;charset=utf-8" }));
171
+ const patches = new import_monkey_around_component.MonkeyAroundComponent();
172
+ patches.load();
173
+ const metadata = (0, import_metadata_cache.registerFileCacheForNonExistingFile)({ app, cache, pathOrFile: file });
174
+ app.vault.fileMap[path] = file;
175
+ app.metadataCache.uniqueFileLookup.add(file.name.toLowerCase(), file);
176
+ patches.registerMethodPatch({ $object: app.vault, methodName: "read", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(content) : fallback() });
177
+ patches.registerMethodPatch({ $object: app.vault, methodName: "cachedRead", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(content) : fallback() });
178
+ patches.registerMethodPatch({ $object: app.vault, methodName: "readBinary", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(new Uint8Array(bytes).buffer) : fallback() });
179
+ patches.registerMethodPatch({ $object: app.vault, methodName: "getResourcePath", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? url : fallback() });
180
+ patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "read", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? Promise.resolve(content) : fallback() });
181
+ patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "readBinary", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? Promise.resolve(new Uint8Array(bytes).buffer) : fallback() });
182
+ patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "getResourcePath", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? url : fallback() });
183
+ for (const methodName of ["append", "appendBinary", "modify", "modifyBinary", "process", "delete", "trash"]) {
184
+ patches.registerMethodPatch({
185
+ $object: app.vault,
186
+ methodName,
187
+ patchHandler: ({ fallback, originalArguments: [target] }) => {
188
+ assertWritable(target.path);
189
+ return fallback();
190
+ }
191
+ });
192
+ }
193
+ patches.registerMethodPatch({
194
+ $object: app.vault,
195
+ methodName: "rename",
196
+ patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
197
+ assertWritable(target.path);
198
+ assertWritable(destination);
199
+ return fallback();
200
+ }
201
+ });
202
+ for (const methodName of ["create", "createBinary", "createFolder"]) {
203
+ patches.registerMethodPatch({
204
+ $object: app.vault,
205
+ methodName,
206
+ patchHandler: ({ fallback, originalArguments: [target] }) => {
207
+ assertWritable(target);
208
+ return fallback();
209
+ }
210
+ });
211
+ }
212
+ patches.registerMethodPatch({
213
+ $object: app.vault,
214
+ methodName: "copy",
215
+ patchHandler: ({ fallback, originalArguments: [, destination] }) => {
216
+ assertWritable(destination);
217
+ return fallback();
218
+ }
219
+ });
220
+ for (const methodName of ["write", "writeBinary", "append", "appendBinary", "process", "remove", "rmdir", "trashLocal", "trashSystem", "mkdir"]) {
221
+ patches.registerMethodPatch({
222
+ $object: app.vault.adapter,
223
+ methodName,
224
+ patchHandler: ({ fallback, originalArguments: [target] }) => {
225
+ assertWritable(target);
226
+ return fallback();
227
+ }
228
+ });
229
+ }
230
+ patches.registerMethodPatch({
231
+ $object: app.vault.adapter,
232
+ methodName: "rename",
233
+ patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
234
+ assertWritable(target);
235
+ assertWritable(destination);
236
+ return fallback();
237
+ }
238
+ });
239
+ patches.registerMethodPatch({
240
+ $object: app.vault.adapter,
241
+ methodName: "copy",
242
+ patchHandler: ({ fallback, originalArguments: [, destination] }) => {
243
+ assertWritable(destination);
244
+ return fallback();
245
+ }
246
+ });
247
+ patches.registerMethodPatch({
248
+ $object: app.fileManager,
249
+ methodName: "renameFile",
250
+ patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
251
+ assertWritable(target.path);
252
+ assertWritable(destination);
253
+ return fallback();
254
+ }
255
+ });
256
+ patches.registerMethodPatch({
257
+ $object: app.fileManager,
258
+ methodName: "trashFile",
259
+ patchHandler: ({ fallback, originalArguments: [target] }) => {
260
+ assertWritable(target.path);
261
+ return fallback();
262
+ }
263
+ });
264
+ patches.registerMethodPatch({
265
+ $object: import_obsidian.MarkdownView.prototype,
266
+ methodName: "setViewData",
267
+ patchHandler: ({ fallback, originalThis }) => {
268
+ fallback();
269
+ if (originalThis.file === file) {
270
+ protectEditor(originalThis);
271
+ }
272
+ }
273
+ });
274
+ patches.registerMethodPatch({
275
+ $object: import_obsidian.MarkdownView.prototype,
276
+ methodName: "onLoadFile",
277
+ patchHandler: async ({ fallback, originalThis }) => {
278
+ await fallback();
279
+ if (originalThis.file === file) {
280
+ protectEditor(originalThis);
281
+ }
282
+ }
283
+ });
284
+ patches.registerMethodPatch({
285
+ $object: import_obsidian.MarkdownView.prototype,
286
+ methodName: "setMode",
287
+ patchHandler: async ({ fallback, originalThis }) => {
288
+ const result = await fallback();
289
+ if (originalThis.file === file) {
290
+ protectEditor(originalThis);
291
+ }
292
+ return result;
293
+ }
294
+ });
295
+ const disposable = new import_disposable.CallbackDisposable({
296
+ callback: () => {
297
+ app.workspace.iterateAllLeaves((leaf) => {
298
+ if ("file" in leaf.view && leaf.view.file === file) {
299
+ leaf.detach();
300
+ }
301
+ });
302
+ app.metadataCache.uniqueFileLookup.remove(file.name.toLowerCase(), file);
303
+ if (app.vault.fileMap[path] === file) {
304
+ Reflect.deleteProperty(app.vault.fileMap, path);
305
+ metadata[Symbol.dispose]();
306
+ }
307
+ patches.unload();
308
+ window.URL.revokeObjectURL(url);
309
+ reservations.delete(path.toLowerCase());
310
+ },
311
+ multipleDisposeBehavior: import_disposable.MultipleDisposeBehavior.Ignore
312
+ });
313
+ return {
314
+ content,
315
+ file,
316
+ [Symbol.dispose]: () => {
317
+ disposable[Symbol.dispose]();
318
+ }
319
+ };
320
+ function isMatching(target) {
321
+ return (0, import_obsidian.normalizePath)(target).toLowerCase() === path.toLowerCase();
322
+ }
323
+ function protectEditor(view) {
324
+ (0, import_editor.toggleEditorReadOnly)(view.editor, true);
325
+ view.editor.cm.dispatch({
326
+ effects: import_state.StateEffect.appendConfig.of(import_state.EditorState.changeFilter.of(() => view.file !== file))
327
+ });
328
+ }
329
+ function assertWritable(target) {
330
+ const normalized = (0, import_obsidian.normalizePath)(target).toLowerCase();
331
+ if (isMatching(target) || path.toLowerCase().startsWith(`${normalized}/`) || normalized === "/") {
332
+ throw new Error(`Virtual file is read-only: ${path}`);
333
+ }
334
+ }
335
+ }
336
+ // Annotate the CommonJS export names for ESM import in node:
337
+ 0 && (module.exports = {
338
+ registerVirtualFile
339
+ });
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92aXJ0dWFsLWZpbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICogRGlzcG9zYWJsZSwgcmVhZC1vbmx5IGZpbGVzIGJhY2tlZCBieSBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgdmF1bHQgYWRhcHRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBFZGl0b3JTdGF0ZSxcbiAgU3RhdGVFZmZlY3Rcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBub3JtYWxpemVQYXRoXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHRvZ2dsZUVkaXRvclJlYWRPbmx5IH0gZnJvbSAnLi9lZGl0b3IudHMnO1xuaW1wb3J0IHsgZ2V0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGVcbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuXG4vKipcblBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlclZpcnR1YWxGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclZpcnR1YWxGaWxlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBhcHAgd2hvc2UgcmVzb2x2ZXIgYW5kIHJlYWQgbWV0aG9kcyBzZXJ2ZSB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgSW1tdXRhYmxlIFVURi04IHRleHQsIGFsc28gYXZhaWxhYmxlIHN5bmNocm9ub3VzbHkgb24gdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbiAgLyoqXG4gIFVub2NjdXBpZWQgdmF1bHQtcmVsYXRpdmUgZmlsZSBwYXRoIGluIGFuIGV4aXN0aW5nIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG5BIG1lbW9yeSBmaWxlIGFuZCBpdHMgbGlmZXRpbWUuIERpc3Bvc2UgaXQgYmVmb3JlIGl0cyBvd25pbmcgcGx1Z2luIHVubG9hZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbEZpbGUgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gIFRoZSBpbW11dGFibGUgdGV4dDsgYWNjZXNzaW5nIGl0IHJlcXVpcmVzIG5vIGFzeW5jaHJvbm91cyByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICAvKipcbiAgVGhlIGZpbGUgYWNjZXB0ZWQgYnkgT2JzaWRpYW4ncyBsaW5rIHJlc29sdmVyIGFuZCBmaWxlIHZpZXdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogVEZpbGU7XG59XG5cbmludGVyZmFjZSBJbnN0YWxsVmlydHVhbEZpbGVQYXJhbXMgZXh0ZW5kcyBSZWdpc3RlclZpcnR1YWxGaWxlUGFyYW1zIHtcbiAgcmVhZG9ubHkgY2FjaGU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VNZXRhZGF0YT4+IHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuICByZWFkb25seSByZXNlcnZhdGlvbnM6IFNldDxzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBpbW11dGFibGUgdGV4dCBhcyBhIGZpbGUgd2l0aG91dCB3cml0aW5nIHRvIHRoZSBhZGFwdGVyLlxuICpcbiAqIFRoZSBwYXJlbnQgZm9sZGVyIG11c3QgZXhpc3QuIE1hcmtkb3duIHZpZXdzIGFyZSByZWFkLW9ubHk7IHZhdWx0IGFuZCBhZGFwdGVyIG11dGF0aW9ucyBvZiB0aGVcbiAqIHBhdGggb3IgaXRzIGFuY2VzdG9ycyB0aHJvdy4gUmF3IGZpbGVzeXN0ZW0gYWNjZXNzIGFuZCB0aGlyZC1wYXJ0eSB2aWV3cyBhcmUgb3V0c2lkZSB0aGlzIGNvbnRyYWN0LlxuICogUmVzb3VyY2UgVVJMcyB1c2UgVVRGLTggYmxvYnMuIERpc3Bvc2luZyBjbG9zZXMgdmlld3Mgb2YgdGhpcyBmaWxlIGFuZCByZXZva2VzIGl0cyBVUkwuIE5vIGNyZWF0ZVxuICogb3IgZGVsZXRlIGV2ZW50cyBhcmUgZW1pdHRlZCwgc28gaW5kZXhlcnMgYW5kIHN5bmNocm9uaXphdGlvbiBuZXZlciB0cmVhdCBpdCBhcyBhIHBlcnNpc3RlZCBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgYXBwLCBwYXRoIGFuZCBpbW11dGFibGUgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIGZpbGUsIHN5bmNocm9ub3VzIGNvbnRlbnQgYW5kIGlkZW1wb3RlbnQgZGlzcG9zYWwgY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlclZpcnR1YWxGaWxlKHBhcmFtczogUmVnaXN0ZXJWaXJ0dWFsRmlsZVBhcmFtcyk6IFByb21pc2U8VmlydHVhbEZpbGU+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgY29uc3QgcGF0aCA9IG5vcm1hbGl6ZVBhdGgocGFyYW1zLnBhdGgpO1xuICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gJy8nIHx8IHBhcmFtcy5wYXRoLnNwbGl0KC9bXFxcXC9dLykuc29tZSgocGFydCkgPT4gcGFydCA9PT0gJy4nIHx8IHBhcnQgPT09ICcuLicpIHx8IC9eW1xcXFwvXXw6Ly50ZXN0KHBhcmFtcy5wYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQSB2aXJ0dWFsIGZpbGUgcmVxdWlyZXMgYSB2YXVsdC1yZWxhdGl2ZSBmaWxlIHBhdGgnKTtcbiAgfVxuICBjb25zdCByZXNlcnZhdGlvbnMgPSBnZXRPYnNpZGlhbkxpYlN0YXRlKCd2aXJ0dWFsRmlsZVBhdGhzVjEnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gIGNvbnN0IGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJlc2VydmF0aW9ucy5oYXMoa2V5KSB8fCBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoSW5zZW5zaXRpdmUocGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgfVxuICBjb25zdCBwYXJlbnQgPSBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpO1xuICBpZiAocGFyZW50ICYmIHBhcmVudCAhPT0gJy8nICYmICFhcHAudmF1bHQuZ2V0Rm9sZGVyQnlQYXRoKHBhcmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBmb2xkZXIgZG9lcyBub3QgZXhpc3Q6ICR7cGFyZW50fWApO1xuICB9XG4gIHJlc2VydmF0aW9ucy5hZGQoa2V5KTtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSBwYXRoLmVuZHNXaXRoKCcubWQnKSA/IGF3YWl0IHBhcnNlTWV0YWRhdGEoYXBwLCBjb250ZW50KSA6IHt9O1xuICAgIC8vIFJlY2hlY2sgYWZ0ZXIgYXN5bmNocm9ub3VzIHdvcmssIGJlZm9yZSBwdWJsaXNoaW5nIGFueXRoaW5nIHRvIHRoZSByZXNvbHZlci5cbiAgICBpZiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aEluc2Vuc2l0aXZlKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbGxWaXJ0dWFsRmlsZSh7IGFwcCwgY2FjaGUsIGNvbnRlbnQsIHBhdGgsIHJlc2VydmF0aW9ucyB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXNlcnZhdGlvbnMuZGVsZXRlKGtleSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbFZpcnR1YWxGaWxlKHBhcmFtczogSW5zdGFsbFZpcnR1YWxGaWxlUGFyYW1zKTogVmlydHVhbEZpbGUge1xuICBjb25zdCB7IGFwcCwgY2FjaGUsIGNvbnRlbnQsIHBhdGgsIHJlc2VydmF0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjb250ZW50KTtcbiAgZmlsZS5zdGF0ID0geyBjdGltZTogRGF0ZS5ub3coKSwgbXRpbWU6IERhdGUubm93KCksIHNpemU6IGJ5dGVzLmJ5dGVMZW5ndGggfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGlzIGlzIHRoZSBicm93c2VyJ3MgQmxvYiBVUkwgQVBJIGluIE9ic2lkaWFuLCBub3QgTm9kZSdzIGltcGxlbWVudGF0aW9uLlxuICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYnl0ZXNdLCB7IHR5cGU6IHBhdGguZW5kc1dpdGgoJy5tZCcpID8gJ3RleHQvbWFya2Rvd247Y2hhcnNldD11dGYtOCcgOiAndGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04JyB9KSk7XG4gIGNvbnN0IHBhdGNoZXMgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gIHBhdGNoZXMubG9hZCgpO1xuICBjb25zdCBtZXRhZGF0YSA9IHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZTogZmlsZSB9KTtcbiAgYXBwLnZhdWx0LmZpbGVNYXBbcGF0aF0gPSBmaWxlO1xuICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG5cbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LCBtZXRob2ROYW1lOiAncmVhZCcsIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB0YXJnZXQgPT09IGZpbGUgPyBQcm9taXNlLnJlc29sdmUoY29udGVudCkgOiBmYWxsYmFjaygpIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goeyAkb2JqZWN0OiBhcHAudmF1bHQsIG1ldGhvZE5hbWU6ICdjYWNoZWRSZWFkJywgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHRhcmdldCA9PT0gZmlsZSA/IFByb21pc2UucmVzb2x2ZShjb250ZW50KSA6IGZhbGxiYWNrKCkgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7ICRvYmplY3Q6IGFwcC52YXVsdCwgbWV0aG9kTmFtZTogJ3JlYWRCaW5hcnknLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gdGFyZ2V0ID09PSBmaWxlID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXIpIDogZmFsbGJhY2soKSB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LCBtZXRob2ROYW1lOiAnZ2V0UmVzb3VyY2VQYXRoJywgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHRhcmdldCA9PT0gZmlsZSA/IHVybCA6IGZhbGxiYWNrKCkgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7ICRvYmplY3Q6IGFwcC52YXVsdC5hZGFwdGVyLCBtZXRob2ROYW1lOiAncmVhZCcsIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiBpc01hdGNoaW5nKHRhcmdldCkgPyBQcm9taXNlLnJlc29sdmUoY29udGVudCkgOiBmYWxsYmFjaygpIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goeyAkb2JqZWN0OiBhcHAudmF1bHQuYWRhcHRlciwgbWV0aG9kTmFtZTogJ3JlYWRCaW5hcnknLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gaXNNYXRjaGluZyh0YXJnZXQpID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXIpIDogZmFsbGJhY2soKSB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LmFkYXB0ZXIsIG1ldGhvZE5hbWU6ICdnZXRSZXNvdXJjZVBhdGgnLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gaXNNYXRjaGluZyh0YXJnZXQpID8gdXJsIDogZmFsbGJhY2soKSB9KTtcblxuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgWydhcHBlbmQnLCAnYXBwZW5kQmluYXJ5JywgJ21vZGlmeScsICdtb2RpZnlCaW5hcnknLCAncHJvY2VzcycsICdkZWxldGUnLCAndHJhc2gnXSBhcyBjb25zdCkge1xuICAgIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiBhcHAudmF1bHQsXG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGFibGUodGFyZ2V0LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC52YXVsdCxcbiAgICBtZXRob2ROYW1lOiAncmVuYW1lJyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldCwgZGVzdGluYXRpb25dIH0pID0+IHtcbiAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldC5wYXRoKTtcbiAgICAgIGFzc2VydFdyaXRhYmxlKGRlc3RpbmF0aW9uKTtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBbJ2NyZWF0ZScsICdjcmVhdGVCaW5hcnknLCAnY3JlYXRlRm9sZGVyJ10gYXMgY29uc3QpIHtcbiAgICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogYXBwLnZhdWx0LFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogYXBwLnZhdWx0LFxuICAgIG1ldGhvZE5hbWU6ICdjb3B5JyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogWywgZGVzdGluYXRpb25dIH0pID0+IHtcbiAgICAgIGFzc2VydFdyaXRhYmxlKGRlc3RpbmF0aW9uKTtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBbJ3dyaXRlJywgJ3dyaXRlQmluYXJ5JywgJ2FwcGVuZCcsICdhcHBlbmRCaW5hcnknLCAncHJvY2VzcycsICdyZW1vdmUnLCAncm1kaXInLCAndHJhc2hMb2NhbCcsICd0cmFzaFN5c3RlbScsICdta2RpciddIGFzIGNvbnN0KSB7XG4gICAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IGFwcC52YXVsdC5hZGFwdGVyLFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogYXBwLnZhdWx0LmFkYXB0ZXIsXG4gICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXQsIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZSh0YXJnZXQpO1xuICAgICAgYXNzZXJ0V3JpdGFibGUoZGVzdGluYXRpb24pO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAkb2JqZWN0OiBhcHAudmF1bHQuYWRhcHRlcixcbiAgICBtZXRob2ROYW1lOiAnY29weScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFssIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZShkZXN0aW5hdGlvbik7XG4gICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC5maWxlTWFuYWdlcixcbiAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXQsIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZSh0YXJnZXQucGF0aCk7XG4gICAgICBhc3NlcnRXcml0YWJsZShkZXN0aW5hdGlvbik7XG4gICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC5maWxlTWFuYWdlcixcbiAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4ge1xuICAgICAgYXNzZXJ0V3JpdGFibGUodGFyZ2V0LnBhdGgpO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAkb2JqZWN0OiBNYXJrZG93blZpZXcucHJvdG90eXBlLFxuICAgIG1ldGhvZE5hbWU6ICdzZXRWaWV3RGF0YScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogTWFya2Rvd25WaWV3LnByb3RvdHlwZSxcbiAgICBtZXRob2ROYW1lOiAnb25Mb2FkRmlsZScsXG4gICAgcGF0Y2hIYW5kbGVyOiBhc3luYyAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogTWFya2Rvd25WaWV3LnByb3RvdHlwZSxcbiAgICBtZXRob2ROYW1lOiAnc2V0TW9kZScsXG4gICAgcGF0Y2hIYW5kbGVyOiBhc3luYyAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAtLSBPYnNpZGlhbiByZXR1cm5zIGEgYm9vbGVhbiBkZXNwaXRlIGl0cyB2b2lkIGRlY2xhcmF0aW9uOyBzZXRTdGF0ZSBjb25zdW1lcyB0aGF0IHJlc3VsdC5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGRpc3Bvc2FibGUgPSBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XG4gICAgICAgIGlmICgnZmlsZScgaW4gbGVhZi52aWV3ICYmIGxlYWYudmlldy5maWxlID09PSBmaWxlKSB7XG4gICAgICAgICAgbGVhZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLnJlbW92ZShmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICBpZiAoYXBwLnZhdWx0LmZpbGVNYXBbcGF0aF0gPT09IGZpbGUpIHtcbiAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShhcHAudmF1bHQuZmlsZU1hcCwgcGF0aCk7XG4gICAgICAgIG1ldGFkYXRhW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgICAgfVxuICAgICAgcGF0Y2hlcy51bmxvYWQoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlIFVSTCBiZWxvbmdzIHRvIHRoZSBicm93c2VyIHJlYWxtIHRoYXQgY3JlYXRlZCBpdC5cbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICByZXNlcnZhdGlvbnMuZGVsZXRlKHBhdGgudG9Mb3dlckNhc2UoKSk7XG4gICAgfSxcbiAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQsXG4gICAgZmlsZSxcbiAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICBkaXNwb3NhYmxlW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBpc01hdGNoaW5nKHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgodGFyZ2V0KS50b0xvd2VyQ2FzZSgpID09PSBwYXRoLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBwcm90ZWN0RWRpdG9yKHZpZXc6IE1hcmtkb3duVmlldyk6IHZvaWQge1xuICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAvLyBBIHZpcnR1YWwgZmlsZSBpcyBpbW11dGFibGUgZXZlbiB0byBwcm9ncmFtbWF0aWMgZWRpdG9yIHRyYW5zYWN0aW9ucy4gVGhlIG9yZGluYXJ5IHJlc291cmNlXG4gICAgLy8gbG9jayBwZXJtaXRzIHRob3NlIGZvciByb2xsYmFjazsgdGhpcyByZWdpc3RyYXRpb24gaGFzIG5vIHdyaXRhYmxlIGJ1ZmZlciB0byByb2xsIGJhY2suXG4gICAgdmlldy5lZGl0b3IuY20uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnLm9mKEVkaXRvclN0YXRlLmNoYW5nZUZpbHRlci5vZigoKSA9PiB2aWV3LmZpbGUgIT09IGZpbGUpKVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNzZXJ0V3JpdGFibGUodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aCh0YXJnZXQpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGlzTWF0Y2hpbmcodGFyZ2V0KSB8fCBwYXRoLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChgJHtub3JtYWxpemVkfS9gKSB8fCBub3JtYWxpemVkID09PSAnLycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmlydHVhbCBmaWxlIGlzIHJlYWQtb25seTogJHtwYXRofWApO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEsbUJBR087QUFDUCx3QkFHTztBQUNQLDZCQUFpQztBQUNqQyxzQkFHTztBQUVQLHFDQUFzQztBQUN0QyxvQkFBcUM7QUFDckMseUJBQXdCO0FBQ3hCLDRCQUdPO0FBQ1AsZ0NBQW9DO0FBa0RwQyxlQUFzQixvQkFBb0IsUUFBeUQ7QUFDakcsUUFBTSxFQUFFLEtBQUssUUFBUSxJQUFJO0FBQ3pCLFFBQU0sV0FBTywrQkFBYyxPQUFPLElBQUk7QUFDdEMsTUFBSSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sS0FBSyxNQUFNLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxTQUFTLE9BQU8sU0FBUyxJQUFJLEtBQUssV0FBVyxLQUFLLE9BQU8sSUFBSSxHQUFHO0FBQ3JJLFVBQU0sSUFBSSxNQUFNLG9EQUFvRDtBQUFBLEVBQ3RFO0FBQ0EsUUFBTSxtQkFBZSwrQ0FBb0Isc0JBQXNCLG9CQUFJLElBQVksQ0FBQyxFQUFFO0FBQ2xGLFFBQU0sTUFBTSxLQUFLLFlBQVk7QUFDN0IsTUFBSSxhQUFhLElBQUksR0FBRyxLQUFLLElBQUksTUFBTSxpQ0FBaUMsSUFBSSxHQUFHO0FBQzdFLFVBQU0sSUFBSSxNQUFNLHdCQUF3QixJQUFJLEVBQUU7QUFBQSxFQUNoRDtBQUNBLFFBQU0sYUFBUyx5Q0FBaUIsSUFBSTtBQUNwQyxNQUFJLFVBQVUsV0FBVyxPQUFPLENBQUMsSUFB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
@@ -0,0 +1,48 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ * Disposable, read-only files backed by memory instead of the vault adapter.
5
+ */
6
+ import type { App, TFile } from 'obsidian' with { 'resolution-mode': 'import' };
7
+ /**
8
+ Parameters for {@link registerVirtualFile}.
9
+ */
10
+ export interface RegisterVirtualFileParams {
11
+ /**
12
+ The app whose resolver and read methods serve the file.
13
+ */
14
+ readonly app: App;
15
+ /**
16
+ Immutable UTF-8 text, also available synchronously on the registration.
17
+ */
18
+ readonly content: string;
19
+ /**
20
+ Unoccupied vault-relative file path in an existing folder.
21
+ */
22
+ readonly path: string;
23
+ }
24
+ /**
25
+ A memory file and its lifetime. Dispose it before its owning plugin unloads.
26
+ */
27
+ export interface VirtualFile extends Disposable {
28
+ /**
29
+ The immutable text; accessing it requires no asynchronous read.
30
+ */
31
+ readonly content: string;
32
+ /**
33
+ The file accepted by Obsidian's link resolver and file views.
34
+ */
35
+ readonly file: TFile;
36
+ }
37
+ /**
38
+ * Registers immutable text as a file without writing to the adapter.
39
+ *
40
+ * The parent folder must exist. Markdown views are read-only; vault and adapter mutations of the
41
+ * path or its ancestors throw. Raw filesystem access and third-party views are outside this contract.
42
+ * Resource URLs use UTF-8 blobs. Disposing closes views of this file and revokes its URL. No create
43
+ * or delete events are emitted, so indexers and synchronization never treat it as a persisted file.
44
+ *
45
+ * @param params - The app, path and immutable text.
46
+ * @returns The registered file, synchronous content and idempotent disposal callback.
47
+ */
48
+ export declare function registerVirtualFile(params: RegisterVirtualFileParams): Promise<VirtualFile>;
@@ -40,7 +40,7 @@ export { UnlockActiveNoteCommandHandler } from './command-handlers/unlock-active
40
40
  export { PluginCommandRegistrar } from './command-registrar.mjs';
41
41
  export { configureCommunityPlugin, ConfigureCommunityPluginResult, disableCommunityPlugin, enableCommunityPlugin, getCommunityPluginRepo, getLatestReleaseVersion, installCommunityPlugin, installConfigureEnableCommunityPlugin, PluginEnableRefusedError, searchCommunityPlugins, toggleEnableCommunityPlugin, toggleInstallCommunityPlugin, uninstallCommunityPlugin, updateCommunityPlugin, UpdateCommunityPluginResult } from './community-plugins.mjs';
42
42
  export { AbortSignalComponent } from './components/abort-signal-component.mjs';
43
- export { AllWindowsEventComponent } from './components/all-windows-event-component.mjs';
43
+ export { AllWindowsEventComponent, forEachWindow, registerBodyClass } from './components/all-windows-event-component.mjs';
44
44
  export { AsyncErrorHandlerComponent } from './components/async-error-handler-component.mjs';
45
45
  export { registerAsyncEvent } from './components/async-events-component.mjs';
46
46
  export { BulkOperationCommitComponent } from './components/bulk-operation-commit-component.mjs';
@@ -78,6 +78,7 @@ export { TemplatesLanguageComponent } from './components/templates-language-comp
78
78
  export { getDomEventsHandlersConstructor } from './constructors/get-dom-events-handlers-constructor.mjs';
79
79
  export { CssClass } from './css-class.mjs';
80
80
  export { PluginDataHandler } from './data-handler.mjs';
81
+ export { DataStoreLocations } from './data-stores/data-store-locations.mjs';
81
82
  export { DataStoreReplica, isDataStoreJsonValue, isDataStoreOperation } from './data-stores/data-store-replica.mjs';
82
83
  export { DataStoreSeeds, validateDataStoreSeed } from './data-stores/data-store-seeds.mjs';
83
84
  export { DataStoreTransport } from './data-stores/data-store-transport.mjs';
@@ -105,6 +106,7 @@ export { revealInFileExplorer } from './file-explorer.mjs';
105
106
  export { addAlias, deleteAlias, processFrontmatter, waitForPendingLinkUpdates } from './file-manager.mjs';
106
107
  export { asArrayOfFiles, asArrayOfFolders, asFile, asFileOrNull, asFolder, asFolderOrNull, BASE_FILE_EXTENSION, CANVAS_FILE_EXTENSION, checkExtension, doesExist, FileSystemType, getAbstractFile, getAbstractFileOrNull, getBasename, getExtension, getFile, getFileOrNull, getFileSystemType, getFolder, getFolderOrNull, getMarkdownFiles, getOrCreateFile, getOrCreateFolder, getPath, isAbstractFile, isBaseFile, isCanvasFile, isFile, isFolder, isMarkdownFile, isNote, isPathOrFile, isTreatedAsAttachment, MARKDOWN_FILE_EXTENSION, MissingPathTreatment, trimMarkdownExtension } from './file-system.mjs';
107
108
  export { FOLDER_NOTES_PLUGIN_ID, FolderNoteLocation, getFolderNoteFolder, resolveFolderNote, resolveFolderNoteConfig } from './folder-note.mjs';
109
+ export { createFormulaFunction, createFormulaFunctionParameter, registerFormulaFunction } from './formula-function.mjs';
108
110
  export { enableFrontmatterFormattingPreservation, preserveFrontmatterFormatting } from './frontmatter-formatting.mjs';
109
111
  export { isFrontmatterLinkCacheWithOffsets, toFrontmatterLinkCacheWithOffsets } from './frontmatter-link-cache-with-offsets.mjs';
110
112
  export { checkIsPlainObject, parseFrontmatter, registerFrontmatterFormattingPreserver, removeEmptyFrontmatterValues, setFrontmatter } from './frontmatter.mjs';
@@ -216,6 +218,7 @@ export { deleteIfNotUsed, DeleteIfNotUsedResult } from './vault-delete.mjs';
216
218
  export { VaultTransaction } from './vault-transaction.mjs';
217
219
  export { cleanupEmptyFolders, copySafe, createFolderSafe, CreateFolderSafeResult, createTemporaryFile, createTemporaryFolder, deleteEmptyFolder, deleteEmptyFolderHierarchy, getAbstractFilePathSafe, getAvailablePath, getFilePathSafe, getFolderPathSafe, getMarkdownFilesSorted, getNoteFilesSorted, getOrCreateAbstractFileSafe, getOrCreateFileSafe, getOrCreateFolderSafe, getSafeRenamePath, InvokeFileActionSafeResult, invokeWithFileSystemLock, isChild, isChildOrSelf, isEmptyFolder, listSafe, process, readSafe, renameSafe, saveNote, trashSafe } from './vault.mjs';
218
220
  export { PluginViewRegistrar } from './view-registrar.mjs';
221
+ export { registerVirtualFile } from './virtual-file.mjs';
219
222
  export { ensureLayoutReady, getAllContainers, getAllDomWindows, getMainWindow, switchToMainWindow, switchToWindow } from './workspace.mjs';
220
223
  export { abortSignalAny, abortSignalNever, abortSignalTimeout, getSharedAbortController, getSharedAbortSignal, INFINITE_TIMEOUT, onAbort, ResettableAbortController, waitForAbort } from '@mnaoumov/typescript-lib/abort-controller';
221
224
  export { createAggregateError } from '@mnaoumov/typescript-lib/aggregate-error';