obsidian-integration-testing 5.1.2 → 5.2.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 +39 -0
- package/bin/obsidian-integration-testing.mjs +4 -0
- package/dist/lib/cjs/cli.cjs +95 -0
- package/dist/lib/cjs/cli.d.cts +15 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +87 -0
- package/dist/lib/cjs/connect-to-cdp.d.cts +130 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +2 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/esm/cli.d.mts +15 -0
- package/dist/lib/esm/cli.mjs +61 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +130 -0
- package/dist/lib/esm/connect-to-cdp.mjs +63 -0
- package/dist/lib/esm/index.d.mts +2 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/obsidian-integration-testing-5.2.0.tgz +0 -0
- package/package.json +5 -1
- package/dist/obsidian-integration-testing-5.1.2.tgz +0 -0
package/README.md
CHANGED
|
@@ -636,6 +636,45 @@ npx vitest run --project integration-tests:android-appium
|
|
|
636
636
|
npx vitest run --project integration-tests:*
|
|
637
637
|
```
|
|
638
638
|
|
|
639
|
+
## Ad-hoc debugging (`connectToCdp` and the CLI)
|
|
640
|
+
|
|
641
|
+
Outside of a test framework, `connectToCdp()` launches (or attaches to) a `CDP` Obsidian instance, opens a vault, bootstraps the runtime helpers, and returns a disposable connection — handy for reproducing behavior in a real Obsidian from a throwaway script or the REPL.
|
|
642
|
+
|
|
643
|
+
```ts
|
|
644
|
+
import { connectToCdp } from 'obsidian-integration-testing';
|
|
645
|
+
|
|
646
|
+
// Owns an isolated instance + an empty temp vault (both cleaned up on dispose).
|
|
647
|
+
await using conn = await connectToCdp();
|
|
648
|
+
|
|
649
|
+
console.log(conn.port, conn.cdpUrl); // the free CDP port the instance was launched on
|
|
650
|
+
|
|
651
|
+
// Raw expression → normalized string result:
|
|
652
|
+
await conn.invoke('app.vault.getName()');
|
|
653
|
+
|
|
654
|
+
// Rich, typed path — `fn` runs in the Obsidian renderer with { app, obsidianModule, typeIntoEditor, context }:
|
|
655
|
+
await conn.evalInObsidian({ fn: ({ app }) => app.workspace.getActiveFile()?.path ?? null });
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
`connectToCdp` accepts the same version knobs as the transport (`obsidianVersion`, `obsidianInstallerVersion`, `host`, `commandTimeoutInMilliseconds`, both defaulting to your installed Obsidian), plus:
|
|
659
|
+
|
|
660
|
+
- **`vault`** — path to an existing vault to open. When omitted, an empty temporary vault is created.
|
|
661
|
+
- **`port`** — attach to an already-running Obsidian on this `CDP` port instead of owning an instance (as in [Attaching to a running Obsidian](#attaching-to-a-running-obsidian)).
|
|
662
|
+
- **`shouldRemoveVaultOnDispose`** — whether `dispose()` removes the vault directory. Defaults to `true` for an implicit temp vault and `false` when a `vault` path is given, so a **real vault is never auto-deleted**. Set it explicitly to override.
|
|
663
|
+
|
|
664
|
+
> [!WARNING]
|
|
665
|
+
>
|
|
666
|
+
> Opening a **real** vault in the owned instance may write to that vault's `.obsidian` config (normal Obsidian behavior). The vault directory itself is never deleted unless `shouldRemoveVaultOnDispose` is `true`.
|
|
667
|
+
|
|
668
|
+
### CLI
|
|
669
|
+
|
|
670
|
+
The package ships an `obsidian-integration-testing` bin that wraps `connectToCdp`, prints the chosen port/URL, and stays alive until `Ctrl+C` — useful when an external tool (raw `CDP` `ws`, DevTools) needs to attach to a printed port:
|
|
671
|
+
|
|
672
|
+
```bash
|
|
673
|
+
npx obsidian-integration-testing --vault F:/path/to/vault --obsidian-version 1.8.10
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
Flags mirror the options above: `--vault`, `--obsidian-version`, `--obsidian-installer-version`, `--port`, `--host`, `--command-timeout`, and `--no-remove-vault` (keep the temp vault on exit).
|
|
677
|
+
|
|
639
678
|
## Support
|
|
640
679
|
|
|
641
680
|
<!-- markdownlint-disable MD033 -->
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var cli_exports = {};
|
|
30
|
+
__export(cli_exports, {
|
|
31
|
+
main: () => main
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(cli_exports);
|
|
34
|
+
var import_node_process = __toESM(require("node:process"), 1);
|
|
35
|
+
var import_node_util = require("node:util");
|
|
36
|
+
var import_connect_to_cdp = require("./connect-to-cdp.cjs");
|
|
37
|
+
async function main() {
|
|
38
|
+
const { values } = (0, import_node_util.parseArgs)({
|
|
39
|
+
options: {
|
|
40
|
+
"command-timeout": { type: "string" },
|
|
41
|
+
"host": { type: "string" },
|
|
42
|
+
"no-remove-vault": { type: "boolean" },
|
|
43
|
+
"obsidian-installer-version": { type: "string" },
|
|
44
|
+
"obsidian-version": { type: "string" },
|
|
45
|
+
"port": { type: "string" },
|
|
46
|
+
"vault": { type: "string" }
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
const connection = await (0, import_connect_to_cdp.connectToCdp)(buildOptions(values));
|
|
50
|
+
import_node_process.default.stdout.write(
|
|
51
|
+
`Obsidian CDP ready.
|
|
52
|
+
port: ${String(connection.port)}
|
|
53
|
+
cdpUrl: ${connection.cdpUrl}
|
|
54
|
+
vault: ${connection.vault.path}
|
|
55
|
+
Runtime helpers bootstrapped as window.__obsidianIntegrationTesting.
|
|
56
|
+
Press Ctrl+C to stop.
|
|
57
|
+
`
|
|
58
|
+
);
|
|
59
|
+
await waitForShutdownSignal();
|
|
60
|
+
import_node_process.default.stdout.write("\nShutting down\u2026\n");
|
|
61
|
+
await connection.dispose();
|
|
62
|
+
}
|
|
63
|
+
function buildOptions(values) {
|
|
64
|
+
return {
|
|
65
|
+
...values["command-timeout"] !== void 0 && { commandTimeoutInMilliseconds: parseNumber("command-timeout", values["command-timeout"]) },
|
|
66
|
+
...values.host !== void 0 && { host: values.host },
|
|
67
|
+
...values["no-remove-vault"] === true && { shouldRemoveVaultOnDispose: false },
|
|
68
|
+
...values["obsidian-installer-version"] !== void 0 && { obsidianInstallerVersion: values["obsidian-installer-version"] },
|
|
69
|
+
...values["obsidian-version"] !== void 0 && { obsidianVersion: values["obsidian-version"] },
|
|
70
|
+
...values.port !== void 0 && { port: parseNumber("port", values.port) },
|
|
71
|
+
...values.vault !== void 0 && { vault: values.vault }
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function parseNumber(flag, raw) {
|
|
75
|
+
const value = Number(raw);
|
|
76
|
+
if (!Number.isFinite(value)) {
|
|
77
|
+
throw new Error(`--${flag} must be a number, got: ${raw}`);
|
|
78
|
+
}
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
function waitForShutdownSignal() {
|
|
82
|
+
return new Promise((resolve) => {
|
|
83
|
+
import_node_process.default.once("SIGINT", () => {
|
|
84
|
+
resolve();
|
|
85
|
+
});
|
|
86
|
+
import_node_process.default.once("SIGTERM", () => {
|
|
87
|
+
resolve();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
92
|
+
0 && (module.exports = {
|
|
93
|
+
main
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaW4gQ0xJIG92ZXIge0BsaW5rIGNvbm5lY3RUb0NkcH06IGxhdW5jaGVzIChvciBhdHRhY2hlcyB0bykgYSBDRFAtZW5hYmxlZFxuICogT2JzaWRpYW4gaW5zdGFuY2Ugd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgcHJpbnRzIHRoZVxuICogY2hvc2VuIENEUCBwb3J0L1VSTCwgYW5kIHN0YXlzIGFsaXZlIHVudGlsIGludGVycnVwdGVkIHNvIGFuIGV4dGVybmFsIHRvb2xcbiAqIChyYXcgQ0RQIGB3c2AsIERldlRvb2xzLCBcdTIwMjYpIGNhbiBhdHRhY2guXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgQ0xJIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBtYW51YWxseSwgbm90IGJ5IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tICdub2RlOnV0aWwnO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3RUb0NkcE9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3QtdG8tY2RwLmNqcyc7XG5cbmltcG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgdGhlIHBhcnNlZCBDTEkgZmxhZyB2YWx1ZXMuXG4gKi9cbmludGVyZmFjZSBQYXJzZWRDbGlWYWx1ZXMge1xuICAnY29tbWFuZC10aW1lb3V0Jz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgJ2hvc3QnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAnbm8tcmVtb3ZlLXZhdWx0Jz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICdvYnNpZGlhbi1pbnN0YWxsZXItdmVyc2lvbic/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICdvYnNpZGlhbi12ZXJzaW9uJz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgJ3BvcnQnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAndmF1bHQnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcnNlcyBDTEkgYXJndW1lbnRzLCBvcGVucyB0aGUgY29ubmVjdGlvbiwgcHJpbnRzIGl0cyBlbmRwb2ludCwgYW5kIGJsb2Nrc1xuICogdW50aWwgYFNJR0lOVGAvYFNJR1RFUk1gLCBkaXNwb3NpbmcgdGhlIGNvbm5lY3Rpb24gb24gc2h1dGRvd24uXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgb3B0aW9uczoge1xuICAgICAgJ2NvbW1hbmQtdGltZW91dCc6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICdob3N0JzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgJ25vLXJlbW92ZS12YXVsdCc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnb2JzaWRpYW4taW5zdGFsbGVyLXZlcnNpb24nOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAnb2JzaWRpYW4tdmVyc2lvbic6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICdwb3J0JzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgJ3ZhdWx0JzogeyB0eXBlOiAnc3RyaW5nJyB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgY29ubmVjdFRvQ2RwKGJ1aWxkT3B0aW9ucyh2YWx1ZXMpKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShcbiAgICAnT2JzaWRpYW4gQ0RQIHJlYWR5LlxcbidcbiAgICAgICsgYCAgcG9ydDogICAke1N0cmluZyhjb25uZWN0aW9uLnBvcnQpfVxcbmBcbiAgICAgICsgYCAgY2RwVXJsOiAke2Nvbm5lY3Rpb24uY2RwVXJsfVxcbmBcbiAgICAgICsgYCAgdmF1bHQ6ICAke2Nvbm5lY3Rpb24udmF1bHQucGF0aH1cXG5gXG4gICAgICArICdSdW50aW1lIGhlbHBlcnMgYm9vdHN0cmFwcGVkIGFzIHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLlxcbidcbiAgICAgICsgJ1ByZXNzIEN0cmwrQyB0byBzdG9wLlxcbidcbiAgKTtcblxuICBhd2FpdCB3YWl0Rm9yU2h1dGRvd25TaWduYWwoKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuU2h1dHRpbmcgZG93blx1MjAyNlxcbicpO1xuICBhd2FpdCBjb25uZWN0aW9uLmRpc3Bvc2UoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnN9IGZyb20gcGFyc2VkIENMSSBmbGFnIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHBhcnNlZCBgcGFyc2VBcmdzYCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgY29ubmVjdGlvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBidWlsZE9wdGlvbnModmFsdWVzOiBQYXJzZWRDbGlWYWx1ZXMpOiBDb25uZWN0VG9DZHBPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICAuLi4odmFsdWVzWydjb21tYW5kLXRpbWVvdXQnXSAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogcGFyc2VOdW1iZXIoJ2NvbW1hbmQtdGltZW91dCcsIHZhbHVlc1snY29tbWFuZC10aW1lb3V0J10pIH0pLFxuICAgIC4uLih2YWx1ZXMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgaG9zdDogdmFsdWVzLmhvc3QgfSksXG4gICAgLi4uKHZhbHVlc1snbm8tcmVtb3ZlLXZhdWx0J10gPT09IHRydWUgJiYgeyBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZTogZmFsc2UgfSksXG4gICAgLi4uKHZhbHVlc1snb2JzaWRpYW4taW5zdGFsbGVyLXZlcnNpb24nXSAhPT0gdW5kZWZpbmVkICYmIHsgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uOiB2YWx1ZXNbJ29ic2lkaWFuLWluc3RhbGxlci12ZXJzaW9uJ10gfSksXG4gICAgLi4uKHZhbHVlc1snb2JzaWRpYW4tdmVyc2lvbiddICE9PSB1bmRlZmluZWQgJiYgeyBvYnNpZGlhblZlcnNpb246IHZhbHVlc1snb2JzaWRpYW4tdmVyc2lvbiddIH0pLFxuICAgIC4uLih2YWx1ZXMucG9ydCAhPT0gdW5kZWZpbmVkICYmIHsgcG9ydDogcGFyc2VOdW1iZXIoJ3BvcnQnLCB2YWx1ZXMucG9ydCkgfSksXG4gICAgLi4uKHZhbHVlcy52YXVsdCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHQ6IHZhbHVlcy52YXVsdCB9KVxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIG51bWVyaWMgQ0xJIGZsYWcgdmFsdWUsIHRocm93aW5nIG9uIGEgbm9uLWZpbml0ZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIGZsYWcgLSBUaGUgZmxhZyBuYW1lIChmb3IgdGhlIGVycm9yIG1lc3NhZ2UpLlxuICogQHBhcmFtIHJhdyAtIFRoZSByYXcgc3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBudW1iZXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGByYXdgIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKGZsYWc6IHN0cmluZywgcmF3OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZSA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYC0tJHtmbGFnfSBtdXN0IGJlIGEgbnVtYmVyLCBnb3Q6ICR7cmF3fWApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmNlIHRoZSBwcm9jZXNzIHJlY2VpdmVzIGBTSUdJTlRgIG9yIGBTSUdURVJNYC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uIHRoZSBmaXJzdCBzaHV0ZG93biBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHdhaXRGb3JTaHV0ZG93blNpZ25hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0EsMEJBQW9CO0FBQ3BCLHVCQUEwQjtBQUkxQiw0QkFBNkI7QUFxQjdCLGVBQXNCLE9BQXNCO0FBQzFDLFFBQU0sRUFBRSxPQUFPLFFBQUksNEJBQVU7QUFBQSxJQUMzQixTQUFTO0FBQUEsTUFDUCxtQkFBbUIsRUFBRSxNQUFNLFNBQVM7QUFBQSxNQUNwQyxRQUFRLEVBQUUsTUFBTSxTQUFTO0FBQUEsTUFDekIsbUJBQW1CLEVBQUUsTUFBTSxVQUFVO0FBQUEsTUFDckMsOEJBQThCLEVBQUUsTUFBTSxTQUFTO0FBQUEsTUFDL0Msb0JBQW9CLEVBQUUsTUFBTSxTQUFTO0FBQUEsTUFDckMsUUFBUSxFQUFFLE1BQU0sU0FBUztBQUFBLE1BQ3pCLFNBQVMsRUFBRSxNQUFNLFNBQVM7QUFBQSxJQUM1QjtBQUFBLEVBQ0YsQ0FBQztBQUVELFFBQU0sYUFBYSxVQUFNLG9DQUFhLGFBQWEsTUFBTSxDQUFDO0FBRTFELHNCQUFBQSxRQUFRLE9BQU87QUFBQSxJQUNiO0FBQUEsWUFDaUIsT0FBTyxXQUFXLElBQUksQ0FBQztBQUFBLFlBQ3ZCLFdBQVcsTUFBTTtBQUFBLFlBQ2pCLFdBQVcsTUFBTSxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFHeEM7QUFFQSxRQUFNLHNCQUFzQjtBQUU1QixzQkFBQUEsUUFBUSxPQUFPLE1BQU0seUJBQW9CO0FBQ3pDLFFBQU0sV0FBVyxRQUFRO0FBQzNCO0FBUUEsU0FBUyxhQUFhLFFBQThDO0FBQ2xFLFNBQU87QUFBQSxJQUNMLEdBQUksT0FBTyxpQkFBaUIsTUFBTSxVQUFhLEVBQUUsOEJBQThCLFlBQVksbUJBQW1CLE9BQU8saUJBQWlCLENBQUMsRUFBRTtBQUFBLElBQ3pJLEdBQUksT0FBTyxTQUFTLFVBQWEsRUFBRSxNQUFNLE9BQU8sS0FBSztBQUFBLElBQ3JELEdBQUksT0FBTyxpQkFBaUIsTUFBTSxRQUFRLEVBQUUsNEJBQTRCLE1BQU07QUFBQSxJQUM5RSxHQUFJLE9BQU8sNEJBQTRCLE1BQU0sVUFBYSxFQUFFLDBCQUEwQixPQUFPLDRCQUE0QixFQUFFO0FBQUEsSUFDM0gsR0FBSSxPQUFPLGtCQUFrQixNQUFNLFVBQWEsRUFBRSxpQkFBaUIsT0FBTyxrQkFBa0IsRUFBRTtBQUFBLElBQzlGLEdBQUksT0FBTyxTQUFTLFVBQWEsRUFBRSxNQUFNLFlBQVksUUFBUSxPQUFPLElBQUksRUFBRTtBQUFBLElBQzFFLEdBQUksT0FBTyxVQUFVLFVBQWEsRUFBRSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQzFEO0FBQ0Y7QUFVQSxTQUFTLFlBQVksTUFBYyxLQUFxQjtBQUN0RCxRQUFNLFFBQVEsT0FBTyxHQUFHO0FBQ3hCLE1BQUksQ0FBQyxPQUFPLFNBQVMsS0FBSyxHQUFHO0FBQzNCLFVBQU0sSUFBSSxNQUFNLEtBQUssSUFBSSwyQkFBMkIsR0FBRyxFQUFFO0FBQUEsRUFDM0Q7QUFDQSxTQUFPO0FBQ1Q7QUFPQSxTQUFTLHdCQUF1QztBQUM5QyxTQUFPLElBQUksUUFBYyxDQUFDLFlBQVk7QUFDcEMsd0JBQUFBLFFBQVEsS0FBSyxVQUFVLE1BQU07QUFDM0IsY0FBUTtBQUFBLElBQ1YsQ0FBQztBQUNELHdCQUFBQSxRQUFRLEtBQUssV0FBVyxNQUFNO0FBQzVCLGNBQVE7QUFBQSxJQUNWLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Thin CLI over {@link connectToCdp}: launches (or attaches to) a CDP-enabled
|
|
5
|
+
* Obsidian instance with the runtime helper namespace bootstrapped, prints the
|
|
6
|
+
* chosen CDP port/URL, and stays alive until interrupted so an external tool
|
|
7
|
+
* (raw CDP `ws`, DevTools, …) can attach.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Parses CLI arguments, opens the connection, prints its endpoint, and blocks
|
|
11
|
+
* until `SIGINT`/`SIGTERM`, disposing the connection on shutdown.
|
|
12
|
+
*
|
|
13
|
+
* @returns A {@link Promise} that resolves once the connection has been disposed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function main(): Promise<void>;
|
|
@@ -0,0 +1,87 @@
|
|
|
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 connect_to_cdp_exports = {};
|
|
20
|
+
__export(connect_to_cdp_exports, {
|
|
21
|
+
connectToCdp: () => connectToCdp
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(connect_to_cdp_exports);
|
|
24
|
+
var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
|
|
25
|
+
var import_temp_vault = require("./temp-vault.cjs");
|
|
26
|
+
var import_transport_desktop_cdp = require("./transport-desktop-cdp.cjs");
|
|
27
|
+
var import_transport_factory = require("./transport-factory.cjs");
|
|
28
|
+
const DEFAULT_CDP_HOST = "localhost";
|
|
29
|
+
async function connectToCdp(options) {
|
|
30
|
+
const transportOptions = {
|
|
31
|
+
type: "obsidian-cdp",
|
|
32
|
+
...options?.commandTimeoutInMilliseconds !== void 0 && { commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds },
|
|
33
|
+
...options?.host !== void 0 && { host: options.host },
|
|
34
|
+
...options?.obsidianInstallerVersion !== void 0 && { obsidianInstallerVersion: options.obsidianInstallerVersion },
|
|
35
|
+
...options?.obsidianVersion !== void 0 && { obsidianVersion: options.obsidianVersion },
|
|
36
|
+
...options?.port !== void 0 && { port: options.port }
|
|
37
|
+
};
|
|
38
|
+
const transport = await (0, import_transport_factory.createTransportFromOptions)(transportOptions);
|
|
39
|
+
const vault = new import_temp_vault.TempVault(options?.vault);
|
|
40
|
+
const shouldRemoveVaultOnDispose = options?.shouldRemoveVaultOnDispose ?? options?.vault === void 0;
|
|
41
|
+
await vault.register(transport);
|
|
42
|
+
const { host, port } = resolveEndpoint(transport, options);
|
|
43
|
+
const cdpUrl = `http://${host}:${String(port)}`;
|
|
44
|
+
const connection = {
|
|
45
|
+
cdpUrl,
|
|
46
|
+
async dispose() {
|
|
47
|
+
try {
|
|
48
|
+
if (shouldRemoveVaultOnDispose) {
|
|
49
|
+
await vault.dispose(transport);
|
|
50
|
+
} else {
|
|
51
|
+
await transport.unregisterVault(vault.path);
|
|
52
|
+
}
|
|
53
|
+
} finally {
|
|
54
|
+
await transport.dispose?.();
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
async evalInObsidian(params) {
|
|
58
|
+
return (0, import_eval_in_obsidian.evalInObsidian)({ ...params, transport, vaultPath: vault.path });
|
|
59
|
+
},
|
|
60
|
+
async invoke(expression) {
|
|
61
|
+
return transport.evaluate(expression, { cwd: vault.path });
|
|
62
|
+
},
|
|
63
|
+
port,
|
|
64
|
+
async [Symbol.asyncDispose]() {
|
|
65
|
+
await connection.dispose();
|
|
66
|
+
},
|
|
67
|
+
vault
|
|
68
|
+
};
|
|
69
|
+
return connection;
|
|
70
|
+
}
|
|
71
|
+
function resolveEndpoint(transport, options) {
|
|
72
|
+
if (transport instanceof import_transport_desktop_cdp.DesktopCdpTransport) {
|
|
73
|
+
const endpoint = transport.getOwnedInstanceEndpoint();
|
|
74
|
+
if (endpoint) {
|
|
75
|
+
return { host: endpoint.host, port: endpoint.port };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (options?.port !== void 0) {
|
|
79
|
+
return { host: options.host ?? DEFAULT_CDP_HOST, port: options.port };
|
|
80
|
+
}
|
|
81
|
+
throw new Error("connectToCdp: could not determine the CDP port.");
|
|
82
|
+
}
|
|
83
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
84
|
+
0 && (module.exports = {
|
|
85
|
+
connectToCdp
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nvbm5lY3QtdG8tY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvZ3JhbW1hdGljIGhlbHBlciB0byBsYXVuY2ggKG9yIGF0dGFjaCB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICogd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgZm9yIGFkLWhvYyByZWFsLWFwcCBkZWJ1Z2dpbmcuXG4gKlxuICogQSBzaW5nbGUge0BsaW5rIGNvbm5lY3RUb0NkcH0gY2FsbCByZXNvbHZlcyB0aGUgb3duZWQtaW5zdGFuY2UgY29uZmlnLCBvcGVucyBhXG4gKiB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCAoc28gYGV2YWxXcmFwcGVyYCxcbiAqIGB0eXBlSW50b0VkaXRvcmAsIGBzZXJpYWxpemVFcnJvcmAsIGBnZXRPYnNpZGlhbk1vZHVsZWAsIFx1MjAyNiBhcmUgYXZhaWxhYmxlKSwgdGhlblxuICogaGFuZHMgYmFjayBhIGRpc3Bvc2FibGUge0BsaW5rIENkcENvbm5lY3Rpb259IGV4cG9zaW5nIHRoZSBjaG9zZW4gQ0RQIHBvcnQsIGFcbiAqIHJhdyB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5pbnZva2V9IGFuZCB0aGUgcmljaCB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5ldmFsSW5PYnNpZGlhbn0uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAobGF1bmNoZXMgT2JzaWRpYW4gLyBDRFApIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IEV4Y2VwdCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV2YWxJbk9ic2lkaWFuUGFyYW1zLFxuICBHZW5lcmljT2JqZWN0XG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5cbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLmNqcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmNvbnN0IERFRkFVTFRfQ0RQX0hPU1QgPSAnbG9jYWxob3N0JztcblxuLyoqXG4gKiBBIGxpdmUgY29ubmVjdGlvbiB0byBhIENEUC1lbmFibGVkIE9ic2lkaWFuIGluc3RhbmNlIHdpdGggdGhlIHJ1bnRpbWUgaGVscGVyXG4gKiBuYW1lc3BhY2UgYm9vdHN0cmFwcGVkLlxuICpcbiAqIEltcGxlbWVudHMgYEFzeW5jRGlzcG9zYWJsZWAsIHNvIGBhd2FpdCB1c2luZyBjb25uID0gYXdhaXQgY29ubmVjdFRvQ2RwKFx1MjAyNilgXG4gKiBkaXNwb3NlcyBpdCAoa2lsbGluZyBhbiBvd25lZCBpbnN0YW5jZSBhbmQgXHUyMDE0IGZvciBhIHRocm93LWF3YXkgdGVtcCB2YXVsdCBcdTIwMTRcbiAqIHJlbW92aW5nIGl0cyBkaXJlY3RvcnkpIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RwQ29ubmVjdGlvbiBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZSBDRFAgVVJMLCBlLmcuIGBodHRwOi8vbG9jYWxob3N0OjUxODg4YC5cbiAgICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgY29ubmVjdGlvbjoga2lsbHMgYW4gb3duZWQgaW5zdGFuY2UgYW5kIHJlbW92ZXMgaXRzIGlzb2xhdGVkXG4gICAqIHVzZXItZGF0YSBkaXIuIFRoZSB2YXVsdCBkaXJlY3RvcnkgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gaXQgaXMgYSB0aHJvdy1hd2F5XG4gICAqIHRlbXAgdmF1bHQgKHNlZSB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy5zaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZX0pOyBhXG4gICAqIHJlYWwgdmF1bHQgcGFzc2VkIHZpYSB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy52YXVsdH0gaXMgbmV2ZXIgZGVsZXRlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIGRpc3Bvc2FsIGNvbXBsZXRlcy5cbiAgICovXG4gIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc2VsZi1jb250YWluZWQgZnVuY3Rpb24gaW5zaWRlIE9ic2lkaWFuIHZpYSB0aGUgcmljaCBoZWxwZXJcbiAgICogcGF0aCwgcmVjZWl2aW5nIGB7IGFwcCwgb2JzaWRpYW5Nb2R1bGUsIHR5cGVJbnRvRWRpdG9yLCBjb250ZXh0IH1gIHBsdXMgYW55XG4gICAqIGBhcmdzYC4gTWlycm9ycyB0aGUgdG9wLWxldmVsIGBldmFsSW5PYnNpZGlhbmAsIHdpdGggdGhlIHRyYW5zcG9ydCBhbmQgdmF1bHRcbiAgICogcGF0aCBwcmUtYm91bmQgdG8gdGhpcyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGV2YWx1YXRpb24gcGFyYW1ldGVycyAoYGZuYCwgb3B0aW9uYWwgYGFyZ3NgL2Bjb250ZXh0SWRgKS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBmbmAuXG4gICAqL1xuICBldmFsSW5PYnNpZGlhbjxBcmdzIGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzLCBSZXN1bHQsIFRDb250ZXh0SWQ+LCAndHJhbnNwb3J0JyB8ICd2YXVsdFBhdGgnPlxuICApOiBQcm9taXNlPFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHJhdyBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIGFuZCByZXR1cm5zIHRoZVxuICAgKiBub3JtYWxpemVkIHN0cmluZyByZXN1bHQgKGUuZy4gYCc1J2AsIGEgSlNPTiBzdHJpbmcsIG9yIGAnKG5vIG91dHB1dCknYCkuXG4gICAqXG4gICAqIEBwYXJhbSBleHByZXNzaW9uIC0gQSBzZWxmLWNvbnRhaW5lZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJhdyByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgaW52b2tlKGV4cHJlc3Npb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIENEUCBwb3J0IHRoZSBpbnN0YW5jZSBpcyByZWFjaGFibGUgb24gKHRoZSBmcmVlIHBvcnQgY2hvc2VuIGZvciBhblxuICAgKiBvd25lZCBpbnN0YW5jZSwgb3IgdGhlIGF0dGFjaGVkIHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnBvcnR9KS5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG9wZW5lZCB2YXVsdC4gRXhwb3NlcyBgcGF0aGAgYW5kIGBwb3B1bGF0ZSguLi4pYCBmb3Igc2VlZGluZyBmaWxlcy5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0OiBUZW1wVmF1bHQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNvbm5lY3RUb0NkcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdFRvQ2RwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSBFbGVjdHJvbiBzaGVsbCAoaW5zdGFsbGVyIGJ1aWxkKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy4gQWNjZXB0c1xuICAgKiBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLiBJZ25vcmVkIHdoZW5cbiAgICoge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LiBXaGVuIG9taXR0ZWQsIHRoZSBpbnN0YWxsZWQgc2hlbGwgaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGlucyB0aGUgT2JzaWRpYW4gYXBwIHZlcnNpb24gKGFzYXIpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLiBBY2NlcHRzXG4gICAqIGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuIElnbm9yZWQgd2hlblxuICAgKiB7QGxpbmsgcG9ydH0gKGF0dGFjaCBtb2RlKSBpcyBzZXQuIFdoZW4gb21pdHRlZCwgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENEUCBwb3J0IG9mIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiB0byAqKmF0dGFjaCoqIHRvLiBXaGVuIG9taXR0ZWQsIGFuXG4gICAqIGlzb2xhdGVkIGluc3RhbmNlIGlzIGxhdW5jaGVkIG9uIGFuIGF1dG9tYXRpY2FsbHkgY2hvc2VuIGZyZWUgcG9ydC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSB2YXVsdCBkaXJlY3Rvcnkgb24ge0BsaW5rIENkcENvbm5lY3Rpb24uZGlzcG9zZX0uXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBhbiBpbXBsaWNpdCB0aHJvdy1hd2F5IHRlbXAgdmF1bHRcbiAgICogKHtAbGluayB2YXVsdH0gbm90IGdpdmVuKSBhbmQgYGZhbHNlYCB3aGVuIGEge0BsaW5rIHZhdWx0fSBwYXRoIGlzIGdpdmVuLCBzb1xuICAgKiBhIHJlYWwgdmF1bHQgaXMgbmV2ZXIgZGVsZXRlZC4gU2V0IGV4cGxpY2l0bHkgdG8gb3ZlcnJpZGUuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gYW4gZXhpc3RpbmcgdmF1bHQgdG8gb3Blbi4gV2hlbiBvbWl0dGVkLCBhbiBlbXB0eSB0ZW1wb3JhcnlcbiAgICogdmF1bHQgaXMgY3JlYXRlZCAoYW5kIHJlbW92ZWQgb24gZGlzcG9zZSB1bmxlc3NcbiAgICoge0BsaW5rIHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlfSBzYXlzIG90aGVyd2lzZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSB2YXVsdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc29sdmVkIENEUCBob3N0L3BvcnQgcGFpci5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVkRW5kcG9pbnQge1xuICBob3N0OiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBMYXVuY2hlcyAob3IgYXR0YWNoZXMgdG8pIGEgQ0RQLWVuYWJsZWQgT2JzaWRpYW4gaW5zdGFuY2UsIG9wZW5zIGEgdmF1bHQsIGFuZFxuICogYm9vdHN0cmFwcyB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlLCByZXR1cm5pbmcgYSBkaXNwb3NhYmxlIGNvbm5lY3Rpb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsaXZlIHtAbGluayBDZHBDb25uZWN0aW9ufS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb0NkcChvcHRpb25zPzogQ29ubmVjdFRvQ2RwT3B0aW9ucyk6IFByb21pc2U8Q2RwQ29ubmVjdGlvbj4ge1xuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgPSB7XG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCcsXG4gICAgLi4uKG9wdGlvbnM/LmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAuLi4ob3B0aW9ucz8uaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgaG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgIC4uLihvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiB7IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbjogb3B0aW9ucy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gfSksXG4gICAgLi4uKG9wdGlvbnM/Lm9ic2lkaWFuVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHsgb2JzaWRpYW5WZXJzaW9uOiBvcHRpb25zLm9ic2lkaWFuVmVyc2lvbiB9KSxcbiAgICAuLi4ob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkICYmIHsgcG9ydDogb3B0aW9ucy5wb3J0IH0pXG4gIH07XG5cbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnModHJhbnNwb3J0T3B0aW9ucyk7XG4gIGNvbnN0IHZhdWx0ID0gbmV3IFRlbXBWYXVsdChvcHRpb25zPy52YXVsdCk7XG4gIGNvbnN0IHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlID0gb3B0aW9ucz8uc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgPz8gKG9wdGlvbnM/LnZhdWx0ID09PSB1bmRlZmluZWQpO1xuXG4gIC8vIFJlZ2lzdGVyaW5nIHRoZSB2YXVsdCBpcyB3aGF0IGxhdW5jaGVzIHRoZSBvd25lZCBpbnN0YW5jZSAocHJvdmlzaW9ucyB0aGVcbiAgLy8gQXNhciwgb3BlbnMgdGhlIHZhdWx0LCBhbmQgYm9vdHN0cmFwcyB0aGUgaGVscGVyIG5hbWVzcGFjZSksIG9yIG9wZW5zIHRoZVxuICAvLyBWYXVsdCBpbiB0aGUgYXR0YWNoZWQgaW5zdGFuY2UuXG4gIGF3YWl0IHZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG5cbiAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSByZXNvbHZlRW5kcG9pbnQodHJhbnNwb3J0LCBvcHRpb25zKTtcbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2hvc3R9OiR7U3RyaW5nKHBvcnQpfWA7XG5cbiAgY29uc3QgY29ubmVjdGlvbjogQ2RwQ29ubmVjdGlvbiA9IHtcbiAgICBjZHBVcmwsXG5cbiAgICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlKSB7XG4gICAgICAgICAgYXdhaXQgdmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRyYW5zcG9ydC51bnJlZ2lzdGVyVmF1bHQodmF1bHQucGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbEluT2JzaWRpYW48QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzLCBSZXN1bHQsIFRDb250ZXh0SWQ+LCAndHJhbnNwb3J0JyB8ICd2YXVsdFBhdGgnPlxuICAgICk6IFByb21pc2U8UmVzdWx0PiB7XG4gICAgICByZXR1cm4gZXZhbEluT2JzaWRpYW48QXJncywgUmVzdWx0LCBUQ29udGV4dElkPih7IC4uLnBhcmFtcywgdHJhbnNwb3J0LCB2YXVsdFBhdGg6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgcmV0dXJuIHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgcG9ydCxcblxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZGlzcG9zZSgpO1xuICAgIH0sXG5cbiAgICB2YXVsdFxuICB9O1xuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBDRFAgaG9zdC9wb3J0IGZvciB0aGUgY29ubmVjdGlvbjogZnJvbSB0aGUgb3duZWQgaW5zdGFuY2Unc1xuICogbGF1bmNoZWQgZW5kcG9pbnQgd2hlbiBwcmVzZW50LCBvdGhlcndpc2UgZnJvbSB0aGUgYXR0YWNoIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgY3JlYXRlZCBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgY29ubmVjdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIGhvc3QgYW5kIHBvcnQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwb3J0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRW5kcG9pbnQodHJhbnNwb3J0OiB1bmtub3duLCBvcHRpb25zOiBDb25uZWN0VG9DZHBPcHRpb25zIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRFbmRwb2ludCB7XG4gIGlmICh0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICByZXR1cm4geyBob3N0OiBlbmRwb2ludC5ob3N0LCBwb3J0OiBlbmRwb2ludC5wb3J0IH07XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnM/LnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IGhvc3Q6IG9wdGlvbnMuaG9zdCA/PyBERUZBVUxUX0NEUF9IT1NULCBwb3J0OiBvcHRpb25zLnBvcnQgfTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignY29ubmVjdFRvQ2RwOiBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBDRFAgcG9ydC4nKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3QkEsOEJBQStCO0FBQy9CLHdCQUEwQjtBQUMxQixtQ0FBb0M7QUFDcEMsK0JBQTJDO0FBRTNDLE1BQU0sbUJBQW1CO0FBMEl6QixlQUFzQixhQUFhLFNBQXVEO0FBQ3hGLFFBQU0sbUJBQWdEO0FBQUEsSUFDcEQsTUFBTTtBQUFBLElBQ04sR0FBSSxTQUFTLGlDQUFpQyxVQUFhLEVBQUUsOEJBQThCLFFBQVEsNkJBQTZCO0FBQUEsSUFDaEksR0FBSSxTQUFTLFNBQVMsVUFBYSxFQUFFLE1BQU0sUUFBUSxLQUFLO0FBQUEsSUFDeEQsR0FBSSxTQUFTLDZCQUE2QixVQUFhLEVBQUUsMEJBQTBCLFFBQVEseUJBQXlCO0FBQUEsSUFDcEgsR0FBSSxTQUFTLG9CQUFvQixVQUFhLEVBQUUsaUJBQWlCLFFBQVEsZ0JBQWdCO0FBQUEsSUFDekYsR0FBSSxTQUFTLFNBQVMsVUFBYSxFQUFFLE1BQU0sUUFBUSxLQUFLO0FBQUEsRUFDMUQ7QUFFQSxRQUFNLFlBQVksVUFBTSxxREFBMkIsZ0JBQWdCO0FBQ25FLFFBQU0sUUFBUSxJQUFJLDRCQUFVLFNBQVMsS0FBSztBQUMxQyxRQUFNLDZCQUE2QixTQUFTLDhCQUErQixTQUFTLFVBQVU7QUFLOUYsUUFBTSxNQUFNLFNBQVMsU0FBUztBQUU5QixRQUFNLEVBQUUsTUFBTSxLQUFLLElBQUksZ0JBQWdCLFdBQVcsT0FBTztBQUN6RCxRQUFNLFNBQVMsVUFBVSxJQUFJLElBQUksT0FBTyxJQUFJLENBQUM7QUFFN0MsUUFBTSxhQUE0QjtBQUFBLElBQ2hDO0FBQUEsSUFFQSxNQUFNLFVBQXlCO0FBQzdCLFVBQUk7QUFDRixZQUFJLDRCQUE0QjtBQUM5QixnQkFBTSxNQUFNLFFBQVEsU0FBUztBQUFBLFFBQy9CLE9BQU87QUFDTCxnQkFBTSxVQUFVLGdCQUFnQixNQUFNLElBQUk7QUFBQSxRQUM1QztBQUFBLE1BQ0YsVUFBRTtBQUNBLGNBQU0sVUFBVSxVQUFVO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNLGVBQ0osUUFDaUI7QUFDakIsaUJBQU8sd0NBQXlDLEVBQUUsR0FBRyxRQUFRLFdBQVcsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBLElBQ2pHO0FBQUEsSUFFQSxNQUFNLE9BQU8sWUFBcUM7QUFDaEQsYUFBTyxVQUFVLFNBQVMsWUFBWSxFQUFFLEtBQUssTUFBTSxLQUFLLENBQUM7QUFBQSxJQUMzRDtBQUFBLElBRUE7QUFBQSxJQUVBLE9BQU8sT0FBTyxZQUFZLElBQW1CO0FBQzNDLFlBQU0sV0FBVyxRQUFRO0FBQUEsSUFDM0I7QUFBQSxJQUVBO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVdBLFNBQVMsZ0JBQWdCLFdBQW9CLFNBQTREO0FBQ3ZHLE1BQUkscUJBQXFCLGtEQUFxQjtBQUM1QyxVQUFNLFdBQVcsVUFBVSx5QkFBeUI7QUFDcEQsUUFBSSxVQUFVO0FBQ1osYUFBTyxFQUFFLE1BQU0sU0FBUyxNQUFNLE1BQU0sU0FBUyxLQUFLO0FBQUEsSUFDcEQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxTQUFTLFNBQVMsUUFBVztBQUMvQixXQUFPLEVBQUUsTUFBTSxRQUFRLFFBQVEsa0JBQWtCLE1BQU0sUUFBUSxLQUFLO0FBQUEsRUFDdEU7QUFFQSxRQUFNLElBQUksTUFBTSxpREFBaUQ7QUFDbkU7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Programmatic helper to launch (or attach to) a CDP-enabled Obsidian instance
|
|
5
|
+
* with the runtime helper namespace bootstrapped, for ad-hoc real-app debugging.
|
|
6
|
+
*
|
|
7
|
+
* A single {@link connectToCdp} call resolves the owned-instance config, opens a
|
|
8
|
+
* vault, and bootstraps `window.__obsidianIntegrationTesting` (so `evalWrapper`,
|
|
9
|
+
* `typeIntoEditor`, `serializeError`, `getObsidianModule`, … are available), then
|
|
10
|
+
* hands back a disposable {@link CdpConnection} exposing the chosen CDP port, a
|
|
11
|
+
* raw {@link CdpConnection.invoke} and the rich {@link CdpConnection.evalInObsidian}.
|
|
12
|
+
*/
|
|
13
|
+
import type { Except } from 'type-fest';
|
|
14
|
+
import type { ContextId } from './context-id.cjs';
|
|
15
|
+
import type { EvalInObsidianParams, GenericObject } from './eval-in-obsidian.cjs';
|
|
16
|
+
import { TempVault } from './temp-vault.cjs';
|
|
17
|
+
/**
|
|
18
|
+
* A live connection to a CDP-enabled Obsidian instance with the runtime helper
|
|
19
|
+
* namespace bootstrapped.
|
|
20
|
+
*
|
|
21
|
+
* Implements `AsyncDisposable`, so `await using conn = await connectToCdp(…)`
|
|
22
|
+
* disposes it (killing an owned instance and — for a throw-away temp vault —
|
|
23
|
+
* removing its directory) automatically.
|
|
24
|
+
*/
|
|
25
|
+
export interface CdpConnection extends AsyncDisposable {
|
|
26
|
+
/**
|
|
27
|
+
* The base CDP URL, e.g. `http://localhost:51888`.
|
|
28
|
+
*/
|
|
29
|
+
readonly cdpUrl: string;
|
|
30
|
+
/**
|
|
31
|
+
* Disposes the connection: kills an owned instance and removes its isolated
|
|
32
|
+
* user-data dir. The vault directory is removed only when it is a throw-away
|
|
33
|
+
* temp vault (see {@link ConnectToCdpOptions.shouldRemoveVaultOnDispose}); a
|
|
34
|
+
* real vault passed via {@link ConnectToCdpOptions.vault} is never deleted.
|
|
35
|
+
*
|
|
36
|
+
* @returns A {@link Promise} that resolves once disposal completes.
|
|
37
|
+
*/
|
|
38
|
+
dispose(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Evaluates a self-contained function inside Obsidian via the rich helper
|
|
41
|
+
* path, receiving `{ app, obsidianModule, typeIntoEditor, context }` plus any
|
|
42
|
+
* `args`. Mirrors the top-level `evalInObsidian`, with the transport and vault
|
|
43
|
+
* path pre-bound to this connection.
|
|
44
|
+
*
|
|
45
|
+
* @param params - The evaluation parameters (`fn`, optional `args`/`contextId`).
|
|
46
|
+
* @returns A {@link Promise} that resolves to the return value of `fn`.
|
|
47
|
+
*/
|
|
48
|
+
evalInObsidian<Args extends GenericObject, Result, TContextId extends ContextId<unknown> | undefined = undefined>(params: Except<EvalInObsidianParams<Args, Result, TContextId>, 'transport' | 'vaultPath'>): Promise<Result>;
|
|
49
|
+
/**
|
|
50
|
+
* Evaluates a raw JavaScript expression inside Obsidian and returns the
|
|
51
|
+
* normalized string result (e.g. `'5'`, a JSON string, or `'(no output)'`).
|
|
52
|
+
*
|
|
53
|
+
* @param expression - A self-contained JavaScript expression.
|
|
54
|
+
* @returns A {@link Promise} that resolves to the raw result string.
|
|
55
|
+
*/
|
|
56
|
+
invoke(expression: string): Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* The CDP port the instance is reachable on (the free port chosen for an
|
|
59
|
+
* owned instance, or the attached {@link ConnectToCdpOptions.port}).
|
|
60
|
+
*/
|
|
61
|
+
readonly port: number;
|
|
62
|
+
/**
|
|
63
|
+
* The opened vault. Exposes `path` and `populate(...)` for seeding files.
|
|
64
|
+
*/
|
|
65
|
+
readonly vault: TempVault;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Options for {@link connectToCdp}.
|
|
69
|
+
*/
|
|
70
|
+
export interface ConnectToCdpOptions {
|
|
71
|
+
/**
|
|
72
|
+
* Timeout in milliseconds for individual CDP commands.
|
|
73
|
+
*
|
|
74
|
+
* @default `30000`
|
|
75
|
+
*/
|
|
76
|
+
readonly commandTimeoutInMilliseconds?: number;
|
|
77
|
+
/**
|
|
78
|
+
* CDP host.
|
|
79
|
+
*
|
|
80
|
+
* @default `'localhost'`
|
|
81
|
+
*/
|
|
82
|
+
readonly host?: string;
|
|
83
|
+
/**
|
|
84
|
+
* Pins the Electron shell (installer build) the owned instance runs. Accepts
|
|
85
|
+
* `'x.y.z'`, `'public-latest'`, or `'catalyst-latest'`. Ignored when
|
|
86
|
+
* {@link port} (attach mode) is set. When omitted, the installed shell is used.
|
|
87
|
+
*
|
|
88
|
+
* @default `undefined`
|
|
89
|
+
*/
|
|
90
|
+
readonly obsidianInstallerVersion?: string;
|
|
91
|
+
/**
|
|
92
|
+
* Pins the Obsidian app version (asar) the owned instance runs. Accepts
|
|
93
|
+
* `'x.y.z'`, `'public-latest'`, or `'catalyst-latest'`. Ignored when
|
|
94
|
+
* {@link port} (attach mode) is set. When omitted, the installed version is used.
|
|
95
|
+
*
|
|
96
|
+
* @default `undefined`
|
|
97
|
+
*/
|
|
98
|
+
readonly obsidianVersion?: string;
|
|
99
|
+
/**
|
|
100
|
+
* CDP port of an already-running Obsidian to **attach** to. When omitted, an
|
|
101
|
+
* isolated instance is launched on an automatically chosen free port.
|
|
102
|
+
*
|
|
103
|
+
* @default `undefined`
|
|
104
|
+
*/
|
|
105
|
+
readonly port?: number;
|
|
106
|
+
/**
|
|
107
|
+
* Whether to remove the vault directory on {@link CdpConnection.dispose}.
|
|
108
|
+
*
|
|
109
|
+
* When omitted, defaults to `true` for an implicit throw-away temp vault
|
|
110
|
+
* ({@link vault} not given) and `false` when a {@link vault} path is given, so
|
|
111
|
+
* a real vault is never deleted. Set explicitly to override.
|
|
112
|
+
*/
|
|
113
|
+
readonly shouldRemoveVaultOnDispose?: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Absolute path to an existing vault to open. When omitted, an empty temporary
|
|
116
|
+
* vault is created (and removed on dispose unless
|
|
117
|
+
* {@link shouldRemoveVaultOnDispose} says otherwise).
|
|
118
|
+
*
|
|
119
|
+
* @default `undefined`
|
|
120
|
+
*/
|
|
121
|
+
readonly vault?: string;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Launches (or attaches to) a CDP-enabled Obsidian instance, opens a vault, and
|
|
125
|
+
* bootstraps the runtime helper namespace, returning a disposable connection.
|
|
126
|
+
*
|
|
127
|
+
* @param options - Connection options.
|
|
128
|
+
* @returns A {@link Promise} that resolves to the live {@link CdpConnection}.
|
|
129
|
+
*/
|
|
130
|
+
export declare function connectToCdp(options?: ConnectToCdpOptions): Promise<CdpConnection>;
|
package/dist/lib/cjs/index.cjs
CHANGED
|
@@ -22,6 +22,7 @@ __export(index_exports, {
|
|
|
22
22
|
ContextId: () => import_context_id.ContextId,
|
|
23
23
|
DesktopCdpTransport: () => import_transport_desktop_cdp.DesktopCdpTransport,
|
|
24
24
|
TempVault: () => import_temp_vault.TempVault,
|
|
25
|
+
connectToCdp: () => import_connect_to_cdp.connectToCdp,
|
|
25
26
|
createTransportFromOptions: () => import_transport_factory.createTransportFromOptions,
|
|
26
27
|
evalInObsidian: () => import_eval_in_obsidian.evalInObsidian,
|
|
27
28
|
registerVault: () => import_vault_registry.registerVault,
|
|
@@ -30,6 +31,7 @@ __export(index_exports, {
|
|
|
30
31
|
unregisterVault: () => import_vault_registry.unregisterVault
|
|
31
32
|
});
|
|
32
33
|
module.exports = __toCommonJS(index_exports);
|
|
34
|
+
var import_connect_to_cdp = require("./connect-to-cdp.cjs");
|
|
33
35
|
var import_context_id = require("./context-id.cjs");
|
|
34
36
|
var import_context_provider = require("./context-provider.cjs");
|
|
35
37
|
var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
|
|
@@ -44,6 +46,7 @@ var import_vault_registry = require("./vault-registry.cjs");
|
|
|
44
46
|
ContextId,
|
|
45
47
|
DesktopCdpTransport,
|
|
46
48
|
TempVault,
|
|
49
|
+
connectToCdp,
|
|
47
50
|
createTransportFromOptions,
|
|
48
51
|
evalInObsidian,
|
|
49
52
|
registerVault,
|
|
@@ -51,4 +54,4 @@ var import_vault_registry = require("./vault-registry.cjs");
|
|
|
51
54
|
setVaultPathResolver,
|
|
52
55
|
unregisterVault
|
|
53
56
|
});
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAuY2pzJztcbmV4cG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5janMnO1xuZXhwb3J0IHtcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuZXhwb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmV4cG9ydCB0eXBlIHtcbiAgUG9wdWxhdGVGaWxlQ29udGVudCxcbiAgUG9wdWxhdGVGaWxlc1BhcmFtc1xufSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmV4cG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VBc2FyLFxuICBPd25lZEluc3RhbmNlQ29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuZXhwb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkuY2pzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLDRCQUE2QjtBQUM3Qix3QkFBMEI7QUFLMUIsOEJBR087QUFLUCw4QkFBK0I7QUFLL0Isd0JBQTBCO0FBSzFCLDhCQUFnQztBQU1oQyxtQ0FBb0M7QUFDcEMsK0JBQTJDO0FBVTNDLDRCQUdPOyIsCiAgIm5hbWVzIjogW10KfQo=
|
package/dist/lib/cjs/index.d.cts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Contains the entry point for the integration testing module.
|
|
5
5
|
*/
|
|
6
|
+
export type { CdpConnection, ConnectToCdpOptions } from './connect-to-cdp.cjs';
|
|
7
|
+
export { connectToCdp } from './connect-to-cdp.cjs';
|
|
6
8
|
export { ContextId } from './context-id.cjs';
|
|
7
9
|
export type { TransportOptionsResolver, VaultPathResolver } from './context-provider.cjs';
|
|
8
10
|
export { setTransportOptionsResolver, setVaultPathResolver } from './context-provider.cjs';
|
package/dist/lib/cjs/library.cjs
CHANGED
|
@@ -21,7 +21,7 @@ __export(library_exports, {
|
|
|
21
21
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(library_exports);
|
|
24
|
-
const LIBRARY_VERSION = false ? "dev" : "5.1.
|
|
24
|
+
const LIBRARY_VERSION = false ? "dev" : "5.1.2";
|
|
25
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
26
|
0 && (module.exports = {
|
|
27
27
|
LIBRARY_VERSION
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Thin CLI over {@link connectToCdp}: launches (or attaches to) a CDP-enabled
|
|
5
|
+
* Obsidian instance with the runtime helper namespace bootstrapped, prints the
|
|
6
|
+
* chosen CDP port/URL, and stays alive until interrupted so an external tool
|
|
7
|
+
* (raw CDP `ws`, DevTools, …) can attach.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Parses CLI arguments, opens the connection, prints its endpoint, and blocks
|
|
11
|
+
* until `SIGINT`/`SIGTERM`, disposing the connection on shutdown.
|
|
12
|
+
*
|
|
13
|
+
* @returns A {@link Promise} that resolves once the connection has been disposed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function main(): Promise<void>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { connectToCdp } from "./connect-to-cdp.mjs";
|
|
4
|
+
async function main() {
|
|
5
|
+
const { values } = parseArgs({
|
|
6
|
+
options: {
|
|
7
|
+
"command-timeout": { type: "string" },
|
|
8
|
+
"host": { type: "string" },
|
|
9
|
+
"no-remove-vault": { type: "boolean" },
|
|
10
|
+
"obsidian-installer-version": { type: "string" },
|
|
11
|
+
"obsidian-version": { type: "string" },
|
|
12
|
+
"port": { type: "string" },
|
|
13
|
+
"vault": { type: "string" }
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const connection = await connectToCdp(buildOptions(values));
|
|
17
|
+
process.stdout.write(
|
|
18
|
+
`Obsidian CDP ready.
|
|
19
|
+
port: ${String(connection.port)}
|
|
20
|
+
cdpUrl: ${connection.cdpUrl}
|
|
21
|
+
vault: ${connection.vault.path}
|
|
22
|
+
Runtime helpers bootstrapped as window.__obsidianIntegrationTesting.
|
|
23
|
+
Press Ctrl+C to stop.
|
|
24
|
+
`
|
|
25
|
+
);
|
|
26
|
+
await waitForShutdownSignal();
|
|
27
|
+
process.stdout.write("\nShutting down\u2026\n");
|
|
28
|
+
await connection.dispose();
|
|
29
|
+
}
|
|
30
|
+
function buildOptions(values) {
|
|
31
|
+
return {
|
|
32
|
+
...values["command-timeout"] !== void 0 && { commandTimeoutInMilliseconds: parseNumber("command-timeout", values["command-timeout"]) },
|
|
33
|
+
...values.host !== void 0 && { host: values.host },
|
|
34
|
+
...values["no-remove-vault"] === true && { shouldRemoveVaultOnDispose: false },
|
|
35
|
+
...values["obsidian-installer-version"] !== void 0 && { obsidianInstallerVersion: values["obsidian-installer-version"] },
|
|
36
|
+
...values["obsidian-version"] !== void 0 && { obsidianVersion: values["obsidian-version"] },
|
|
37
|
+
...values.port !== void 0 && { port: parseNumber("port", values.port) },
|
|
38
|
+
...values.vault !== void 0 && { vault: values.vault }
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function parseNumber(flag, raw) {
|
|
42
|
+
const value = Number(raw);
|
|
43
|
+
if (!Number.isFinite(value)) {
|
|
44
|
+
throw new Error(`--${flag} must be a number, got: ${raw}`);
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function waitForShutdownSignal() {
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
process.once("SIGINT", () => {
|
|
51
|
+
resolve();
|
|
52
|
+
});
|
|
53
|
+
process.once("SIGTERM", () => {
|
|
54
|
+
resolve();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
main
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaW4gQ0xJIG92ZXIge0BsaW5rIGNvbm5lY3RUb0NkcH06IGxhdW5jaGVzIChvciBhdHRhY2hlcyB0bykgYSBDRFAtZW5hYmxlZFxuICogT2JzaWRpYW4gaW5zdGFuY2Ugd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgcHJpbnRzIHRoZVxuICogY2hvc2VuIENEUCBwb3J0L1VSTCwgYW5kIHN0YXlzIGFsaXZlIHVudGlsIGludGVycnVwdGVkIHNvIGFuIGV4dGVybmFsIHRvb2xcbiAqIChyYXcgQ0RQIGB3c2AsIERldlRvb2xzLCBcdTIwMjYpIGNhbiBhdHRhY2guXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgQ0xJIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBtYW51YWxseSwgbm90IGJ5IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tICdub2RlOnV0aWwnO1xuXG5pbXBvcnQgdHlwZSB7IENvbm5lY3RUb0NkcE9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3QtdG8tY2RwLm1qcyc7XG5cbmltcG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgdGhlIHBhcnNlZCBDTEkgZmxhZyB2YWx1ZXMuXG4gKi9cbmludGVyZmFjZSBQYXJzZWRDbGlWYWx1ZXMge1xuICAnY29tbWFuZC10aW1lb3V0Jz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgJ2hvc3QnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAnbm8tcmVtb3ZlLXZhdWx0Jz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICdvYnNpZGlhbi1pbnN0YWxsZXItdmVyc2lvbic/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICdvYnNpZGlhbi12ZXJzaW9uJz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgJ3BvcnQnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAndmF1bHQnPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcnNlcyBDTEkgYXJndW1lbnRzLCBvcGVucyB0aGUgY29ubmVjdGlvbiwgcHJpbnRzIGl0cyBlbmRwb2ludCwgYW5kIGJsb2Nrc1xuICogdW50aWwgYFNJR0lOVGAvYFNJR1RFUk1gLCBkaXNwb3NpbmcgdGhlIGNvbm5lY3Rpb24gb24gc2h1dGRvd24uXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgb3B0aW9uczoge1xuICAgICAgJ2NvbW1hbmQtdGltZW91dCc6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICdob3N0JzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgJ25vLXJlbW92ZS12YXVsdCc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnb2JzaWRpYW4taW5zdGFsbGVyLXZlcnNpb24nOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAnb2JzaWRpYW4tdmVyc2lvbic6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICdwb3J0JzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgJ3ZhdWx0JzogeyB0eXBlOiAnc3RyaW5nJyB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgY29ubmVjdFRvQ2RwKGJ1aWxkT3B0aW9ucyh2YWx1ZXMpKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShcbiAgICAnT2JzaWRpYW4gQ0RQIHJlYWR5LlxcbidcbiAgICAgICsgYCAgcG9ydDogICAke1N0cmluZyhjb25uZWN0aW9uLnBvcnQpfVxcbmBcbiAgICAgICsgYCAgY2RwVXJsOiAke2Nvbm5lY3Rpb24uY2RwVXJsfVxcbmBcbiAgICAgICsgYCAgdmF1bHQ6ICAke2Nvbm5lY3Rpb24udmF1bHQucGF0aH1cXG5gXG4gICAgICArICdSdW50aW1lIGhlbHBlcnMgYm9vdHN0cmFwcGVkIGFzIHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLlxcbidcbiAgICAgICsgJ1ByZXNzIEN0cmwrQyB0byBzdG9wLlxcbidcbiAgKTtcblxuICBhd2FpdCB3YWl0Rm9yU2h1dGRvd25TaWduYWwoKTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuU2h1dHRpbmcgZG93blx1MjAyNlxcbicpO1xuICBhd2FpdCBjb25uZWN0aW9uLmRpc3Bvc2UoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnN9IGZyb20gcGFyc2VkIENMSSBmbGFnIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWVzIC0gVGhlIHBhcnNlZCBgcGFyc2VBcmdzYCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgY29ubmVjdGlvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBidWlsZE9wdGlvbnModmFsdWVzOiBQYXJzZWRDbGlWYWx1ZXMpOiBDb25uZWN0VG9DZHBPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICAuLi4odmFsdWVzWydjb21tYW5kLXRpbWVvdXQnXSAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogcGFyc2VOdW1iZXIoJ2NvbW1hbmQtdGltZW91dCcsIHZhbHVlc1snY29tbWFuZC10aW1lb3V0J10pIH0pLFxuICAgIC4uLih2YWx1ZXMuaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgaG9zdDogdmFsdWVzLmhvc3QgfSksXG4gICAgLi4uKHZhbHVlc1snbm8tcmVtb3ZlLXZhdWx0J10gPT09IHRydWUgJiYgeyBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZTogZmFsc2UgfSksXG4gICAgLi4uKHZhbHVlc1snb2JzaWRpYW4taW5zdGFsbGVyLXZlcnNpb24nXSAhPT0gdW5kZWZpbmVkICYmIHsgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uOiB2YWx1ZXNbJ29ic2lkaWFuLWluc3RhbGxlci12ZXJzaW9uJ10gfSksXG4gICAgLi4uKHZhbHVlc1snb2JzaWRpYW4tdmVyc2lvbiddICE9PSB1bmRlZmluZWQgJiYgeyBvYnNpZGlhblZlcnNpb246IHZhbHVlc1snb2JzaWRpYW4tdmVyc2lvbiddIH0pLFxuICAgIC4uLih2YWx1ZXMucG9ydCAhPT0gdW5kZWZpbmVkICYmIHsgcG9ydDogcGFyc2VOdW1iZXIoJ3BvcnQnLCB2YWx1ZXMucG9ydCkgfSksXG4gICAgLi4uKHZhbHVlcy52YXVsdCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHQ6IHZhbHVlcy52YXVsdCB9KVxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIG51bWVyaWMgQ0xJIGZsYWcgdmFsdWUsIHRocm93aW5nIG9uIGEgbm9uLWZpbml0ZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIGZsYWcgLSBUaGUgZmxhZyBuYW1lIChmb3IgdGhlIGVycm9yIG1lc3NhZ2UpLlxuICogQHBhcmFtIHJhdyAtIFRoZSByYXcgc3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBudW1iZXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGByYXdgIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKGZsYWc6IHN0cmluZywgcmF3OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCB2YWx1ZSA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYC0tJHtmbGFnfSBtdXN0IGJlIGEgbnVtYmVyLCBnb3Q6ICR7cmF3fWApO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmNlIHRoZSBwcm9jZXNzIHJlY2VpdmVzIGBTSUdJTlRgIG9yIGBTSUdURVJNYC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uIHRoZSBmaXJzdCBzaHV0ZG93biBzaWduYWwuXG4gKi9cbmZ1bmN0aW9uIHdhaXRGb3JTaHV0ZG93blNpZ25hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQVdBLE9BQU8sYUFBYTtBQUNwQixTQUFTLGlCQUFpQjtBQUkxQixTQUFTLG9CQUFvQjtBQXFCN0IsZUFBc0IsT0FBc0I7QUFDMUMsUUFBTSxFQUFFLE9BQU8sSUFBSSxVQUFVO0FBQUEsSUFDM0IsU0FBUztBQUFBLE1BQ1AsbUJBQW1CLEVBQUUsTUFBTSxTQUFTO0FBQUEsTUFDcEMsUUFBUSxFQUFFLE1BQU0sU0FBUztBQUFBLE1BQ3pCLG1CQUFtQixFQUFFLE1BQU0sVUFBVTtBQUFBLE1BQ3JDLDhCQUE4QixFQUFFLE1BQU0sU0FBUztBQUFBLE1BQy9DLG9CQUFvQixFQUFFLE1BQU0sU0FBUztBQUFBLE1BQ3JDLFFBQVEsRUFBRSxNQUFNLFNBQVM7QUFBQSxNQUN6QixTQUFTLEVBQUUsTUFBTSxTQUFTO0FBQUEsSUFDNUI7QUFBQSxFQUNGLENBQUM7QUFFRCxRQUFNLGFBQWEsTUFBTSxhQUFhLGFBQWEsTUFBTSxDQUFDO0FBRTFELFVBQVEsT0FBTztBQUFBLElBQ2I7QUFBQSxZQUNpQixPQUFPLFdBQVcsSUFBSSxDQUFDO0FBQUEsWUFDdkIsV0FBVyxNQUFNO0FBQUEsWUFDakIsV0FBVyxNQUFNLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUd4QztBQUVBLFFBQU0sc0JBQXNCO0FBRTVCLFVBQVEsT0FBTyxNQUFNLHlCQUFvQjtBQUN6QyxRQUFNLFdBQVcsUUFBUTtBQUMzQjtBQVFBLFNBQVMsYUFBYSxRQUE4QztBQUNsRSxTQUFPO0FBQUEsSUFDTCxHQUFJLE9BQU8saUJBQWlCLE1BQU0sVUFBYSxFQUFFLDhCQUE4QixZQUFZLG1CQUFtQixPQUFPLGlCQUFpQixDQUFDLEVBQUU7QUFBQSxJQUN6SSxHQUFJLE9BQU8sU0FBUyxVQUFhLEVBQUUsTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUNyRCxHQUFJLE9BQU8saUJBQWlCLE1BQU0sUUFBUSxFQUFFLDRCQUE0QixNQUFNO0FBQUEsSUFDOUUsR0FBSSxPQUFPLDRCQUE0QixNQUFNLFVBQWEsRUFBRSwwQkFBMEIsT0FBTyw0QkFBNEIsRUFBRTtBQUFBLElBQzNILEdBQUksT0FBTyxrQkFBa0IsTUFBTSxVQUFhLEVBQUUsaUJBQWlCLE9BQU8sa0JBQWtCLEVBQUU7QUFBQSxJQUM5RixHQUFJLE9BQU8sU0FBUyxVQUFhLEVBQUUsTUFBTSxZQUFZLFFBQVEsT0FBTyxJQUFJLEVBQUU7QUFBQSxJQUMxRSxHQUFJLE9BQU8sVUFBVSxVQUFhLEVBQUUsT0FBTyxPQUFPLE1BQU07QUFBQSxFQUMxRDtBQUNGO0FBVUEsU0FBUyxZQUFZLE1BQWMsS0FBcUI7QUFDdEQsUUFBTSxRQUFRLE9BQU8sR0FBRztBQUN4QixNQUFJLENBQUMsT0FBTyxTQUFTLEtBQUssR0FBRztBQUMzQixVQUFNLElBQUksTUFBTSxLQUFLLElBQUksMkJBQTJCLEdBQUcsRUFBRTtBQUFBLEVBQzNEO0FBQ0EsU0FBTztBQUNUO0FBT0EsU0FBUyx3QkFBdUM7QUFDOUMsU0FBTyxJQUFJLFFBQWMsQ0FBQyxZQUFZO0FBQ3BDLFlBQVEsS0FBSyxVQUFVLE1BQU07QUFDM0IsY0FBUTtBQUFBLElBQ1YsQ0FBQztBQUNELFlBQVEsS0FBSyxXQUFXLE1BQU07QUFDNUIsY0FBUTtBQUFBLElBQ1YsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Programmatic helper to launch (or attach to) a CDP-enabled Obsidian instance
|
|
5
|
+
* with the runtime helper namespace bootstrapped, for ad-hoc real-app debugging.
|
|
6
|
+
*
|
|
7
|
+
* A single {@link connectToCdp} call resolves the owned-instance config, opens a
|
|
8
|
+
* vault, and bootstraps `window.__obsidianIntegrationTesting` (so `evalWrapper`,
|
|
9
|
+
* `typeIntoEditor`, `serializeError`, `getObsidianModule`, … are available), then
|
|
10
|
+
* hands back a disposable {@link CdpConnection} exposing the chosen CDP port, a
|
|
11
|
+
* raw {@link CdpConnection.invoke} and the rich {@link CdpConnection.evalInObsidian}.
|
|
12
|
+
*/
|
|
13
|
+
import type { Except } from 'type-fest';
|
|
14
|
+
import type { ContextId } from './context-id.mjs';
|
|
15
|
+
import type { EvalInObsidianParams, GenericObject } from './eval-in-obsidian.mjs';
|
|
16
|
+
import { TempVault } from './temp-vault.mjs';
|
|
17
|
+
/**
|
|
18
|
+
* A live connection to a CDP-enabled Obsidian instance with the runtime helper
|
|
19
|
+
* namespace bootstrapped.
|
|
20
|
+
*
|
|
21
|
+
* Implements `AsyncDisposable`, so `await using conn = await connectToCdp(…)`
|
|
22
|
+
* disposes it (killing an owned instance and — for a throw-away temp vault —
|
|
23
|
+
* removing its directory) automatically.
|
|
24
|
+
*/
|
|
25
|
+
export interface CdpConnection extends AsyncDisposable {
|
|
26
|
+
/**
|
|
27
|
+
* The base CDP URL, e.g. `http://localhost:51888`.
|
|
28
|
+
*/
|
|
29
|
+
readonly cdpUrl: string;
|
|
30
|
+
/**
|
|
31
|
+
* Disposes the connection: kills an owned instance and removes its isolated
|
|
32
|
+
* user-data dir. The vault directory is removed only when it is a throw-away
|
|
33
|
+
* temp vault (see {@link ConnectToCdpOptions.shouldRemoveVaultOnDispose}); a
|
|
34
|
+
* real vault passed via {@link ConnectToCdpOptions.vault} is never deleted.
|
|
35
|
+
*
|
|
36
|
+
* @returns A {@link Promise} that resolves once disposal completes.
|
|
37
|
+
*/
|
|
38
|
+
dispose(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Evaluates a self-contained function inside Obsidian via the rich helper
|
|
41
|
+
* path, receiving `{ app, obsidianModule, typeIntoEditor, context }` plus any
|
|
42
|
+
* `args`. Mirrors the top-level `evalInObsidian`, with the transport and vault
|
|
43
|
+
* path pre-bound to this connection.
|
|
44
|
+
*
|
|
45
|
+
* @param params - The evaluation parameters (`fn`, optional `args`/`contextId`).
|
|
46
|
+
* @returns A {@link Promise} that resolves to the return value of `fn`.
|
|
47
|
+
*/
|
|
48
|
+
evalInObsidian<Args extends GenericObject, Result, TContextId extends ContextId<unknown> | undefined = undefined>(params: Except<EvalInObsidianParams<Args, Result, TContextId>, 'transport' | 'vaultPath'>): Promise<Result>;
|
|
49
|
+
/**
|
|
50
|
+
* Evaluates a raw JavaScript expression inside Obsidian and returns the
|
|
51
|
+
* normalized string result (e.g. `'5'`, a JSON string, or `'(no output)'`).
|
|
52
|
+
*
|
|
53
|
+
* @param expression - A self-contained JavaScript expression.
|
|
54
|
+
* @returns A {@link Promise} that resolves to the raw result string.
|
|
55
|
+
*/
|
|
56
|
+
invoke(expression: string): Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* The CDP port the instance is reachable on (the free port chosen for an
|
|
59
|
+
* owned instance, or the attached {@link ConnectToCdpOptions.port}).
|
|
60
|
+
*/
|
|
61
|
+
readonly port: number;
|
|
62
|
+
/**
|
|
63
|
+
* The opened vault. Exposes `path` and `populate(...)` for seeding files.
|
|
64
|
+
*/
|
|
65
|
+
readonly vault: TempVault;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Options for {@link connectToCdp}.
|
|
69
|
+
*/
|
|
70
|
+
export interface ConnectToCdpOptions {
|
|
71
|
+
/**
|
|
72
|
+
* Timeout in milliseconds for individual CDP commands.
|
|
73
|
+
*
|
|
74
|
+
* @default `30000`
|
|
75
|
+
*/
|
|
76
|
+
readonly commandTimeoutInMilliseconds?: number;
|
|
77
|
+
/**
|
|
78
|
+
* CDP host.
|
|
79
|
+
*
|
|
80
|
+
* @default `'localhost'`
|
|
81
|
+
*/
|
|
82
|
+
readonly host?: string;
|
|
83
|
+
/**
|
|
84
|
+
* Pins the Electron shell (installer build) the owned instance runs. Accepts
|
|
85
|
+
* `'x.y.z'`, `'public-latest'`, or `'catalyst-latest'`. Ignored when
|
|
86
|
+
* {@link port} (attach mode) is set. When omitted, the installed shell is used.
|
|
87
|
+
*
|
|
88
|
+
* @default `undefined`
|
|
89
|
+
*/
|
|
90
|
+
readonly obsidianInstallerVersion?: string;
|
|
91
|
+
/**
|
|
92
|
+
* Pins the Obsidian app version (asar) the owned instance runs. Accepts
|
|
93
|
+
* `'x.y.z'`, `'public-latest'`, or `'catalyst-latest'`. Ignored when
|
|
94
|
+
* {@link port} (attach mode) is set. When omitted, the installed version is used.
|
|
95
|
+
*
|
|
96
|
+
* @default `undefined`
|
|
97
|
+
*/
|
|
98
|
+
readonly obsidianVersion?: string;
|
|
99
|
+
/**
|
|
100
|
+
* CDP port of an already-running Obsidian to **attach** to. When omitted, an
|
|
101
|
+
* isolated instance is launched on an automatically chosen free port.
|
|
102
|
+
*
|
|
103
|
+
* @default `undefined`
|
|
104
|
+
*/
|
|
105
|
+
readonly port?: number;
|
|
106
|
+
/**
|
|
107
|
+
* Whether to remove the vault directory on {@link CdpConnection.dispose}.
|
|
108
|
+
*
|
|
109
|
+
* When omitted, defaults to `true` for an implicit throw-away temp vault
|
|
110
|
+
* ({@link vault} not given) and `false` when a {@link vault} path is given, so
|
|
111
|
+
* a real vault is never deleted. Set explicitly to override.
|
|
112
|
+
*/
|
|
113
|
+
readonly shouldRemoveVaultOnDispose?: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Absolute path to an existing vault to open. When omitted, an empty temporary
|
|
116
|
+
* vault is created (and removed on dispose unless
|
|
117
|
+
* {@link shouldRemoveVaultOnDispose} says otherwise).
|
|
118
|
+
*
|
|
119
|
+
* @default `undefined`
|
|
120
|
+
*/
|
|
121
|
+
readonly vault?: string;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Launches (or attaches to) a CDP-enabled Obsidian instance, opens a vault, and
|
|
125
|
+
* bootstraps the runtime helper namespace, returning a disposable connection.
|
|
126
|
+
*
|
|
127
|
+
* @param options - Connection options.
|
|
128
|
+
* @returns A {@link Promise} that resolves to the live {@link CdpConnection}.
|
|
129
|
+
*/
|
|
130
|
+
export declare function connectToCdp(options?: ConnectToCdpOptions): Promise<CdpConnection>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { evalInObsidian } from "./eval-in-obsidian.mjs";
|
|
2
|
+
import { TempVault } from "./temp-vault.mjs";
|
|
3
|
+
import { DesktopCdpTransport } from "./transport-desktop-cdp.mjs";
|
|
4
|
+
import { createTransportFromOptions } from "./transport-factory.mjs";
|
|
5
|
+
const DEFAULT_CDP_HOST = "localhost";
|
|
6
|
+
async function connectToCdp(options) {
|
|
7
|
+
const transportOptions = {
|
|
8
|
+
type: "obsidian-cdp",
|
|
9
|
+
...options?.commandTimeoutInMilliseconds !== void 0 && { commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds },
|
|
10
|
+
...options?.host !== void 0 && { host: options.host },
|
|
11
|
+
...options?.obsidianInstallerVersion !== void 0 && { obsidianInstallerVersion: options.obsidianInstallerVersion },
|
|
12
|
+
...options?.obsidianVersion !== void 0 && { obsidianVersion: options.obsidianVersion },
|
|
13
|
+
...options?.port !== void 0 && { port: options.port }
|
|
14
|
+
};
|
|
15
|
+
const transport = await createTransportFromOptions(transportOptions);
|
|
16
|
+
const vault = new TempVault(options?.vault);
|
|
17
|
+
const shouldRemoveVaultOnDispose = options?.shouldRemoveVaultOnDispose ?? options?.vault === void 0;
|
|
18
|
+
await vault.register(transport);
|
|
19
|
+
const { host, port } = resolveEndpoint(transport, options);
|
|
20
|
+
const cdpUrl = `http://${host}:${String(port)}`;
|
|
21
|
+
const connection = {
|
|
22
|
+
cdpUrl,
|
|
23
|
+
async dispose() {
|
|
24
|
+
try {
|
|
25
|
+
if (shouldRemoveVaultOnDispose) {
|
|
26
|
+
await vault.dispose(transport);
|
|
27
|
+
} else {
|
|
28
|
+
await transport.unregisterVault(vault.path);
|
|
29
|
+
}
|
|
30
|
+
} finally {
|
|
31
|
+
await transport.dispose?.();
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
async evalInObsidian(params) {
|
|
35
|
+
return evalInObsidian({ ...params, transport, vaultPath: vault.path });
|
|
36
|
+
},
|
|
37
|
+
async invoke(expression) {
|
|
38
|
+
return transport.evaluate(expression, { cwd: vault.path });
|
|
39
|
+
},
|
|
40
|
+
port,
|
|
41
|
+
async [Symbol.asyncDispose]() {
|
|
42
|
+
await connection.dispose();
|
|
43
|
+
},
|
|
44
|
+
vault
|
|
45
|
+
};
|
|
46
|
+
return connection;
|
|
47
|
+
}
|
|
48
|
+
function resolveEndpoint(transport, options) {
|
|
49
|
+
if (transport instanceof DesktopCdpTransport) {
|
|
50
|
+
const endpoint = transport.getOwnedInstanceEndpoint();
|
|
51
|
+
if (endpoint) {
|
|
52
|
+
return { host: endpoint.host, port: endpoint.port };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (options?.port !== void 0) {
|
|
56
|
+
return { host: options.host ?? DEFAULT_CDP_HOST, port: options.port };
|
|
57
|
+
}
|
|
58
|
+
throw new Error("connectToCdp: could not determine the CDP port.");
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
connectToCdp
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nvbm5lY3QtdG8tY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvZ3JhbW1hdGljIGhlbHBlciB0byBsYXVuY2ggKG9yIGF0dGFjaCB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICogd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgZm9yIGFkLWhvYyByZWFsLWFwcCBkZWJ1Z2dpbmcuXG4gKlxuICogQSBzaW5nbGUge0BsaW5rIGNvbm5lY3RUb0NkcH0gY2FsbCByZXNvbHZlcyB0aGUgb3duZWQtaW5zdGFuY2UgY29uZmlnLCBvcGVucyBhXG4gKiB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCAoc28gYGV2YWxXcmFwcGVyYCxcbiAqIGB0eXBlSW50b0VkaXRvcmAsIGBzZXJpYWxpemVFcnJvcmAsIGBnZXRPYnNpZGlhbk1vZHVsZWAsIFx1MjAyNiBhcmUgYXZhaWxhYmxlKSwgdGhlblxuICogaGFuZHMgYmFjayBhIGRpc3Bvc2FibGUge0BsaW5rIENkcENvbm5lY3Rpb259IGV4cG9zaW5nIHRoZSBjaG9zZW4gQ0RQIHBvcnQsIGFcbiAqIHJhdyB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5pbnZva2V9IGFuZCB0aGUgcmljaCB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5ldmFsSW5PYnNpZGlhbn0uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAobGF1bmNoZXMgT2JzaWRpYW4gLyBDRFApIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IEV4Y2VwdCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV2YWxJbk9ic2lkaWFuUGFyYW1zLFxuICBHZW5lcmljT2JqZWN0XG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5cbmNvbnN0IERFRkFVTFRfQ0RQX0hPU1QgPSAnbG9jYWxob3N0JztcblxuLyoqXG4gKiBBIGxpdmUgY29ubmVjdGlvbiB0byBhIENEUC1lbmFibGVkIE9ic2lkaWFuIGluc3RhbmNlIHdpdGggdGhlIHJ1bnRpbWUgaGVscGVyXG4gKiBuYW1lc3BhY2UgYm9vdHN0cmFwcGVkLlxuICpcbiAqIEltcGxlbWVudHMgYEFzeW5jRGlzcG9zYWJsZWAsIHNvIGBhd2FpdCB1c2luZyBjb25uID0gYXdhaXQgY29ubmVjdFRvQ2RwKFx1MjAyNilgXG4gKiBkaXNwb3NlcyBpdCAoa2lsbGluZyBhbiBvd25lZCBpbnN0YW5jZSBhbmQgXHUyMDE0IGZvciBhIHRocm93LWF3YXkgdGVtcCB2YXVsdCBcdTIwMTRcbiAqIHJlbW92aW5nIGl0cyBkaXJlY3RvcnkpIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RwQ29ubmVjdGlvbiBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZSBDRFAgVVJMLCBlLmcuIGBodHRwOi8vbG9jYWxob3N0OjUxODg4YC5cbiAgICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgY29ubmVjdGlvbjoga2lsbHMgYW4gb3duZWQgaW5zdGFuY2UgYW5kIHJlbW92ZXMgaXRzIGlzb2xhdGVkXG4gICAqIHVzZXItZGF0YSBkaXIuIFRoZSB2YXVsdCBkaXJlY3RvcnkgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gaXQgaXMgYSB0aHJvdy1hd2F5XG4gICAqIHRlbXAgdmF1bHQgKHNlZSB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy5zaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZX0pOyBhXG4gICAqIHJlYWwgdmF1bHQgcGFzc2VkIHZpYSB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy52YXVsdH0gaXMgbmV2ZXIgZGVsZXRlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIGRpc3Bvc2FsIGNvbXBsZXRlcy5cbiAgICovXG4gIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc2VsZi1jb250YWluZWQgZnVuY3Rpb24gaW5zaWRlIE9ic2lkaWFuIHZpYSB0aGUgcmljaCBoZWxwZXJcbiAgICogcGF0aCwgcmVjZWl2aW5nIGB7IGFwcCwgb2JzaWRpYW5Nb2R1bGUsIHR5cGVJbnRvRWRpdG9yLCBjb250ZXh0IH1gIHBsdXMgYW55XG4gICAqIGBhcmdzYC4gTWlycm9ycyB0aGUgdG9wLWxldmVsIGBldmFsSW5PYnNpZGlhbmAsIHdpdGggdGhlIHRyYW5zcG9ydCBhbmQgdmF1bHRcbiAgICogcGF0aCBwcmUtYm91bmQgdG8gdGhpcyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGV2YWx1YXRpb24gcGFyYW1ldGVycyAoYGZuYCwgb3B0aW9uYWwgYGFyZ3NgL2Bjb250ZXh0SWRgKS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBmbmAuXG4gICAqL1xuICBldmFsSW5PYnNpZGlhbjxBcmdzIGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzLCBSZXN1bHQsIFRDb250ZXh0SWQ+LCAndHJhbnNwb3J0JyB8ICd2YXVsdFBhdGgnPlxuICApOiBQcm9taXNlPFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHJhdyBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIGFuZCByZXR1cm5zIHRoZVxuICAgKiBub3JtYWxpemVkIHN0cmluZyByZXN1bHQgKGUuZy4gYCc1J2AsIGEgSlNPTiBzdHJpbmcsIG9yIGAnKG5vIG91dHB1dCknYCkuXG4gICAqXG4gICAqIEBwYXJhbSBleHByZXNzaW9uIC0gQSBzZWxmLWNvbnRhaW5lZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJhdyByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgaW52b2tlKGV4cHJlc3Npb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIENEUCBwb3J0IHRoZSBpbnN0YW5jZSBpcyByZWFjaGFibGUgb24gKHRoZSBmcmVlIHBvcnQgY2hvc2VuIGZvciBhblxuICAgKiBvd25lZCBpbnN0YW5jZSwgb3IgdGhlIGF0dGFjaGVkIHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnBvcnR9KS5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG9wZW5lZCB2YXVsdC4gRXhwb3NlcyBgcGF0aGAgYW5kIGBwb3B1bGF0ZSguLi4pYCBmb3Igc2VlZGluZyBmaWxlcy5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0OiBUZW1wVmF1bHQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNvbm5lY3RUb0NkcH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdFRvQ2RwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSBFbGVjdHJvbiBzaGVsbCAoaW5zdGFsbGVyIGJ1aWxkKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy4gQWNjZXB0c1xuICAgKiBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLiBJZ25vcmVkIHdoZW5cbiAgICoge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LiBXaGVuIG9taXR0ZWQsIHRoZSBpbnN0YWxsZWQgc2hlbGwgaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGlucyB0aGUgT2JzaWRpYW4gYXBwIHZlcnNpb24gKGFzYXIpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLiBBY2NlcHRzXG4gICAqIGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuIElnbm9yZWQgd2hlblxuICAgKiB7QGxpbmsgcG9ydH0gKGF0dGFjaCBtb2RlKSBpcyBzZXQuIFdoZW4gb21pdHRlZCwgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENEUCBwb3J0IG9mIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiB0byAqKmF0dGFjaCoqIHRvLiBXaGVuIG9taXR0ZWQsIGFuXG4gICAqIGlzb2xhdGVkIGluc3RhbmNlIGlzIGxhdW5jaGVkIG9uIGFuIGF1dG9tYXRpY2FsbHkgY2hvc2VuIGZyZWUgcG9ydC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSB2YXVsdCBkaXJlY3Rvcnkgb24ge0BsaW5rIENkcENvbm5lY3Rpb24uZGlzcG9zZX0uXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBhbiBpbXBsaWNpdCB0aHJvdy1hd2F5IHRlbXAgdmF1bHRcbiAgICogKHtAbGluayB2YXVsdH0gbm90IGdpdmVuKSBhbmQgYGZhbHNlYCB3aGVuIGEge0BsaW5rIHZhdWx0fSBwYXRoIGlzIGdpdmVuLCBzb1xuICAgKiBhIHJlYWwgdmF1bHQgaXMgbmV2ZXIgZGVsZXRlZC4gU2V0IGV4cGxpY2l0bHkgdG8gb3ZlcnJpZGUuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gYW4gZXhpc3RpbmcgdmF1bHQgdG8gb3Blbi4gV2hlbiBvbWl0dGVkLCBhbiBlbXB0eSB0ZW1wb3JhcnlcbiAgICogdmF1bHQgaXMgY3JlYXRlZCAoYW5kIHJlbW92ZWQgb24gZGlzcG9zZSB1bmxlc3NcbiAgICoge0BsaW5rIHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlfSBzYXlzIG90aGVyd2lzZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSB2YXVsdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc29sdmVkIENEUCBob3N0L3BvcnQgcGFpci5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVkRW5kcG9pbnQge1xuICBob3N0OiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBMYXVuY2hlcyAob3IgYXR0YWNoZXMgdG8pIGEgQ0RQLWVuYWJsZWQgT2JzaWRpYW4gaW5zdGFuY2UsIG9wZW5zIGEgdmF1bHQsIGFuZFxuICogYm9vdHN0cmFwcyB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlLCByZXR1cm5pbmcgYSBkaXNwb3NhYmxlIGNvbm5lY3Rpb24uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsaXZlIHtAbGluayBDZHBDb25uZWN0aW9ufS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb0NkcChvcHRpb25zPzogQ29ubmVjdFRvQ2RwT3B0aW9ucyk6IFByb21pc2U8Q2RwQ29ubmVjdGlvbj4ge1xuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgPSB7XG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCcsXG4gICAgLi4uKG9wdGlvbnM/LmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAuLi4ob3B0aW9ucz8uaG9zdCAhPT0gdW5kZWZpbmVkICYmIHsgaG9zdDogb3B0aW9ucy5ob3N0IH0pLFxuICAgIC4uLihvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiB7IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbjogb3B0aW9ucy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gfSksXG4gICAgLi4uKG9wdGlvbnM/Lm9ic2lkaWFuVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHsgb2JzaWRpYW5WZXJzaW9uOiBvcHRpb25zLm9ic2lkaWFuVmVyc2lvbiB9KSxcbiAgICAuLi4ob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkICYmIHsgcG9ydDogb3B0aW9ucy5wb3J0IH0pXG4gIH07XG5cbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnModHJhbnNwb3J0T3B0aW9ucyk7XG4gIGNvbnN0IHZhdWx0ID0gbmV3IFRlbXBWYXVsdChvcHRpb25zPy52YXVsdCk7XG4gIGNvbnN0IHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlID0gb3B0aW9ucz8uc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgPz8gKG9wdGlvbnM/LnZhdWx0ID09PSB1bmRlZmluZWQpO1xuXG4gIC8vIFJlZ2lzdGVyaW5nIHRoZSB2YXVsdCBpcyB3aGF0IGxhdW5jaGVzIHRoZSBvd25lZCBpbnN0YW5jZSAocHJvdmlzaW9ucyB0aGVcbiAgLy8gQXNhciwgb3BlbnMgdGhlIHZhdWx0LCBhbmQgYm9vdHN0cmFwcyB0aGUgaGVscGVyIG5hbWVzcGFjZSksIG9yIG9wZW5zIHRoZVxuICAvLyBWYXVsdCBpbiB0aGUgYXR0YWNoZWQgaW5zdGFuY2UuXG4gIGF3YWl0IHZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG5cbiAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSByZXNvbHZlRW5kcG9pbnQodHJhbnNwb3J0LCBvcHRpb25zKTtcbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2hvc3R9OiR7U3RyaW5nKHBvcnQpfWA7XG5cbiAgY29uc3QgY29ubmVjdGlvbjogQ2RwQ29ubmVjdGlvbiA9IHtcbiAgICBjZHBVcmwsXG5cbiAgICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlKSB7XG4gICAgICAgICAgYXdhaXQgdmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRyYW5zcG9ydC51bnJlZ2lzdGVyVmF1bHQodmF1bHQucGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbEluT2JzaWRpYW48QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzLCBSZXN1bHQsIFRDb250ZXh0SWQ+LCAndHJhbnNwb3J0JyB8ICd2YXVsdFBhdGgnPlxuICAgICk6IFByb21pc2U8UmVzdWx0PiB7XG4gICAgICByZXR1cm4gZXZhbEluT2JzaWRpYW48QXJncywgUmVzdWx0LCBUQ29udGV4dElkPih7IC4uLnBhcmFtcywgdHJhbnNwb3J0LCB2YXVsdFBhdGg6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgcmV0dXJuIHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgcG9ydCxcblxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZGlzcG9zZSgpO1xuICAgIH0sXG5cbiAgICB2YXVsdFxuICB9O1xuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBDRFAgaG9zdC9wb3J0IGZvciB0aGUgY29ubmVjdGlvbjogZnJvbSB0aGUgb3duZWQgaW5zdGFuY2Unc1xuICogbGF1bmNoZWQgZW5kcG9pbnQgd2hlbiBwcmVzZW50LCBvdGhlcndpc2UgZnJvbSB0aGUgYXR0YWNoIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgY3JlYXRlZCBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgY29ubmVjdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIGhvc3QgYW5kIHBvcnQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwb3J0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRW5kcG9pbnQodHJhbnNwb3J0OiB1bmtub3duLCBvcHRpb25zOiBDb25uZWN0VG9DZHBPcHRpb25zIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRFbmRwb2ludCB7XG4gIGlmICh0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICByZXR1cm4geyBob3N0OiBlbmRwb2ludC5ob3N0LCBwb3J0OiBlbmRwb2ludC5wb3J0IH07XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnM/LnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IGhvc3Q6IG9wdGlvbnMuaG9zdCA/PyBERUZBVUxUX0NEUF9IT1NULCBwb3J0OiBvcHRpb25zLnBvcnQgfTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignY29ubmVjdFRvQ2RwOiBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBDRFAgcG9ydC4nKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXdCQSxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLGtDQUFrQztBQUUzQyxNQUFNLG1CQUFtQjtBQTBJekIsZUFBc0IsYUFBYSxTQUF1RDtBQUN4RixRQUFNLG1CQUFnRDtBQUFBLElBQ3BELE1BQU07QUFBQSxJQUNOLEdBQUksU0FBUyxpQ0FBaUMsVUFBYSxFQUFFLDhCQUE4QixRQUFRLDZCQUE2QjtBQUFBLElBQ2hJLEdBQUksU0FBUyxTQUFTLFVBQWEsRUFBRSxNQUFNLFFBQVEsS0FBSztBQUFBLElBQ3hELEdBQUksU0FBUyw2QkFBNkIsVUFBYSxFQUFFLDBCQUEwQixRQUFRLHlCQUF5QjtBQUFBLElBQ3BILEdBQUksU0FBUyxvQkFBb0IsVUFBYSxFQUFFLGlCQUFpQixRQUFRLGdCQUFnQjtBQUFBLElBQ3pGLEdBQUksU0FBUyxTQUFTLFVBQWEsRUFBRSxNQUFNLFFBQVEsS0FBSztBQUFBLEVBQzFEO0FBRUEsUUFBTSxZQUFZLE1BQU0sMkJBQTJCLGdCQUFnQjtBQUNuRSxRQUFNLFFBQVEsSUFBSSxVQUFVLFNBQVMsS0FBSztBQUMxQyxRQUFNLDZCQUE2QixTQUFTLDhCQUErQixTQUFTLFVBQVU7QUFLOUYsUUFBTSxNQUFNLFNBQVMsU0FBUztBQUU5QixRQUFNLEVBQUUsTUFBTSxLQUFLLElBQUksZ0JBQWdCLFdBQVcsT0FBTztBQUN6RCxRQUFNLFNBQVMsVUFBVSxJQUFJLElBQUksT0FBTyxJQUFJLENBQUM7QUFFN0MsUUFBTSxhQUE0QjtBQUFBLElBQ2hDO0FBQUEsSUFFQSxNQUFNLFVBQXlCO0FBQzdCLFVBQUk7QUFDRixZQUFJLDRCQUE0QjtBQUM5QixnQkFBTSxNQUFNLFFBQVEsU0FBUztBQUFBLFFBQy9CLE9BQU87QUFDTCxnQkFBTSxVQUFVLGdCQUFnQixNQUFNLElBQUk7QUFBQSxRQUM1QztBQUFBLE1BQ0YsVUFBRTtBQUNBLGNBQU0sVUFBVSxVQUFVO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNLGVBQ0osUUFDaUI7QUFDakIsYUFBTyxlQUF5QyxFQUFFLEdBQUcsUUFBUSxXQUFXLFdBQVcsTUFBTSxLQUFLLENBQUM7QUFBQSxJQUNqRztBQUFBLElBRUEsTUFBTSxPQUFPLFlBQXFDO0FBQ2hELGFBQU8sVUFBVSxTQUFTLFlBQVksRUFBRSxLQUFLLE1BQU0sS0FBSyxDQUFDO0FBQUEsSUFDM0Q7QUFBQSxJQUVBO0FBQUEsSUFFQSxPQUFPLE9BQU8sWUFBWSxJQUFtQjtBQUMzQyxZQUFNLFdBQVcsUUFBUTtBQUFBLElBQzNCO0FBQUEsSUFFQTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFXQSxTQUFTLGdCQUFnQixXQUFvQixTQUE0RDtBQUN2RyxNQUFJLHFCQUFxQixxQkFBcUI7QUFDNUMsVUFBTSxXQUFXLFVBQVUseUJBQXlCO0FBQ3BELFFBQUksVUFBVTtBQUNaLGFBQU8sRUFBRSxNQUFNLFNBQVMsTUFBTSxNQUFNLFNBQVMsS0FBSztBQUFBLElBQ3BEO0FBQUEsRUFDRjtBQUVBLE1BQUksU0FBUyxTQUFTLFFBQVc7QUFDL0IsV0FBTyxFQUFFLE1BQU0sUUFBUSxRQUFRLGtCQUFrQixNQUFNLFFBQVEsS0FBSztBQUFBLEVBQ3RFO0FBRUEsUUFBTSxJQUFJLE1BQU0saURBQWlEO0FBQ25FOyIsCiAgIm5hbWVzIjogW10KfQo=
|
package/dist/lib/esm/index.d.mts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Contains the entry point for the integration testing module.
|
|
5
5
|
*/
|
|
6
|
+
export type { CdpConnection, ConnectToCdpOptions } from './connect-to-cdp.mjs';
|
|
7
|
+
export { connectToCdp } from './connect-to-cdp.mjs';
|
|
6
8
|
export { ContextId } from './context-id.mjs';
|
|
7
9
|
export type { TransportOptionsResolver, VaultPathResolver } from './context-provider.mjs';
|
|
8
10
|
export { setTransportOptionsResolver, setVaultPathResolver } from './context-provider.mjs';
|
package/dist/lib/esm/index.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { connectToCdp } from "./connect-to-cdp.mjs";
|
|
1
2
|
import { ContextId } from "./context-id.mjs";
|
|
2
3
|
import {
|
|
3
4
|
setTransportOptionsResolver,
|
|
@@ -17,6 +18,7 @@ export {
|
|
|
17
18
|
ContextId,
|
|
18
19
|
DesktopCdpTransport,
|
|
19
20
|
TempVault,
|
|
21
|
+
connectToCdp,
|
|
20
22
|
createTransportFromOptions,
|
|
21
23
|
evalInObsidian,
|
|
22
24
|
registerVault,
|
|
@@ -24,4 +26,4 @@ export {
|
|
|
24
26
|
setVaultPathResolver,
|
|
25
27
|
unregisterVault
|
|
26
28
|
};
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5tanMnO1xuZXhwb3J0IHtcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuZXhwb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgUG9wdWxhdGVGaWxlQ29udGVudCxcbiAgUG9wdWxhdGVGaWxlc1BhcmFtc1xufSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcbmV4cG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VBc2FyLFxuICBPd25lZEluc3RhbmNlQ29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuZXhwb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkubWpzJztcbiJdLAogICJtYXBwaW5ncyI6ICJBQVVBLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsaUJBQWlCO0FBSzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsU0FBUyxzQkFBc0I7QUFLL0IsU0FBUyxpQkFBaUI7QUFLMUIsU0FBUyx1QkFBdUI7QUFNaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxrQ0FBa0M7QUFVM0M7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/dist/lib/esm/library.mjs
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obsidian-integration-testing",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.2.0",
|
|
4
4
|
"description": "Simplifies integration testing of Obsidian plugins.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian",
|
|
@@ -92,9 +92,13 @@
|
|
|
92
92
|
"main": "dist/lib/cjs/index.cjs",
|
|
93
93
|
"module": "dist/lib/esm/index.mjs",
|
|
94
94
|
"types": "dist/lib/esm/index.d.mts",
|
|
95
|
+
"bin": {
|
|
96
|
+
"obsidian-integration-testing": "bin/obsidian-integration-testing.mjs"
|
|
97
|
+
},
|
|
95
98
|
"files": [
|
|
96
99
|
"!dist/*.tgz",
|
|
97
100
|
"**/package.json",
|
|
101
|
+
"bin/",
|
|
98
102
|
"dist/",
|
|
99
103
|
"LICENSE",
|
|
100
104
|
"README.md"
|
|
Binary file
|