obsidian-integration-testing 1.3.2 → 2.0.1
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 +54 -11
- package/dist/lib/cjs/context-provider.cjs +37 -0
- package/dist/lib/cjs/context-provider.d.cts +28 -0
- package/dist/lib/cjs/global-setup-core.cjs +127 -0
- package/dist/lib/cjs/global-setup-core.d.cts +48 -0
- package/dist/lib/cjs/index.cjs +4 -2
- package/dist/lib/cjs/index.d.cts +2 -1
- package/dist/lib/cjs/jest/global-setup.cjs +63 -0
- package/dist/lib/cjs/jest/global-setup.d.cts +61 -0
- package/dist/lib/cjs/log.cjs +32 -0
- package/dist/lib/cjs/log.d.cts +11 -0
- package/dist/lib/cjs/obsidian-cli.cjs +3 -3
- package/dist/lib/cjs/obsidian-cli.d.cts +1 -1
- package/dist/lib/cjs/temp-vault.cjs +7 -7
- package/dist/lib/cjs/temp-vault.d.cts +3 -3
- package/dist/lib/cjs/transport-appium.cjs +12 -11
- package/dist/lib/cjs/transport-desktop-cdp.cjs +35 -10
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +12 -0
- package/dist/lib/cjs/transport-desktop-cli.cjs +34 -10
- package/dist/lib/cjs/transport-desktop-cli.d.cts +11 -0
- package/dist/lib/cjs/transport-factory.cjs +15 -14
- package/dist/lib/cjs/vault-registry.cjs +4 -4
- package/dist/lib/cjs/vault-registry.d.cts +8 -2
- package/dist/lib/cjs/vitest/global-setup.cjs +52 -0
- package/dist/lib/{esm/integration-global-setup.d.mts → cjs/vitest/global-setup.d.cts} +5 -2
- package/dist/lib/{esm/vitest.d.mts → cjs/vitest/typings.d.cts} +1 -1
- package/dist/lib/esm/context-provider.d.mts +28 -0
- package/dist/lib/esm/context-provider.mjs +12 -0
- package/dist/lib/esm/global-setup-core.d.mts +48 -0
- package/dist/lib/esm/global-setup-core.mjs +108 -0
- package/dist/lib/esm/index.d.mts +2 -1
- package/dist/lib/esm/index.mjs +3 -2
- package/dist/lib/esm/jest/global-setup.d.mts +61 -0
- package/dist/lib/esm/jest/global-setup.mjs +39 -0
- package/dist/lib/esm/log.d.mts +11 -0
- package/dist/lib/esm/log.mjs +8 -0
- package/dist/lib/esm/obsidian-cli.d.mts +1 -1
- package/dist/lib/esm/obsidian-cli.mjs +3 -3
- package/dist/lib/esm/temp-vault.d.mts +3 -3
- package/dist/lib/esm/temp-vault.mjs +7 -7
- package/dist/lib/esm/transport-appium.mjs +12 -11
- package/dist/lib/esm/transport-desktop-cdp.d.mts +12 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +39 -11
- package/dist/lib/esm/transport-desktop-cli.d.mts +11 -0
- package/dist/lib/esm/transport-desktop-cli.mjs +35 -10
- package/dist/lib/esm/transport-factory.mjs +15 -14
- package/dist/lib/esm/vault-registry.d.mts +8 -2
- package/dist/lib/esm/vault-registry.mjs +4 -4
- package/dist/lib/{cjs/integration-global-setup.d.cts → esm/vitest/global-setup.d.mts} +5 -2
- package/dist/lib/esm/vitest/global-setup.mjs +29 -0
- package/dist/lib/{cjs/vitest.d.cts → esm/vitest/typings.d.mts} +1 -1
- package/dist/obsidian-integration-testing-2.0.1.tgz +0 -0
- package/package.json +25 -11
- package/dist/lib/cjs/integration-global-setup.cjs +0 -132
- package/dist/lib/esm/integration-global-setup.mjs +0 -112
- package/dist/obsidian-integration-testing-1.3.2.tgz +0 -0
- /package/dist/lib/cjs/{vitest.cjs → vitest/typings.cjs} +0 -0
- /package/dist/lib/esm/{vitest.mjs → vitest/typings.mjs} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import http from "node:http";
|
|
3
3
|
import { remote } from "webdriverio";
|
|
4
|
+
import { log } from "./log.mjs";
|
|
4
5
|
import { AppiumTransport } from "./transport-appium.mjs";
|
|
5
6
|
import { DesktopCdpTransport } from "./transport-desktop-cdp.mjs";
|
|
6
7
|
import { DesktopCliTransport } from "./transport-desktop-cli.mjs";
|
|
@@ -10,25 +11,25 @@ const APPIUM_CONNECTION_RETRY_COUNT = 1;
|
|
|
10
11
|
const APPIUM_CONNECTION_RETRY_TIMEOUT_IN_MILLISECONDS = 1e4;
|
|
11
12
|
const APPIUM_PREFLIGHT_TIMEOUT_IN_MILLISECONDS = 5e3;
|
|
12
13
|
const APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS = 500;
|
|
13
|
-
const APPIUM_START_TIMEOUT_IN_MILLISECONDS =
|
|
14
|
+
const APPIUM_START_TIMEOUT_IN_MILLISECONDS = 6e4;
|
|
14
15
|
const CDP_DEFAULT_PORT = 8315;
|
|
15
16
|
const COMMAND_TIMEOUT_IN_MILLISECONDS = 300;
|
|
16
17
|
const SERVER_LAUNCH_TIMEOUT_IN_MILLISECONDS = 3e4;
|
|
17
18
|
let cachedTransport;
|
|
18
19
|
async function createTransportFromOptions(options) {
|
|
19
20
|
if (!options || options.type === "obsidian-cli") {
|
|
20
|
-
|
|
21
|
+
log("[transport-factory] Creating DesktopCliTransport (no options or type=obsidian-cli)");
|
|
21
22
|
return new DesktopCliTransport();
|
|
22
23
|
}
|
|
23
24
|
if (options.type === "obsidian-cdp") {
|
|
24
|
-
|
|
25
|
+
log(`[transport-factory] Creating DesktopCdpTransport (host=${options.host ?? "localhost"}, port=${String(options.port ?? CDP_DEFAULT_PORT)})`);
|
|
25
26
|
return new DesktopCdpTransport({
|
|
26
27
|
...options.host !== void 0 && { cdpHost: options.host },
|
|
27
28
|
...options.port !== void 0 && { cdpPort: options.port },
|
|
28
29
|
...options.commandTimeoutInMilliseconds !== void 0 && { commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds }
|
|
29
30
|
});
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
+
log(`[transport-factory] Creating AppiumTransport (url=${options.appiumUrl}, device=${options.deviceId})`);
|
|
32
33
|
return createAppiumTransport(options);
|
|
33
34
|
}
|
|
34
35
|
async function getOrCreateTransport(options) {
|
|
@@ -70,21 +71,21 @@ async function createAppiumTransport(options) {
|
|
|
70
71
|
throw new Error(`Invalid port in appiumUrl: ${url.port}`);
|
|
71
72
|
}
|
|
72
73
|
const appId = options.appId ?? APP_PACKAGE;
|
|
73
|
-
|
|
74
|
+
log(`[transport-factory] Checking Appium server at ${options.appiumUrl}...`);
|
|
74
75
|
let appiumProcess;
|
|
75
76
|
try {
|
|
76
77
|
await checkAppiumReachable(url);
|
|
77
|
-
|
|
78
|
+
log("[transport-factory] Appium server is reachable.");
|
|
78
79
|
} catch (error) {
|
|
79
80
|
if (options.shouldAutoStartAppium === false) {
|
|
80
81
|
throw error;
|
|
81
82
|
}
|
|
82
|
-
|
|
83
|
+
log(`[transport-factory] Appium not reachable, auto-starting on port ${String(port)}...`);
|
|
83
84
|
appiumProcess = startAppiumServer(port);
|
|
84
85
|
await waitForAppiumReady(url);
|
|
85
|
-
|
|
86
|
+
log("[transport-factory] Auto-started Appium server is ready.");
|
|
86
87
|
}
|
|
87
|
-
|
|
88
|
+
log(`[transport-factory] Connecting to Appium (device=${options.deviceId}, app=${appId})...`);
|
|
88
89
|
const browser = await remote({
|
|
89
90
|
capabilities: {
|
|
90
91
|
"appium:appActivity": APP_ACTIVITY,
|
|
@@ -107,7 +108,7 @@ async function createAppiumTransport(options) {
|
|
|
107
108
|
path: url.pathname,
|
|
108
109
|
port
|
|
109
110
|
});
|
|
110
|
-
|
|
111
|
+
log("[transport-factory] Appium session established.");
|
|
111
112
|
const transport = new AppiumTransport({
|
|
112
113
|
appId,
|
|
113
114
|
browser,
|
|
@@ -119,16 +120,16 @@ async function createAppiumTransport(options) {
|
|
|
119
120
|
transport.dispose = async () => {
|
|
120
121
|
await originalDispose();
|
|
121
122
|
appiumProcess.kill();
|
|
122
|
-
|
|
123
|
+
log("[transport-factory] Auto-started Appium server stopped.");
|
|
123
124
|
};
|
|
124
125
|
}
|
|
125
126
|
return transport;
|
|
126
127
|
}
|
|
127
128
|
function startAppiumServer(port) {
|
|
128
|
-
const child = spawn(
|
|
129
|
+
const child = spawn(`npx appium --log-timestamp --port ${String(port)}`, {
|
|
129
130
|
detached: true,
|
|
130
131
|
shell: true,
|
|
131
|
-
stdio: "
|
|
132
|
+
stdio: "inherit"
|
|
132
133
|
});
|
|
133
134
|
child.unref();
|
|
134
135
|
return child;
|
|
@@ -153,4 +154,4 @@ export {
|
|
|
153
154
|
createTransportFromOptions,
|
|
154
155
|
getOrCreateTransport
|
|
155
156
|
};
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gJ3dlYmRyaXZlcmlvJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCA9IDE7XG5jb25zdCBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDAwO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IENEUF9ERUZBVUxUX1BPUlQgPSA4MzE1O1xuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNsaScpIHtcbiAgICBjb25zb2xlLndhcm4oJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQ3JlYXRpbmcgRGVza3RvcENsaVRyYW5zcG9ydCAobm8gb3B0aW9ucyBvciB0eXBlPW9ic2lkaWFuLWNsaSknKTtcbiAgICByZXR1cm4gbmV3IERlc2t0b3BDbGlUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgY29uc29sZS53YXJuKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDZHBUcmFuc3BvcnQgKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCA/PyBDRFBfREVGQVVMVF9QT1JUKX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KHtcbiAgICAgIC4uLihvcHRpb25zLmhvc3QgIT09IHVuZGVmaW5lZCAmJiB7IGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCB9KSxcbiAgICAgIC4uLihvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCAmJiB7IGNkcFBvcnQ6IG9wdGlvbnMucG9ydCB9KSxcbiAgICAgIC4uLihvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgY29uc29sZS53YXJuKGBbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIEFwcGl1bVRyYW5zcG9ydCAodXJsPSR7b3B0aW9ucy5hcHBpdW1Vcmx9LCBkZXZpY2U9JHtvcHRpb25zLmRldmljZUlkfSlgKTtcbiAgcmV0dXJuIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHF1aWNrIEhUVFAgY2hlY2sgYWdhaW5zdCB0aGUgQXBwaXVtIHNlcnZlcidzIHN0YXR1cyBlbmRwb2ludC5cbiAqXG4gKiBGYWlscyBmYXN0ICh3aXRoaW4ge0BsaW5rIEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9KSB3aXRoXG4gKiBhIGNsZWFyIGVycm9yIG1lc3NhZ2UgaW5zdGVhZCBvZiBsZXR0aW5nIFdlYkRyaXZlcklPIHJldHJ5IHNpbGVudGx5IGZvciBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgcGFyc2VkIEFwcGl1bSBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybDogVVJMKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgY29uc3QgcmVxID0gaHR0cC5nZXQoc3RhdHVzVXJsLCB7IHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlcykgPT4ge1xuICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnIubWVzc2FnZX0uIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcGl1bVRyYW5zcG9ydChvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxBcHBpdW1UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG5cbiAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gIGlmIChpc05hTihwb3J0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgfVxuXG4gIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICBjb25zb2xlLndhcm4oYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ2hlY2tpbmcgQXBwaXVtIHNlcnZlciBhdCAke29wdGlvbnMuYXBwaXVtVXJsfS4uLmApO1xuICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICBjb25zb2xlLndhcm4oJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlcnZlciBpcyByZWFjaGFibGUuJyk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKGBbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgYXBwaXVtUHJvY2VzcyA9IHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQpO1xuICAgIGF3YWl0IHdhaXRGb3JBcHBpdW1SZWFkeSh1cmwpO1xuICAgIGNvbnNvbGUud2FybignW3RyYW5zcG9ydC1mYWN0b3J5XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBpcyByZWFkeS4nKTtcbiAgfVxuXG4gIGNvbnNvbGUud2FybihgW3RyYW5zcG9ydC1mYWN0b3J5XSBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7b3B0aW9ucy5kZXZpY2VJZH0sIGFwcD0ke2FwcElkfSkuLi5gKTtcbiAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHJlbW90ZSh7XG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgJ2FwcGl1bTphcHBQYWNrYWdlJzogYXBwSWQsXG4gICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICdhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXQnOiBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICdhcHBpdW06c2V0dGluZ3MnOiB7XG4gICAgICAgICdhcHBpdW06Y2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgICdhcHBpdW06c2tpcFNlcnZlckluc3RhbGxhdGlvbic6IHRydWUsXG4gICAgICAnYXBwaXVtOnVkaWQnOiBvcHRpb25zLmRldmljZUlkLFxuICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICB9LFxuICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICBwb3J0XG4gIH0pO1xuXG4gIGNvbnNvbGUud2FybignW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgYXBwSWQsXG4gICAgYnJvd3NlcixcbiAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KVxuICB9KTtcblxuICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IHRyYW5zcG9ydC5kaXNwb3NlLmJpbmQodHJhbnNwb3J0KTtcbiAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgYXBwaXVtUHJvY2Vzcy5raWxsKCk7XG4gICAgICBjb25zb2xlLndhcm4oJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC4nKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zcG9ydDtcbn1cblxuLyoqXG4gKiBTcGF3bnMgYW4gQXBwaXVtIHNlcnZlciBhcyBhIGRldGFjaGVkIGJhY2tncm91bmQgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IHRvIHN0YXJ0IEFwcGl1bSBvbi5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0QXBwaXVtU2VydmVyKHBvcnQ6IG51bWJlcik6IENoaWxkUHJvY2VzcyB7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oJ25weCcsIFsnYXBwaXVtJywgJy0tcG9ydCcsIFN0cmluZyhwb3J0KV0sIHtcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2lnbm9yZSdcbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFBvbGxzIHRoZSBBcHBpdW0gc2VydmVyIHVudGlsIGl0IHJlc3BvbmRzIHRvIGAvc3RhdHVzYC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgXG4gICk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFVQSxTQUFTLGFBQWE7QUFDdEIsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsY0FBYztBQVF2QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDJCQUEyQjtBQUVwQyxNQUFNLGNBQWM7QUFDcEIsTUFBTSxlQUFlLEdBQUcsV0FBVztBQUNuQyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGtEQUFrRDtBQUN4RCxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLDZDQUE2QztBQUNuRCxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtDQUFrQztBQUN4QyxNQUFNLHdDQUF3QztBQUU5QyxJQUFJO0FBUUosZUFBc0IsMkJBQTJCLFNBQWdFO0FBQy9HLE1BQUksQ0FBQyxXQUFXLFFBQVEsU0FBUyxnQkFBZ0I7QUFDL0MsWUFBUSxLQUFLLG9GQUFvRjtBQUNqRyxXQUFPLElBQUksb0JBQW9CO0FBQUEsRUFDakM7QUFFQSxNQUFJLFFBQVEsU0FBUyxnQkFBZ0I7QUFDbkMsWUFBUSxLQUFLLDBEQUEwRCxRQUFRLFFBQVEsV0FBVyxVQUFVLE9BQU8sUUFBUSxRQUFRLGdCQUFnQixDQUFDLEdBQUc7QUFDdkosV0FBTyxJQUFJLG9CQUFvQjtBQUFBLE1BQzdCLEdBQUksUUFBUSxTQUFTLFVBQWEsRUFBRSxTQUFTLFFBQVEsS0FBSztBQUFBLE1BQzFELEdBQUksUUFBUSxTQUFTLFVBQWEsRUFBRSxTQUFTLFFBQVEsS0FBSztBQUFBLE1BQzFELEdBQUksUUFBUSxpQ0FBaUMsVUFBYSxFQUFFLDhCQUE4QixRQUFRLDZCQUE2QjtBQUFBLElBQ2pJLENBQUM7QUFBQSxFQUNIO0FBRUEsVUFBUSxLQUFLLHFEQUFxRCxRQUFRLFNBQVMsWUFBWSxR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
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gJ3dlYmRyaXZlcmlvJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENsaVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2xpLm1qcyc7XG5cbmNvbnN0IEFQUF9QQUNLQUdFID0gJ21kLm9ic2lkaWFuJztcbmNvbnN0IEFQUF9BQ1RJVklUWSA9IGAke0FQUF9QQUNLQUdFfS5NYWluQWN0aXZpdHlgO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQgPSAxO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcbmNvbnN0IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5jb25zdCBDRFBfREVGQVVMVF9QT1JUID0gODMxNTtcbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwMDA7XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jbGknKSB7XG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIENyZWF0aW5nIERlc2t0b3BDbGlUcmFuc3BvcnQgKG5vIG9wdGlvbnMgb3IgdHlwZT1vYnNpZGlhbi1jbGkpJyk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2xpVHJhbnNwb3J0KCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDcmVhdGluZyBEZXNrdG9wQ2RwVHJhbnNwb3J0IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQgPz8gQ0RQX0RFRkFVTFRfUE9SVCl9KWApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydCh7XG4gICAgICAuLi4ob3B0aW9ucy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgICAuLi4ob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBQb3J0OiBvcHRpb25zLnBvcnQgfSksXG4gICAgICAuLi4ob3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgZGV2aWNlPSR7b3B0aW9ucy5kZXZpY2VJZH0pYCk7XG4gIHJldHVybiBjcmVhdGVBcHBpdW1UcmFuc3BvcnQob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBxdWljayBIVFRQIGNoZWNrIGFnYWluc3QgdGhlIEFwcGl1bSBzZXJ2ZXIncyBzdGF0dXMgZW5kcG9pbnQuXG4gKlxuICogRmFpbHMgZmFzdCAod2l0aGluIHtAbGluayBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTfSkgd2l0aFxuICogYSBjbGVhciBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YgbGV0dGluZyBXZWJEcml2ZXJJTyByZXRyeSBzaWxlbnRseSBmb3IgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIHBhcnNlZCBBcHBpdW0gVVJMLlxuICovXG5mdW5jdGlvbiBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1c1VybCA9IG5ldyBVUkwoJy9zdGF0dXMnLCB1cmwpO1xuICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBcHBpdW1UcmFuc3BvcnQob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8QXBwaXVtVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gIH1cblxuICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgbG9nKGBbdHJhbnNwb3J0LWZhY3RvcnldIENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHtvcHRpb25zLmFwcGl1bVVybH0uLi5gKTtcbiAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGF3YWl0IGNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGlmIChvcHRpb25zLnNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5XSBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgIGFwcGl1bVByb2Nlc3MgPSBzdGFydEFwcGl1bVNlcnZlcihwb3J0KTtcbiAgICBhd2FpdCB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsKTtcbiAgICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gIH1cblxuICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeV0gQ29ubmVjdGluZyB0byBBcHBpdW0gKGRldmljZT0ke29wdGlvbnMuZGV2aWNlSWR9LCBhcHA9JHthcHBJZH0pLi4uYCk7XG4gIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgJ2FwcGl1bTphdXRvR3JhbnRQZXJtaXNzaW9ucyc6IHRydWUsXG4gICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAnYXBwaXVtOnNldHRpbmdzJzoge1xuICAgICAgICAnYXBwaXVtOmNocm9tZWRyaXZlckF1dG9kb3dubG9hZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICAnYXBwaXVtOnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24nOiB0cnVlLFxuICAgICAgJ2FwcGl1bTp1ZGlkJzogb3B0aW9ucy5kZXZpY2VJZCxcbiAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCc6IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgfSxcbiAgICBjb25uZWN0aW9uUmV0cnlDb3VudDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQsXG4gICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgcG9ydFxuICB9KTtcblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeV0gQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgIGFwcElkLFxuICAgIGJyb3dzZXIsXG4gICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSlcbiAgfSk7XG5cbiAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSB0cmFuc3BvcnQuZGlzcG9zZS5iaW5kKHRyYW5zcG9ydCk7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2UgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgIGFwcGl1bVByb2Nlc3Mua2lsbCgpO1xuICAgICAgbG9nKCdbdHJhbnNwb3J0LWZhY3RvcnldIEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHN0b3BwZWQuJyk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc3BvcnQ7XG59XG5cbi8qKlxuICogU3Bhd25zIGFuIEFwcGl1bSBzZXJ2ZXIgYXMgYSBkZXRhY2hlZCBiYWNrZ3JvdW5kIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCB0byBzdGFydCBBcHBpdW0gb24uXG4gKiBAcmV0dXJucyBUaGUgc3Bhd25lZCBjaGlsZCBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIpOiBDaGlsZFByb2Nlc3Mge1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggYXBwaXVtIC0tbG9nLXRpbWVzdGFtcCAtLXBvcnQgJHtTdHJpbmcocG9ydCl9YCwge1xuICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgfSk7XG5cbiAgY2hpbGQudW5yZWYoKTtcbiAgcmV0dXJuIGNoaWxkO1xufVxuXG4vKipcbiAqIFBvbGxzIHRoZSBBcHBpdW0gc2VydmVyIHVudGlsIGl0IHJlc3BvbmRzIHRvIGAvc3RhdHVzYC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVBQSVVNX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKEFQUElVTV9TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgXG4gICk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFVQSxTQUFTLGFBQWE7QUFDdEIsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsY0FBYztBQVF2QixTQUFTLFdBQVc7QUFDcEIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUywyQkFBMkI7QUFFcEMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sZUFBZSxHQUFHLFdBQVc7QUFDbkMsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSxrREFBa0Q7QUFDeEQsTUFBTSwyQ0FBMkM7QUFDakQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSx1Q0FBdUM7QUFDN0MsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSx3Q0FBd0M7QUFFOUMsSUFBSTtBQVFKLGVBQXNCLDJCQUEyQixTQUFnRTtBQUMvRyxNQUFJLENBQUMsV0FBVyxRQUFRLFNBQVMsZ0JBQWdCO0FBQy9DLFFBQUksb0ZBQW9GO0FBQ3hGLFdBQU8sSUFBSSxvQkFBb0I7QUFBQSxFQUNqQztBQUVBLE1BQUksUUFBUSxTQUFTLGdCQUFnQjtBQUNuQyxRQUFJLDBEQUEwRCxRQUFRLFFBQVEsV0FBVyxVQUFVLE9BQU8sUUFBUSxRQUFRLGdCQUFnQixDQUFDLEdBQUc7QUFDOUksV0FBTyxJQUFJLG9CQUFvQjtBQUFBLE1BQzdCLEdBQUksUUFBUSxTQUFTLFVBQWEsRUFBRSxTQUFTLFFBQVEsS0FBSztBQUFBLE1BQzFELEdBQUksUUFBUSxTQUFTLFVBQWEsRUFBRSxTQUFTLFFBQVEsS0FBSztBQUFBLE1BQzFELEdBQUksUUFBUSxpQ0FBaUMsVUFBYSxFQUFFLDhCQUE4QixRQUFRLDZCQUE2QjtBQUFBLElBQ2pJLENBQUM7QUFBQSxFQUNIO0FBRUEsTUFBSSxxREFBcUQsUUFBUSxTQUFTLFlBQVksUUFBUSxRQUFRLEdBQUc7QUFDekcsU0FBTyxzQkFBc0IsT0FBTztBQUN0QztB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
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Manages vault registration in the running Obsidian instance.
|
|
5
|
+
* Delegates to the transport resolved from the context provider.
|
|
6
|
+
*/
|
|
1
7
|
import type { ObsidianTransport } from './transport.mjs';
|
|
2
8
|
/**
|
|
3
9
|
* Registers a vault path in the running Obsidian instance.
|
|
@@ -6,7 +12,7 @@ import type { ObsidianTransport } from './transport.mjs';
|
|
|
6
12
|
*
|
|
7
13
|
* @param vaultPath - The absolute path to the vault folder.
|
|
8
14
|
* @param transportOverride - An explicit transport to use. When omitted,
|
|
9
|
-
* falls back to
|
|
15
|
+
* falls back to the transport configured via the context provider.
|
|
10
16
|
*/
|
|
11
17
|
export declare function registerVault(vaultPath: string, transportOverride?: ObsidianTransport): Promise<void>;
|
|
12
18
|
/**
|
|
@@ -16,6 +22,6 @@ export declare function registerVault(vaultPath: string, transportOverride?: Obs
|
|
|
16
22
|
*
|
|
17
23
|
* @param vaultPath - The absolute path to the vault folder.
|
|
18
24
|
* @param transportOverride - An explicit transport to use. When omitted,
|
|
19
|
-
* falls back to
|
|
25
|
+
* falls back to the transport configured via the context provider.
|
|
20
26
|
*/
|
|
21
27
|
export declare function unregisterVault(vaultPath: string, transportOverride?: ObsidianTransport): Promise<void>;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getTransportOptions } from "./context-provider.mjs";
|
|
2
2
|
import { getOrCreateTransport } from "./transport-factory.mjs";
|
|
3
3
|
async function registerVault(vaultPath, transportOverride) {
|
|
4
|
-
const transport = transportOverride ?? await getOrCreateTransport(
|
|
4
|
+
const transport = transportOverride ?? await getOrCreateTransport(getTransportOptions());
|
|
5
5
|
await transport.registerVault(vaultPath);
|
|
6
6
|
}
|
|
7
7
|
async function unregisterVault(vaultPath, transportOverride) {
|
|
8
|
-
const transport = transportOverride ?? await getOrCreateTransport(
|
|
8
|
+
const transport = transportOverride ?? await getOrCreateTransport(getTransportOptions());
|
|
9
9
|
await transport.unregisterVault(vaultPath);
|
|
10
10
|
}
|
|
11
11
|
export {
|
|
12
12
|
registerVault,
|
|
13
13
|
unregisterVault
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZhdWx0LXJlZ2lzdHJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG4vKipcbiAqIEBmaWxlXG4gKlxuICogTWFuYWdlcyB2YXVsdCByZWdpc3RyYXRpb24gaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKiBEZWxlZ2F0ZXMgdG8gdGhlIHRyYW5zcG9ydCByZXNvbHZlZCBmcm9tIHRoZSBjb250ZXh0IHByb3ZpZGVyLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBnZXRUcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLm1qcyc7XG5pbXBvcnQgeyBnZXRPckNyZWF0ZVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkubWpzJztcblxuLyoqXG4gKiBSZWdpc3RlcnMgYSB2YXVsdCBwYXRoIGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgYWN0aXZlIHRyYW5zcG9ydCdzIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydC5yZWdpc3RlclZhdWx0fS5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAqICAgZmFsbHMgYmFjayB0byB0aGUgdHJhbnNwb3J0IGNvbmZpZ3VyZWQgdmlhIHRoZSBjb250ZXh0IHByb3ZpZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZywgdHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRPdmVycmlkZSA/PyBhd2FpdCBnZXRPckNyZWF0ZVRyYW5zcG9ydChnZXRUcmFuc3BvcnRPcHRpb25zKCkpO1xuICBhd2FpdCB0cmFuc3BvcnQucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGgpO1xufVxuXG4vKipcbiAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgcGF0aCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgYWN0aXZlIHRyYW5zcG9ydCdzIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydC51bnJlZ2lzdGVyVmF1bHR9LlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZS4gV2hlbiBvbWl0dGVkLFxuICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcsIHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdHJhbnNwb3J0ID0gdHJhbnNwb3J0T3ZlcnJpZGUgPz8gYXdhaXQgZ2V0T3JDcmVhdGVUcmFuc3BvcnQoZ2V0VHJhbnNwb3J0T3B0aW9ucygpKTtcbiAgYXdhaXQgdHJhbnNwb3J0LnVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGgpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBV0EsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyw0QkFBNEI7QUFXckMsZUFBc0IsY0FBYyxXQUFtQixtQkFBc0Q7QUFDM0csUUFBTSxZQUFZLHFCQUFxQixNQUFNLHFCQUFxQixvQkFBb0IsQ0FBQztBQUN2RixRQUFNLFVBQVUsY0FBYyxTQUFTO0FBQ3pDO0FBV0EsZUFBc0IsZ0JBQWdCLFdBQW1CLG1CQUFzRDtBQUM3RyxRQUFNLFlBQVkscUJBQXFCLE1BQU0scUJBQXFCLG9CQUFvQixDQUFDO0FBQ3ZGLFFBQU0sVUFBVSxnQkFBZ0IsU0FBUztBQUMzQzsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Vitest global setup and teardown adapter.
|
|
5
|
+
*
|
|
6
|
+
* Delegates to the framework-agnostic core and bridges context
|
|
7
|
+
* to test workers via Vitest's `project.provide` / `inject`.
|
|
5
8
|
*/
|
|
6
9
|
import type { TestProject } from 'vitest/node';
|
|
7
|
-
import { TempVault } from '
|
|
10
|
+
import { TempVault } from '../temp-vault.mjs';
|
|
8
11
|
/**
|
|
9
12
|
* Returns the temporary vault provided by the global setup.
|
|
10
13
|
*
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { inject } from "vitest";
|
|
2
|
+
import { setTransportOptionsResolver } from "../context-provider.mjs";
|
|
3
|
+
import {
|
|
4
|
+
coreSetup,
|
|
5
|
+
coreTeardown
|
|
6
|
+
} from "../global-setup-core.mjs";
|
|
7
|
+
import { TempVault } from "../temp-vault.mjs";
|
|
8
|
+
setTransportOptionsResolver(() => inject("obsidianTransport"));
|
|
9
|
+
let setupResult;
|
|
10
|
+
function getTempVault() {
|
|
11
|
+
const tempVaultPath = inject("tempVaultPath");
|
|
12
|
+
return new TempVault(tempVaultPath);
|
|
13
|
+
}
|
|
14
|
+
async function setup(project) {
|
|
15
|
+
const environmentOptions = project.config.environmentOptions;
|
|
16
|
+
const transportOptions = environmentOptions?.["obsidianTransport"];
|
|
17
|
+
setupResult = await coreSetup({ transportOptions });
|
|
18
|
+
project.provide("obsidianTransport", setupResult.transportOptions);
|
|
19
|
+
project.provide("tempVaultPath", setupResult.tempVault.path);
|
|
20
|
+
}
|
|
21
|
+
async function teardown() {
|
|
22
|
+
await coreTeardown(setupResult);
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
getTempVault,
|
|
26
|
+
setup,
|
|
27
|
+
teardown
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7IHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlciB9IGZyb20gJy4uL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7XG4gIGNvcmVTZXR1cCxcbiAgY29yZVRlYXJkb3duXG59IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuLi90ZW1wLXZhdWx0Lm1qcyc7XG5cbnNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcigoKSA9PiBpbmplY3QoJ29ic2lkaWFuVHJhbnNwb3J0JykpO1xuXG5sZXQgc2V0dXBSZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgdmF1bHQgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdGVtcG9yYXJ5IHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFZhdWx0KCk6IFRlbXBWYXVsdCB7XG4gIGNvbnN0IHRlbXBWYXVsdFBhdGggPSBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKTtcbiAgcmV0dXJuIG5ldyBUZW1wVmF1bHQodGVtcFZhdWx0UGF0aCk7XG59XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCBzZXR1cCBmdW5jdGlvbi5cbiAqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIGEgdGVtcG9yYXJ5IHZhdWx0LCBlbmFibGVzIGl0IHZpYSB0aGUgT2JzaWRpYW4gQ0xJLFxuICogYW5kIHByb3ZpZGVzIGB0ZW1wVmF1bHRQYXRoYCB0byB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdCAtIFRoZSBWaXRlc3QgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKHByb2plY3Q6IFRlc3RQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9ucyA9IHByb2plY3QuY29uZmlnLmVudmlyb25tZW50T3B0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IGVudmlyb25tZW50T3B0aW9ucz8uWydvYnNpZGlhblRyYW5zcG9ydCddIGFzIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBzZXR1cFJlc3VsdCA9IGF3YWl0IGNvcmVTZXR1cCh7IHRyYW5zcG9ydE9wdGlvbnMgfSk7XG5cbiAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHNldHVwUmVzdWx0LnRyYW5zcG9ydE9wdGlvbnMpO1xuICBwcm9qZWN0LnByb3ZpZGUoJ3RlbXBWYXVsdFBhdGgnLCBzZXR1cFJlc3VsdC50ZW1wVmF1bHQucGF0aCk7XG59XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCB0ZWFyZG93biBmdW5jdGlvbi5cbiAqXG4gKiBSZW1vdmVzIHRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZWFyZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY29yZVRlYXJkb3duKHNldHVwUmVzdWx0KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWFBLFNBQVMsY0FBYztBQUt2QixTQUFTLG1DQUFtQztBQUM1QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUJBQWlCO0FBRTFCLDRCQUE0QixNQUFNLE9BQU8sbUJBQW1CLENBQUM7QUFFN0QsSUFBSTtBQU9HLFNBQVMsZUFBMEI7QUFDeEMsUUFBTSxnQkFBZ0IsT0FBTyxlQUFlO0FBQzVDLFNBQU8sSUFBSSxVQUFVLGFBQWE7QUFDcEM7QUFVQSxlQUFzQixNQUFNLFNBQXFDO0FBQy9ELFFBQU0scUJBQXFCLFFBQVEsT0FBTztBQUMxQyxRQUFNLG1CQUFtQixxQkFBcUIsbUJBQW1CO0FBRWpFLGdCQUFjLE1BQU0sVUFBVSxFQUFFLGlCQUFpQixDQUFDO0FBRWxELFVBQVEsUUFBUSxxQkFBcUIsWUFBWSxnQkFBZ0I7QUFDakUsVUFBUSxRQUFRLGlCQUFpQixZQUFZLFVBQVUsSUFBSTtBQUM3RDtBQU9BLGVBQXNCLFdBQTBCO0FBQzlDLFFBQU0sYUFBYSxXQUFXO0FBQ2hDOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Provides intellisense for `environmentOptions.obsidianTransport`
|
|
8
8
|
* and `inject('obsidianTransport')` / `inject('tempVaultPath')`.
|
|
9
9
|
*/
|
|
10
|
-
import type { ObsidianTransportOptions } from '
|
|
10
|
+
import type { ObsidianTransportOptions } from '../transport-options.mjs';
|
|
11
11
|
declare module 'vitest' {
|
|
12
12
|
interface ProvidedContext {
|
|
13
13
|
/**
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obsidian-integration-testing",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Simplifies integration testing of Obsidian plugins.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian",
|
|
@@ -33,22 +33,32 @@
|
|
|
33
33
|
"default": "./dist/lib/cjs/index.cjs"
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
|
-
"./
|
|
36
|
+
"./jest-global-setup": {
|
|
37
37
|
"import": {
|
|
38
|
-
"types": "./dist/lib/esm/
|
|
38
|
+
"types": "./dist/lib/esm/jest/global-setup.d.mts",
|
|
39
|
+
"default": "./dist/lib/esm/jest/global-setup.mjs"
|
|
39
40
|
},
|
|
40
41
|
"require": {
|
|
41
|
-
"types": "./dist/lib/cjs/
|
|
42
|
+
"types": "./dist/lib/cjs/jest/global-setup.d.cts",
|
|
43
|
+
"default": "./dist/lib/cjs/jest/global-setup.cjs"
|
|
42
44
|
}
|
|
43
45
|
},
|
|
44
|
-
"./
|
|
46
|
+
"./vitest-global-setup": {
|
|
45
47
|
"import": {
|
|
46
|
-
"types": "./dist/lib/esm/
|
|
47
|
-
"default": "./dist/lib/esm/
|
|
48
|
+
"types": "./dist/lib/esm/vitest/global-setup.d.mts",
|
|
49
|
+
"default": "./dist/lib/esm/vitest/global-setup.mjs"
|
|
48
50
|
},
|
|
49
51
|
"require": {
|
|
50
|
-
"types": "./dist/lib/cjs/
|
|
51
|
-
"default": "./dist/lib/cjs/
|
|
52
|
+
"types": "./dist/lib/cjs/vitest/global-setup.d.cts",
|
|
53
|
+
"default": "./dist/lib/cjs/vitest/global-setup.cjs"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"./vitest-typings": {
|
|
57
|
+
"import": {
|
|
58
|
+
"types": "./dist/lib/esm/vitest/typings.d.mts"
|
|
59
|
+
},
|
|
60
|
+
"require": {
|
|
61
|
+
"types": "./dist/lib/cjs/vitest/typings.d.cts"
|
|
52
62
|
}
|
|
53
63
|
}
|
|
54
64
|
},
|
|
@@ -80,6 +90,7 @@
|
|
|
80
90
|
"spellcheck": "jiti scripts/spellcheck.ts",
|
|
81
91
|
"test": "jiti scripts/test.ts",
|
|
82
92
|
"test:coverage": "jiti scripts/test-coverage.ts",
|
|
93
|
+
"test:jest": "jiti scripts/test-jest.ts",
|
|
83
94
|
"test:integration": "jiti scripts/test-integration.ts",
|
|
84
95
|
"test:watch": "jiti scripts/test-watch.ts",
|
|
85
96
|
"version": "jiti scripts/version.ts"
|
|
@@ -95,6 +106,7 @@
|
|
|
95
106
|
"@stylistic/eslint-plugin": "latest",
|
|
96
107
|
"@total-typescript/ts-reset": "latest",
|
|
97
108
|
"@tsconfig/strictest": "latest",
|
|
109
|
+
"@types/jest": "latest",
|
|
98
110
|
"@types/markdown-it": "latest",
|
|
99
111
|
"@types/semver": "latest",
|
|
100
112
|
"@types/turndown": "latest",
|
|
@@ -118,6 +130,7 @@
|
|
|
118
130
|
"eslint-plugin-tsdoc": "latest",
|
|
119
131
|
"globals": "latest",
|
|
120
132
|
"husky": "latest",
|
|
133
|
+
"jest": "latest",
|
|
121
134
|
"jiti": "latest",
|
|
122
135
|
"jsdom": "latest",
|
|
123
136
|
"markdownlint": "latest",
|
|
@@ -127,6 +140,7 @@
|
|
|
127
140
|
"obsidian": "latest",
|
|
128
141
|
"obsidian-typings": "obsidian-public-latest",
|
|
129
142
|
"semver": "latest",
|
|
143
|
+
"ts-jest": "latest",
|
|
130
144
|
"type-fest": "latest",
|
|
131
145
|
"typescript": "latest",
|
|
132
146
|
"typescript-eslint": "latest",
|
|
@@ -135,11 +149,11 @@
|
|
|
135
149
|
},
|
|
136
150
|
"peerDependencies": {
|
|
137
151
|
"obsidian": "latest",
|
|
138
|
-
"type-fest": "latest"
|
|
139
|
-
"vitest": "latest"
|
|
152
|
+
"type-fest": "latest"
|
|
140
153
|
},
|
|
141
154
|
"overrides": {
|
|
142
155
|
"@antfu/utils": "9.2.0",
|
|
156
|
+
"@sinonjs/fake-timers": "13.0.5",
|
|
143
157
|
"eslint-plugin-import": "npm:eslint-plugin-import-x@latest",
|
|
144
158
|
"type-fest": "latest"
|
|
145
159
|
},
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var integration_global_setup_exports = {};
|
|
20
|
-
__export(integration_global_setup_exports, {
|
|
21
|
-
getTempVault: () => getTempVault,
|
|
22
|
-
setup: () => setup,
|
|
23
|
-
teardown: () => teardown
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(integration_global_setup_exports);
|
|
26
|
-
var import_node_fs = require("node:fs");
|
|
27
|
-
var import_promises = require("node:fs/promises");
|
|
28
|
-
var import_node_path = require("node:path");
|
|
29
|
-
var import_vitest = require("vitest");
|
|
30
|
-
var import_enable_plugin = require("./enable-plugin.cjs");
|
|
31
|
-
var import_obsidian_cli = require("./obsidian-cli.cjs");
|
|
32
|
-
var import_temp_vault = require("./temp-vault.cjs");
|
|
33
|
-
var import_transport_factory = require("./transport-factory.cjs");
|
|
34
|
-
function getTempVault() {
|
|
35
|
-
const tempVaultPath = (0, import_vitest.inject)("tempVaultPath");
|
|
36
|
-
return new import_temp_vault.TempVault(tempVaultPath);
|
|
37
|
-
}
|
|
38
|
-
const DIST_DEV = "dist/dev";
|
|
39
|
-
const DIST_BUILD = "dist/build";
|
|
40
|
-
const MAIN_JS = "main.js";
|
|
41
|
-
const OBSIDIAN_CONFIG_DIR = ".obsidian";
|
|
42
|
-
const PLUGINS_DIR = "plugins";
|
|
43
|
-
const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
|
|
44
|
-
let tempVault;
|
|
45
|
-
let transport;
|
|
46
|
-
async function setup(project) {
|
|
47
|
-
const environmentOptions = project.config.environmentOptions;
|
|
48
|
-
const transportOptions = environmentOptions?.["obsidianTransport"];
|
|
49
|
-
console.warn("[integration-setup] Creating transport...");
|
|
50
|
-
transport = await (0, import_transport_factory.createTransportFromOptions)(transportOptions);
|
|
51
|
-
console.warn(`[integration-setup] Transport created: ${transport.constructor.name}`);
|
|
52
|
-
const projectRoot = findProjectRoot();
|
|
53
|
-
console.warn(`[integration-setup] Project root: ${projectRoot}`);
|
|
54
|
-
const distPath = await resolveDistPath(projectRoot);
|
|
55
|
-
const manifestJson = JSON.parse(await (0, import_promises.readFile)((0, import_node_path.join)(distPath, "manifest.json"), "utf-8"));
|
|
56
|
-
const pluginId = manifestJson.id;
|
|
57
|
-
if (transport.isMobile && manifestJson.isDesktopOnly) {
|
|
58
|
-
throw new Error(
|
|
59
|
-
`Plugin "${pluginId}" has isDesktopOnly: true in manifest.json. Mobile integration tests cannot run for desktop-only plugins.`
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
const mainJs = (0, import_node_path.join)(distPath, MAIN_JS);
|
|
63
|
-
const buildStat = await (0, import_promises.stat)(mainJs);
|
|
64
|
-
console.warn(`[integration-setup] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
|
|
65
|
-
tempVault = new import_temp_vault.TempVault();
|
|
66
|
-
console.warn(`[integration-setup] Created temp vault: ${tempVault.path}`);
|
|
67
|
-
const pluginDir = (0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
|
|
68
|
-
await (0, import_promises.mkdir)(pluginDir, { recursive: true });
|
|
69
|
-
await (0, import_promises.cp)(distPath, pluginDir, { recursive: true });
|
|
70
|
-
await (0, import_promises.writeFile)((0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
|
|
71
|
-
console.warn("[integration-setup] Syncing vault to device...");
|
|
72
|
-
await tempVault.syncToDevice(transport);
|
|
73
|
-
console.warn("[integration-setup] Registering vault...");
|
|
74
|
-
await tempVault.register(transport);
|
|
75
|
-
console.warn("[integration-setup] Vault registered.");
|
|
76
|
-
console.warn(`[integration-setup] Enabling plugin "${pluginId}"...`);
|
|
77
|
-
const { errorMessage } = await (0, import_obsidian_cli.evalInObsidian)({
|
|
78
|
-
args: { pluginId },
|
|
79
|
-
fn: import_enable_plugin.enablePluginWithErrorCapture,
|
|
80
|
-
shouldSkipPreflightChecks: true,
|
|
81
|
-
transport,
|
|
82
|
-
vaultPath: tempVault.path
|
|
83
|
-
});
|
|
84
|
-
if (errorMessage) {
|
|
85
|
-
throw new Error(`Plugin "${pluginId}" failed to load: ${errorMessage}`);
|
|
86
|
-
}
|
|
87
|
-
console.warn(`[integration-setup] Plugin "${pluginId}" enabled successfully.`);
|
|
88
|
-
project.provide("obsidianTransport", transportOptions);
|
|
89
|
-
project.provide("tempVaultPath", tempVault.path);
|
|
90
|
-
}
|
|
91
|
-
async function teardown() {
|
|
92
|
-
await tempVault?.dispose(transport);
|
|
93
|
-
await transport?.dispose?.();
|
|
94
|
-
}
|
|
95
|
-
function findProjectRoot() {
|
|
96
|
-
let dir = process.cwd();
|
|
97
|
-
while (true) {
|
|
98
|
-
if ((0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "package.json"))) {
|
|
99
|
-
return dir;
|
|
100
|
-
}
|
|
101
|
-
const parent = (0, import_node_path.join)(dir, "..");
|
|
102
|
-
if (parent === dir) {
|
|
103
|
-
throw new Error("Could not find project root (no package.json found).");
|
|
104
|
-
}
|
|
105
|
-
dir = parent;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
async function resolveDistPath(projectRoot) {
|
|
109
|
-
const devPath = (0, import_node_path.join)(projectRoot, DIST_DEV);
|
|
110
|
-
const buildPath = (0, import_node_path.join)(projectRoot, DIST_BUILD);
|
|
111
|
-
const devMainJs = (0, import_node_path.join)(devPath, MAIN_JS);
|
|
112
|
-
const buildMainJs = (0, import_node_path.join)(buildPath, MAIN_JS);
|
|
113
|
-
const devStat = (0, import_node_fs.existsSync)(devMainJs) ? await (0, import_promises.stat)(devMainJs) : null;
|
|
114
|
-
const buildStat = (0, import_node_fs.existsSync)(buildMainJs) ? await (0, import_promises.stat)(buildMainJs) : null;
|
|
115
|
-
if (devStat && buildStat) {
|
|
116
|
-
return devStat.mtime > buildStat.mtime ? devPath : buildPath;
|
|
117
|
-
}
|
|
118
|
-
if (devStat) {
|
|
119
|
-
return devPath;
|
|
120
|
-
}
|
|
121
|
-
if (buildStat) {
|
|
122
|
-
return buildPath;
|
|
123
|
-
}
|
|
124
|
-
throw new Error("No build found. Run `npm run build` or `npm run dev` first.");
|
|
125
|
-
}
|
|
126
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
127
|
-
0 && (module.exports = {
|
|
128
|
-
getTempVault,
|
|
129
|
-
setup,
|
|
130
|
-
teardown
|
|
131
|
-
});
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uLWdsb2JhbC1zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHRoZSBnbG9iYWwgc2V0dXAgYW5kIHRlYXJkb3duIGZ1bmN0aW9ucyBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgc2V0dXAgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTWFuaWZlc3QgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ3ZpdGVzdCc7XG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7IGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUgfSBmcm9tICcuL2VuYWJsZS1wbHVnaW4uY2pzJztcbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGkuY2pzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdGVtcG9yYXJ5IHZhdWx0IHByb3ZpZGVkIGJ5IHRoZSBnbG9iYWwgc2V0dXAuXG4gKlxuICogQHJldHVybnMgVGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBWYXVsdCgpOiBUZW1wVmF1bHQge1xuICBjb25zdCB0ZW1wVmF1bHRQYXRoID0gaW5qZWN0KCd0ZW1wVmF1bHRQYXRoJyk7XG4gIHJldHVybiBuZXcgVGVtcFZhdWx0KHRlbXBWYXVsdFBhdGgpO1xufVxuXG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiA9ICdjb21tdW5pdHktcGx1Z2lucy5qc29uJztcblxubGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xubGV0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCBzZXR1cCBmdW5jdGlvbi5cbiAqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIGEgdGVtcG9yYXJ5IHZhdWx0LCBlbmFibGVzIGl0IHZpYSB0aGUgT2JzaWRpYW4gQ0xJLFxuICogYW5kIHByb3ZpZGVzIGB0ZW1wVmF1bHRQYXRoYCB0byB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdCAtIFRoZSBWaXRlc3QgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKHByb2plY3Q6IFRlc3RQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9ucyA9IHByb2plY3QuY29uZmlnLmVudmlyb25tZW50T3B0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IGVudmlyb25tZW50T3B0aW9ucz8uWydvYnNpZGlhblRyYW5zcG9ydCddIGFzIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgY29uc29sZS53YXJuKCdbaW50ZWdyYXRpb24tc2V0dXBdIENyZWF0aW5nIHRyYW5zcG9ydC4uLicpO1xuICB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc29sZS53YXJuKGBbaW50ZWdyYXRpb24tc2V0dXBdIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gIGNvbnN0IHByb2plY3RSb290ID0gZmluZFByb2plY3RSb290KCk7XG4gIGNvbnNvbGUud2FybihgW2ludGVncmF0aW9uLXNldHVwXSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gIGNvbnN0IGRpc3RQYXRoID0gYXdhaXQgcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290KTtcbiAgY29uc3QgbWFuaWZlc3RKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShqb2luKGRpc3RQYXRoLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG4gIGNvbnN0IHBsdWdpbklkID0gbWFuaWZlc3RKc29uLmlkO1xuXG4gIGlmICh0cmFuc3BvcnQuaXNNb2JpbGUgJiYgbWFuaWZlc3RKc29uLmlzRGVza3RvcE9ubHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgaXNEZXNrdG9wT25seTogdHJ1ZSBpbiBtYW5pZmVzdC5qc29uLiBNb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgY2Fubm90IHJ1biBmb3IgZGVza3RvcC1vbmx5IHBsdWdpbnMuYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRTdGF0ID0gYXdhaXQgc3RhdChtYWluSnMpO1xuXG4gIGNvbnNvbGUud2FybihgW2ludGVncmF0aW9uLXNldHVwXSBVc2luZyAke2Rpc3RQYXRofSAoJHtidWlsZFN0YXQubXRpbWUudG9JU09TdHJpbmcoKX0pLiBJZiBvdXRkYXRlZCwgcmVidWlsZC5gKTtcblxuICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gIGNvbnNvbGUud2FybihgW2ludGVncmF0aW9uLXNldHVwXSBDcmVhdGVkIHRlbXAgdmF1bHQ6ICR7dGVtcFZhdWx0LnBhdGh9YCk7XG4gIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICBjb25zb2xlLndhcm4oJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi4nKTtcbiAgYXdhaXQgdGVtcFZhdWx0LnN5bmNUb0RldmljZSh0cmFuc3BvcnQpO1xuICBjb25zb2xlLndhcm4oJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gUmVnaXN0ZXJpbmcgdmF1bHQuLi4nKTtcbiAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gIGNvbnNvbGUud2FybignW2ludGVncmF0aW9uLXNldHVwXSBWYXVsdCByZWdpc3RlcmVkLicpO1xuXG4gIC8vIEVuYWJsZSB0aGUgcGx1Z2luIGFuZCB2ZXJpZnkgaXQgbG9hZGVkLiBPYnNpZGlhbidzIGVuYWJsZVBsdWdpbigpIHdyYXBzXG4gIC8vIExvYWRQbHVnaW4oKSBpbiBhIHRyeS1jYXRjaCB0aGF0IHN3YWxsb3dzIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZS5cbiAgLy8gV2UgbW9ua2V5LXBhdGNoIGxvYWRQbHVnaW4oKSB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gIGNvbnNvbGUud2FybihgW2ludGVncmF0aW9uLXNldHVwXSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG4gIGNvbnN0IHsgZXJyb3JNZXNzYWdlIH0gPSBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgYXJnczogeyBwbHVnaW5JZCB9LFxuICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgfSk7XG5cbiAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gIH1cblxuICBjb25zb2xlLndhcm4oYFtpbnRlZ3JhdGlvbi1zZXR1cF0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHRyYW5zcG9ydE9wdGlvbnMpO1xuICBwcm9qZWN0LnByb3ZpZGUoJ3RlbXBWYXVsdFBhdGgnLCB0ZW1wVmF1bHQucGF0aCk7XG59XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCB0ZWFyZG93biBmdW5jdGlvbi5cbiAqXG4gKiBSZW1vdmVzIHRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZWFyZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgdGVtcFZhdWx0Py5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gIGF3YWl0IHRyYW5zcG9ydD8uZGlzcG9zZT8uKCk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2plY3Qgcm9vdCBieSB3YWxraW5nIHVwIGZyb20gYHByb2Nlc3MuY3dkKClgIGxvb2tpbmcgZm9yIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIHRlcm1pbmF0ZXMgYXQgZmlsZXN5c3RlbSByb290LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBqb2luKGRpciwgJy4uJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByb2plY3Qgcm9vdCAobm8gcGFja2FnZS5qc29uIGZvdW5kKS4nKTtcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGRpc3QgcGF0aCB0byB1c2UgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIFBpY2tzIHdoaWNoZXZlciBvZiBgZGlzdC9kZXZgIGFuZCBgZGlzdC9idWlsZGAgaGFzIGEgbmV3ZXIgYG1haW4uanNgLlxuICogSWYgb25seSBvbmUgZXhpc3RzLCB0aGF0IG9uZSBpcyB1c2VkLiBUaHJvd3MgaWYgbmVpdGhlciBleGlzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3RSb290IC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGV2UGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfREVWKTtcbiAgY29uc3QgYnVpbGRQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9CVUlMRCk7XG4gIGNvbnN0IGRldk1haW5KcyA9IGpvaW4oZGV2UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkTWFpbkpzID0gam9pbihidWlsZFBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBkZXZTdGF0ID0gZXhpc3RzU3luYyhkZXZNYWluSnMpID8gYXdhaXQgc3RhdChkZXZNYWluSnMpIDogbnVsbDtcbiAgY29uc3QgYnVpbGRTdGF0ID0gZXhpc3RzU3luYyhidWlsZE1haW5KcykgPyBhd2FpdCBzdGF0KGJ1aWxkTWFpbkpzKSA6IG51bGw7XG5cbiAgaWYgKGRldlN0YXQgJiYgYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGRldlN0YXQubXRpbWUgPiBidWlsZFN0YXQubXRpbWUgPyBkZXZQYXRoIDogYnVpbGRQYXRoO1xuICB9XG5cbiAgaWYgKGRldlN0YXQpIHtcbiAgICByZXR1cm4gZGV2UGF0aDtcbiAgfVxuXG4gIGlmIChidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBidWlsZCBmb3VuZC4gUnVuIGBucG0gcnVuIGJ1aWxkYCBvciBgbnBtIHJ1biBkZXZgIGZpcnN0LicpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSxxQkFBMkI7QUFDM0Isc0JBTU87QUFDUCx1QkFBcUI7QUFDckIsb0JBQXVCO0FBS3ZCLDJCQUE2QztBQUM3QywwQkFBK0I7QUFDL0Isd0JBQTBCO0FBQzFCLCtCQUEyQztBQU9wQyxTQUFTLGVBQTBCO0FBQ3hDLFFBQU0sb0JBQWdCLHNCQUFPLGVBQWU7QUFDNUMsU0FBTyxJQUFJLDRCQUFVLGFBQWE7QUFDcEM7QUFFQSxNQUFNLFdBQVc7QUFDakIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUFFL0IsSUFBSTtBQUNKLElBQUk7QUFVSixlQUFzQixNQUFNLFNBQXFDO0FBQy9ELFFBQU0scUJBQXFCLFFBQVEsT0FBTztBQUMxQyxRQUFNLG1CQUFtQixxQkFBcUIsbUJBQW1CO0FBQ2pFLFVBQVEsS0FBSywyQ0FBMkM7QUFDeEQsY0FBWSxVQUFNLHFEQUEyQixnQkFBZ0I7QUFDN0QsVUFBUSxLQUFLLDBDQUEwQyxVQUFVLFlBQVksSUFBSSxFQUFFO0FBRW5GLFFBQU0sY0FBYyxnQkFBZ0I7QUFDcEMsVUFBUSxLQUFLLHFDQUFxQyxXQUFXLEVBQUU7QUFDL0QsUUFBTSxXQUFXLE1BQU0sZ0JBQWdCLFdBQVc7QUFDbEQsUUFBTSxlQUFlLEtBQUssTUFBTSxVQUFNLDhCQUFTLHVCQUFLLFVBQVUsZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUN4RixRQUFNLFdBQVcsYUFBYTtBQUU5QixNQUFJLFVBQVUsWUFBWSxhQUFhLGVBQWU7QUFDcEQsVUFBTSxJQUFJ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
|