obsidian-integration-testing 2.7.2 → 3.0.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 (39) hide show
  1. package/dist/lib/cjs/context-id.cjs +3 -3
  2. package/dist/lib/cjs/enable-plugin.cjs +3 -2
  3. package/dist/lib/cjs/eval-in-obsidian.cjs +10 -67
  4. package/dist/lib/cjs/generate-function-call.cjs +13 -3
  5. package/dist/lib/cjs/generate-function-call.d.cts +30 -7
  6. package/dist/lib/cjs/library.cjs +29 -0
  7. package/dist/lib/cjs/library.d.cts +13 -0
  8. package/dist/lib/cjs/namespace-bootstrap.cjs +139 -0
  9. package/dist/lib/cjs/namespace-bootstrap.d.cts +20 -0
  10. package/dist/lib/cjs/native-dialog-monitor.cjs +190 -0
  11. package/dist/lib/cjs/native-dialog-monitor.d.cts +66 -0
  12. package/dist/lib/cjs/obsidian-config.cjs +29 -1
  13. package/dist/lib/cjs/obsidian-config.d.cts +33 -0
  14. package/dist/lib/cjs/obsidian-namespace.cjs +17 -0
  15. package/dist/lib/cjs/obsidian-namespace.d.cts +114 -0
  16. package/dist/lib/cjs/transport-desktop-cdp.cjs +8 -6
  17. package/dist/lib/cjs/transport-desktop-cli.cjs +163 -70
  18. package/dist/lib/cjs/transport-desktop-cli.d.cts +15 -23
  19. package/dist/lib/esm/context-id.mjs +3 -3
  20. package/dist/lib/esm/enable-plugin.mjs +3 -2
  21. package/dist/lib/esm/eval-in-obsidian.mjs +11 -71
  22. package/dist/lib/esm/generate-function-call.d.mts +30 -7
  23. package/dist/lib/esm/generate-function-call.mjs +11 -2
  24. package/dist/lib/esm/library.d.mts +13 -0
  25. package/dist/lib/esm/library.mjs +5 -0
  26. package/dist/lib/esm/namespace-bootstrap.d.mts +20 -0
  27. package/dist/lib/esm/namespace-bootstrap.mjs +115 -0
  28. package/dist/lib/esm/native-dialog-monitor.d.mts +66 -0
  29. package/dist/lib/esm/native-dialog-monitor.mjs +156 -0
  30. package/dist/lib/esm/obsidian-config.d.mts +33 -0
  31. package/dist/lib/esm/obsidian-config.mjs +27 -1
  32. package/dist/lib/esm/obsidian-namespace.d.mts +114 -0
  33. package/dist/lib/esm/obsidian-namespace.mjs +1 -0
  34. package/dist/lib/esm/transport-desktop-cdp.mjs +8 -12
  35. package/dist/lib/esm/transport-desktop-cli.d.mts +15 -23
  36. package/dist/lib/esm/transport-desktop-cli.mjs +164 -71
  37. package/dist/obsidian-integration-testing-3.0.0.tgz +0 -0
  38. package/package.json +1 -1
  39. package/dist/obsidian-integration-testing-2.7.2.tgz +0 -0
