obsidian-integration-testing 9.2.2 → 10.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.
- package/README.md +45 -45
- package/dist/lib/cjs/appium-dependencies.cjs +5 -5
- package/dist/lib/cjs/appium-dependencies.d.cts +4 -2
- package/dist/lib/cjs/appium-session-config.cjs +1 -1
- package/dist/lib/cjs/asar-fallback-detection.cjs +4 -4
- package/dist/lib/cjs/asar-fallback-detection.d.cts +15 -7
- package/dist/lib/cjs/avd-list.cjs +1 -1
- package/dist/lib/cjs/avd-list.d.cts +6 -2
- package/dist/lib/cjs/cli.cjs +4 -4
- package/dist/lib/cjs/compatibility-options.cjs +13 -13
- package/dist/lib/cjs/compatibility-options.d.cts +24 -12
- package/dist/lib/cjs/connect-to-cdp.cjs +4 -4
- package/dist/lib/cjs/connect-to-cdp.d.cts +6 -6
- package/dist/lib/cjs/context-id.cjs +5 -5
- package/dist/lib/cjs/context-id.d.cts +1 -1
- package/dist/lib/cjs/context-provider.cjs +5 -5
- package/dist/lib/cjs/context-provider.d.cts +4 -4
- package/dist/lib/cjs/demo-vault-populate.cjs +5 -5
- package/dist/lib/cjs/demo-vault-populate.d.cts +4 -4
- package/dist/lib/cjs/demo-vault-tree.cjs +4 -4
- package/dist/lib/cjs/demo-vault-tree.d.cts +3 -3
- package/dist/lib/cjs/device-readiness.cjs +3 -3
- package/dist/lib/cjs/device-readiness.d.cts +7 -3
- package/dist/lib/cjs/ecmascript-version.cjs +1 -1
- package/dist/lib/cjs/electron-compatibility.cjs +4 -4
- package/dist/lib/cjs/electron-compatibility.d.cts +33 -17
- package/dist/lib/cjs/emulator-arguments.cjs +36 -0
- package/dist/lib/{esm/emulator-args.d.mts → cjs/emulator-arguments.d.cts} +6 -4
- package/dist/lib/cjs/enable-plugin.cjs +29 -29
- package/dist/lib/cjs/enable-plugin.d.cts +6 -6
- package/dist/lib/cjs/eval-in-obsidian.cjs +9 -9
- package/dist/lib/cjs/eval-in-obsidian.d.cts +23 -23
- package/dist/lib/cjs/exec.cjs +49 -53
- package/dist/lib/cjs/exec.d.cts +9 -9
- package/dist/lib/cjs/function-expression.cjs +8 -8
- package/dist/lib/cjs/function-expression.d.cts +4 -4
- package/dist/lib/cjs/generate-function-call.cjs +6 -6
- package/dist/lib/cjs/generate-function-call.d.cts +15 -9
- package/dist/lib/cjs/global-setup-core.cjs +43 -43
- package/dist/lib/cjs/global-setup-core.d.cts +19 -9
- package/dist/lib/cjs/incompatible-installer-version-error.cjs +10 -4
- package/dist/lib/cjs/incompatible-installer-version-error.d.cts +18 -6
- package/dist/lib/cjs/index.cjs +10 -10
- package/dist/lib/cjs/index.d.cts +8 -8
- package/dist/lib/cjs/installer-asset.cjs +4 -4
- package/dist/lib/cjs/installer-asset.d.cts +21 -7
- package/dist/lib/cjs/installer-compatibility.cjs +4 -4
- package/dist/lib/cjs/installer-compatibility.d.cts +36 -18
- package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +3 -3
- package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +1 -1
- package/dist/lib/cjs/jest/global-setup.cjs +11 -11
- package/dist/lib/cjs/jest/global-setup.d.cts +12 -8
- package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +2 -3
- package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +1 -2
- package/dist/lib/cjs/jest/global-teardown.cjs +2 -3
- package/dist/lib/cjs/jest/global-teardown.d.cts +1 -2
- package/dist/lib/cjs/jest/setup.cjs +2 -2
- package/dist/lib/cjs/jest/setup.d.cts +1 -1
- package/dist/lib/cjs/json-with-functions.cjs +7 -7
- package/dist/lib/cjs/leftover-cleanup.cjs +14 -14
- package/dist/lib/cjs/leftover-cleanup.d.cts +42 -20
- package/dist/lib/cjs/library.cjs +2 -2
- package/dist/lib/cjs/namespace-bootstrap.cjs +46 -40
- package/dist/lib/cjs/native-dialog-monitor.cjs +15 -13
- package/dist/lib/cjs/normalize-optional-properties.cjs +3 -3
- package/dist/lib/cjs/normalize-optional-properties.d.cts +2 -2
- package/dist/lib/cjs/obsidian-config.cjs +30 -31
- package/dist/lib/cjs/obsidian-config.d.cts +8 -8
- package/dist/lib/cjs/obsidian-executable.cjs +2 -2
- package/dist/lib/cjs/obsidian-installer.cjs +37 -37
- package/dist/lib/cjs/obsidian-installer.d.cts +7 -3
- package/dist/lib/cjs/obsidian-instance.cjs +3 -3
- package/dist/lib/cjs/obsidian-instance.d.cts +18 -8
- package/dist/lib/cjs/obsidian-metadata.cjs +1 -1
- package/dist/lib/cjs/obsidian-metadata.d.cts +36 -12
- package/dist/lib/cjs/obsidian-namespace.cjs +1 -1
- package/dist/lib/cjs/obsidian-namespace.d.cts +25 -11
- package/dist/lib/cjs/obsidian-version-switch.cjs +9 -9
- package/dist/lib/cjs/obsidian-version-switch.d.cts +14 -10
- package/dist/lib/cjs/obsidian-version.cjs +3 -3
- package/dist/lib/cjs/obsidian-version.d.cts +15 -5
- package/dist/lib/cjs/owned-vault-seed.cjs +1 -1
- package/dist/lib/cjs/owned-vault-seed.d.cts +24 -8
- package/dist/lib/cjs/parent-liveness.cjs +4 -4
- package/dist/lib/cjs/parent-liveness.d.cts +7 -3
- package/dist/lib/cjs/poll-in-obsidian.cjs +5 -5
- package/dist/lib/cjs/poll-in-obsidian.d.cts +12 -12
- package/dist/lib/cjs/poll-until.cjs +1 -1
- package/dist/lib/cjs/poll-until.d.cts +21 -7
- package/dist/lib/cjs/process-exit-message.cjs +1 -1
- package/dist/lib/cjs/process-exit-message.d.cts +21 -7
- package/dist/lib/cjs/renderer-boot-detection.cjs +9 -9
- package/dist/lib/cjs/renderer-boot-detection.d.cts +31 -27
- package/dist/lib/cjs/renderer-failed-to-initialize-error.cjs +1 -1
- package/dist/lib/cjs/renderer-failed-to-initialize-error.d.cts +1 -1
- package/dist/lib/cjs/setup-lock.cjs +26 -26
- package/dist/lib/cjs/setup-lock.d.cts +6 -2
- package/dist/lib/cjs/silent-asar-fallback-error.cjs +7 -3
- package/dist/lib/cjs/silent-asar-fallback-error.d.cts +12 -4
- package/dist/lib/cjs/spawn-options.cjs +1 -1
- package/dist/lib/cjs/spawn-options.d.cts +3 -1
- package/dist/lib/cjs/strict-proxy.cjs +25 -25
- package/dist/lib/cjs/strict-proxy.d.cts +3 -3
- package/dist/lib/cjs/temporary-vault.cjs +166 -0
- package/dist/lib/cjs/{temp-vault.d.cts → temporary-vault.d.cts} +3 -3
- package/dist/lib/cjs/transport-appium.cjs +7 -7
- package/dist/lib/cjs/transport-appium.d.cts +7 -3
- package/dist/lib/cjs/transport-desktop-cdp.cjs +57 -57
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +29 -17
- package/dist/lib/cjs/transport-factory.cjs +62 -63
- package/dist/lib/cjs/type-guards.cjs +3 -3
- package/dist/lib/cjs/type-guards.d.cts +2 -2
- package/dist/lib/cjs/vault-path-match.cjs +9 -9
- package/dist/lib/cjs/vault-path-match.d.cts +11 -11
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +51 -17
- package/dist/lib/cjs/visibility.cjs +7 -7
- package/dist/lib/cjs/visibility.d.cts +5 -5
- package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +3 -3
- package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +2 -2
- package/dist/lib/cjs/vitest/global-setup.cjs +9 -9
- package/dist/lib/cjs/vitest/global-setup.d.cts +4 -4
- package/dist/lib/cjs/vitest/setup.cjs +2 -2
- package/dist/lib/cjs/vitest/typings.d.cts +2 -2
- package/dist/lib/esm/appium-dependencies.d.mts +4 -2
- package/dist/lib/esm/appium-dependencies.mjs +4 -4
- package/dist/lib/esm/appium-session-config.mjs +1 -1
- package/dist/lib/esm/asar-fallback-detection.d.mts +15 -7
- package/dist/lib/esm/asar-fallback-detection.mjs +3 -3
- package/dist/lib/esm/avd-list.d.mts +6 -2
- package/dist/lib/esm/avd-list.mjs +1 -1
- package/dist/lib/esm/cli.mjs +4 -4
- package/dist/lib/esm/compatibility-options.d.mts +24 -12
- package/dist/lib/esm/compatibility-options.mjs +10 -10
- package/dist/lib/esm/connect-to-cdp.d.mts +6 -6
- package/dist/lib/esm/connect-to-cdp.mjs +6 -6
- package/dist/lib/esm/context-id.d.mts +1 -1
- package/dist/lib/esm/context-id.mjs +5 -5
- package/dist/lib/esm/context-provider.d.mts +4 -4
- package/dist/lib/esm/context-provider.mjs +5 -5
- package/dist/lib/esm/demo-vault-populate.d.mts +4 -4
- package/dist/lib/esm/demo-vault-populate.mjs +5 -5
- package/dist/lib/esm/demo-vault-tree.d.mts +3 -3
- package/dist/lib/esm/demo-vault-tree.mjs +4 -4
- package/dist/lib/esm/device-readiness.d.mts +7 -3
- package/dist/lib/esm/device-readiness.mjs +3 -3
- package/dist/lib/esm/ecmascript-version.mjs +1 -1
- package/dist/lib/esm/electron-compatibility.d.mts +33 -17
- package/dist/lib/esm/electron-compatibility.mjs +3 -3
- package/dist/lib/{cjs/emulator-args.d.cts → esm/emulator-arguments.d.mts} +6 -4
- package/dist/lib/esm/emulator-arguments.mjs +12 -0
- package/dist/lib/esm/enable-plugin.d.mts +6 -6
- package/dist/lib/esm/enable-plugin.mjs +29 -29
- package/dist/lib/esm/eval-in-obsidian.d.mts +23 -23
- package/dist/lib/esm/eval-in-obsidian.mjs +9 -9
- package/dist/lib/esm/exec.d.mts +9 -9
- package/dist/lib/esm/exec.mjs +49 -53
- package/dist/lib/esm/function-expression.d.mts +4 -4
- package/dist/lib/esm/function-expression.mjs +8 -8
- package/dist/lib/esm/generate-function-call.d.mts +15 -9
- package/dist/lib/esm/generate-function-call.mjs +6 -6
- package/dist/lib/esm/global-setup-core.d.mts +19 -9
- package/dist/lib/esm/global-setup-core.mjs +45 -45
- package/dist/lib/esm/incompatible-installer-version-error.d.mts +18 -6
- package/dist/lib/esm/incompatible-installer-version-error.mjs +10 -4
- package/dist/lib/esm/index.d.mts +8 -8
- package/dist/lib/esm/index.mjs +9 -9
- package/dist/lib/esm/installer-asset.d.mts +21 -7
- package/dist/lib/esm/installer-asset.mjs +4 -4
- package/dist/lib/esm/installer-compatibility.d.mts +36 -18
- package/dist/lib/esm/installer-compatibility.mjs +3 -3
- package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +1 -1
- package/dist/lib/esm/jest/global-setup-no-plugin.mjs +3 -3
- package/dist/lib/esm/jest/global-setup.d.mts +12 -8
- package/dist/lib/esm/jest/global-setup.mjs +10 -10
- package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +1 -2
- package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +2 -3
- package/dist/lib/esm/jest/global-teardown.d.mts +1 -2
- package/dist/lib/esm/jest/global-teardown.mjs +2 -3
- package/dist/lib/esm/jest/setup.d.mts +1 -1
- package/dist/lib/esm/jest/setup.mjs +2 -2
- package/dist/lib/esm/json-with-functions.mjs +7 -7
- package/dist/lib/esm/leftover-cleanup.d.mts +42 -20
- package/dist/lib/esm/leftover-cleanup.mjs +12 -12
- package/dist/lib/esm/library.mjs +2 -2
- package/dist/lib/esm/namespace-bootstrap.mjs +46 -40
- package/dist/lib/esm/native-dialog-monitor.mjs +15 -13
- package/dist/lib/esm/normalize-optional-properties.d.mts +2 -2
- package/dist/lib/esm/normalize-optional-properties.mjs +3 -3
- package/dist/lib/esm/obsidian-config.d.mts +8 -8
- package/dist/lib/esm/obsidian-config.mjs +27 -28
- package/dist/lib/esm/obsidian-executable.mjs +2 -2
- package/dist/lib/esm/obsidian-installer.d.mts +7 -3
- package/dist/lib/esm/obsidian-installer.mjs +36 -36
- package/dist/lib/esm/obsidian-instance.d.mts +18 -8
- package/dist/lib/esm/obsidian-instance.mjs +3 -3
- package/dist/lib/esm/obsidian-metadata.d.mts +36 -12
- package/dist/lib/esm/obsidian-metadata.mjs +1 -1
- package/dist/lib/esm/obsidian-namespace.d.mts +25 -11
- package/dist/lib/esm/obsidian-version-switch.d.mts +14 -10
- package/dist/lib/esm/obsidian-version-switch.mjs +9 -9
- package/dist/lib/esm/obsidian-version.d.mts +15 -5
- package/dist/lib/esm/obsidian-version.mjs +3 -3
- package/dist/lib/esm/owned-vault-seed.d.mts +24 -8
- package/dist/lib/esm/owned-vault-seed.mjs +1 -1
- package/dist/lib/esm/parent-liveness.d.mts +7 -3
- package/dist/lib/esm/parent-liveness.mjs +3 -3
- package/dist/lib/esm/poll-in-obsidian.d.mts +12 -12
- package/dist/lib/esm/poll-in-obsidian.mjs +5 -5
- package/dist/lib/esm/poll-until.d.mts +21 -7
- package/dist/lib/esm/poll-until.mjs +1 -1
- package/dist/lib/esm/process-exit-message.d.mts +21 -7
- package/dist/lib/esm/process-exit-message.mjs +1 -1
- package/dist/lib/esm/renderer-boot-detection.d.mts +31 -27
- package/dist/lib/esm/renderer-boot-detection.mjs +7 -7
- package/dist/lib/esm/renderer-failed-to-initialize-error.d.mts +1 -1
- package/dist/lib/esm/renderer-failed-to-initialize-error.mjs +1 -1
- package/dist/lib/esm/setup-lock.d.mts +6 -2
- package/dist/lib/esm/setup-lock.mjs +26 -26
- package/dist/lib/esm/silent-asar-fallback-error.d.mts +12 -4
- package/dist/lib/esm/silent-asar-fallback-error.mjs +7 -3
- package/dist/lib/esm/spawn-options.d.mts +3 -1
- package/dist/lib/esm/spawn-options.mjs +1 -1
- package/dist/lib/esm/strict-proxy.d.mts +3 -3
- package/dist/lib/esm/strict-proxy.mjs +25 -25
- package/dist/lib/esm/{temp-vault.d.mts → temporary-vault.d.mts} +3 -3
- package/dist/lib/esm/temporary-vault.mjs +157 -0
- package/dist/lib/esm/transport-appium.d.mts +7 -3
- package/dist/lib/esm/transport-appium.mjs +7 -7
- package/dist/lib/esm/transport-desktop-cdp.d.mts +29 -17
- package/dist/lib/esm/transport-desktop-cdp.mjs +67 -67
- package/dist/lib/esm/transport-factory.mjs +71 -72
- package/dist/lib/esm/type-guards.d.mts +2 -2
- package/dist/lib/esm/type-guards.mjs +3 -3
- package/dist/lib/esm/vault-path-match.d.mts +11 -11
- package/dist/lib/esm/vault-path-match.mjs +7 -7
- package/dist/lib/esm/version-matrix.d.mts +51 -17
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/visibility.d.mts +5 -5
- package/dist/lib/esm/visibility.mjs +5 -5
- package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +2 -2
- package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +3 -3
- package/dist/lib/esm/vitest/global-setup.d.mts +4 -4
- package/dist/lib/esm/vitest/global-setup.mjs +8 -8
- package/dist/lib/esm/vitest/setup.mjs +2 -2
- package/dist/lib/esm/vitest/typings.d.mts +2 -2
- package/dist/obsidian-integration-testing-10.0.0.tgz +0 -0
- package/package.json +15 -13
- package/dist/lib/cjs/emulator-args.cjs +0 -36
- package/dist/lib/cjs/temp-vault.cjs +0 -166
- package/dist/lib/esm/emulator-args.mjs +0 -12
- package/dist/lib/esm/temp-vault.mjs +0 -157
- package/dist/obsidian-integration-testing-9.2.2.tgz +0 -0
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ export default defineConfig({
|
|
|
31
31
|
});
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
To get Vitest module augmentations (`environmentOptions.obsidianTransport`, `inject('obsidianTransport')`, `inject('
|
|
34
|
+
To get Vitest module augmentations (`environmentOptions.obsidianTransport`, `inject('obsidianTransport')`, `inject('temporaryVaultPath')`), add a side-effect import in your test setup or config:
|
|
35
35
|
|
|
36
36
|
```ts
|
|
37
37
|
import 'obsidian-integration-testing/vitest/typings';
|
|
@@ -69,7 +69,7 @@ globalThis.__obsidianIntegrationTesting = {
|
|
|
69
69
|
};
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
-
After setup, `globalThis.__obsidianIntegrationTesting.
|
|
72
|
+
After setup, `globalThis.__obsidianIntegrationTesting.temporaryVaultPath` is available in test workers.
|
|
73
73
|
|
|
74
74
|
By default this launches a **harness-owned, isolated `CDP` instance** (a temporary Obsidian that never touches your real config). See [Transport modes](#transport-modes) for version pinning, attaching to a running Obsidian, and mobile.
|
|
75
75
|
|
|
@@ -82,8 +82,8 @@ import { evalInObsidian } from 'obsidian-integration-testing';
|
|
|
82
82
|
|
|
83
83
|
// Simple expression
|
|
84
84
|
const sum = await evalInObsidian({
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
input: { a: 2, b: 3 },
|
|
86
|
+
callback: ({ a, b }) => a + b
|
|
87
87
|
});
|
|
88
88
|
// sum === 5
|
|
89
89
|
```
|
|
@@ -95,17 +95,17 @@ Every callback receives `app` (the Obsidian `App` instance) and `obsidianModule`
|
|
|
95
95
|
```ts
|
|
96
96
|
// Read the vault config directory
|
|
97
97
|
const configDir = await evalInObsidian({
|
|
98
|
-
|
|
98
|
+
callback: ({ app }) => app.vault.configDir
|
|
99
99
|
});
|
|
100
100
|
|
|
101
101
|
// Use the obsidian module
|
|
102
102
|
const yaml = await evalInObsidian({
|
|
103
|
-
|
|
103
|
+
callback: ({ obsidianModule }) => obsidianModule.stringifyYaml({ key: 'value' })
|
|
104
104
|
});
|
|
105
105
|
|
|
106
106
|
// Access internal APIs
|
|
107
107
|
const title = await evalInObsidian({
|
|
108
|
-
|
|
108
|
+
callback: ({ app }) => app.title
|
|
109
109
|
});
|
|
110
110
|
```
|
|
111
111
|
|
|
@@ -135,7 +135,7 @@ renderer, so no cross-process serialization is needed.
|
|
|
135
135
|
```ts
|
|
136
136
|
// Type into the active editor — only succeeds if the editor truly holds focus.
|
|
137
137
|
const typed = await evalInObsidian({
|
|
138
|
-
|
|
138
|
+
callback: async ({ app, lib: { typeIntoEditor }, obsidianModule }) => {
|
|
139
139
|
const view = app.workspace.getActiveViewOfType(obsidianModule.MarkdownView);
|
|
140
140
|
const editor = view?.editor;
|
|
141
141
|
if (!editor) {
|
|
@@ -150,7 +150,7 @@ const typed = await evalInObsidian({
|
|
|
150
150
|
// Press special keys / shortcuts (Obsidian `Modifier` names; `'Mod'` = Cmd on macOS, Ctrl elsewhere).
|
|
151
151
|
// A key press has no universal effect, so pair it with `waitUntil` to await the outcome.
|
|
152
152
|
await evalInObsidian({
|
|
153
|
-
|
|
153
|
+
callback: async ({ app, lib: { pressKey, waitUntil }, obsidianModule }) => {
|
|
154
154
|
const editor = app.workspace.getActiveViewOfType(obsidianModule.MarkdownView)?.editor;
|
|
155
155
|
editor?.focus();
|
|
156
156
|
|
|
@@ -161,7 +161,7 @@ await evalInObsidian({
|
|
|
161
161
|
|
|
162
162
|
// Observe a genuine :hover state (real theme var() values, real compositing).
|
|
163
163
|
await evalInObsidian({
|
|
164
|
-
|
|
164
|
+
callback: async ({ lib: { hoverElement, unhoverElement } }) => {
|
|
165
165
|
const bar = document.querySelector<HTMLElement>('.minimized-modal-bar');
|
|
166
166
|
if (!bar) {
|
|
167
167
|
return;
|
|
@@ -203,7 +203,7 @@ includes `message` when given).
|
|
|
203
203
|
```ts
|
|
204
204
|
// Wait until the plugin has opened a Markdown view, then read its editor.
|
|
205
205
|
const value = await evalInObsidian({
|
|
206
|
-
|
|
206
|
+
callback: async ({ app, lib: { waitUntil }, obsidianModule }) => {
|
|
207
207
|
await waitUntil({
|
|
208
208
|
message: 'no active Markdown view',
|
|
209
209
|
predicate: () => Boolean(app.workspace.getActiveViewOfType(obsidianModule.MarkdownView))
|
|
@@ -247,7 +247,7 @@ and nothing is rewritten, so it is safe to use everywhere.
|
|
|
247
247
|
|
|
248
248
|
```ts
|
|
249
249
|
const heading = await evalInObsidian({
|
|
250
|
-
|
|
250
|
+
callback: async ({ app, lib: { createNote, waitUntil }, obsidianModule }) => {
|
|
251
251
|
// Guaranteed on disk before the wait below can depend on it.
|
|
252
252
|
const file = await createNote({ content: '# Title\n', path: 'note.md' });
|
|
253
253
|
await app.workspace.getLeaf().openFile(file);
|
|
@@ -294,7 +294,7 @@ declare module 'obsidian-integration-testing' {
|
|
|
294
294
|
}
|
|
295
295
|
|
|
296
296
|
const name = await evalInObsidian({
|
|
297
|
-
|
|
297
|
+
callback: ({ lib: { getThing } }) => getThing('a').name
|
|
298
298
|
});
|
|
299
299
|
```
|
|
300
300
|
|
|
@@ -304,13 +304,13 @@ Arguments are JSON-serialized. You can even pass functions — they are serializ
|
|
|
304
304
|
|
|
305
305
|
```ts
|
|
306
306
|
const result = await evalInObsidian({
|
|
307
|
-
|
|
307
|
+
input: {
|
|
308
308
|
transform(x: number): number {
|
|
309
309
|
return x * 2;
|
|
310
310
|
},
|
|
311
311
|
value: 5
|
|
312
312
|
},
|
|
313
|
-
|
|
313
|
+
callback: ({ transform, value }) => transform(value)
|
|
314
314
|
});
|
|
315
315
|
// result === 10
|
|
316
316
|
```
|
|
@@ -333,7 +333,7 @@ const contextId = new ContextId<Context>();
|
|
|
333
333
|
beforeEach(async () => {
|
|
334
334
|
await evalInObsidian({
|
|
335
335
|
contextId,
|
|
336
|
-
|
|
336
|
+
callback: async ({ app, context }) => {
|
|
337
337
|
context.file = await app.vault.create('test.md', '# Hello');
|
|
338
338
|
}
|
|
339
339
|
});
|
|
@@ -342,7 +342,7 @@ beforeEach(async () => {
|
|
|
342
342
|
afterEach(async () => {
|
|
343
343
|
await evalInObsidian({
|
|
344
344
|
contextId,
|
|
345
|
-
|
|
345
|
+
callback: async ({ app, context: { file } }) => {
|
|
346
346
|
await app.vault.delete(file);
|
|
347
347
|
}
|
|
348
348
|
});
|
|
@@ -352,7 +352,7 @@ afterEach(async () => {
|
|
|
352
352
|
it('should read the file path', async () => {
|
|
353
353
|
const path = await evalInObsidian({
|
|
354
354
|
contextId,
|
|
355
|
-
|
|
355
|
+
callback: ({ context: { file } }) => file.path
|
|
356
356
|
});
|
|
357
357
|
expect(path).toBe('test.md');
|
|
358
358
|
});
|
|
@@ -360,18 +360,18 @@ it('should read the file path', async () => {
|
|
|
360
360
|
|
|
361
361
|
### Create a temporary vault
|
|
362
362
|
|
|
363
|
-
Use `
|
|
363
|
+
Use `TemporaryVault` to create a disposable vault pre-populated with files:
|
|
364
364
|
|
|
365
365
|
```ts
|
|
366
366
|
import type { TFile } from 'obsidian';
|
|
367
367
|
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
368
|
-
import { ContextId, evalInObsidian,
|
|
368
|
+
import { ContextId, evalInObsidian, TemporaryVault } from 'obsidian-integration-testing';
|
|
369
369
|
|
|
370
370
|
interface Context {
|
|
371
371
|
file: TFile;
|
|
372
372
|
}
|
|
373
373
|
|
|
374
|
-
const vault = new
|
|
374
|
+
const vault = new TemporaryVault();
|
|
375
375
|
|
|
376
376
|
vault.populate({
|
|
377
377
|
'note.md': '# Hello',
|
|
@@ -386,7 +386,7 @@ beforeAll(async () => {
|
|
|
386
386
|
// Resolve the pre-populated file into a TFile and store it in the context
|
|
387
387
|
await evalInObsidian({
|
|
388
388
|
contextId,
|
|
389
|
-
|
|
389
|
+
callback: async ({ app, context }) => {
|
|
390
390
|
const file = app.vault.getFileByPath('note.md');
|
|
391
391
|
if (!file) {
|
|
392
392
|
throw new Error('File not found');
|
|
@@ -404,7 +404,7 @@ afterAll(async () => {
|
|
|
404
404
|
|
|
405
405
|
it('should read a pre-populated file', async () => {
|
|
406
406
|
const content = await evalInObsidian({
|
|
407
|
-
|
|
407
|
+
callback: ({ app }) => app.vault.adapter.read('note.md'),
|
|
408
408
|
vaultPath: vault.path
|
|
409
409
|
});
|
|
410
410
|
expect(content).toBe('# Hello');
|
|
@@ -413,35 +413,35 @@ it('should read a pre-populated file', async () => {
|
|
|
413
413
|
it('should access the TFile from context', async () => {
|
|
414
414
|
const path = await evalInObsidian({
|
|
415
415
|
contextId,
|
|
416
|
-
|
|
416
|
+
callback: ({ context: { file } }) => file.path,
|
|
417
417
|
vaultPath: vault.path
|
|
418
418
|
});
|
|
419
419
|
expect(path).toBe('note.md');
|
|
420
420
|
});
|
|
421
421
|
```
|
|
422
422
|
|
|
423
|
-
Both `
|
|
423
|
+
Both `TemporaryVault` and `ContextId` implement `AsyncDisposable`, so you can use `await using` for automatic cleanup.
|
|
424
424
|
|
|
425
425
|
Parent directories are created automatically. To create an empty folder, use a path ending with `/` and an empty string as content.
|
|
426
426
|
|
|
427
427
|
### Test your plugin
|
|
428
428
|
|
|
429
|
-
Use `
|
|
429
|
+
Use `getTemporaryVault()` to get the temporary vault created by the global setup:
|
|
430
430
|
|
|
431
431
|
**Vitest:**
|
|
432
432
|
|
|
433
433
|
```ts
|
|
434
434
|
import { describe, expect, it } from 'vitest';
|
|
435
435
|
import { evalInObsidian } from 'obsidian-integration-testing';
|
|
436
|
-
import {
|
|
436
|
+
import { getTemporaryVault } from 'obsidian-integration-testing/vitest-global-setup-plugin';
|
|
437
437
|
|
|
438
438
|
describe('my-plugin', () => {
|
|
439
|
-
const vault =
|
|
439
|
+
const vault = getTemporaryVault();
|
|
440
440
|
|
|
441
441
|
it('should be enabled', async () => {
|
|
442
442
|
const isEnabled = await evalInObsidian({
|
|
443
|
-
|
|
444
|
-
|
|
443
|
+
input: { pluginId: 'my-plugin' },
|
|
444
|
+
callback: ({ app, pluginId }) => app.plugins.enabledPlugins.has(pluginId),
|
|
445
445
|
vaultPath: vault.path
|
|
446
446
|
});
|
|
447
447
|
expect(isEnabled).toBe(true);
|
|
@@ -449,14 +449,14 @@ describe('my-plugin', () => {
|
|
|
449
449
|
|
|
450
450
|
it('should create a file', async () => {
|
|
451
451
|
await evalInObsidian({
|
|
452
|
-
|
|
452
|
+
callback: async ({ app }) => {
|
|
453
453
|
await app.vault.create('test.md', '# Hello');
|
|
454
454
|
},
|
|
455
455
|
vaultPath: vault.path
|
|
456
456
|
});
|
|
457
457
|
|
|
458
458
|
const content = await evalInObsidian({
|
|
459
|
-
|
|
459
|
+
callback: ({ app }) => app.vault.adapter.read('test.md'),
|
|
460
460
|
vaultPath: vault.path
|
|
461
461
|
});
|
|
462
462
|
expect(content).toBe('# Hello');
|
|
@@ -468,15 +468,15 @@ describe('my-plugin', () => {
|
|
|
468
468
|
|
|
469
469
|
```ts
|
|
470
470
|
import { evalInObsidian } from 'obsidian-integration-testing';
|
|
471
|
-
import {
|
|
471
|
+
import { getTemporaryVault } from 'obsidian-integration-testing/jest-global-setup-plugin';
|
|
472
472
|
|
|
473
473
|
describe('my-plugin', () => {
|
|
474
|
-
const vault =
|
|
474
|
+
const vault = getTemporaryVault();
|
|
475
475
|
|
|
476
476
|
it('should be enabled', async () => {
|
|
477
477
|
const isEnabled = await evalInObsidian({
|
|
478
|
-
|
|
479
|
-
|
|
478
|
+
input: { pluginId: 'my-plugin' },
|
|
479
|
+
callback: ({ app, pluginId }) => app.plugins.enabledPlugins.has(pluginId),
|
|
480
480
|
vaultPath: vault.path
|
|
481
481
|
});
|
|
482
482
|
expect(isEnabled).toBe(true);
|
|
@@ -548,7 +548,7 @@ export default {
|
|
|
548
548
|
|
|
549
549
|
Both files share the same `createSetup` instance (via the common module), so `teardown` cleans up exactly what `setup` created.
|
|
550
550
|
|
|
551
|
-
**Manual** — when wiring `
|
|
551
|
+
**Manual** — when wiring `TemporaryVault` yourself (without a framework global setup), call `vault.populate()` before `vault.register()`, as shown in [Create a temporary vault](#create-a-temporary-vault).
|
|
552
552
|
|
|
553
553
|
### Seed a plugin's `demo-vault/` and enable extra community plugins
|
|
554
554
|
|
|
@@ -597,7 +597,7 @@ export default defineConfig({
|
|
|
597
597
|
|
|
598
598
|
```ts
|
|
599
599
|
// your.integration.test.ts — read the empty registered vault's path
|
|
600
|
-
import {
|
|
600
|
+
import { getTemporaryVault } from 'obsidian-integration-testing/vitest-global-setup-no-plugin';
|
|
601
601
|
```
|
|
602
602
|
|
|
603
603
|
For Jest, use `obsidian-integration-testing/jest-global-setup-no-plugin` (`globalSetup`) + `obsidian-integration-testing/jest-global-teardown-no-plugin` (`globalTeardown`). If you also need to pre-populate the empty vault, build the pair yourself with `createSetup({ installPlugin: false, populate })` from the `-plugin` factory and re-export its `setup`/`teardown` (the same wrapper pattern shown above for `populate`).
|
|
@@ -624,7 +624,7 @@ For Jest, use `obsidian-integration-testing/jest-global-setup-no-plugin` (`globa
|
|
|
624
624
|
> **`evalInObsidian` limitations:**
|
|
625
625
|
>
|
|
626
626
|
> - The function is serialized via `toString()` and executed in a separate process. It must be **self-contained** — closures over local variables will not work.
|
|
627
|
-
> - Pass any needed values via `
|
|
627
|
+
> - Pass any needed values via `input`. Arguments must be **JSON-serializable** (strings, numbers, booleans, arrays, plain objects). Functions in `input` are supported — they are serialized via `toString()` with the same self-contained constraint.
|
|
628
628
|
> - The **return value** must also be JSON-serializable. You cannot return functions, class instances, `Map`, `Set`, DOM elements, or other non-serializable values.
|
|
629
629
|
> - Imports (`import`/`require`) are not available inside the function. Use `obsidianModule` to access the `obsidian` API, and `app` to access the Obsidian `App` instance.
|
|
630
630
|
|
|
@@ -637,7 +637,7 @@ Since `evalInObsidian` runs inside a real Obsidian process, you have access to i
|
|
|
637
637
|
```ts
|
|
638
638
|
// With obsidian-typings installed — no casts needed
|
|
639
639
|
const title = await evalInObsidian({
|
|
640
|
-
|
|
640
|
+
callback: ({ app }) => app.title
|
|
641
641
|
});
|
|
642
642
|
```
|
|
643
643
|
|
|
@@ -651,7 +651,7 @@ declare module 'obsidian' {
|
|
|
651
651
|
}
|
|
652
652
|
|
|
653
653
|
const title = await evalInObsidian({
|
|
654
|
-
|
|
654
|
+
callback: ({ app }) => app.title
|
|
655
655
|
});
|
|
656
656
|
```
|
|
657
657
|
|
|
@@ -660,12 +660,12 @@ const title = await evalInObsidian({
|
|
|
660
660
|
```ts
|
|
661
661
|
const title = await evalInObsidian({
|
|
662
662
|
// @ts-expect-error -- accessing internal API
|
|
663
|
-
|
|
663
|
+
callback: ({ app }) => app.title
|
|
664
664
|
});
|
|
665
665
|
|
|
666
666
|
// or
|
|
667
667
|
const title2 = await evalInObsidian({
|
|
668
|
-
|
|
668
|
+
callback: ({ app }) => (app as any).title
|
|
669
669
|
});
|
|
670
670
|
```
|
|
671
671
|
|
|
@@ -1125,8 +1125,8 @@ console.log(conn.port, conn.cdpUrl); // the free CDP port the instance was launc
|
|
|
1125
1125
|
// Raw expression → normalized string result:
|
|
1126
1126
|
await conn.invoke('app.vault.getName()');
|
|
1127
1127
|
|
|
1128
|
-
// Rich, typed path — `
|
|
1129
|
-
await conn.evalInObsidian({
|
|
1128
|
+
// Rich, typed path — `callback` runs in the Obsidian renderer with { app, obsidianModule, typeIntoEditor, context }:
|
|
1129
|
+
await conn.evalInObsidian({ callback: ({ app }) => app.workspace.getActiveFile()?.path ?? null });
|
|
1130
1130
|
```
|
|
1131
1131
|
|
|
1132
1132
|
`connectToCdp` accepts the same version knobs as the transport (`obsidianVersion`, `obsidianInstallerVersion`, `host`, `commandTimeoutInMilliseconds`, both defaulting to your installed Obsidian), plus:
|
|
@@ -20,7 +20,7 @@ var appium_dependencies_exports = {};
|
|
|
20
20
|
__export(appium_dependencies_exports, {
|
|
21
21
|
UIAUTOMATOR2_DRIVER_NAME: () => UIAUTOMATOR2_DRIVER_NAME,
|
|
22
22
|
checkIsAppiumDriverInstalled: () => checkIsAppiumDriverInstalled,
|
|
23
|
-
|
|
23
|
+
willAutoInstallAppiumDependencies: () => willAutoInstallAppiumDependencies
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(appium_dependencies_exports);
|
|
26
26
|
const UIAUTOMATOR2_DRIVER_NAME = "uiautomator2";
|
|
@@ -34,15 +34,15 @@ function checkIsAppiumDriverInstalled(params) {
|
|
|
34
34
|
if (typeof parsed !== "object" || parsed === null) {
|
|
35
35
|
return false;
|
|
36
36
|
}
|
|
37
|
-
return params.driverName
|
|
37
|
+
return Object.hasOwn(parsed, params.driverName);
|
|
38
38
|
}
|
|
39
|
-
function
|
|
39
|
+
function willAutoInstallAppiumDependencies(options) {
|
|
40
40
|
return options.shouldAutoInstallAppiumDependencies ?? true;
|
|
41
41
|
}
|
|
42
42
|
// Annotate the CommonJS export names for ESM import in node:
|
|
43
43
|
0 && (module.exports = {
|
|
44
44
|
UIAUTOMATOR2_DRIVER_NAME,
|
|
45
45
|
checkIsAppiumDriverInstalled,
|
|
46
|
-
|
|
46
|
+
willAutoInstallAppiumDependencies
|
|
47
47
|
});
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwcGl1bS1kZXBlbmRlbmNpZXMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGRlY2lkaW5nIHdoZXRoZXIgdGhlIGhhcm5lc3MgbXVzdCBhdXRvLWluc3RhbGwgdGhlIEFwcGl1bVxuICogZGVwZW5kZW5jaWVzICh0aGUgYHVpYXV0b21hdG9yMmAgZHJpdmVyKSBiZWZvcmUgaXQgYXV0by1zdGFydHMgdGhlIEFwcGl1bVxuICogc2VydmVyLCBwbHVzIHJlc29sdmluZyB0aGUgYXV0by1pbnN0YWxsIG9wdC1vdXQgZnJvbSB0aGUgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCBzbyB0aGUgcGFyc2luZyBhbmRcbiAqIGRlZmF1bHQgcmVzb2x1dGlvbiBzdGF5IHVuaXQtdGVzdGFibGUgKHRoZSBmYWN0b3J5IGl0c2VsZiBzaGVsbHMgb3V0IHRvIGBucG1gXG4gKiAvIGBucHhgIGFuZCBpcyBleGNsdWRlZCBmcm9tIHVuaXQgdGVzdHMpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcblxuLyoqXG4gKiBUaGUgQXBwaXVtIGRyaXZlciBuYW1lIHJlcXVpcmVkIHRvIGF1dG9tYXRlIE9ic2lkaWFuIE1vYmlsZSBvbiBBbmRyb2lkLlxuICovXG5leHBvcnQgY29uc3QgVUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FID0gJ3VpYXV0b21hdG9yMic7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrSXNBcHBpdW1Ecml2ZXJJbnN0YWxsZWR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNBcHBpdW1Ecml2ZXJJbnN0YWxsZWRQYXJhbXMge1xuICAvKipcbiAgICogUmF3IHN0ZG91dCBvZiBgYXBwaXVtIGRyaXZlciBsaXN0IC0taW5zdGFsbGVkIC0tanNvbmAgXHUyMDE0IGEgSlNPTiBvYmplY3Qga2V5ZWRcbiAgICogYnkgaW5zdGFsbGVkIGRyaXZlciBuYW1lIChge31gIHdoZW4gbm9uZSBhcmUgaW5zdGFsbGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGRyaXZlckxpc3RKc29uOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBkcml2ZXIgbmFtZSB0byBsb29rIGZvciAoZS5nLiB7QGxpbmsgVUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSkuXG4gICAqL1xuICByZWFkb25seSBkcml2ZXJOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgZ2l2ZW4gQXBwaXVtIGRyaXZlciBpcyBpbnN0YWxsZWQsIGZyb20gdGhlIHJhdyBKU09OIG91dHB1dFxuICogb2YgYGFwcGl1bSBkcml2ZXIgbGlzdCAtLWluc3RhbGxlZCAtLWpzb25gLlxuICpcbiAqIGAtLWluc3RhbGxlZGAgcmVzdHJpY3RzIHRoZSBsaXN0aW5nIHRvIGluc3RhbGxlZCBkcml2ZXJzLCBzbyBhIGRyaXZlciBpc1xuICogcHJlc2VudCBleGFjdGx5IHdoZW4gaXRzIG5hbWUgaXMgYSBrZXkgb2YgdGhlIHBhcnNlZCBvYmplY3QuIE1hbGZvcm1lZCBvclxuICogbm9uLW9iamVjdCBvdXRwdXQgKGFuIGVtcHR5IHN0cmluZywgYSBsb2cgbGluZSB0aGF0IGxlYWtlZCBvbnRvIHN0ZG91dCwgYVxuICogSlNPTiBwcmltaXRpdmUsIGBudWxsYCkgaXMgdHJlYXRlZCBhcyBcIm5vdCBpbnN0YWxsZWRcIiBzbyB0aGUgY2FsbGVyIHByb2NlZWRzXG4gKiB0byBpbnN0YWxsIFx1MjAxNCB0aGUgaW5zdGFsbCBjb21tYW5kIGlzIG9ubHkgaXNzdWVkIHdoZW4gdGhpcyByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzYW1wbGVkIGRyaXZlci1saXN0IG91dHB1dCBhbmQgdGhlIGRyaXZlciBuYW1lIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRyaXZlciBpcyBsaXN0ZWQgYXMgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZChwYXJhbXM6IENoZWNrSXNBcHBpdW1Ecml2ZXJJbnN0YWxsZWRQYXJhbXMpOiBib29sZWFuIHtcbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHBhcmFtcy5kcml2ZXJMaXN0SnNvbik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBwYXJzZWQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0Lmhhc093bihwYXJzZWQsIHBhcmFtcy5kcml2ZXJOYW1lKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3aGV0aGVyIHRoZSBoYXJuZXNzIG1heSBhdXRvLWluc3RhbGwgbWlzc2luZyBBcHBpdW0gZGVwZW5kZW5jaWVzLFxuICogYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlbiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKlxuICogVGhpcyBvbmx5IGdvdmVybnMgdGhlIG1hY2hpbmUtbXV0YXRpbmcgaW5zdGFsbCBzdGVwIChhIGdsb2JhbCBgbnBtIGluc3RhbGwgLWdcbiAqIGFwcGl1bWAgYW5kIGFuIGBhcHBpdW0gZHJpdmVyIGluc3RhbGxgKTsgaXQgaXMgYSBuby1vcCB1bmxlc3MgdGhlIGhhcm5lc3MgaXNcbiAqIGFsc28gYXV0by1zdGFydGluZyB0aGUgQXBwaXVtIHNlcnZlciAoe0BsaW5rXG4gKiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLnNob3VsZEF1dG9TdGFydEFwcGl1bX0pLiBTZXQgaXQgdG9cbiAqIGBmYWxzZWAgdG8gbWFuYWdlIHRoZSBBcHBpdW0gdG9vbGNoYWluIHlvdXJzZWxmLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgV2hldGhlciBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgbWF5IGJlIGF1dG8taW5zdGFsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2lsbEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKFxuICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMgPz8gdHJ1ZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JPLE1BQU0sMkJBQTJCO0FBK0JqQyxTQUFTLDZCQUE2QixRQUFxRDtBQUNoRyxNQUFJO0FBQ0osTUFBSTtBQUNGLGFBQVMsS0FBSyxNQUFNLE9BQU8sY0FBYztBQUFBLEVBQzNDLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksT0FBTyxXQUFXLFlBQVksV0FBVyxNQUFNO0FBQ2pELFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxPQUFPLE9BQU8sUUFBUSxPQUFPLFVBQVU7QUFDaEQ7QUFlTyxTQUFTLGtDQUNkLFNBQ1M7QUFDVCxTQUFPLFFBQVEsdUNBQXVDO0FBQ3hEOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -22,7 +22,9 @@ export interface CheckIsAppiumDriverInstalledParams {
|
|
|
22
22
|
* by installed driver name (`{}` when none are installed).
|
|
23
23
|
*/
|
|
24
24
|
readonly driverListJson: string;
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
The driver name to look for (e.g. {@link UIAUTOMATOR2_DRIVER_NAME}).
|
|
27
|
+
*/
|
|
26
28
|
readonly driverName: string;
|
|
27
29
|
}
|
|
28
30
|
/**
|
|
@@ -52,4 +54,4 @@ export declare function checkIsAppiumDriverInstalled(params: CheckIsAppiumDriver
|
|
|
52
54
|
* @param options - The Android Appium transport options.
|
|
53
55
|
* @returns Whether missing Appium dependencies may be auto-installed.
|
|
54
56
|
*/
|
|
55
|
-
export declare function
|
|
57
|
+
export declare function willAutoInstallAppiumDependencies(options: ObsidianAndroidAppiumTransportOptions): boolean;
|
|
@@ -39,4 +39,4 @@ function resolveSessionConnectionRetryTimeoutInMilliseconds(options) {
|
|
|
39
39
|
resolveAppiumStartTimeoutInMilliseconds,
|
|
40
40
|
resolveSessionConnectionRetryTimeoutInMilliseconds
|
|
41
41
|
});
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlc29sdmVzIHR1bmFibGUgQXBwaXVtIHNlcnZlci1zdGFydCBhbmQgc2Vzc2lvbi1lc3RhYmxpc2htZW50IHRpbWVvdXRzIGZyb21cbiAqIHRoZSB0cmFuc3BvcnQgb3B0aW9ucywgYXBwbHlpbmcgZGVmYXVsdHMuIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGVcbiAqIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCBzbyB0aGUgZGVmYXVsdCByZXNvbHV0aW9uIHN0YXlzXG4gKiB1bml0LXRlc3RhYmxlICh0aGUgZmFjdG9yeSBpdHNlbGYgbmVlZHMgYSByZWFsIEFwcGl1bSBzZXJ2ZXIgYW5kIGlzIGV4Y2x1ZGVkXG4gKiBmcm9tIHVuaXQgdGVzdHMpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcblxuLyoqXG4gKiBEZWZhdWx0IGZvciB7QGxpbmsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucy5hcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kc30uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDE4MF8wMDA7XG5cbi8qKlxuICogRGVmYXVsdCBmb3Ige0BsaW5rIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMuc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFU1NJT05fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDE4MF8wMDA7XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHJlYWRpbmVzcyB0aW1lb3V0LCBhcHBseWluZyB0aGVcbiAqIGRlZmF1bHQgd2hlbiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKlxuICogVGhpcyBnb3Zlcm5zIGhvdyBsb25nIHRoZSBmYWN0b3J5IHBvbGxzIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlcidzXG4gKiBgL3N0YXR1c2AgZW5kcG9pbnQgYmVmb3JlIGdpdmluZyB1cC4gT25seSByZWxldmFudCB3aGVuIHRoZSBoYXJuZXNzXG4gKiBhdXRvLXN0YXJ0cyB0aGUgc2VydmVyOyB3aGVuIGF0dGFjaGluZyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgc2VydmVyIHRoZSB3YWl0XG4gKiBpcyBza2lwcGVkIGVudGlyZWx5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzKFxuICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4pOiBudW1iZXIge1xuICByZXR1cm4gb3B0aW9ucy5hcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgQXBwaXVtIHNlc3Npb24gY29ubmVjdGlvbiByZXRyeSB0aW1lb3V0LCBhcHBseWluZyB0aGUgZGVmYXVsdFxuICogd2hlbiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKlxuICogVGhpcyBnb3Zlcm5zIGhvdyBsb25nIFdlYkRyaXZlcklPJ3MgYHJlbW90ZSgpYCB3YWl0cyBmb3IgdGhlIHNlc3Npb24gdG8gYmVcbiAqIGVzdGFibGlzaGVkIChVaUF1dG9tYXRvcjIgc2VydmVyIGluc3RhbGwgKyBhcHAgbGF1bmNoKSBcdTIwMTQgZW1waXJpY2FsbHkgdGhlXG4gKiBsYXJnZXN0IGFuZCBtb3N0IGxvYWQtc2Vuc2l0aXZlIHN0ZXAgb2YgdGhlIEFuZHJvaWQgc2V0dXAsIHNvIGl0IGlzIHRoZSBrbm9iXG4gKiB0byByYWlzZSB3aGVuIHNlc3Npb24gZXN0YWJsaXNobWVudCB0aW1lcyBvdXQgb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKFxuICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4pOiBudW1iZXIge1xuICByZXR1cm4gb3B0aW9ucy5zZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfU0VTU0lPTl9DT05ORUNUSU9OX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVPLE1BQU0sK0NBQStDO0FBS3JELE1BQU0sMkRBQTJEO0FBY2pFLFNBQVMsd0NBQ2QsU0FDUTtBQUNSLFNBQU8sUUFBUSxvQ0FBb0M7QUFDckQ7QUFjTyxTQUFTLG1EQUNkLFNBQ1E7QUFDUixTQUFPLFFBQVEsK0NBQStDO0FBQ2hFOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -18,11 +18,11 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var asar_fallback_detection_exports = {};
|
|
20
20
|
__export(asar_fallback_detection_exports, {
|
|
21
|
-
|
|
21
|
+
resolveAsarFallback: () => resolveAsarFallback
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(asar_fallback_detection_exports);
|
|
24
24
|
var import_obsidian_version = require("./obsidian-version.cjs");
|
|
25
|
-
function
|
|
25
|
+
function resolveAsarFallback(params) {
|
|
26
26
|
const { requestedVersion, runningApiVersion } = params;
|
|
27
27
|
if (requestedVersion === void 0 || runningApiVersion === void 0) {
|
|
28
28
|
return {
|
|
@@ -43,6 +43,6 @@ function checkAsarFallback(params) {
|
|
|
43
43
|
}
|
|
44
44
|
// Annotate the CommonJS export names for ESM import in node:
|
|
45
45
|
0 && (module.exports = {
|
|
46
|
-
|
|
46
|
+
resolveAsarFallback
|
|
47
47
|
});
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzYXItZmFsbGJhY2stZGV0ZWN0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSB2ZXJkaWN0IG9uIHdoZXRoZXIgYSBib290ZWQgb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgaXMgYWN0dWFsbHkgcnVubmluZ1xuICogdGhlIHBpbm5lZCBhcHAgKGFzYXIpIHZlcnNpb24sIG9yICoqc2lsZW50bHkgZmVsbCBiYWNrKiogdG8gdGhlIGluc3RhbGxlcidzIG93blxuICogYnVuZGxlZCBhc2FyLiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1kZXNrdG9wLWNkcGBcbiAqICh3aGljaCByZWFkcyB0aGUgbGl2ZSB2ZXJzaW9uIG92ZXIgQ0RQIGFuZCBpcyBleGNsdWRlZCBmcm9tIHVuaXQgdGVzdHMpIHNvIHRoZVxuICogdGllciBsb2dpYyBzdGF5cyB1bml0LXRlc3RhYmxlIFx1MjAxNCBtaXJyb3JpbmcgdGhlIGBpbnN0YWxsZXItY29tcGF0aWJpbGl0eWAgL1xuICogYGVsZWN0cm9uLWNvbXBhdGliaWxpdHlgIC8gYHJlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uYCBzcGxpdC5cbiAqXG4gKiBXaGVuIGFuIGFzYXIgaXMgc3dhcHBlZCBvbnRvIGFuIGluc3RhbGxlciBzaGVsbCBiZWxvdyBpdHMgcmVhbCBib290IGZsb29yLCB0aGVcbiAqIHJlbmRlcmVyIGRvZXMgbm90IGFsd2F5cyBkZWFkLWJvb3QgKHRoZSBibGFjayBzY3JlZW4gYHJlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uYFxuICogY2F0Y2hlcykuIFNvbWUgYXBwIHZlcnNpb25zIGluc3RlYWQgKipzaWxlbnRseSByZXZlcnQgdG8gdGhlIGluc3RhbGxlcidzIG93blxuICogYnVuZGxlZCBhc2FyKiogYW5kIHJlbmRlciBhIHBlcmZlY3RseSBoZWFsdGh5IFVJIG9mIHRoZSAqd3JvbmcgKG9sZGVyKSogdmVyc2lvbi5cbiAqIFRoZSBkZWFkLWJvb3QgZGV0ZWN0b3IgcmVhZHMgdGhhdCBoZWFsdGh5IFVJIGFzIGEgZmFsc2UtcG9zaXRpdmUgXCJydW5uYWJsZVwiIFx1MjAxNFxuICogZXhhY3RseSBob3cgT2JzaWRpYW4gYDEuMTMuMGAgb24gaW5zdGFsbGVyIGAxLjEuOWAgd2FzIGZpcnN0IG1pcy1tZWFzdXJlZCAoaXRcbiAqIHJlcG9ydHMgYGFwaVZlcnNpb25gIGAxLjEuOWAsIG5vdCBgMS4xMy4wYCkuXG4gKlxuICogVGhlIGRpc2NyaW1pbmF0b3IgaXMgdGhlICoqcnVubmluZyoqIGFwcCB2ZXJzaW9uLCByZWFkIGxpdmUgcG9zdC1ib290XG4gKiAoYGlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2ZXJzaW9uJylgIC8gYG9ic2lkaWFuTW9kdWxlLmFwaVZlcnNpb25gLCB3aGljaCBib3RoXG4gKiB0cmFjayB0aGUgYXNhciBhY3R1YWxseSBydW5uaW5nKS4gVGhpcyB2ZXJkaWN0IGNvbXBhcmVzIGl0IHRvIHRoZSBwaW5uZWRcbiAqIHZlcnNpb246IGVxdWFsIFx1MjFEMiBgJ21hdGNoJ2AsIGRpZmZlcmVudCBcdTIxRDIgYCdmYWxsYmFjaydgICh0aGUgcGluIHdhcyBub3QgaG9ub3JlZCksXG4gKiBhbmQgYCd1bmtub3duJ2Agd2hlbiBlaXRoZXIgdmVyc2lvbiBpcyB1bmF2YWlsYWJsZSAobm8gYXNhciB3YXMgc3dhcHBlZCwgb3IgdGhlXG4gKiBsaXZlIHZlcnNpb24gY291bGQgbm90IGJlIHJlYWQpIFx1MjAxNCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaXMgdGhyb3duIG9yIHdhcm5lZC5cbiAqL1xuXG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24uY2pzJztcblxuLyoqXG4gKiBUaGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCBmb3IgYSBib290ZWQgb3duZWQgaW5zdGFuY2UsIGNhcnJpZWQgYXMgZGF0YVxuICogb24gdGhlIHRyYW5zcG9ydCAvIGNvbm5lY3Rpb24gcmVzdWx0IHNvIGNvbnN1bWVycyBjYW4gYXNzZXJ0IG9uIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzYXJGYWxsYmFjayB7XG4gIC8qKlxuICBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uLCBwcmVzZW50IGZvciB0aGUgYCdmYWxsYmFjaydgIHRpZXIuXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcGlubmVkIGFwcCAoYXNhcikgdmVyc2lvbiB0aGF0IHdhcyByZXF1ZXN0ZWQsIG9yIGBudWxsYCB3aGVuIG5vbmUuXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0ZWRWZXJzaW9uOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgYXBwIChhc2FyKSB2ZXJzaW9uIGFjdHVhbGx5IHJ1bm5pbmcsIG9yIGBudWxsYCB3aGVuIHVucmVhZGFibGUuXG4gICAqL1xuICByZWFkb25seSBydW5uaW5nQXBpVmVyc2lvbjogbnVsbCB8IHN0cmluZztcblxuICAvKipcbiAgVGhlIHJlc29sdmVkIGZhbGxiYWNrIHRpZXIuXG4gICAqL1xuICByZWFkb25seSB0aWVyOiBBc2FyRmFsbGJhY2tUaWVyO1xufVxuXG4vKipcbiAqIFRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB0aWVyIGZvciBhIGJvb3RlZCBvd25lZCBpbnN0YW5jZS5cbiAqXG4gKiAtIGAnbWF0Y2gnYCBcdTIwMTQgdGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24gZXF1YWxzIHRoZSBwaW5uZWQgdmVyc2lvbjsgdGhlIHBpbiB3YXNcbiAqICAgaG9ub3JlZC5cbiAqIC0gYCdmYWxsYmFjaydgIFx1MjAxNCB0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBkaWZmZXJzIGZyb20gdGhlIHBpbm5lZCB2ZXJzaW9uOyB0aGVcbiAqICAgaW5zdGFsbGVyIHNpbGVudGx5IHJhbiBhIGRpZmZlcmVudCAoaXRzIG93biBidW5kbGVkKSBhc2FyIGluc3RlYWQgb2YgdGhlIHBpbi5cbiAqIC0gYCd1bmtub3duJ2AgXHUyMDE0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChubyBhc2FyIHdhcyBzd2FwcGVkLCBzbyB0aGVyZSBpcyBubyBwaW4gdG9cbiAqICAgdmVyaWZ5LCBvciB0aGUgbGl2ZSBydW5uaW5nIHZlcnNpb24gY291bGQgbm90IGJlIHJlYWQpLlxuICovXG5leHBvcnQgdHlwZSBBc2FyRmFsbGJhY2tUaWVyID0gJ2ZhbGxiYWNrJyB8ICdtYXRjaCcgfCAndW5rbm93bic7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVBc2FyRmFsbGJhY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVBc2FyRmFsbGJhY2tQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBpbm5lZCBPYnNpZGlhbiBhcHAgKGFzYXIpIHZlcnNpb24gdGhlIG93bmVkIGluc3RhbmNlIHdhcyBhc2tlZCB0byBydW4sXG4gICAqIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gYXNhciB3YXMgc3dhcHBlZCAoc28gdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkpLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdGVkVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIHRoZSBpbnN0YW5jZSBpcyBhY3R1YWxseSBydW5uaW5nLCByZWFkIGxpdmVcbiAgICogcG9zdC1ib290LCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNvdWxkIG5vdCBiZSByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVubmluZ0FwaVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCBmb3IgYSBib290ZWQgb3duZWQgaW5zdGFuY2UuXG4gKlxuICogT25seSBgJ2ZhbGxiYWNrJ2Agd2FycmFudHMgYWN0aW9uIChhIHRocm93IC8gd2FybmluZyk7IGAnbWF0Y2gnYCBhbmQgYCd1bmtub3duJ2BcbiAqIGFyZSBzaWxlbnQuIENvbXBhcmlzb24gaXMgYSBwdXJlIGB4LnkuemAgdmVyc2lvbiBjb21wYXJlIFx1MjAxNCBubyBJL08uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwaW5uZWQgdmVyc2lvbiBhbmQgdGhlIGxpdmUgcnVubmluZyB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGZhbGxiYWNrIHZlcmRpY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXNhckZhbGxiYWNrKHBhcmFtczogUmVzb2x2ZUFzYXJGYWxsYmFja1BhcmFtcyk6IEFzYXJGYWxsYmFjayB7XG4gIGNvbnN0IHsgcmVxdWVzdGVkVmVyc2lvbiwgcnVubmluZ0FwaVZlcnNpb24gfSA9IHBhcmFtcztcblxuICBpZiAocmVxdWVzdGVkVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IHJ1bm5pbmdBcGlWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWVzdGVkVmVyc2lvbjogcmVxdWVzdGVkVmVyc2lvbiA/PyBudWxsLFxuICAgICAgcnVubmluZ0FwaVZlcnNpb246IHJ1bm5pbmdBcGlWZXJzaW9uID8/IG51bGwsXG4gICAgICB0aWVyOiAndW5rbm93bidcbiAgICB9O1xuICB9XG5cbiAgaWYgKGNvbXBhcmVWZXJzaW9ucyhydW5uaW5nQXBpVmVyc2lvbiwgcmVxdWVzdGVkVmVyc2lvbikgPT09IDApIHtcbiAgICByZXR1cm4geyByZXF1ZXN0ZWRWZXJzaW9uLCBydW5uaW5nQXBpVmVyc2lvbiwgdGllcjogJ21hdGNoJyB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBgT2JzaWRpYW4gd2FzIHBpbm5lZCB0byBhcHAgdmVyc2lvbiAke3JlcXVlc3RlZFZlcnNpb259IGJ1dCBpcyBhY3R1YWxseSBydW5uaW5nICR7cnVubmluZ0FwaVZlcnNpb259IFx1MjAxNCBgXG4gICAgICArICd0aGUgaW5zdGFsbGVyIHNpbGVudGx5IGZlbGwgYmFjayB0byBpdHMgb3duIGJ1bmRsZWQgYXNhciBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlIHBpbm5lZCB2ZXJzaW9uLiAnXG4gICAgICArIGBQaW4gYW4gb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uIGF0IG9yIGFib3ZlICR7cmVxdWVzdGVkVmVyc2lvbn0ncyBydW4gZmxvb3Igc28gdGhlIHBpbiBhY3R1YWxseSBydW5zLmAsXG4gICAgcmVxdWVzdGVkVmVyc2lvbixcbiAgICBydW5uaW5nQXBpVmVyc2lvbixcbiAgICB0aWVyOiAnZmFsbGJhY2snXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMEJBLDhCQUFnQztBQWtFekIsU0FBUyxvQkFBb0IsUUFBaUQ7QUFDbkYsUUFBTSxFQUFFLGtCQUFrQixrQkFBa0IsSUFBSTtBQUVoRCxNQUFJLHFCQUFxQixVQUFhLHNCQUFzQixRQUFXO0FBQ3JFLFdBQU87QUFBQSxNQUNMLGtCQUFrQixvQkFBb0I7QUFBQSxNQUN0QyxtQkFBbUIscUJBQXFCO0FBQUEsTUFDeEMsTUFBTTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBRUEsVUFBSSx5Q0FBZ0IsbUJBQW1CLGdCQUFnQixNQUFNLEdBQUc7QUFDOUQsV0FBTyxFQUFFLGtCQUFrQixtQkFBbUIsTUFBTSxRQUFRO0FBQUEsRUFDOUQ7QUFFQSxTQUFPO0FBQUEsSUFDTCxTQUFTLHNDQUFzQyxnQkFBZ0IsNEJBQTRCLGlCQUFpQix1SkFFekQsZ0JBQWdCO0FBQUEsSUFDbkU7QUFBQSxJQUNBO0FBQUEsSUFDQSxNQUFNO0FBQUEsRUFDUjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -28,13 +28,21 @@
|
|
|
28
28
|
* on the transport / connection result so consumers can assert on it.
|
|
29
29
|
*/
|
|
30
30
|
export interface AsarFallback {
|
|
31
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
A human-readable explanation, present for the `'fallback'` tier.
|
|
33
|
+
*/
|
|
32
34
|
readonly message?: string;
|
|
33
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
The pinned app (asar) version that was requested, or `null` when none.
|
|
37
|
+
*/
|
|
34
38
|
readonly requestedVersion: null | string;
|
|
35
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
The app (asar) version actually running, or `null` when unreadable.
|
|
41
|
+
*/
|
|
36
42
|
readonly runningApiVersion: null | string;
|
|
37
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
The resolved fallback tier.
|
|
45
|
+
*/
|
|
38
46
|
readonly tier: AsarFallbackTier;
|
|
39
47
|
}
|
|
40
48
|
/**
|
|
@@ -49,9 +57,9 @@ export interface AsarFallback {
|
|
|
49
57
|
*/
|
|
50
58
|
export type AsarFallbackTier = 'fallback' | 'match' | 'unknown';
|
|
51
59
|
/**
|
|
52
|
-
* Parameters for {@link
|
|
60
|
+
* Parameters for {@link resolveAsarFallback}.
|
|
53
61
|
*/
|
|
54
|
-
export interface
|
|
62
|
+
export interface ResolveAsarFallbackParams {
|
|
55
63
|
/**
|
|
56
64
|
* The pinned Obsidian app (asar) version the owned instance was asked to run,
|
|
57
65
|
* or `undefined` when no asar was swapped (so there is nothing to verify).
|
|
@@ -72,4 +80,4 @@ export interface CheckAsarFallbackParams {
|
|
|
72
80
|
* @param params - The pinned version and the live running version.
|
|
73
81
|
* @returns The fallback verdict.
|
|
74
82
|
*/
|
|
75
|
-
export declare function
|
|
83
|
+
export declare function resolveAsarFallback(params: ResolveAsarFallbackParams): AsarFallback;
|
|
@@ -33,4 +33,4 @@ function listAvailableAvds(avdListOutput) {
|
|
|
33
33
|
checkAvdExists,
|
|
34
34
|
listAvailableAvds
|
|
35
35
|
});
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1saXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBoZWxwZXJzIGZvciBwYXJzaW5nIGBlbXVsYXRvciAtbGlzdC1hdmRzYCBvdXRwdXQ6IGV4dHJhY3RpbmcgdGhlXG4gKiBhdmFpbGFibGUgQVZEIG5hbWVzIGFuZCBjaGVja2luZyB3aGV0aGVyIGEgcmVxdWVzdGVkIEFWRCBleGlzdHMuXG4gKlxuICogS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBpbnRlZ3JhdGlvbi1vbmx5IGB0cmFuc3BvcnQtZmFjdG9yeWAgKGV4Y2x1ZGVkIGZyb21cbiAqIHVuaXQgdGVzdHMpIHNvIHRoZSBwYXJzaW5nIHN0YXlzIHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZSBmYWN0b3J5IGl0c2VsZiBzaGVsbHMgb3V0XG4gKiB0byB0aGUgYGVtdWxhdG9yYCBiaW5hcnkuXG4gKi9cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tBdmRFeGlzdHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrQXZkRXhpc3RzUGFyYW1zIHtcbiAgLyoqXG4gIFJhdyBzdGRvdXQgb2YgYGVtdWxhdG9yIC1saXN0LWF2ZHNgIFx1MjAxNCBvbmUgQVZEIG5hbWUgcGVyIGxpbmUuXG4gICAqL1xuICByZWFkb25seSBhdmRMaXN0T3V0cHV0OiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBBVkQgbmFtZSB0byBsb29rIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgYSBnaXZlbiBBVkQgZXhpc3RzLCBmcm9tIHRoZSByYXcgc3Rkb3V0IG9mXG4gKiBgZW11bGF0b3IgLWxpc3QtYXZkc2AuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBsaXN0aW5nIG91dHB1dCBhbmQgdGhlIEFWRCBuYW1lIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIEFWRCBuYW1lIGFwcGVhcnMgaW4gdGhlIGxpc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0F2ZEV4aXN0cyhwYXJhbXM6IENoZWNrQXZkRXhpc3RzUGFyYW1zKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaXN0QXZhaWxhYmxlQXZkcyhwYXJhbXMuYXZkTGlzdE91dHB1dCkuaW5jbHVkZXMocGFyYW1zLmF2ZE5hbWUpO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgYXZhaWxhYmxlIEFWRCBuYW1lcyBmcm9tIHRoZSByYXcgc3Rkb3V0IG9mIGBlbXVsYXRvciAtbGlzdC1hdmRzYC5cbiAqXG4gKiBUaGUgY29tbWFuZCBwcmludHMgb25lIEFWRCBuYW1lIHBlciBsaW5lOyBibGFuayBsaW5lcyBhbmQgc3Vycm91bmRpbmdcbiAqIHdoaXRlc3BhY2UgYXJlIGlnbm9yZWQuIFNvbWUgZW11bGF0b3IgYnVpbGRzIGVtaXQgYW4gaW5mb3JtYXRpb25hbCBiYW5uZXJcbiAqIChlLmcuIGBJTkZPICAgIHwgLi4uYCkgdG8gc3Rkb3V0IGJlZm9yZSB0aGUgbGlzdCwgc28gdGhvc2UgbGluZXMgYXJlIGRyb3BwZWQuXG4gKlxuICogQHBhcmFtIGF2ZExpc3RPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIGBlbXVsYXRvciAtbGlzdC1hdmRzYC5cbiAqIEByZXR1cm5zIFRoZSBhdmFpbGFibGUgQVZEIG5hbWVzLCBpbiBsaXN0ZWQgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0QXZhaWxhYmxlQXZkcyhhdmRMaXN0T3V0cHV0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBhdmRMaXN0T3V0cHV0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCAmJiAhbGluZS5pbmNsdWRlcygnfCcpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlDTyxTQUFTLGVBQWUsUUFBdUM7QUFDcEUsU0FBTyxrQkFBa0IsT0FBTyxhQUFhLEVBQUUsU0FBUyxPQUFPLE9BQU87QUFDeEU7QUFZTyxTQUFTLGtCQUFrQixlQUFpQztBQUNqRSxTQUFPLGNBQ0osTUFBTSxJQUFJLEVBQ1YsSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsRUFDekIsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEtBQUssQ0FBQyxLQUFLLFNBQVMsR0FBRyxDQUFDO0FBQzVEOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -12,9 +12,13 @@
|
|
|
12
12
|
* Parameters for {@link checkAvdExists}.
|
|
13
13
|
*/
|
|
14
14
|
export interface CheckAvdExistsParams {
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
Raw stdout of `emulator -list-avds` — one AVD name per line.
|
|
17
|
+
*/
|
|
16
18
|
readonly avdListOutput: string;
|
|
17
|
-
/**
|
|
19
|
+
/**
|
|
20
|
+
The AVD name to look for.
|
|
21
|
+
*/
|
|
18
22
|
readonly avdName: string;
|
|
19
23
|
}
|
|
20
24
|
/**
|
package/dist/lib/cjs/cli.cjs
CHANGED
|
@@ -74,7 +74,7 @@ function buildOptions(values) {
|
|
|
74
74
|
function parseNumber(flag, raw) {
|
|
75
75
|
const value = Number(raw);
|
|
76
76
|
if (!Number.isFinite(value)) {
|
|
77
|
-
throw new
|
|
77
|
+
throw new TypeError(`--${flag} must be a number, got: ${raw}`);
|
|
78
78
|
}
|
|
79
79
|
return value;
|
|
80
80
|
}
|
|
@@ -84,12 +84,12 @@ function waitForShutdownOrInstanceClose(cdpUrl) {
|
|
|
84
84
|
const versionUrl = `${cdpUrl}/json/version`;
|
|
85
85
|
let isSettled = false;
|
|
86
86
|
const timer = setInterval(() => {
|
|
87
|
-
|
|
87
|
+
probeAlive().catch(() => {
|
|
88
88
|
});
|
|
89
89
|
}, POLL_INTERVAL_IN_MILLISECONDS);
|
|
90
90
|
import_node_process.default.once("SIGINT", settle);
|
|
91
91
|
import_node_process.default.once("SIGTERM", settle);
|
|
92
|
-
async function
|
|
92
|
+
async function probeAlive() {
|
|
93
93
|
try {
|
|
94
94
|
const response = await fetch(versionUrl);
|
|
95
95
|
if (!response.ok) {
|
|
@@ -113,4 +113,4 @@ function waitForShutdownOrInstanceClose(cdpUrl) {
|
|
|
113
113
|
0 && (module.exports = {
|
|
114
114
|
main
|
|
115
115
|
});
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaW4gQ0xJIG92ZXIge0BsaW5rIGNvbm5lY3RUb0NkcH06IGxhdW5jaGVzIChvciBhdHRhY2hlcyB0bykgYSBDRFAtZW5hYmxlZFxuICogT2JzaWRpYW4gaW5zdGFuY2Ugd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgcHJpbnRzIHRoZVxuICogY2hvc2VuIENEUCBwb3J0L1VSTCwgYW5kIHN0YXlzIGFsaXZlIHVudGlsIGludGVycnVwdGVkIHNvIGFuIGV4dGVybmFsIHRvb2xcbiAqIChyYXcgQ0RQIGB3c2AsIERldlRvb2xzLCBcdTIwMjYpIGNhbiBhdHRhY2guXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgQ0xJIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBtYW51YWxseSwgbm90IGJ5IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tICdub2RlOnV0aWwnO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3RUb0NkcE9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3QtdG8tY2RwLmNqcyc7XG5cbmltcG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgdGhlIHBhcnNlZCBDTEkgZmxhZyB2YWx1ZXMuXG4gKi9cbmludGVyZmFjZSBQYXJzZWRDbGlWYWx1ZXMge1xuICAnY29tbWFuZC10aW1lb3V0Jz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgJ2hvc3QnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAnbm8tcmVtb3ZlLXZhdWx0Jz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICdvYnNpZGlhbi1pbnN0YWxsZXItdmVyc2lvbic/
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaW4gQ0xJIG92ZXIge0BsaW5rIGNvbm5lY3RUb0NkcH06IGxhdW5jaGVzIChvciBhdHRhY2hlcyB0bykgYSBDRFAtZW5hYmxlZFxuICogT2JzaWRpYW4gaW5zdGFuY2Ugd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgcHJpbnRzIHRoZVxuICogY2hvc2VuIENEUCBwb3J0L1VSTCwgYW5kIHN0YXlzIGFsaXZlIHVudGlsIGludGVycnVwdGVkIHNvIGFuIGV4dGVybmFsIHRvb2xcbiAqIChyYXcgQ0RQIGB3c2AsIERldlRvb2xzLCBcdTIwMjYpIGNhbiBhdHRhY2guXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgQ0xJIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBtYW51YWxseSwgbm90IGJ5IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tICdub2RlOnV0aWwnO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3RUb0NkcE9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3QtdG8tY2RwLmNqcyc7XG5cbmltcG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgdGhlIHBhcnNlZCBDTEkgZmxhZyB2YWx1ZXMuXG4gKi9cbmludGVyZmFjZSBQYXJzZWRDbGlWYWx1ZXMge1xuICAnY29tbWFuZC10aW1lb3V0Jz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgJ2hvc3QnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAnbm8tcmVtb3ZlLXZhdWx0Jz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICdvYnNpZGlhbi1pbnN0YWxsZXItdmVyc2lvbic/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICdvYnNpZGlhbi12ZXJzaW9uJz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgJ3BvcnQnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAndmF1bHQnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcnNlcyBDTEkgYXJndW1lbnRzLCBvcGVucyB0aGUgY29ubmVjdGlvbiwgcHJpbnRzIGl0cyBlbmRwb2ludCwgYW5kIGJsb2Nrc1xuICogdW50aWwgYFNJR0lOVGAvYFNJR1RFUk1gIG9yIHRoZSBvd25lZCBPYnNpZGlhbiB3aW5kb3cgaXMgY2xvc2VkLCBkaXNwb3NpbmcgdGhlXG4gKiBjb25uZWN0aW9uIG9uIHNodXRkb3duLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgdmFsdWVzIH0gPSBwYXJzZUFyZ3Moe1xuICAgIG9wdGlvbnM6IHtcbiAgICAgICdjb21tYW5kLXRpbWVvdXQnOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAnaG9zdCc6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICduby1yZW1vdmUtdmF1bHQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ29ic2lkaWFuLWluc3RhbGxlci12ZXJzaW9uJzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgJ29ic2lkaWFuLXZlcnNpb24nOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAncG9ydCc6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICd2YXVsdCc6IHsgdHlwZTogJ3N0cmluZycgfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IGNvbm5lY3RUb0NkcChidWlsZE9wdGlvbnModmFsdWVzKSk7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXG4gICAgJ09ic2lkaWFuIENEUCByZWFkeS5cXG4nXG4gICAgICArIGAgIHBvcnQ6ICAgJHtTdHJpbmcoY29ubmVjdGlvbi5wb3J0KX1cXG5gXG4gICAgICArIGAgIGNkcFVybDogJHtjb25uZWN0aW9uLmNkcFVybH1cXG5gXG4gICAgICArIGAgIHZhdWx0OiAgJHtjb25uZWN0aW9uLnZhdWx0LnBhdGh9XFxuYFxuICAgICAgKyAnUnVudGltZSBoZWxwZXJzIGJvb3RzdHJhcHBlZCBhcyB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5cXG4nXG4gICAgICArICdQcmVzcyBDdHJsK0MgdG8gc3RvcC5cXG4nXG4gICk7XG5cbiAgYXdhaXQgd2FpdEZvclNodXRkb3duT3JJbnN0YW5jZUNsb3NlKGNvbm5lY3Rpb24uY2RwVXJsKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuU2h1dHRpbmcgZG93blx1MjAyNlxcbicpO1xuICBhd2FpdCBjb25uZWN0aW9uLmRpc3Bvc2UoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnN9IGZyb20gcGFyc2VkIENMSSBmbGFnIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHBhcnNlZCBgcGFyc2VBcmdzYCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgY29ubmVjdGlvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBidWlsZE9wdGlvbnModmFsdWVzOiBQYXJzZWRDbGlWYWx1ZXMpOiBDb25uZWN0VG9DZHBPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICAuLi4odmFsdWVzWydjb21tYW5kLXRpbWVvdXQnXSAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogcGFyc2VOdW1iZXIoJ2NvbW1hbmQtdGltZW91dCcsIHZhbHVlc1snY29tbWFuZC10aW1lb3V0J10pIH0pLFxuICAgIC4uLih2YWx1ZXMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgaG9zdDogdmFsdWVzLmhvc3QgfSksXG4gICAgLi4uKHZhbHVlc1snbm8tcmVtb3ZlLXZhdWx0J10gPT09IHRydWUgJiYgeyBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZTogZmFsc2UgfSksXG4gICAgLi4uKHZhbHVlc1snb2JzaWRpYW4taW5zdGFsbGVyLXZlcnNpb24nXSAhPT0gdW5kZWZpbmVkICYmIHsgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uOiB2YWx1ZXNbJ29ic2lkaWFuLWluc3RhbGxlci12ZXJzaW9uJ10gfSksXG4gICAgLi4uKHZhbHVlc1snb2JzaWRpYW4tdmVyc2lvbiddICE9PSB1bmRlZmluZWQgJiYgeyBvYnNpZGlhblZlcnNpb246IHZhbHVlc1snb2JzaWRpYW4tdmVyc2lvbiddIH0pLFxuICAgIC4uLih2YWx1ZXMucG9ydCAhPT0gdW5kZWZpbmVkICYmIHsgcG9ydDogcGFyc2VOdW1iZXIoJ3BvcnQnLCB2YWx1ZXMucG9ydCkgfSksXG4gICAgLi4uKHZhbHVlcy52YXVsdCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHQ6IHZhbHVlcy52YXVsdCB9KVxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIG51bWVyaWMgQ0xJIGZsYWcgdmFsdWUsIHRocm93aW5nIG9uIGEgbm9uLWZpbml0ZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIGZsYWcgLSBUaGUgZmxhZyBuYW1lIChmb3IgdGhlIGVycm9yIG1lc3NhZ2UpLlxuICogQHBhcmFtIHJhdyAtIFRoZSByYXcgc3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBudW1iZXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGByYXdgIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKGZsYWc6IHN0cmluZywgcmF3OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZSA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAtLSR7ZmxhZ30gbXVzdCBiZSBhIG51bWJlciwgZ290OiAke3Jhd31gKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25jZSB0aGUgcHJvY2VzcyByZWNlaXZlcyBgU0lHSU5UYC9gU0lHVEVSTWAsIG9yIHRoZSBDRFAgZW5kcG9pbnRcbiAqIHN0b3BzIGFuc3dlcmluZyAodGhlIG93bmVkIE9ic2lkaWFuIHdpbmRvdyB3YXMgY2xvc2VkKS5cbiAqXG4gKiBAcGFyYW0gY2RwVXJsIC0gVGhlIGNvbm5lY3Rpb24ncyBDRFAgYmFzZSBVUkwgdG8gcG9sbC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb24gdGhlIGZpcnN0IHNodXRkb3duIHRyaWdnZXIuXG4gKi9cbmZ1bmN0aW9uIHdhaXRGb3JTaHV0ZG93bk9ySW5zdGFuY2VDbG9zZShjZHBVcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHZlcnNpb25VcmwgPSBgJHtjZHBVcmx9L2pzb24vdmVyc2lvbmA7XG4gICAgbGV0IGlzU2V0dGxlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBwcm9iZUFsaXZlKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBJZ25vcmUgcG9sbCBlcnJvcnMuXG4gICAgICB9KTtcbiAgICB9LCBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIHNldHRsZSk7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgc2V0dGxlKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHByb2JlQWxpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHZlcnNpb25VcmwpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgc2V0dGxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgQ0RQIHBvcnQgc3RvcHBlZCBhbnN3ZXJpbmc6IHRoZSBPYnNpZGlhbiB3aW5kb3cgd2FzIGNsb3NlZC5cbiAgICAgICAgc2V0dGxlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0dGxlKCk6IHZvaWQge1xuICAgICAgaWYgKGlzU2V0dGxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpc1NldHRsZWQgPSB0cnVlO1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0EsMEJBQW9CO0FBQ3BCLHVCQUEwQjtBQUkxQiw0QkFBNkI7QUFzQjdCLGVBQXNCLE9BQXNCO0FBQzFDLFFBQU0sRUFBRSxPQUFPLFFBQUksNEJBQVU7QUFBQSxJQUMzQixTQUFTO0FBQUEsTUFDUCxtQkFBbUIsRUFBRSxNQUFNLFNBQVM7QUFBQSxNQUNwQyxRQUFRLEVBQUUsTUFBTSxTQUFTO0FBQUEsTUFDekIsbUJBQW1CLEVBQUUsTUFBTSxVQUFVO0FBQUEsTUFDckMsOEJBQThCLEVBQUUsTUFBTSxTQUFTO0FBQUEsTUFDL0Msb0JBQW9CLEVBQUUsTUFBTSxTQUFTO0FBQUEsTUFDckMsUUFBUSxFQUFFLE1BQU0sU0FBUztBQUFBLE1BQ3pCLFNBQVMsRUFBRSxNQUFNLFNBQVM7QUFBQSxJQUM1QjtBQUFBLEVBQ0YsQ0FBQztBQUVELFFBQU0sYUFBYSxVQUFNLG9DQUFhLGFBQWEsTUFBTSxDQUFDO0FBRTFELHNCQUFBQSxRQUFRLE9BQU87QUFBQSxJQUNiO0FBQUEsWUFDaUIsT0FBTyxXQUFXLElBQUksQ0FBQztBQUFBLFlBQ3ZCLFdBQVcsTUFBTTtBQUFBLFlBQ2pCLFdBQVcsTUFBTSxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFHeEM7QUFFQSxRQUFNLCtCQUErQixXQUFXLE1BQU07QUFFdEQsc0JBQUFBLFFBQVEsT0FBTyxNQUFNLHlCQUFvQjtBQUN6QyxRQUFNLFdBQVcsUUFBUTtBQUMzQjtBQVFBLFNBQVMsYUFBYSxRQUE4QztBQUNsRSxTQUFPO0FBQUEsSUFDTCxHQUFJLE9BQU8saUJBQWlCLE1BQU0sVUFBYSxFQUFFLDhCQUE4QixZQUFZLG1CQUFtQixPQUFPLGlCQUFpQixDQUFDLEVBQUU7QUFBQSxJQUN6SSxHQUFJLE9BQU8sU0FBUyxVQUFhLEVBQUUsTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUNyRCxHQUFJLE9BQU8saUJBQWlCLE1BQU0sUUFBUSxFQUFFLDRCQUE0QixNQUFNO0FBQUEsSUFDOUUsR0FBSSxPQUFPLDRCQUE0QixNQUFNLFVBQWEsRUFBRSwwQkFBMEIsT0FBTyw0QkFBNEIsRUFBRTtBQUFBLElBQzNILEdBQUksT0FBTyxrQkFBa0IsTUFBTSxVQUFhLEVBQUUsaUJBQWlCLE9BQU8sa0JBQWtCLEVBQUU7QUFBQSxJQUM5RixHQUFJLE9BQU8sU0FBUyxVQUFhLEVBQUUsTUFBTSxZQUFZLFFBQVEsT0FBTyxJQUFJLEVBQUU7QUFBQSxJQUMxRSxHQUFJLE9BQU8sVUFBVSxVQUFhLEVBQUUsT0FBTyxPQUFPLE1BQU07QUFBQSxFQUMxRDtBQUNGO0FBVUEsU0FBUyxZQUFZLE1BQWMsS0FBcUI7QUFDdEQsUUFBTSxRQUFRLE9BQU8sR0FBRztBQUN4QixNQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssR0FBRztBQUMzQixVQUFNLElBQUksVUFBVSxLQUFLLElBQUksMkJBQTJCLEdBQUcsRUFBRTtBQUFBLEVBQy9EO0FBQ0EsU0FBTztBQUNUO0FBU0EsU0FBUywrQkFBK0IsUUFBK0I7QUFDckUsUUFBTSxnQ0FBZ0M7QUFDdEMsU0FBTyxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQ3BDLFVBQU0sYUFBYSxHQUFHLE1BQU07QUFDNUIsUUFBSSxZQUFZO0FBRWhCLFVBQU0sUUFBUSxZQUFZLE1BQU07QUFDOUIsaUJBQVcsRUFBRSxNQUFNLE1BQU07QUFBQSxNQUV6QixDQUFDO0FBQUEsSUFDSCxHQUFHLDZCQUE2QjtBQUVoQyx3QkFBQUEsUUFBUSxLQUFLLFVBQVUsTUFBTTtBQUM3Qix3QkFBQUEsUUFBUSxLQUFLLFdBQVcsTUFBTTtBQUU5QixtQkFBZSxhQUE0QjtBQUN6QyxVQUFJO0FBQ0YsY0FBTSxXQUFXLE1BQU0sTUFBTSxVQUFVO0FBQ3ZDLFlBQUksQ0FBQyxTQUFTLElBQUk7QUFDaEIsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRixRQUFRO0FBRU4sZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBRUEsYUFBUyxTQUFlO0FBQ3RCLFVBQUksV0FBVztBQUNiO0FBQUEsTUFDRjtBQUNBLGtCQUFZO0FBQ1osb0JBQWMsS0FBSztBQUNuQixjQUFRO0FBQUEsSUFDVjtBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJwcm9jZXNzIl0KfQo=
|