@@ -0,0 +1,156 @@
1
+ import process from "node:process";
2
+ import { exec } from "./exec.mjs";
3
+ const DIALOG_TITLES = [
4
+ "Error",
5
+ "Vault not found."
6
+ ];
7
+ const POLL_INTERVAL_IN_MILLISECONDS = 500;
8
+ class NativeDialogMonitor {
9
+ events = [];
10
+ intervalId;
11
+ isPolling = false;
12
+ /**
13
+ * Asserts that no native dialogs were detected during monitoring.
14
+ *
15
+ * @throws If any dialogs were recorded.
16
+ */
17
+ assertNoDialogs() {
18
+ if (this.events.length > 0) {
19
+ const descriptions = this.events.map((e) => ` - "${e.title}" at ${new Date(e.timestamp).toISOString()}`).join("\n");
20
+ throw new Error(`Native dialog(s) detected during test:
21
+ ${descriptions}`);
22
+ }
23
+ }
24
+ /**
25
+ * Returns all dialog events recorded since the monitor started.
26
+ *
27
+ * @returns The recorded dialog events.
28
+ */
29
+ getEvents() {
30
+ return this.events;
31
+ }
32
+ /**
33
+ * Resets the recorded events without stopping the monitor.
34
+ */
35
+ reset() {
36
+ this.events = [];
37
+ }
38
+ /**
39
+ * Starts polling for native dialogs in the background.
40
+ */
41
+ start() {
42
+ if (this.intervalId) {
43
+ return;
44
+ }
45
+ this.events = [];
46
+ this.intervalId = setInterval(() => {
47
+ this.poll().catch(() => {
48
+ });
49
+ }, POLL_INTERVAL_IN_MILLISECONDS);
50
+ }
51
+ /**
52
+ * Stops polling and returns all recorded events.
53
+ *
54
+ * @returns The recorded dialog events.
55
+ */
56
+ stop() {
57
+ if (this.intervalId) {
58
+ clearInterval(this.intervalId);
59
+ this.intervalId = void 0;
60
+ }
61
+ return this.events;
62
+ }
63
+ /**
64
+ * Single poll iteration: detects and dismisses any Obsidian dialog windows.
65
+ */
66
+ async poll() {
67
+ if (this.isPolling) {
68
+ return;
69
+ }
70
+ this.isPolling = true;
71
+ try {
72
+ const titles = await getObsidianWindowTitles();
73
+ for (const title of titles) {
74
+ if (DIALOG_TITLES.includes(title)) {
75
+ this.events.push({ timestamp: Date.now(), title });
76
+ await dismissDialogByTitle(title);
77
+ }
78
+ }
79
+ } catch {
80
+ } finally {
81
+ this.isPolling = false;
82
+ }
83
+ }
84
+ }
85
+ async function dismissDialogByTitle(title) {
86
+ if (process.platform === "win32") {
87
+ await dismissDialogWindows(title);
88
+ } else if (process.platform === "darwin") {
89
+ await dismissDialogMac(title);
90
+ } else {
91
+ await dismissDialogLinux(title);
92
+ }
93
+ }
94
+ async function dismissDialogLinux(title) {
95
+ const escapedTitle = title.replace(/"/g, '\\"');
96
+ await exec(
97
+ `xdotool search --name "${escapedTitle}" windowactivate --sync key Return 2>/dev/null || true`,
98
+ { isQuiet: true }
99
+ );
100
+ }
101
+ async function dismissDialogMac(title) {
102
+ const escapedTitle = title.replace(/"/g, '\\"');
103
+ await exec(
104
+ `osascript -e 'tell application "System Events" to tell process "Obsidian" to click button 1 of window "${escapedTitle}"'`,
105
+ { isQuiet: true }
106
+ );
107
+ }
108
+ async function dismissDialogWindows(title) {
109
+ const escapedTitle = title.replace(/'/g, "''");
110
+ const script = [
111
+ 'Add-Type -TypeDefinition @"',
112
+ "using System; using System.Runtime.InteropServices;",
113
+ "public class DlgClose {",
114
+ ' [DllImport("user32.dll")] public static extern IntPtr FindWindow(string c, string t);',
115
+ ' [DllImport("user32.dll")] public static extern IntPtr SendMessage(IntPtr h, uint m, IntPtr w, IntPtr l);',
116
+ "}",
117
+ '"@',
118
+ `$h = [DlgClose]::FindWindow($null, '${escapedTitle}')`,
119
+ "if ($h -ne [IntPtr]::Zero) { [DlgClose]::SendMessage($h, 0x0010, [IntPtr]::Zero, [IntPtr]::Zero) }"
120
+ ].join("; ");
121
+ await exec(`powershell -Command "${script}"`, { isQuiet: true });
122
+ }
123
+ async function getObsidianWindowTitles() {
124
+ if (process.platform === "win32") {
125
+ return getWindowTitlesWindows();
126
+ }
127
+ if (process.platform === "darwin") {
128
+ return getWindowTitlesMac();
129
+ }
130
+ return getWindowTitlesLinux();
131
+ }
132
+ async function getWindowTitlesLinux() {
133
+ const output = await exec(
134
+ 'xdotool search --name "Obsidian" getwindowname 2>/dev/null || true',
135
+ { isQuiet: true }
136
+ );
137
+ return output.trim().split("\n").filter(Boolean);
138
+ }
139
+ async function getWindowTitlesMac() {
140
+ const output = await exec(
141
+ `osascript -e 'tell application "System Events" to get name of every window of (processes whose name is "Obsidian")'`,
142
+ { isQuiet: true }
143
+ );
144
+ return output.trim().split(", ").filter(Boolean);
145
+ }
146
+ async function getWindowTitlesWindows() {
147
+ const output = await exec(
148
+ `powershell -Command "Get-Process Obsidian -ErrorAction SilentlyContinue | Where-Object { $_.MainWindowTitle -ne '' } | Select-Object -ExpandProperty MainWindowTitle"`,
149
+ { isQuiet: true }
150
+ );
151
+ return output.trim().split("\n").map((line) => line.trim()).filter(Boolean);
152
+ }
153
+ export {
154
+ NativeDialogMonitor
155
+ };
156
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hdGl2ZS1kaWFsb2ctbW9uaXRvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1vbml0b3JzIGZvciBuYXRpdmUgT1MgZGlhbG9ncyAoRWxlY3Ryb24gYGRpYWxvZy5zaG93RXJyb3JCb3hgLCBgZGlhbG9nLnNob3dNZXNzYWdlQm94U3luY2ApXG4gKiBmcm9tIHRoZSBPYnNpZGlhbiBwcm9jZXNzLiBUaGVzZSBkaWFsb2dzIGJsb2NrIHRoZSBtYWluIHByb2Nlc3MgYW5kIGNhbm5vdCBiZSBpbnRlcmNlcHRlZFxuICogZnJvbSB0aGUgcmVuZGVyZXIgdmlhIGBAZWxlY3Ryb24vcmVtb3RlYC5cbiAqXG4gKiBVc2VzIHBsYXRmb3JtLXNwZWNpZmljIHByb2Nlc3Mgd2luZG93IHRpdGxlIGluc3BlY3Rpb24gdG8gZGV0ZWN0IGRpYWxvZ3MsIGFuZFxuICogYXV0by1kaXNtaXNzZXMgdGhlbSBzbyB0aGV5IGRvbid0IGJsb2NrIHRlc3QgZXhlY3V0aW9uLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHV0aWxpdHkuIE5vdCB1bml0LXRlc3RhYmxlOiByZWxpZXMgb24gT1MgcHJvY2VzcyBpbnNwZWN0aW9uLiAqL1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5cbi8qKlxuICogQSBjYXB0dXJlZCBuYXRpdmUgZGlhbG9nIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZURpYWxvZ0V2ZW50IHtcbiAgLyoqXG4gICAqIFdoZW4gdGhlIGRpYWxvZyB3YXMgZGV0ZWN0ZWQuXG4gICAqL1xuICB0aW1lc3RhbXA6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdyB0aXRsZSBvZiB0aGUgZGlhbG9nLlxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBLbm93biBPYnNpZGlhbiBkaWFsb2cgd2luZG93IHRpdGxlcyB0aGF0IGluZGljYXRlIGFuIGVycm9yIG9yIGJsb2NraW5nIHByb21wdC5cbiAqL1xuY29uc3QgRElBTE9HX1RJVExFUyA9IFtcbiAgJ0Vycm9yJyxcbiAgJ1ZhdWx0IG5vdCBmb3VuZC4nXG5dO1xuXG5jb25zdCBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcblxuLyoqXG4gKiBNb25pdG9ycyB0aGUgT2JzaWRpYW4gcHJvY2VzcyBmb3IgbmF0aXZlIE9TIGRpYWxvZ3MgYnkgcG9sbGluZyBwcm9jZXNzIHdpbmRvdyB0aXRsZXMuXG4gKlxuICogRGV0ZWN0ZWQgZGlhbG9ncyBhcmUgYXV0by1kaXNtaXNzZWQgKHZpYSBXTV9DTE9TRSAvIEFwcGxlU2NyaXB0IC8geGRvdG9vbCkgc28gdGhleVxuICogZG9uJ3QgYmxvY2sgdGhlIG1haW4gcHJvY2VzcywgYW5kIHJlY29yZGVkIGZvciBsYXRlciBhc3NlcnRpb24uXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm06IHdvcmtzIG9uIFdpbmRvd3MsIG1hY09TLCBhbmQgTGludXguXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXRpdmVEaWFsb2dNb25pdG9yIHtcbiAgcHJpdmF0ZSBldmVudHM6IE5hdGl2ZURpYWxvZ0V2ZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBpbnRlcnZhbElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNQb2xsaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEFzc2VydHMgdGhhdCBubyBuYXRpdmUgZGlhbG9ncyB3ZXJlIGRldGVjdGVkIGR1cmluZyBtb25pdG9yaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIElmIGFueSBkaWFsb2dzIHdlcmUgcmVjb3JkZWQuXG4gICAqL1xuICBwdWJsaWMgYXNzZXJ0Tm9EaWFsb2dzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSB0aGlzLmV2ZW50c1xuICAgICAgICAubWFwKChlKSA9PiBgICAtIFwiJHtlLnRpdGxlfVwiIGF0ICR7bmV3IERhdGUoZS50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCl9YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYXRpdmUgZGlhbG9nKHMpIGRldGVjdGVkIGR1cmluZyB0ZXN0OlxcbiR7ZGVzY3JpcHRpb25zfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBkaWFsb2cgZXZlbnRzIHJlY29yZGVkIHNpbmNlIHRoZSBtb25pdG9yIHN0YXJ0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWNvcmRlZCBkaWFsb2cgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIGdldEV2ZW50cygpOiByZWFkb25seSBOYXRpdmVEaWFsb2dFdmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHM7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSByZWNvcmRlZCBldmVudHMgd2l0aG91dCBzdG9wcGluZyB0aGUgbW9uaXRvci5cbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBwb2xsaW5nIGZvciBuYXRpdmUgZGlhbG9ncyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5wb2xsKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBJZ25vcmUgcG9sbCBlcnJvcnMuXG4gICAgICB9KTtcbiAgICB9LCBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgcG9sbGluZyBhbmQgcmV0dXJucyBhbGwgcmVjb3JkZWQgZXZlbnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVjb3JkZWQgZGlhbG9nIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHJlYWRvbmx5IE5hdGl2ZURpYWxvZ0V2ZW50W10ge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKTtcbiAgICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbmdsZSBwb2xsIGl0ZXJhdGlvbjogZGV0ZWN0cyBhbmQgZGlzbWlzc2VzIGFueSBPYnNpZGlhbiBkaWFsb2cgd2luZG93cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcG9sbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1BvbGxpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1BvbGxpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0aXRsZXMgPSBhd2FpdCBnZXRPYnNpZGlhbldpbmRvd1RpdGxlcygpO1xuICAgICAgZm9yIChjb25zdCB0aXRsZSBvZiB0aXRsZXMpIHtcbiAgICAgICAgaWYgKERJQUxPR19USVRMRVMuaW5jbHVkZXModGl0bGUpKSB7XG4gICAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgdGl0bGUgfSk7XG4gICAgICAgICAgYXdhaXQgZGlzbWlzc0RpYWxvZ0J5VGl0bGUodGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBQcm9jZXNzIG1heSBub3QgYmUgcnVubmluZyBcdTIwMTQgaWdub3JlLlxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzUG9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERpc21pc3NlcyBhIG5hdGl2ZSBkaWFsb2cgd2luZG93IGJ5IGl0cyB0aXRsZS5cbiAqXG4gKiBAcGFyYW0gdGl0bGUgLSBUaGUgd2luZG93IHRpdGxlIHRvIGRpc21pc3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRpc21pc3NEaWFsb2dCeVRpdGxlKHRpdGxlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBhd2FpdCBkaXNtaXNzRGlhbG9nV2luZG93cyh0aXRsZSk7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICBhd2FpdCBkaXNtaXNzRGlhbG9nTWFjKHRpdGxlKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBkaXNtaXNzRGlhbG9nTGludXgodGl0bGUpO1xuICB9XG59XG5cbi8qKlxuICogRGlzbWlzc2VzIGEgZGlhbG9nIG9uIExpbnV4IHZpYSB4ZG90b29sLlxuICpcbiAqIEBwYXJhbSB0aXRsZSAtIFRoZSB3aW5kb3cgdGl0bGUgdG8gZGlzbWlzcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0RpYWxvZ0xpbnV4KHRpdGxlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXNjYXBlZFRpdGxlID0gdGl0bGUucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xuICBhd2FpdCBleGVjKFxuICAgIGB4ZG90b29sIHNlYXJjaCAtLW5hbWUgXCIke2VzY2FwZWRUaXRsZX1cIiB3aW5kb3dhY3RpdmF0ZSAtLXN5bmMga2V5IFJldHVybiAyPi9kZXYvbnVsbCB8fCB0cnVlYCxcbiAgICB7IGlzUXVpZXQ6IHRydWUgfVxuICApO1xufVxuXG4vKipcbiAqIERpc21pc3NlcyBhIGRpYWxvZyBvbiBtYWNPUyB2aWEgQXBwbGVTY3JpcHQuXG4gKlxuICogQHBhcmFtIHRpdGxlIC0gVGhlIHdpbmRvdyB0aXRsZSB0byBkaXNtaXNzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkaXNtaXNzRGlhbG9nTWFjKHRpdGxlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXNjYXBlZFRpdGxlID0gdGl0bGUucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xuICBhd2FpdCBleGVjKFxuICAgIGBvc2FzY3JpcHQgLWUgJ3RlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCIgdG8gdGVsbCBwcm9jZXNzIFwiT2JzaWRpYW5cIiB0byBjbGljayBidXR0b24gMSBvZiB3aW5kb3cgXCIke2VzY2FwZWRUaXRsZX1cIidgLFxuICAgIHsgaXNRdWlldDogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogRGlzbWlzc2VzIGEgZGlhbG9nIG9uIFdpbmRvd3MgYnkgc2VuZGluZyBXTV9DTE9TRSB2aWEgV2luMzIgQVBJLlxuICpcbiAqIEBwYXJhbSB0aXRsZSAtIFRoZSB3aW5kb3cgdGl0bGUgdG8gZGlzbWlzcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0RpYWxvZ1dpbmRvd3ModGl0bGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBlc2NhcGVkVGl0bGUgPSB0aXRsZS5yZXBsYWNlKC8nL2csICdcXCdcXCcnKTtcbiAgY29uc3Qgc2NyaXB0ID0gW1xuICAgICdBZGQtVHlwZSAtVHlwZURlZmluaXRpb24gQFwiJyxcbiAgICAndXNpbmcgU3lzdGVtOyB1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7JyxcbiAgICAncHVibGljIGNsYXNzIERsZ0Nsb3NlIHsnLFxuICAgICcgIFtEbGxJbXBvcnQoXCJ1c2VyMzIuZGxsXCIpXSBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgRmluZFdpbmRvdyhzdHJpbmcgYywgc3RyaW5nIHQpOycsXG4gICAgJyAgW0RsbEltcG9ydChcInVzZXIzMi5kbGxcIildIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIEludFB0ciBTZW5kTWVzc2FnZShJbnRQdHIgaCwgdWludCBtLCBJbnRQdHIgdywgSW50UHRyIGwpOycsXG4gICAgJ30nLFxuICAgICdcIkAnLFxuICAgIGAkaCA9IFtEbGdDbG9zZV06OkZpbmRXaW5kb3coJG51bGwsICcke2VzY2FwZWRUaXRsZX0nKWAsXG4gICAgJ2lmICgkaCAtbmUgW0ludFB0cl06Olplcm8pIHsgW0RsZ0Nsb3NlXTo6U2VuZE1lc3NhZ2UoJGgsIDB4MDAxMCwgW0ludFB0cl06Olplcm8sIFtJbnRQdHJdOjpaZXJvKSB9J1xuICBdLmpvaW4oJzsgJyk7XG4gIGF3YWl0IGV4ZWMoYHBvd2Vyc2hlbGwgLUNvbW1hbmQgXCIke3NjcmlwdH1cImAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdpbmRvdyB0aXRsZXMgb2YgYWxsIE9ic2lkaWFuIHByb2Nlc3Mgd2luZG93cy5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiB3aW5kb3cgdGl0bGUgc3RyaW5ncy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T2JzaWRpYW5XaW5kb3dUaXRsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBnZXRXaW5kb3dUaXRsZXNXaW5kb3dzKCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gZ2V0V2luZG93VGl0bGVzTWFjKCk7XG4gIH1cblxuICByZXR1cm4gZ2V0V2luZG93VGl0bGVzTGludXgoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIE9ic2lkaWFuIHdpbmRvdyB0aXRsZXMgb24gTGludXggdmlhIHhkb3Rvb2wuXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygd2luZG93IHRpdGxlIHN0cmluZ3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd1RpdGxlc0xpbnV4KCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlYyhcbiAgICAneGRvdG9vbCBzZWFyY2ggLS1uYW1lIFwiT2JzaWRpYW5cIiBnZXR3aW5kb3duYW1lIDI+L2Rldi9udWxsIHx8IHRydWUnLFxuICAgIHsgaXNRdWlldDogdHJ1ZSB9XG4gICk7XG4gIHJldHVybiBvdXRwdXQudHJpbSgpLnNwbGl0KCdcXG4nKS5maWx0ZXIoQm9vbGVhbik7XG59XG5cbi8qKlxuICogUmV0dXJucyBPYnNpZGlhbiB3aW5kb3cgdGl0bGVzIG9uIG1hY09TIHZpYSBBcHBsZVNjcmlwdC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiB3aW5kb3cgdGl0bGUgc3RyaW5ncy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93VGl0bGVzTWFjKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlYyhcbiAgICAnb3Nhc2NyaXB0IC1lIFxcJ3RlbGwgYXBwbGljYXRpb24gXCJTeXN0ZW0gRXZlbnRzXCIgdG8gZ2V0IG5hbWUgb2YgZXZlcnkgd2luZG93IG9mIChwcm9jZXNzZXMgd2hvc2UgbmFtZSBpcyBcIk9ic2lkaWFuXCIpXFwnJyxcbiAgICB7IGlzUXVpZXQ6IHRydWUgfVxuICApO1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKS5zcGxpdCgnLCAnKS5maWx0ZXIoQm9vbGVhbik7XG59XG5cbi8qKlxuICogUmV0dXJucyBPYnNpZGlhbiB3aW5kb3cgdGl0bGVzIG9uIFdpbmRvd3MgdmlhIEdldC1Qcm9jZXNzLlxuICpcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHdpbmRvdyB0aXRsZSBzdHJpbmdzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dUaXRsZXNXaW5kb3dzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlYyhcbiAgICAncG93ZXJzaGVsbCAtQ29tbWFuZCBcIkdldC1Qcm9jZXNzIE9ic2lkaWFuIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlIHwgV2hlcmUtT2JqZWN0IHsgJF8uTWFpbldpbmRvd1RpdGxlIC1uZSBcXCdcXCcgfSB8IFNlbGVjdC1PYmplY3QgLUV4cGFuZFByb3BlcnR5IE1haW5XaW5kb3dUaXRsZVwiJyxcbiAgICB7IGlzUXVpZXQ6IHRydWUgfVxuICApO1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKS5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBYUEsT0FBTyxhQUFhO0FBRXBCLFNBQVMsWUFBWTtBQW9CckIsTUFBTSxnQkFBZ0I7QUFBQSxFQUNwQjtBQUFBLEVBQ0E7QUFDRjtBQUVBLE1BQU0sZ0NBQWdDO0FBVS9CLE1BQU0sb0JBQW9CO0FBQUEsRUFDdkIsU0FBOEIsQ0FBQztBQUFBLEVBQy9CO0FBQUEsRUFDQSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT2Isa0JBQXdCO0FBQzdCLFFBQUksS0FBSyxPQUFPLFNBQVMsR0FBRztBQUMxQixZQUFNLGVBQWUsS0FBSyxPQUN2QixJQUFJLENBQUMsTUFBTSxRQUFRLEVBQUUsS0FBSyxRQUFRLElBQUksS0FBSyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxFQUN2RSxLQUFLLElBQUk7QUFDWixZQUFNLElBQUksTUFBTTtBQUFBLEVBQTJDLFlBQVksRUFBRTtBQUFBLElBQzNFO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQTBDO0FBQy9DLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFFBQWM7QUFDbkIsU0FBSyxTQUFTLENBQUM7QUFBQSxFQUNqQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBYztBQUNuQixRQUFJLEtBQUssWUFBWTtBQUNuQjtBQUFBLElBQ0Y7QUFDQSxTQUFLLFNBQVMsQ0FBQztBQUNmLFNBQUssYUFBYSxZQUFZLE1BQU07QUFDbEMsV0FBSyxLQUFLLEVBQUUsTUFBTSxNQUFNO0FBQUEsTUFFeEIsQ0FBQztBQUFBLElBQ0gsR0FBRyw2QkFBNkI7QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLE9BQXFDO0FBQzFDLFFBQUksS0FBSyxZQUFZO0FBQ25CLG9CQUFjLEtBQUssVUFBVTtBQUM3QixXQUFLLGFBQWE7QUFBQSxJQUNwQjtBQUNBLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWMsT0FBc0I7QUFDbEMsUUFBSSxLQUFLLFdBQVc7QUFDbEI7QUFBQSxJQUNGO0FBQ0EsU0FBSyxZQUFZO0FBQ2pCLFFBQUk7QUFDRixZQUFNLFNBQVMsTUFBTSx3QkFBd0I7QUFDN0MsaUJBQVcsU0FBUyxRQUFRO0FBQzFCLFlBQUksY0FBYyxTQUFTLEtBQUssR0FBRztBQUNqQyxlQUFLLE9BQU8sS0FBSyxFQUFFLFdBQVcsS0FBSyxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQ2pELGdCQUFNLHFCQUFxQixLQUFLO0FBQUEsUUFDbEM7QUFBQSxNQUNGO0FBQUEsSUFDRixRQUFRO0FBQUEsSUFFUixVQUFFO0FBQ0EsV0FBSyxZQUFZO0FBQUEsSUFDbkI7QUFBQSxFQUNGO0FBQ0Y7QUFPQSxlQUFlLHFCQUFxQixPQUE4QjtBQUNoRSxNQUFJLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFVBQU0scUJBQXFCLEtBQUs7QUFBQSxFQUNsQyxXQUFXLFFBQVEsYUFBYSxVQUFVO0FBQ3hDLFVBQU0saUJBQWlCLEtBQUs7QUFBQSxFQUM5QixPQUFPO0FBQ0wsVUFBTSxtQkFBbUIsS0FBSztBQUFBLEVBQ2hDO0FBQ0Y7QUFPQSxlQUFlLG1CQUFtQixPQUE4QjtBQUM5RCxRQUFNLGVBQWUsTUFBTSxRQUFRLE1BQU0sS0FBSztBQUM5QyxRQUFNO0FBQUEsSUFDSiwwQkFBMEIsWUFBWTtBQUFBLElBQ3RDLEVBQUUsU0FBUyxLQUFLO0FBQUEsRUFDbEI7QUFDRjtBQU9BLGVBQWUsaUJBQWlCLE9BQThCO0FBQzVELFFBQU0sZUFBZSxNQUFNLFFBQVEsTUFBTSxLQUFLO0FBQzlDLFFBQU07QUFBQSxJQUNKLDBHQUEwRyxZQUFZO0FBQUEsSUFDdEgsRUFBRSxTQUFTLEtBQUs7QUFBQSxFQUNsQjtBQUNGO0FBT0EsZUFBZSxxQkFBcUIsT0FBOEI7QUFDaEUsUUFBTSxlQUFlLE1BQU0sUUFBUSxNQUFNLElBQU07QUFDL0MsUUFBTSxTQUFTO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsdUNBQXVDLFlBQVk7QUFBQSxJQUNuRDtBQUFBLEVBQ0YsRUFBRSxLQUFLLElBQUk7QUFDWCxRQUFNLEtBQUssd0JBQXdCLE1BQU0sS0FBSyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ2pFO0FBT0EsZUFBZSwwQkFBNkM7QUFDMUQsTUFBSSxRQUFRLGFBQWEsU0FBUztBQUNoQyxXQUFPLHVCQUF1QjtBQUFBLEVBQ2hDO0FBRUEsTUFBSSxRQUFRLGFBQWEsVUFBVTtBQUNqQyxXQUFPLG1CQUFtQjtBQUFBLEVBQzVCO0FBRUEsU0FBTyxxQkFBcUI7QUFDOUI7QUFPQSxlQUFlLHVCQUEwQztBQUN2RCxRQUFNLFNBQVMsTUFBTTtBQUFBLElBQ25CO0FBQUEsSUFDQSxFQUFFLFNBQVMsS0FBSztBQUFBLEVBQ2xCO0FBQ0EsU0FBTyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksRUFBRSxPQUFPLE9BQU87QUFDakQ7QUFPQSxlQUFlLHFCQUF3QztBQUNyRCxRQUFNLFNBQVMsTUFBTTtBQUFBLElBQ25CO0FBQUEsSUFDQSxFQUFFLFNBQVMsS0FBSztBQUFBLEVBQ2xCO0FBQ0EsU0FBTyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksRUFBRSxPQUFPLE9BQU87QUFDakQ7QUFPQSxlQUFlLHlCQUE0QztBQUN6RCxRQUFNLFNBQVMsTUFBTTtBQUFBLElBQ25CO0FBQUEsSUFDQSxFQUFFLFNBQVMsS0FBSztBQUFBLEVBQ2xCO0FBQ0EsU0FBTyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFLE9BQU8sT0FBTztBQUM1RTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -3,6 +3,23 @@
3
3
  *
4
4
  * Reads and queries Obsidian's local configuration (`obsidian.json`).
5
5
  */
6
+ /**
7
+ * A registered vault entry returned by {@link getRegisteredVaults}.
8
+ */
9
+ export interface RegisteredVault {
10
+ /**
11
+ * The hex vault ID from `obsidian.json`.
12
+ */
13
+ id: string;
14
+ /**
15
+ * Whether the vault is currently marked as open.
16
+ */
17
+ open: boolean;
18
+ /**
19
+ * The absolute path to the vault folder.
20
+ */
21
+ path: string;
22
+ }
6
23
  /**
7
24
  * Enables the CLI in Obsidian's `obsidian.json` config file.
8
25
  *
@@ -19,6 +36,12 @@ export declare function enableCliInConfig(): void;
19
36
  * @returns The absolute path to a registered vault, or `undefined` if no vaults are registered.
20
37
  */
21
38
  export declare function getAnyRegisteredVaultPath(): string | undefined;
39
+ /**
40
+ * Returns all registered vaults from Obsidian's `obsidian.json` registry.
41
+ *
42
+ * @returns An array of registered vault entries.
43
+ */
44
+ export declare function getRegisteredVaults(): RegisteredVault[];
22
45
  /**
23
46
  * Returns the hex vault ID for a given vault path from Obsidian's registry.
24
47
  *
@@ -32,6 +55,16 @@ export declare function getVaultId(vaultPath: string): string | undefined;
32
55
  * @returns `true` if the CLI is enabled, `false` otherwise.
33
56
  */
34
57
  export declare function isCliEnabled(): boolean;
58
+ /**
59
+ * Checks whether a vault is marked as open in Obsidian's vault registry.
60
+ *
61
+ * Note: This checks the `open` flag in `obsidian.json`, which is updated
62
+ * asynchronously by Obsidian. It may not reflect the current runtime state.
63
+ *
64
+ * @param vaultPath - The absolute path to the vault folder.
65
+ * @returns `true` if the vault is registered and marked as open, `false` otherwise.
66
+ */
67
+ export declare function isVaultOpen(vaultPath: string): boolean;
35
68
  /**
36
69
  * Checks whether a vault path is registered in Obsidian's vault registry.
37
70
  *
@@ -22,6 +22,17 @@ function getAnyRegisteredVaultPath() {
22
22
  const firstEntry = Object.values(config.vaults)[0];
23
23
  return firstEntry?.path;
24
24
  }
25
+ function getRegisteredVaults() {
26
+ const config = readObsidianJson();
27
+ if (!config) {
28
+ return [];
29
+ }
30
+ return Object.entries(config.vaults).map(([id, entry]) => ({
31
+ id,
32
+ open: entry.open === true,
33
+ path: entry.path
34
+ }));
35
+ }
25
36
  function getVaultId(vaultPath) {
26
37
  const config = readObsidianJson();
27
38
  if (!config) {
@@ -39,6 +50,19 @@ function isCliEnabled() {
39
50
  const config = readObsidianJson();
40
51
  return config?.cli === true;
41
52
  }
53
+ function isVaultOpen(vaultPath) {
54
+ const config = readObsidianJson();
55
+ if (!config) {
56
+ return false;
57
+ }
58
+ const normalizedTarget = normalizePath(vaultPath);
59
+ for (const entry of Object.values(config.vaults)) {
60
+ if (normalizePath(entry.path) === normalizedTarget) {
61
+ return entry.open === true;
62
+ }
63
+ }
64
+ return false;
65
+ }
42
66
  function isVaultRegistered(vaultPath) {
43
67
  return getVaultId(vaultPath) !== void 0;
44
68
  }
@@ -101,10 +125,12 @@ function writeObsidianJson(config) {
101
125
  export {
102
126
  enableCliInConfig,
103
127
  getAnyRegisteredVaultPath,
128
+ getRegisteredVaults,
104
129
  getVaultId,
105
130
  isCliEnabled,
131
+ isVaultOpen,
106
132
  isVaultRegistered,
107
133
  registerVaultInConfig,
108
134
  removeVaultFromConfig
109
135
  };
110
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlYWRzIGFuZCBxdWVyaWVzIE9ic2lkaWFuJ3MgbG9jYWwgY29uZmlndXJhdGlvbiAoYG9ic2lkaWFuLmpzb25gKS5cbiAqL1xuXG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gIHJlYWRGaWxlU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7XG4gIGpvaW4sXG4gIHJlc29sdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbi8qKlxuICogVGhlIHRvcC1sZXZlbCBzdHJ1Y3R1cmUgb2YgT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgY29uZmlnIGZpbGUuXG4gKi9cbmludGVyZmFjZSBPYnNpZGlhbkpzb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgQ0xJIGlzIGVuYWJsZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBjbGk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgdmF1bHQgSURzIHRvIHZhdWx0IGVudHJpZXMuXG4gICAqL1xuICB2YXVsdHM6IFJlY29yZDxzdHJpbmcsIE9ic2lkaWFuVmF1bHRFbnRyeT47XG59XG5cbi8qKlxuICogQSBzaW5nbGUgdmF1bHQgZW50cnkgaW4gYG9ic2lkaWFuLmpzb25gLlxuICovXG5pbnRlcmZhY2UgT2JzaWRpYW5WYXVsdEVudHJ5IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHZhdWx0IGlzIGN1cnJlbnRseSBvcGVuLlxuICAgKi9cbiAgb3Blbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCBhY2Nlc3MuXG4gICAqL1xuICB0czogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgdGhlIENMSSBpbiBPYnNpZGlhbidzIGBvYnNpZGlhbi5qc29uYCBjb25maWcgZmlsZS5cbiAqXG4gKiBTZXRzIGBjbGk6IHRydWVgIHNvIHRoYXQgT2JzaWRpYW4gc3RhcnRzIGl0cyBDTEkgc2VydmVyIG9uIG5leHQgbGF1bmNoLlxuICogSWYgdGhlIGNvbmZpZyBmaWxlIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZXMgaXQgd2l0aCBhbiBlbXB0eSB2YXVsdHMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlQ2xpSW5Db25maWcoKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRPYnNpZGlhbkpzb24oKSA/PyB7IHZhdWx0czoge30gfTtcbiAgY29uZmlnLmNsaSA9IHRydWU7XG4gIHdyaXRlT2JzaWRpYW5Kc29uKGNvbmZpZyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBvZiBhbnkgdmF1bHQgdGhhdCBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBpbiBPYnNpZGlhbidzIHJlZ2lzdHJ5LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYW4gYG9ic2lkaWFuIGV2YWxgIGNhbGwgbXVzdCBydW4gaW5zaWRlIGFuIGV4aXN0aW5nIHZhdWx0XG4gKiB3aW5kb3cgKGUuZy4sIHRvIGlzc3VlIElQQyBjb21tYW5kcyB0aGF0IHJlZ2lzdGVyIG9yIHJlbW92ZSBvdGhlciB2YXVsdHMpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVnaXN0ZXJlZCB2YXVsdCwgb3IgYHVuZGVmaW5lZGAgaWYgbm8gdmF1bHRzIGFyZSByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0RW50cnkgPSBPYmplY3QudmFsdWVzKGNvbmZpZy52YXVsdHMpWzBdO1xuICByZXR1cm4gZmlyc3RFbnRyeT8ucGF0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBoZXggdmF1bHQgSUQgZm9yIGEgZ2l2ZW4gdmF1bHQgcGF0aCBmcm9tIE9ic2lkaWFuJ3MgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKiBAcmV0dXJucyBUaGUgdmF1bHQgSUQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSB2YXVsdCBpcyBub3QgcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhdWx0SWQodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYXRoKHZhdWx0UGF0aCk7XG5cbiAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudmF1bHRzKSkge1xuICAgIGlmIChub3JtYWxpemVQYXRoKGVudHJ5LnBhdGgpID09PSBub3JtYWxpemVkVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gQ0xJIGlzIGVuYWJsZWQgaW4gT2JzaWRpYW4ncyBzZXR0aW5ncy5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIENMSSBpcyBlbmFibGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgY29uZmlnID0gcmVhZE9ic2lkaWFuSnNvbigpO1xuICByZXR1cm4gY29uZmlnPy5jbGkgPT09IHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXVsdCBwYXRoIGlzIHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW4ncyB2YXVsdCByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmF1bHQgaXMgcmVnaXN0ZXJlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhdWx0UmVnaXN0ZXJlZCh2YXVsdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgdmF1bHQgZGlyZWN0bHkgaW4gT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgY29uZmlnIGZpbGUuXG4gKlxuICogVGhpcyB3cml0ZXMgYSBuZXcgdmF1bHQgZW50cnkgd2l0aCBhIHJhbmRvbSBoZXggSUQuIFVzZWQgd2hlbiBubyBleGlzdGluZ1xuICogdmF1bHQgaXMgYXZhaWxhYmxlIHRvIHNlbmQgSVBDIGNvbW1hbmRzIHRocm91Z2ggXHUyMDE0IHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkXG4gKiBcIm9mZmxpbmVcIiBzbyBPYnNpZGlhbiB3aWxsIG9wZW4gaXQgb24gbmV4dCBsYXVuY2guXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclZhdWx0SW5Db25maWcodmF1bHRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgY29uZmlnID0gcmVhZE9ic2lkaWFuSnNvbigpID8/IHsgdmF1bHRzOiB7fSB9O1xuICBjb25zdCBWQVVMVF9JRF9CWVRFX0xFTkdUSCA9IDg7XG4gIGNvbnN0IGlkID0gcmFuZG9tQnl0ZXMoVkFVTFRfSURfQllURV9MRU5HVEgpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uZmlnLnZhdWx0c1tpZF0gPSB7IHBhdGg6IHZhdWx0UGF0aCwgdHM6IERhdGUubm93KCkgfTtcbiAgY29uZmlnLmNsaSA9IHRydWU7XG4gIHdyaXRlT2JzaWRpYW5Kc29uKGNvbmZpZyk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBhIHZhdWx0IGVudHJ5IGZyb20gT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgY29uZmlnIGZpbGUuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhdWx0IHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVWYXVsdEZyb21Db25maWcodmF1bHRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY29uZmlnID0gcmVhZE9ic2lkaWFuSnNvbigpO1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYXRoKHZhdWx0UGF0aCk7XG4gIGxldCB3YXNGb3VuZCA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2lkLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLnZhdWx0cykpIHtcbiAgICBpZiAobm9ybWFsaXplUGF0aChlbnRyeS5wYXRoKSA9PT0gbm9ybWFsaXplZFRhcmdldCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBSZW1vdmluZyBhIHZhdWx0IGVudHJ5IGJ5IGl0cyBkeW5hbWljIGtleS5cbiAgICAgIGRlbGV0ZSBjb25maWcudmF1bHRzW2lkXTtcbiAgICAgIHdhc0ZvdW5kID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICh3YXNGb3VuZCkge1xuICAgIHdyaXRlT2JzaWRpYW5Kc29uKGNvbmZpZyk7XG4gIH1cblxuICByZXR1cm4gd2FzRm91bmQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCB0byBPYnNpZGlhbidzIGNvbmZpZyBkaXJlY3RvcnkuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGBvYnNpZGlhbi9gIGNvbmZpZyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuQ29uZmlnRGlyKCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc3QgYXBwRGF0YSA9IHByb2Nlc3MuZW52WydBUFBEQVRBJ107XG4gICAgaWYgKGFwcERhdGEpIHtcbiAgICAgIHJldHVybiBqb2luKGFwcERhdGEsICdvYnNpZGlhbicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBqb2luKGhvbWVkaXIoKSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdvYnNpZGlhbicpO1xuICB9XG5cbiAgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnZbJ1hER19DT05GSUdfSE9NRSddID8/IGpvaW4oaG9tZWRpcigpLCAnLmNvbmZpZycpLCAnb2JzaWRpYW4nKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgdmF1bHQgcGF0aCBmb3IgY29tcGFyaXNvbi5cbiAqIE9uIFdpbmRvd3MsIHBhdGhzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBzZXBhcmF0b3JzIG1heSB2YXJ5LlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgcGF0aCB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXRoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHZhdWx0UGF0aCk7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gcmVzb2x2ZWQudG9Mb3dlckNhc2UoKSA6IHJlc29sdmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgY29uZmlnIGZpbGUuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBjb25maWcsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkLlxuICovXG5mdW5jdGlvbiByZWFkT2JzaWRpYW5Kc29uKCk6IE9ic2lkaWFuSnNvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGdldE9ic2lkaWFuQ29uZmlnRGlyKCksICdvYnNpZGlhbi5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KSBhcyBPYnNpZGlhbkpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGdpdmVuIGNvbmZpZyBvYmplY3QgdG8gT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgZmlsZS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZyB0byB3cml0ZS5cbiAqL1xuZnVuY3Rpb24gd3JpdGVPYnNpZGlhbkpzb24oY29uZmlnOiBPYnNpZGlhbkpzb24pOiB2b2lkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oZ2V0T2JzaWRpYW5Db25maWdEaXIoKSwgJ29ic2lkaWFuLmpzb24nKTtcbiAgd3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQU1BLFNBQVMsbUJBQW1CO0FBQzVCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlO0FBQ3hCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxhQUFhO0FBMkNiLFNBQVMsb0JBQTBCO0FBQ3hDLFFBQU0sU0FBUyxpQkFBaUIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFO0FBQ2xELFNBQU8sTUFBTTtBQUNiLG9CQUFrQixNQUFNO0FBQzFCO0FBVU8sU0FBUyw0QkFBZ0Q7QUFDOUQsUUFBTSxTQUFTLGlCQUFpQjtBQUNoQyxNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxhQUFhLE9BQU8sT0FBTyxPQUFPLE1BQU0sRUFBRSxDQUFDO0FBQ2pELFNBQU8sWUFBWTtBQUNyQjtBQVFPLFNBQVMsV0FBVyxXQUF1QztBQUNoRSxRQUFNLFNBQVMsaUJBQWlCO0FBQ2hDLE1BQUksQ0FBQyxRQUFRO0FBQ1gsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLG1CQUFtQixjQUFjLFNBQVM7QUFFaEQsYUFBVyxDQUFDLElBQUksS0FBSyxLQUFLLE9BQU8sUUFBUSxPQUFPLE1BQU0sR0FBRztBQUN2RCxRQUFJLGNBQWMsTUFBTSxJQUFJLE1BQU0sa0JBQWtCO0FBQ2xELGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQU9PLFNBQVMsZUFBd0I7QUFDdEMsUUFBTSxTQUFTLGlCQUFpQjtBQUNoQyxTQUFPLFFBQVEsUUFBUTtBQUN6QjtBQVFPLFNBQVMsa0JBQWtCLFdBQTRCO0FBQzVELFNBQU8sV0FBVyxTQUFTLE1BQU07QUFDbkM7QUFXTyxTQUFTLHNCQUFzQixXQUF5QjtBQUM3RCxRQUFNLFNBQVMsaUJBQWlCLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTtBQUNsRCxRQUFNLHVCQUF1QjtBQUM3QixRQUFNLEtBQUssWUFBWSxvQkFBb0IsRUFBRSxTQUFTLEtBQUs7QUFDM0QsU0FBTyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQ3RELFNBQU8sTUFBTTtBQUNiLG9CQUFrQixNQUFNO0FBQzFCO0FBUU8sU0FBUyxzQkFBc0IsV0FBNEI7QUFDaEUsUUFBTSxTQUFTLGlCQUFpQjtBQUNoQyxNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBbUIsY0FBYyxTQUFTO0FBQ2hELE1BQUksV0FBVztBQUVmLGFBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxPQUFPLFFBQVEsT0FBTyxNQUFNLEdBQUc7QUFDdkQsUUFBSSxjQUFjLE1BQU0sSUFBSSxNQUFNLGtCQUFrQjtBQUVsRCxhQUFPLE9BQU8sT0FBTyxFQUFFO0FBQ3ZCLGlCQUFXO0FBQ1g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksVUFBVTtBQUNaLHNCQUFrQixNQUFNO0FBQUEsRUFDMUI7QUFFQSxTQUFPO0FBQ1Q7QUFPQSxTQUFTLHVCQUErQjtBQUN0QyxNQUFJLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFVBQU0sVUFBVSxRQUFRLElBQUksU0FBUztBQUNyQyxRQUFJLFNBQVM7QUFDWCxhQUFPLEtBQUssU0FBUyxVQUFVO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBRUEsTUFBSSxRQUFRLGFBQWEsVUFBVTtBQUNqQyxXQUFPLEtBQUssUUFBUSxHQUFHLFdBQVcsdUJBQXVCLFVBQVU7QUFBQSxFQUNyRTtBQUVBLFNBQU8sS0FBSyxRQUFRLElBQUksaUJBQWlCLEtBQUssS0FBSyxRQUFRLEdBQUcsU0FBUyxHQUFHLFVBQVU7QUFDdEY7QUFTQSxTQUFTLGNBQWMsV0FBMkI7QUFDaEQsUUFBTSxXQUFXLFFBQVEsU0FBUztBQUNsQyxTQUFPLFFBQVEsYUFBYSxVQUFVLFNBQVMsWUFBWSxJQUFJO0FBQ2pFO0FBT0EsU0FBUyxtQkFBNkM7QUFDcEQsUUFBTSxhQUFhLEtBQUsscUJBQXFCLEdBQUcsZUFBZTtBQUMvRCxNQUFJO0FBQ0YsVUFBTSxVQUFVLGFBQWEsWUFBWSxPQUFPO0FBQ2hELFdBQU8sS0FBSyxNQUFNLE9BQU87QUFBQSxFQUMzQixRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQU9BLFNBQVMsa0JBQWtCLFFBQTRCO0FBQ3JELFFBQU0sYUFBYSxLQUFLLHFCQUFxQixHQUFHLGVBQWU7QUFDL0QsZ0JBQWMsWUFBWSxLQUFLLFVBQVUsTUFBTSxDQUFDO0FBQ2xEOyIsCiAgIm5hbWVzIjogW10KfQo=
136
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlYWRzIGFuZCBxdWVyaWVzIE9ic2lkaWFuJ3MgbG9jYWwgY29uZmlndXJhdGlvbiAoYG9ic2lkaWFuLmpzb25gKS5cbiAqL1xuXG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gIHJlYWRGaWxlU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7XG4gIGpvaW4sXG4gIHJlc29sdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbi8qKlxuICogQSByZWdpc3RlcmVkIHZhdWx0IGVudHJ5IHJldHVybmVkIGJ5IHtAbGluayBnZXRSZWdpc3RlcmVkVmF1bHRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlcmVkVmF1bHQge1xuICAvKipcbiAgICogVGhlIGhleCB2YXVsdCBJRCBmcm9tIGBvYnNpZGlhbi5qc29uYC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHZhdWx0IGlzIGN1cnJlbnRseSBtYXJrZWQgYXMgb3Blbi5cbiAgICovXG4gIG9wZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHRvcC1sZXZlbCBzdHJ1Y3R1cmUgb2YgT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgY29uZmlnIGZpbGUuXG4gKi9cbmludGVyZmFjZSBPYnNpZGlhbkpzb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgQ0xJIGlzIGVuYWJsZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBjbGk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgdmF1bHQgSURzIHRvIHZhdWx0IGVudHJpZXMuXG4gICAqL1xuICB2YXVsdHM6IFJlY29yZDxzdHJpbmcsIE9ic2lkaWFuVmF1bHRFbnRyeT47XG59XG5cbi8qKlxuICogQSBzaW5nbGUgdmF1bHQgZW50cnkgaW4gYG9ic2lkaWFuLmpzb25gLlxuICovXG5pbnRlcmZhY2UgT2JzaWRpYW5WYXVsdEVudHJ5IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHZhdWx0IGlzIGN1cnJlbnRseSBvcGVuLlxuICAgKi9cbiAgb3Blbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCBhY2Nlc3MuXG4gICAqL1xuICB0czogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgdGhlIENMSSBpbiBPYnNpZGlhbidzIGBvYnNpZGlhbi5qc29uYCBjb25maWcgZmlsZS5cbiAqXG4gKiBTZXRzIGBjbGk6IHRydWVgIHNvIHRoYXQgT2JzaWRpYW4gc3RhcnRzIGl0cyBDTEkgc2VydmVyIG9uIG5leHQgbGF1bmNoLlxuICogSWYgdGhlIGNvbmZpZyBmaWxlIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZXMgaXQgd2l0aCBhbiBlbXB0eSB2YXVsdHMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlQ2xpSW5Db25maWcoKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRPYnNpZGlhbkpzb24oKSA/PyB7IHZhdWx0czoge30gfTtcbiAgY29uZmlnLmNsaSA9IHRydWU7XG4gIHdyaXRlT2JzaWRpYW5Kc29uKGNvbmZpZyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBvZiBhbnkgdmF1bHQgdGhhdCBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBpbiBPYnNpZGlhbidzIHJlZ2lzdHJ5LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYW4gYG9ic2lkaWFuIGV2YWxgIGNhbGwgbXVzdCBydW4gaW5zaWRlIGFuIGV4aXN0aW5nIHZhdWx0XG4gKiB3aW5kb3cgKGUuZy4sIHRvIGlzc3VlIElQQyBjb21tYW5kcyB0aGF0IHJlZ2lzdGVyIG9yIHJlbW92ZSBvdGhlciB2YXVsdHMpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVnaXN0ZXJlZCB2YXVsdCwgb3IgYHVuZGVmaW5lZGAgaWYgbm8gdmF1bHRzIGFyZSByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0RW50cnkgPSBPYmplY3QudmFsdWVzKGNvbmZpZy52YXVsdHMpWzBdO1xuICByZXR1cm4gZmlyc3RFbnRyeT8ucGF0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIHZhdWx0cyBmcm9tIE9ic2lkaWFuJ3MgYG9ic2lkaWFuLmpzb25gIHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHJlZ2lzdGVyZWQgdmF1bHQgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRWYXVsdHMoKTogUmVnaXN0ZXJlZFZhdWx0W10ge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGNvbmZpZy52YXVsdHMpLm1hcCgoW2lkLCBlbnRyeV0pID0+ICh7XG4gICAgaWQsXG4gICAgb3BlbjogZW50cnkub3BlbiA9PT0gdHJ1ZSxcbiAgICBwYXRoOiBlbnRyeS5wYXRoXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBoZXggdmF1bHQgSUQgZm9yIGEgZ2l2ZW4gdmF1bHQgcGF0aCBmcm9tIE9ic2lkaWFuJ3MgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKiBAcmV0dXJucyBUaGUgdmF1bHQgSUQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSB2YXVsdCBpcyBub3QgcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhdWx0SWQodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYXRoKHZhdWx0UGF0aCk7XG5cbiAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudmF1bHRzKSkge1xuICAgIGlmIChub3JtYWxpemVQYXRoKGVudHJ5LnBhdGgpID09PSBub3JtYWxpemVkVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gQ0xJIGlzIGVuYWJsZWQgaW4gT2JzaWRpYW4ncyBzZXR0aW5ncy5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIENMSSBpcyBlbmFibGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgY29uZmlnID0gcmVhZE9ic2lkaWFuSnNvbigpO1xuICByZXR1cm4gY29uZmlnPy5jbGkgPT09IHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXVsdCBpcyBtYXJrZWQgYXMgb3BlbiBpbiBPYnNpZGlhbidzIHZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIE5vdGU6IFRoaXMgY2hlY2tzIHRoZSBgb3BlbmAgZmxhZyBpbiBgb2JzaWRpYW4uanNvbmAsIHdoaWNoIGlzIHVwZGF0ZWRcbiAqIGFzeW5jaHJvbm91c2x5IGJ5IE9ic2lkaWFuLiBJdCBtYXkgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgcnVudGltZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmF1bHQgaXMgcmVnaXN0ZXJlZCBhbmQgbWFya2VkIGFzIG9wZW4sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYXVsdE9wZW4odmF1bHRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY29uZmlnID0gcmVhZE9ic2lkaWFuSnNvbigpO1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYXRoKHZhdWx0UGF0aCk7XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBPYmplY3QudmFsdWVzKGNvbmZpZy52YXVsdHMpKSB7XG4gICAgaWYgKG5vcm1hbGl6ZVBhdGgoZW50cnkucGF0aCkgPT09IG5vcm1hbGl6ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiBlbnRyeS5vcGVuID09PSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhdWx0IHBhdGggaXMgcmVnaXN0ZXJlZCBpbiBPYnNpZGlhbidzIHZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRWYXVsdElkKHZhdWx0UGF0aCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSB2YXVsdCBkaXJlY3RseSBpbiBPYnNpZGlhbidzIGBvYnNpZGlhbi5qc29uYCBjb25maWcgZmlsZS5cbiAqXG4gKiBUaGlzIHdyaXRlcyBhIG5ldyB2YXVsdCBlbnRyeSB3aXRoIGEgcmFuZG9tIGhleCBJRC4gVXNlZCB3aGVuIG5vIGV4aXN0aW5nXG4gKiB2YXVsdCBpcyBhdmFpbGFibGUgdG8gc2VuZCBJUEMgY29tbWFuZHMgdGhyb3VnaCBcdTIwMTQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWRcbiAqIFwib2ZmbGluZVwiIHNvIE9ic2lkaWFuIHdpbGwgb3BlbiBpdCBvbiBuZXh0IGxhdW5jaC5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVmF1bHRJbkNvbmZpZyh2YXVsdFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCkgPz8geyB2YXVsdHM6IHt9IH07XG4gIGNvbnN0IFZBVUxUX0lEX0JZVEVfTEVOR1RIID0gODtcbiAgY29uc3QgaWQgPSByYW5kb21CeXRlcyhWQVVMVF9JRF9CWVRFX0xFTkdUSCkudG9TdHJpbmcoJ2hleCcpO1xuICBjb25maWcudmF1bHRzW2lkXSA9IHsgcGF0aDogdmF1bHRQYXRoLCB0czogRGF0ZS5ub3coKSB9O1xuICBjb25maWcuY2xpID0gdHJ1ZTtcbiAgd3JpdGVPYnNpZGlhbkpzb24oY29uZmlnKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGEgdmF1bHQgZW50cnkgZnJvbSBPYnNpZGlhbidzIGBvYnNpZGlhbi5qc29uYCBjb25maWcgZmlsZS5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmF1bHQgd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVZhdWx0RnJvbUNvbmZpZyh2YXVsdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldCA9IG5vcm1hbGl6ZVBhdGgodmF1bHRQYXRoKTtcbiAgbGV0IHdhc0ZvdW5kID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudmF1bHRzKSkge1xuICAgIGlmIChub3JtYWxpemVQYXRoKGVudHJ5LnBhdGgpID09PSBub3JtYWxpemVkVGFyZ2V0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFJlbW92aW5nIGEgdmF1bHQgZW50cnkgYnkgaXRzIGR5bmFtaWMga2V5LlxuICAgICAgZGVsZXRlIGNvbmZpZy52YXVsdHNbaWRdO1xuICAgICAgd2FzRm91bmQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdhc0ZvdW5kKSB7XG4gICAgd3JpdGVPYnNpZGlhbkpzb24oY29uZmlnKTtcbiAgfVxuXG4gIHJldHVybiB3YXNGb3VuZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoIHRvIE9ic2lkaWFuJ3MgY29uZmlnIGRpcmVjdG9yeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgYG9ic2lkaWFuL2AgY29uZmlnIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gZ2V0T2JzaWRpYW5Db25maWdEaXIoKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zdCBhcHBEYXRhID0gcHJvY2Vzcy5lbnZbJ0FQUERBVEEnXTtcbiAgICBpZiAoYXBwRGF0YSkge1xuICAgICAgcmV0dXJuIGpvaW4oYXBwRGF0YSwgJ29ic2lkaWFuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuIGpvaW4oaG9tZWRpcigpLCAnTGlicmFyeScsICdBcHBsaWNhdGlvbiBTdXBwb3J0JywgJ29ic2lkaWFuJyk7XG4gIH1cblxuICByZXR1cm4gam9pbihwcm9jZXNzLmVudlsnWERHX0NPTkZJR19IT01FJ10gPz8gam9pbihob21lZGlyKCksICcuY29uZmlnJyksICdvYnNpZGlhbicpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSB2YXVsdCBwYXRoIGZvciBjb21wYXJpc29uLlxuICogT24gV2luZG93cywgcGF0aHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHNlcGFyYXRvcnMgbWF5IHZhcnkuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBwYXRoIHRvIG5vcm1hbGl6ZS5cbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUodmF1bHRQYXRoKTtcbiAgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyByZXNvbHZlZC50b0xvd2VyQ2FzZSgpIDogcmVzb2x2ZWQ7XG59XG5cbi8qKlxuICogUmVhZHMgYW5kIHBhcnNlcyBPYnNpZGlhbidzIGBvYnNpZGlhbi5qc29uYCBjb25maWcgZmlsZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGNvbmZpZywgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRPYnNpZGlhbkpzb24oKTogT2JzaWRpYW5Kc29uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oZ2V0T2JzaWRpYW5Db25maWdEaXIoKSwgJ29ic2lkaWFuLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGYtOCcpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIE9ic2lkaWFuSnNvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZ2l2ZW4gY29uZmlnIG9iamVjdCB0byBPYnNpZGlhbidzIGBvYnNpZGlhbi5qc29uYCBmaWxlLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlnIHRvIHdyaXRlLlxuICovXG5mdW5jdGlvbiB3cml0ZU9ic2lkaWFuSnNvbihjb25maWc6IE9ic2lkaWFuSnNvbik6IHZvaWQge1xuICBjb25zdCBjb25maWdQYXRoID0gam9pbihnZXRPYnNpZGlhbkNvbmZpZ0RpcigpLCAnb2JzaWRpYW4uanNvbicpO1xuICB3cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xufVxuIl0sCiAg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
@@ -0,0 +1,114 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Type definitions for the `window.__obsidianIntegrationTesting` namespace
5
+ * used inside the Obsidian process. All library state and registered helper
6
+ * functions live under this single namespace to avoid polluting `window`.
7
+ */
8
+ /**
9
+ * Parameters for the registered `evalWrapper` function.
10
+ */
11
+ export interface EvalWrapperNamespaceParams {
12
+ /** User-supplied arguments to pass to `fn`. */
13
+ args: Record<string, unknown>;
14
+ /** Optional context ID for persistent storage. */
15
+ contextId?: string;
16
+ /** The user function to evaluate. */
17
+ fn(args: Record<string, unknown>): unknown;
18
+ }
19
+ /**
20
+ * Parameters for {@link ObsidianIntegrationTestingNamespace.ipcSendSync}.
21
+ */
22
+ export interface IpcSendSyncNamespaceParams {
23
+ /** The IPC arguments. */
24
+ args: unknown[];
25
+ /** The IPC channel name. */
26
+ channel: string;
27
+ }
28
+ /**
29
+ * Holder interface for type-safe access to `window.__obsidianIntegrationTesting`.
30
+ * Use with `Partial<ObsidianIntegrationTestingHolder>` to safely check existence.
31
+ */
32
+ export interface ObsidianIntegrationTestingHolder {
33
+ __obsidianIntegrationTesting: ObsidianIntegrationTestingNamespace;
34
+ }
35
+ /**
36
+ * The namespace object stored on `window.__obsidianIntegrationTesting`
37
+ * inside the Obsidian process. Registered once via {@link bootstrapNamespace}
38
+ * and reused across all subsequent `evalInObsidian` calls.
39
+ *
40
+ * All functions access `window.app` directly — callers do not need to pass it.
41
+ */
42
+ export interface ObsidianIntegrationTestingNamespace {
43
+ /**
44
+ * Persistent context objects keyed by {@link ContextId} string.
45
+ * Preserved across version upgrades so live context references survive.
46
+ */
47
+ contexts: Record<string, Record<string, unknown>>;
48
+ /**
49
+ * Destroys the current Electron window.
50
+ */
51
+ destroyCurrentWindow(): Promise<void>;
52
+ /**
53
+ * Waits for the Obsidian workspace layout to be ready.
54
+ */
55
+ ensureLayoutReady(): Promise<void>;
56
+ /**
57
+ * The top-level wrapper that sets up context, resolves the obsidian module,
58
+ * calls the user's function, and returns a JSON envelope.
59
+ *
60
+ * @param params - Parameters including the user's function, args, and context ID.
61
+ * @returns A JSON-stringified result envelope.
62
+ */
63
+ evalWrapper(params: EvalWrapperNamespaceParams): Promise<string>;
64
+ /**
65
+ * Resolves the `obsidian` module at runtime inside the Obsidian process.
66
+ *
67
+ * @returns The `obsidian` module.
68
+ */
69
+ getObsidianModule(): Promise<unknown>;
70
+ /**
71
+ * Sends an IPC message synchronously via Electron's `ipcRenderer`.
72
+ *
73
+ * @param params - The IPC channel and arguments.
74
+ */
75
+ ipcSendSync(params: IpcSendSyncNamespaceParams): Promise<void>;
76
+ /**
77
+ * Cached `obsidian` module, set by {@link getObsidianModule} on first resolution.
78
+ */
79
+ obsidianModule?: unknown;
80
+ /**
81
+ * Returns the vault's base path as a JSON-encoded string.
82
+ *
83
+ * @returns The JSON-encoded base path.
84
+ */
85
+ pollVaultBasePath(): Promise<string>;
86
+ /**
87
+ * Serializes an error into a human-readable string with stack trace and cause chain.
88
+ *
89
+ * @param error - The error to serialize.
90
+ * @param depth - The current nesting depth.
91
+ * @returns A formatted error string.
92
+ */
93
+ serializeError(error: unknown, depth?: number): string;
94
+ /**
95
+ * Sets a `localStorage` item.
96
+ *
97
+ * @param params - The key and value to set.
98
+ */
99
+ setLocalStorageItem(params: SetLocalStorageItemNamespaceParams): Promise<void>;
100
+ /**
101
+ * The library version that was used to bootstrap this namespace.
102
+ * Used to detect version mismatches and re-initialize.
103
+ */
104
+ version: string;
105
+ }
106
+ /**
107
+ * Parameters for {@link ObsidianIntegrationTestingNamespace.setLocalStorageItem}.
108
+ */
109
+ export interface SetLocalStorageItemNamespaceParams {
110
+ /** The localStorage key. */
111
+ key: string;
112
+ /** The localStorage value. */
113
+ value: string;
114
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K