obsidian-integration-testing 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +298 -0
- package/dist/lib/cjs/context-id.cjs +83 -0
- package/dist/lib/cjs/context-id.d.cts +57 -0
- package/dist/lib/cjs/exec.cjs +267 -0
- package/dist/lib/cjs/exec.d.cts +108 -0
- package/dist/lib/cjs/function-expression.cjs +41 -0
- package/dist/lib/cjs/function-expression.d.cts +16 -0
- package/dist/lib/cjs/index.cjs +40 -0
- package/dist/lib/cjs/index.d.cts +11 -0
- package/dist/lib/cjs/integration-global-setup.cjs +106 -0
- package/dist/lib/cjs/integration-global-setup.d.cts +32 -0
- package/dist/lib/cjs/json-with-functions.cjs +46 -0
- package/dist/lib/cjs/json-with-functions.d.cts +16 -0
- package/dist/lib/cjs/obsidian-cli.cjs +191 -0
- package/dist/lib/cjs/obsidian-cli.d.cts +75 -0
- package/dist/lib/cjs/obsidian-config.cjs +91 -0
- package/dist/lib/cjs/obsidian-config.d.cts +25 -0
- package/dist/lib/cjs/temp-vault.cjs +96 -0
- package/dist/lib/cjs/temp-vault.d.cts +47 -0
- package/dist/lib/cjs/type-guards.cjs +42 -0
- package/dist/lib/cjs/type-guards.d.cts +30 -0
- package/dist/lib/cjs/vault-registry.cjs +89 -0
- package/dist/lib/cjs/vault-registry.d.cts +18 -0
- package/dist/lib/esm/context-id.d.mts +57 -0
- package/dist/lib/esm/context-id.mjs +59 -0
- package/dist/lib/esm/exec.d.mts +108 -0
- package/dist/lib/esm/exec.mjs +232 -0
- package/dist/lib/esm/function-expression.d.mts +16 -0
- package/dist/lib/esm/function-expression.mjs +17 -0
- package/dist/lib/esm/index.d.mts +11 -0
- package/dist/lib/esm/index.mjs +15 -0
- package/dist/lib/esm/integration-global-setup.d.mts +32 -0
- package/dist/lib/esm/integration-global-setup.mjs +88 -0
- package/dist/lib/esm/json-with-functions.d.mts +16 -0
- package/dist/lib/esm/json-with-functions.mjs +22 -0
- package/dist/lib/esm/obsidian-cli.d.mts +75 -0
- package/dist/lib/esm/obsidian-cli.mjs +161 -0
- package/dist/lib/esm/obsidian-config.d.mts +25 -0
- package/dist/lib/esm/obsidian-config.mjs +58 -0
- package/dist/lib/esm/temp-vault.d.mts +47 -0
- package/dist/lib/esm/temp-vault.mjs +82 -0
- package/dist/lib/esm/type-guards.d.mts +30 -0
- package/dist/lib/esm/type-guards.mjs +17 -0
- package/dist/lib/esm/vault-registry.d.mts +18 -0
- package/dist/lib/esm/vault-registry.mjs +64 -0
- package/dist/obsidian-integration-testing-1.0.0.tgz +0 -0
- package/package.json +131 -0
- package/patches/@vitest+runner+4.1.0.patch +22 -0
- package/scripts/postinstall.mjs +29 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
*
|
|
4
|
+
* Reads and queries Obsidian's local configuration (`obsidian.json`).
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Returns the hex vault ID for a given vault path from Obsidian's registry.
|
|
8
|
+
*
|
|
9
|
+
* @param vaultPath - The absolute path to the vault folder.
|
|
10
|
+
* @returns The vault ID, or `undefined` if the vault is not registered.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getVaultId(vaultPath: string): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Checks whether the Obsidian CLI is enabled in Obsidian's settings.
|
|
15
|
+
*
|
|
16
|
+
* @returns `true` if the CLI is enabled, `false` otherwise.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isCliEnabled(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Checks whether a vault path is registered in Obsidian's vault registry.
|
|
21
|
+
*
|
|
22
|
+
* @param vaultPath - The absolute path to the vault folder.
|
|
23
|
+
* @returns `true` if the vault is registered, `false` otherwise.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isVaultRegistered(vaultPath: string): boolean;
|
|
@@ -0,0 +1,96 @@
|
|
|
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 temp_vault_exports = {};
|
|
20
|
+
__export(temp_vault_exports, {
|
|
21
|
+
TempVault: () => TempVault
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(temp_vault_exports);
|
|
24
|
+
var import_node_fs = require("node:fs");
|
|
25
|
+
var import_promises = require("node:fs/promises");
|
|
26
|
+
var import_node_os = require("node:os");
|
|
27
|
+
var import_node_path = require("node:path");
|
|
28
|
+
var import_vault_registry = require("./vault-registry.cjs");
|
|
29
|
+
const RM_RETRY_DELAY_MS = 500;
|
|
30
|
+
const RM_RETRY_TIMEOUT_MS = 1e4;
|
|
31
|
+
class TempVault {
|
|
32
|
+
/**
|
|
33
|
+
* The absolute path to the temporary vault.
|
|
34
|
+
*/
|
|
35
|
+
path;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a new temp vault, optionally pre-populated with files.
|
|
38
|
+
*
|
|
39
|
+
* @param params - Configuration for the vault.
|
|
40
|
+
*/
|
|
41
|
+
constructor(params = {}) {
|
|
42
|
+
this.path = params.path ?? (0, import_node_fs.mkdtempSync)((0, import_node_path.join)((0, import_node_os.tmpdir)(), "temp-vault-"));
|
|
43
|
+
for (const [filePath, content] of Object.entries(params.files ?? {})) {
|
|
44
|
+
const fullPath = (0, import_node_path.join)(this.path, filePath);
|
|
45
|
+
if (filePath.endsWith("/")) {
|
|
46
|
+
if (content !== "") {
|
|
47
|
+
throw new Error(`Folder path "${filePath}" must have empty content`);
|
|
48
|
+
}
|
|
49
|
+
(0, import_node_fs.mkdirSync)(fullPath, { recursive: true });
|
|
50
|
+
} else {
|
|
51
|
+
(0, import_node_fs.mkdirSync)((0, import_node_path.dirname)(fullPath), { recursive: true });
|
|
52
|
+
(0, import_node_fs.writeFileSync)(fullPath, content);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Unregisters the vault from Obsidian and deletes the temp directory.
|
|
58
|
+
*/
|
|
59
|
+
async dispose() {
|
|
60
|
+
await (0, import_vault_registry.unregisterVault)(this.path);
|
|
61
|
+
await retryRm(this.path);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Registers this vault in the running Obsidian instance so the CLI can target it.
|
|
65
|
+
*/
|
|
66
|
+
async register() {
|
|
67
|
+
await (0, import_vault_registry.registerVault)(this.path);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Async disposable support for `await using`.
|
|
71
|
+
*
|
|
72
|
+
* @returns A promise that resolves when the vault is disposed.
|
|
73
|
+
*/
|
|
74
|
+
async [Symbol.asyncDispose]() {
|
|
75
|
+
return this.dispose();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function retryRm(path) {
|
|
79
|
+
const deadline = Date.now() + RM_RETRY_TIMEOUT_MS;
|
|
80
|
+
while (Date.now() < deadline) {
|
|
81
|
+
try {
|
|
82
|
+
await (0, import_promises.rm)(path, { force: true, recursive: true });
|
|
83
|
+
return;
|
|
84
|
+
} catch {
|
|
85
|
+
await new Promise((resolve) => {
|
|
86
|
+
setTimeout(resolve, RM_RETRY_DELAY_MS);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
await (0, import_promises.rm)(path, { force: true, recursive: true });
|
|
91
|
+
}
|
|
92
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
93
|
+
0 && (module.exports = {
|
|
94
|
+
TempVault
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXAtdmF1bHQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogTWFuYWdlcyB0ZW1wb3JhcnkgdmF1bHQgbGlmZWN5Y2xlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqL1xuXG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgcm0gfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pblxufSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQge1xuICByZWdpc3RlclZhdWx0LFxuICB1bnJlZ2lzdGVyVmF1bHRcbn0gZnJvbSAnLi92YXVsdC1yZWdpc3RyeS5janMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgVGVtcFZhdWx0fSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wVmF1bHRQYXJhbXMge1xuICAvKipcbiAgICogTWFwIG9mIGZpbGUgcGF0aHMgdG8gY29udGVudC4gUGFyZW50IGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIFRvIGNyZWF0ZSBhbiBlbXB0eSBmb2xkZXIsIHVzZSBhIHBhdGggZW5kaW5nIHdpdGggYC9gIGFuZCBhbiBlbXB0eSBzdHJpbmcgYXMgY29udGVudC5cbiAgICovXG4gIGZpbGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogQW4gZXhwbGljaXQgdmF1bHQgcGF0aC4gSWYgb21pdHRlZCwgYSB0ZW1wIGRpcmVjdG9yeSBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcGF0aD86IHN0cmluZztcbn1cblxuY29uc3QgUk1fUkVUUllfREVMQVlfTVMgPSA1MDA7XG5jb25zdCBSTV9SRVRSWV9USU1FT1VUX01TID0gMTAwMDA7XG5cbi8qKlxuICogQSB0ZW1wb3JhcnkgT2JzaWRpYW4gdmF1bHQgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIENyZWF0ZXMgYSB0ZW1wIGRpcmVjdG9yeSBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlXG4gKiBzbyB0aGF0IHRoZSBPYnNpZGlhbiBDTEkgY2FuIHRhcmdldCBpdCB2aWEgYGN3ZGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wVmF1bHQge1xuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGVtcCB2YXVsdCwgb3B0aW9uYWxseSBwcmUtcG9wdWxhdGVkIHdpdGggZmlsZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25maWd1cmF0aW9uIGZvciB0aGUgdmF1bHQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBUZW1wVmF1bHRQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGF0aCA9IHBhcmFtcy5wYXRoID8/IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksICd0ZW1wLXZhdWx0LScpKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMuZmlsZXMgPz8ge30pKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4odGhpcy5wYXRoLCBmaWxlUGF0aCk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICBpZiAoY29udGVudCAhPT0gJycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvbGRlciBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgZW1wdHkgY29udGVudGApO1xuICAgICAgICB9XG4gICAgICAgIG1rZGlyU3luYyhmdWxsUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBta2RpclN5bmMoZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB3cml0ZUZpbGVTeW5jKGZ1bGxQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIHZhdWx0IGZyb20gT2JzaWRpYW4gYW5kIGRlbGV0ZXMgdGhlIHRlbXAgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdW5yZWdpc3RlclZhdWx0KHRoaXMucGF0aCk7XG4gICAgYXdhaXQgcmV0cnlSbSh0aGlzLnBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGlzIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHNvIHRoZSBDTEkgY2FuIHRhcmdldCBpdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCByZWdpc3RlclZhdWx0KHRoaXMucGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMgZGlzcG9zYWJsZSBzdXBwb3J0IGZvciBgYXdhaXQgdXNpbmdgLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2YXVsdCBpcyBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcG9zZSgpO1xuICB9XG59XG5cbi8qKlxuICogUmV0cmllcyBgcm1gIHVudGlsIGl0IHN1Y2NlZWRzIG9yIHRpbWVzIG91dC5cbiAqIE9ic2lkaWFuIG1heSBob2xkIGZpbGUgbG9ja3MgYnJpZWZseSBhZnRlciBhIHdpbmRvdyBpcyBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXRyeVJtKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSTV9SRVRSWV9USU1FT1VUX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJtKHBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgUk1fUkVUUllfREVMQVlfTVMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIEZpbmFsIGF0dGVtcHQgXHUyMDE0IGxldCBpdCB0aHJvdy5cbiAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLHFCQUlPO0FBQ1Asc0JBQW1CO0FBQ25CLHFCQUF1QjtBQUN2Qix1QkFHTztBQUVQLDRCQUdPO0FBbUJQLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sc0JBQXNCO0FBUXJCLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUw7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLFNBQTBCLENBQUMsR0FBRztBQUMvQyxTQUFLLE9BQU8sT0FBTyxZQUFRLGdDQUFZLDJCQUFLLHVCQUFPLEdBQUcsYUFBYSxDQUFDO0FBRXBFLGVBQVcsQ0FBQyxVQUFVLE9BQU8sS0FBSyxPQUFPLFFBQVEsT0FBTyxTQUFTLENBQUMsQ0FBQyxHQUFHO0FBQ3BFLFlBQU0sZUFBVyx1QkFBSyxLQUFLLE1BQU0sUUFBUTtBQUN6QyxVQUFJLFNBQVMsU0FBUyxHQUFHLEdBQUc7QUFDMUIsWUFBSSxZQUFZLElBQUk7QUFDbEIsZ0JBQU0sSUFBSSxNQUFNLGdCQUFnQixRQUFRLDJCQUEyQjtBQUFBLFFBQ3JFO0FBQ0Esc0NBQVUsVUFBVSxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQUEsTUFDekMsT0FBTztBQUNMLDBDQUFVLDBCQUFRLFFBQVEsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2hELDBDQUFjLFVBQVUsT0FBTztBQUFBLE1BQ2pDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWEsVUFBeUI7QUFDcEMsY0FBTSx1Q0FBZ0IsS0FBSyxJQUFJO0FBQy9CLFVBQU0sUUFBUSxLQUFLLElBQUk7QUFBQSxFQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYSxXQUEwQjtBQUNyQyxjQUFNLHFDQUFjLEtBQUssSUFBSTtBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBYyxPQUFPLFlBQVksSUFBbUI7QUFDbEQsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUN0QjtBQUNGO0FBU0EsZUFBZSxRQUFRLE1BQTZCO0FBQ2xELFFBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5QixTQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsUUFBSTtBQUNGLGdCQUFNLG9CQUFHLE1BQU0sRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFDL0M7QUFBQSxJQUNGLFFBQVE7QUFDTixZQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsbUJBQVcsU0FBUyxpQkFBaUI7QUFBQSxNQUN2QyxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxZQUFNLG9CQUFHLE1BQU0sRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFDakQ7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameters for the {@link TempVault} constructor.
|
|
3
|
+
*/
|
|
4
|
+
export interface TempVaultParams {
|
|
5
|
+
/**
|
|
6
|
+
* Map of file paths to content. Parent directories are created automatically.
|
|
7
|
+
*
|
|
8
|
+
* To create an empty folder, use a path ending with `/` and an empty string as content.
|
|
9
|
+
*/
|
|
10
|
+
files?: Record<string, string>;
|
|
11
|
+
/**
|
|
12
|
+
* An explicit vault path. If omitted, a temp directory is created.
|
|
13
|
+
*/
|
|
14
|
+
path?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A temporary Obsidian vault for integration tests.
|
|
18
|
+
*
|
|
19
|
+
* Creates a temp directory and registers it in the running Obsidian instance
|
|
20
|
+
* so that the Obsidian CLI can target it via `cwd`.
|
|
21
|
+
*/
|
|
22
|
+
export declare class TempVault {
|
|
23
|
+
/**
|
|
24
|
+
* The absolute path to the temporary vault.
|
|
25
|
+
*/
|
|
26
|
+
readonly path: string;
|
|
27
|
+
/**
|
|
28
|
+
* Creates a new temp vault, optionally pre-populated with files.
|
|
29
|
+
*
|
|
30
|
+
* @param params - Configuration for the vault.
|
|
31
|
+
*/
|
|
32
|
+
constructor(params?: TempVaultParams);
|
|
33
|
+
/**
|
|
34
|
+
* Unregisters the vault from Obsidian and deletes the temp directory.
|
|
35
|
+
*/
|
|
36
|
+
dispose(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Registers this vault in the running Obsidian instance so the CLI can target it.
|
|
39
|
+
*/
|
|
40
|
+
register(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Async disposable support for `await using`.
|
|
43
|
+
*
|
|
44
|
+
* @returns A promise that resolves when the vault is disposed.
|
|
45
|
+
*/
|
|
46
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
47
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
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 type_guards_exports = {};
|
|
20
|
+
__export(type_guards_exports, {
|
|
21
|
+
assertNonNullable: () => assertNonNullable,
|
|
22
|
+
ensureNonNullable: () => ensureNonNullable
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(type_guards_exports);
|
|
25
|
+
function assertNonNullable(value, errorOrMessage) {
|
|
26
|
+
if (value !== null && value !== void 0) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
errorOrMessage ??= value === null ? "Value is null" : "Value is undefined";
|
|
30
|
+
const error = typeof errorOrMessage === "string" ? new Error(errorOrMessage) : errorOrMessage;
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
function ensureNonNullable(value, errorOrMessage) {
|
|
34
|
+
assertNonNullable(value, errorOrMessage);
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
38
|
+
0 && (module.exports = {
|
|
39
|
+
assertNonNullable,
|
|
40
|
+
ensureNonNullable
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3R5cGUtZ3VhcmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0eXBlIGd1YXJkcy5cbiAqL1xuXG50eXBlIE51bGxhYmxlQ29uc3RyYWludDxUPiA9IG51bGwgZXh0ZW5kcyBUID8gdW5rbm93biA6IHVuZGVmaW5lZCBleHRlbmRzIFQgPyB1bmtub3duIDogbmV2ZXI7XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGEgdmFsdWUgaXMgbm90IGBudWxsYCBvciBgdW5kZWZpbmVkYCwgbmFycm93aW5nIGl0cyB0eXBlIGluIHBsYWNlLlxuICpcbiAqIE9ubHkgY2FsbGFibGUgd2hlbiBgVGAgaW5jbHVkZXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLiBQYXNzaW5nIGFuIGFscmVhZHkgbm9uLW51bGxhYmxlIHR5cGUgaXMgYSBjb21waWxlIGVycm9yLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSBlcnJvck9yTWVzc2FnZSAtIE9wdGlvbmFsIHtAbGluayBFcnJvcn0gb3IgZXJyb3IgbWVzc2FnZSBzdHJpbmcuXG4gKiBAdGhyb3dzIElmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25OdWxsYWJsZTxUIGV4dGVuZHMgTnVsbGFibGVDb25zdHJhaW50PFQ+Pih2YWx1ZTogVCwgZXJyb3JPck1lc3NhZ2U/OiBFcnJvciB8IHN0cmluZyk6IGFzc2VydHMgdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4ge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVycm9yT3JNZXNzYWdlID8/PSB2YWx1ZSA9PT0gbnVsbCA/ICdWYWx1ZSBpcyBudWxsJyA6ICdWYWx1ZSBpcyB1bmRlZmluZWQnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBlcnJvck9yTWVzc2FnZSA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZXJyb3JPck1lc3NhZ2UpIDogZXJyb3JPck1lc3NhZ2U7XG4gIHRocm93IGVycm9yO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhIHZhbHVlIGlzIG5vdCBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgYW5kIHJldHVybnMgaXQgd2l0aCBuYXJyb3dlZCB0eXBlLlxuICpcbiAqIE9ubHkgY2FsbGFibGUgd2hlbiBgVGAgaW5jbHVkZXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLiBQYXNzaW5nIGFuIGFscmVhZHkgbm9uLW51bGxhYmxlIHR5cGUgaXMgYSBjb21waWxlIGVycm9yLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSBlcnJvck9yTWVzc2FnZSAtIE9wdGlvbmFsIHtAbGluayBFcnJvcn0gb3IgZXJyb3IgbWVzc2FnZSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgd2l0aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGV4Y2x1ZGVkIGZyb20gaXRzIHR5cGUuXG4gKiBAdGhyb3dzIElmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVOb25OdWxsYWJsZTxUIGV4dGVuZHMgTnVsbGFibGVDb25zdHJhaW50PFQ+Pih2YWx1ZTogVCwgZXJyb3JPck1lc3NhZ2U/OiBFcnJvciB8IHN0cmluZyk6IE5vbk51bGxhYmxlPFQ+IHtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUodmFsdWUsIGVycm9yT3JNZXNzYWdlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0JPLFNBQVMsa0JBQW1ELE9BQVUsZ0JBQWtFO0FBQzdJLE1BQUksVUFBVSxRQUFRLFVBQVUsUUFBVztBQUN6QztBQUFBLEVBQ0Y7QUFFQSxxQkFBbUIsVUFBVSxPQUFPLGtCQUFrQjtBQUN0RCxRQUFNLFFBQVEsT0FBTyxtQkFBbUIsV0FBVyxJQUFJLE1BQU0sY0FBYyxJQUFJO0FBQy9FLFFBQU07QUFDUjtBQWFPLFNBQVMsa0JBQW1ELE9BQVUsZ0JBQWlEO0FBQzVILG9CQUFrQixPQUFPLGNBQWM7QUFDdkMsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
*
|
|
4
|
+
* Contains utility functions for type guards.
|
|
5
|
+
*/
|
|
6
|
+
type NullableConstraint<T> = null extends T ? unknown : undefined extends T ? unknown : never;
|
|
7
|
+
/**
|
|
8
|
+
* Asserts that a value is not `null` or `undefined`, narrowing its type in place.
|
|
9
|
+
*
|
|
10
|
+
* Only callable when `T` includes `null` or `undefined`. Passing an already non-nullable type is a compile error.
|
|
11
|
+
*
|
|
12
|
+
* @typeParam T - The type of the value.
|
|
13
|
+
* @param value - The value to check.
|
|
14
|
+
* @param errorOrMessage - Optional {@link Error} or error message string.
|
|
15
|
+
* @throws If the value is `null` or `undefined`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function assertNonNullable<T extends NullableConstraint<T>>(value: T, errorOrMessage?: Error | string): asserts value is NonNullable<T>;
|
|
18
|
+
/**
|
|
19
|
+
* Ensures that a value is not `null` or `undefined` and returns it with narrowed type.
|
|
20
|
+
*
|
|
21
|
+
* Only callable when `T` includes `null` or `undefined`. Passing an already non-nullable type is a compile error.
|
|
22
|
+
*
|
|
23
|
+
* @typeParam T - The type of the value.
|
|
24
|
+
* @param value - The value to check.
|
|
25
|
+
* @param errorOrMessage - Optional {@link Error} or error message string.
|
|
26
|
+
* @returns The value with `null` and `undefined` excluded from its type.
|
|
27
|
+
* @throws If the value is `null` or `undefined`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function ensureNonNullable<T extends NullableConstraint<T>>(value: T, errorOrMessage?: Error | string): NonNullable<T>;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
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 vault_registry_exports = {};
|
|
20
|
+
__export(vault_registry_exports, {
|
|
21
|
+
registerVault: () => registerVault,
|
|
22
|
+
unregisterVault: () => unregisterVault
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(vault_registry_exports);
|
|
25
|
+
var import_obsidian_cli = require("./obsidian-cli.cjs");
|
|
26
|
+
const POLL_INTERVAL_MS = 500;
|
|
27
|
+
const POLL_TIMEOUT_MS = 3e4;
|
|
28
|
+
const CLOSE_DELAY_MS = 1e3;
|
|
29
|
+
async function registerVault(vaultPath) {
|
|
30
|
+
await (0, import_obsidian_cli.evalInObsidian)({
|
|
31
|
+
args: { vaultPath },
|
|
32
|
+
// eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
|
|
33
|
+
fn({ vaultPath: vaultPath2 }) {
|
|
34
|
+
window.electron.ipcRenderer.sendSync("vault-open", vaultPath2, false);
|
|
35
|
+
},
|
|
36
|
+
shouldSkipPreflightChecks: true
|
|
37
|
+
});
|
|
38
|
+
const deadline = Date.now() + POLL_TIMEOUT_MS;
|
|
39
|
+
while (Date.now() < deadline) {
|
|
40
|
+
try {
|
|
41
|
+
const basePath = await (0, import_obsidian_cli.evalInObsidian)({
|
|
42
|
+
fn({ app }) {
|
|
43
|
+
return app.vault.adapter.getBasePath();
|
|
44
|
+
},
|
|
45
|
+
shouldSkipPreflightChecks: true,
|
|
46
|
+
vaultPath
|
|
47
|
+
});
|
|
48
|
+
if (basePath === vaultPath) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
} catch {
|
|
52
|
+
}
|
|
53
|
+
await new Promise((r) => {
|
|
54
|
+
setTimeout(r, POLL_INTERVAL_MS);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`Vault at ${vaultPath} did not become ready within ${String(POLL_TIMEOUT_MS)}ms`);
|
|
58
|
+
}
|
|
59
|
+
async function unregisterVault(vaultPath) {
|
|
60
|
+
try {
|
|
61
|
+
await (0, import_obsidian_cli.evalInObsidian)({
|
|
62
|
+
fn() {
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
window.electron.remote?.getCurrentWindow().destroy();
|
|
65
|
+
}, 0);
|
|
66
|
+
},
|
|
67
|
+
shouldSkipPreflightChecks: true,
|
|
68
|
+
vaultPath
|
|
69
|
+
});
|
|
70
|
+
} catch {
|
|
71
|
+
}
|
|
72
|
+
await new Promise((r) => {
|
|
73
|
+
setTimeout(r, CLOSE_DELAY_MS);
|
|
74
|
+
});
|
|
75
|
+
await (0, import_obsidian_cli.evalInObsidian)({
|
|
76
|
+
args: { vaultPath },
|
|
77
|
+
// eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
|
|
78
|
+
fn({ vaultPath: vaultPath2 }) {
|
|
79
|
+
window.electron.ipcRenderer.sendSync("vault-remove", vaultPath2);
|
|
80
|
+
},
|
|
81
|
+
shouldSkipPreflightChecks: true
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
85
|
+
0 && (module.exports = {
|
|
86
|
+
registerVault,
|
|
87
|
+
unregisterVault
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZhdWx0LXJlZ2lzdHJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG4vKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIE1hbmFnZXMgdmF1bHQgcmVnaXN0cmF0aW9uIGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGkuY2pzJztcblxuY29uc3QgUE9MTF9JTlRFUlZBTF9NUyA9IDUwMDtcbmNvbnN0IFBPTExfVElNRU9VVF9NUyA9IDMwMDAwO1xuY29uc3QgQ0xPU0VfREVMQVlfTVMgPSAxMDAwO1xuXG5pbnRlcmZhY2UgRWxlY3Ryb24ge1xuICByZW1vdGU6IEVsZWN0cm9uUmVtb3RlO1xufVxuXG5pbnRlcmZhY2UgRWxlY3Ryb25SZW1vdGUge1xuICBnZXRDdXJyZW50V2luZG93KCk6IEdldEN1cnJlbnRXaW5kb3dSZXN1bHQ7XG59XG5cbmludGVyZmFjZSBHZXRDdXJyZW50V2luZG93UmVzdWx0IHtcbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHZhdWx0IHBhdGggaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2Ugc28gdGhlIENMSSBjYW4gdGFyZ2V0IGl0IHZpYSBgY3dkYC5cbiAqXG4gKiBVc2VzIHRoZSBgdmF1bHQtb3BlbmAgSVBDIHRvIHJlZ2lzdGVyIGFuZCBvcGVuIHRoZSB2YXVsdCwgdGhlbiBwb2xscyB1bnRpbFxuICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gT3BlbiB0aGUgdmF1bHQgdmlhIElQQy4gVGhlIHNlbmRTeW5jIHJldHVybiB2YWx1ZSBpcyB1bnJlbGlhYmxlXG4gIC8vIChDTEkgb3V0cHV0IG1heSBiZSBsb3N0IHdoZW4gdGhlIG5ldyB3aW5kb3cgb3BlbnMpLCBzbyB3ZSBpZ25vcmUgaXRcbiAgLy8gQW5kIHBvbGwgZm9yIHJlYWRpbmVzcyBpbnN0ZWFkLlxuICBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgYXJnczogeyB2YXVsdFBhdGggfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIE5vIGFjdHVhbCBzaGFkb3dpbmcgYXMgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGV4dGVybmFsbHkuXG4gICAgZm4oeyB2YXVsdFBhdGggfSk6IHZvaWQge1xuICAgICAgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1vcGVuJywgdmF1bHRQYXRoLCBmYWxzZSk7XG4gICAgfSxcbiAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlXG4gIH0pO1xuXG4gIC8vIFBvbGwgdW50aWwgdGhlIG5ldyB2YXVsdCdzIENMSSByZXNwb25kcyB3aXRoIHRoZSBjb3JyZWN0IGJhc2VQYXRoLlxuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBQT0xMX1RJTUVPVVRfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgICAgIGZuKHsgYXBwIH0pOiBzdHJpbmcge1xuICAgICAgICAgIHJldHVybiAoYXBwLnZhdWx0LmFkYXB0ZXIgYXMgRmlsZVN5c3RlbUFkYXB0ZXIpLmdldEJhc2VQYXRoKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgICAgIHZhdWx0UGF0aFxuICAgICAgfSk7XG4gICAgICBpZiAoYmFzZVBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBWYXVsdCBub3QgcmVhZHkgeWV0LlxuICAgIH1cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4ge1xuICAgICAgc2V0VGltZW91dChyLCBQT0xMX0lOVEVSVkFMX01TKTtcbiAgICB9KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoUE9MTF9USU1FT1VUX01TKX1tc2ApO1xufVxuXG4vKipcbiAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgcGF0aCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICpcbiAqIFNjaGVkdWxlcyB0aGUgdmF1bHQgd2luZG93IHRvIGNsb3NlLCB3YWl0cyBmb3IgaXQsIHRoZW4gcmVtb3Zlc1xuICogdGhlIHZhdWx0IGZyb20gdGhlIHJlZ2lzdHJ5IHZpYSBgdmF1bHQtcmVtb3ZlYCBJUEMuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gU2NoZWR1bGUgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSBmcm9tIHdpdGhpbiBpdHMgb3duIGNvbnRleHQuXG4gIC8vIFVzZSBzZXRUaW1lb3V0IHNvIHRoZSBDTEkgcmVzcG9uc2UgaXMgc2VudCBiZWZvcmUgdGhlIHdpbmRvdyBjbG9zZXMuXG4gIHRyeSB7XG4gICAgYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgZm4oKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICh3aW5kb3cuZWxlY3Ryb24gYXMgUGFydGlhbDxFbGVjdHJvbj4pLnJlbW90ZT8uZ2V0Q3VycmVudFdpbmRvdygpLmRlc3Ryb3koKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9LFxuICAgICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZSxcbiAgICAgIHZhdWx0UGF0aFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBUaGUgd2luZG93IG1heSBoYXZlIGNsb3NlZCBiZWZvcmUgdGhlIHJlc3BvbnNlIHdhcyBzZW50IFx1MjAxNCB0aGF0J3MgT0suXG4gIH1cblxuICAvLyBXYWl0IGZvciB0aGUgd2luZG93IHRvIGFjdHVhbGx5IGNsb3NlLlxuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4ge1xuICAgIHNldFRpbWVvdXQociwgQ0xPU0VfREVMQVlfTVMpO1xuICB9KTtcblxuICAvLyBSZW1vdmUgZnJvbSB0aGUgcmVnaXN0cnkgKGZyb20gYW55IHJlbWFpbmluZyB2YXVsdCdzIGNvbnRleHQpLlxuICBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgYXJnczogeyB2YXVsdFBhdGggfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIE5vIGFjdHVhbCBzaGFkb3dpbmcgYXMgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGV4dGVybmFsbHkuXG4gICAgZm4oeyB2YXVsdFBhdGggfSk6IHZvaWQge1xuICAgICAgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1yZW1vdmUnLCB2YXVsdFBhdGgpO1xuICAgIH0sXG4gICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVVBLDBCQUErQjtBQUUvQixNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLGlCQUFpQjtBQXNCdkIsZUFBc0IsY0FBYyxXQUFrQztBQUlwRSxZQUFNLG9DQUFlO0FBQUEsSUFDbkIsTUFBTSxFQUFFLFVBQVU7QUFBQTtBQUFBLElBRWxCLEdBQUcsRUFBRSxXQUFBQSxXQUFVLEdBQVM7QUFDdEIsYUFBTyxTQUFTLFlBQVksU0FBUyxjQUFjQSxZQUFXLEtBQUs7QUFBQSxJQUNyRTtBQUFBLElBQ0EsMkJBQTJCO0FBQUEsRUFDN0IsQ0FBQztBQUdELFFBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5QixTQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsUUFBSTtBQUNGLFlBQU0sV0FBVyxVQUFNLG9DQUFlO0FBQUEsUUFDcEMsR0FBRyxFQUFFLElBQUksR0FBVztBQUNsQixpQkFBUSxJQUFJLE1BQU0sUUFBOEIsWUFBWTtBQUFBLFFBQzlEO0FBQUEsUUFDQSwyQkFBMkI7QUFBQSxRQUMzQjtBQUFBLE1BQ0YsQ0FBQztBQUNELFVBQUksYUFBYSxXQUFXO0FBQzFCO0FBQUEsTUFDRjtBQUFBLElBQ0YsUUFBUTtBQUFBLElBRVI7QUFDQSxVQUFNLElBQUksUUFBUSxDQUFDLE1BQU07QUFDdkIsaUJBQVcsR0FBRyxnQkFBZ0I7QUFBQSxJQUNoQyxDQUFDO0FBQUEsRUFDSDtBQUNBLFFBQU0sSUFBSSxNQUFNLFlBQVksU0FBUyxnQ0FBZ0MsT0FBTyxlQUFlLENBQUMsSUFBSTtBQUNsRztBQVVBLGVBQXNCLGdCQUFnQixXQUFrQztBQUd0RSxNQUFJO0FBQ0YsY0FBTSxvQ0FBZTtBQUFBLE1BQ25CLEtBQVc7QUFDVCxtQkFBVyxNQUFNO0FBQ2YsVUFBQyxPQUFPLFNBQStCLFFBQVEsaUJBQWlCLEVBQUUsUUFBUTtBQUFBLFFBQzVFLEdBQUcsQ0FBQztBQUFBLE1BQ047QUFBQSxNQUNBLDJCQUEyQjtBQUFBLE1BQzNCO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSCxRQUFRO0FBQUEsRUFFUjtBQUdBLFFBQU0sSUFBSSxRQUFRLENBQUMsTUFBTTtBQUN2QixlQUFXLEdBQUcsY0FBYztBQUFBLEVBQzlCLENBQUM7QUFHRCxZQUFNLG9DQUFlO0FBQUEsSUFDbkIsTUFBTSxFQUFFLFVBQVU7QUFBQTtBQUFBLElBRWxCLEdBQUcsRUFBRSxXQUFBQSxXQUFVLEdBQVM7QUFDdEIsYUFBTyxTQUFTLFlBQVksU0FBUyxnQkFBZ0JBLFVBQVM7QUFBQSxJQUNoRTtBQUFBLElBQ0EsMkJBQTJCO0FBQUEsRUFDN0IsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJ2YXVsdFBhdGgiXQp9Cg==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registers a vault path in the running Obsidian instance so the CLI can target it via `cwd`.
|
|
3
|
+
*
|
|
4
|
+
* Uses the `vault-open` IPC to register and open the vault, then polls until
|
|
5
|
+
* the vault's CLI is ready and `getBasePath()` matches `vaultPath`.
|
|
6
|
+
*
|
|
7
|
+
* @param vaultPath - The absolute path to the vault folder.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerVault(vaultPath: string): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Unregisters a vault path from the running Obsidian instance.
|
|
12
|
+
*
|
|
13
|
+
* Schedules the vault window to close, waits for it, then removes
|
|
14
|
+
* the vault from the registry via `vault-remove` IPC.
|
|
15
|
+
*
|
|
16
|
+
* @param vaultPath - The absolute path to the vault folder.
|
|
17
|
+
*/
|
|
18
|
+
export declare function unregisterVault(vaultPath: string): Promise<void>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
*
|
|
4
|
+
* Typed context identifiers for persisting non-serializable values
|
|
5
|
+
* across {@link evalInObsidian} calls.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Wraps a {@link ContextOf} extraction into an object with a `context` property.
|
|
9
|
+
*/
|
|
10
|
+
export interface ContextArgs<TContextId extends ContextId<unknown> | undefined = undefined> {
|
|
11
|
+
context: ContextOf<TContextId>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Extracts the context type from a {@link ContextId}.
|
|
15
|
+
*/
|
|
16
|
+
export type ContextOf<T> = T extends ContextId<infer Context> ? Context : never;
|
|
17
|
+
/**
|
|
18
|
+
* A typed context identifier for persisting non-serializable values
|
|
19
|
+
* across {@link evalInObsidian} calls.
|
|
20
|
+
*
|
|
21
|
+
* The context is a persistent object stored on `window` in the Obsidian process.
|
|
22
|
+
* All calls sharing the same `ContextId` share the same context object,
|
|
23
|
+
* allowing non-serializable values (e.g. `TFile`, `Editor`) to survive across calls.
|
|
24
|
+
*
|
|
25
|
+
* Implements `AsyncDisposable` for use with `await using`.
|
|
26
|
+
*/
|
|
27
|
+
export declare class ContextId<_Context> implements AsyncDisposable {
|
|
28
|
+
private readonly id;
|
|
29
|
+
/**
|
|
30
|
+
* Creates a new context id.
|
|
31
|
+
*/
|
|
32
|
+
constructor();
|
|
33
|
+
/**
|
|
34
|
+
* Removes this context from the Obsidian process.
|
|
35
|
+
*
|
|
36
|
+
* @param vaultPath - The path to the Obsidian vault. Defaults to `process.cwd()`.
|
|
37
|
+
*/
|
|
38
|
+
dispose(vaultPath?: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Disposes this context id.
|
|
41
|
+
*
|
|
42
|
+
* @returns A promise that resolves when the context id is disposed.
|
|
43
|
+
*/
|
|
44
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Returns the JSON representation of the context id.
|
|
47
|
+
*
|
|
48
|
+
* @returns The JSON representation of the context id.
|
|
49
|
+
*/
|
|
50
|
+
toJSON(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Returns the string representation of the context id.
|
|
53
|
+
*
|
|
54
|
+
* @returns The string representation of the context id.
|
|
55
|
+
*/
|
|
56
|
+
toString(): string;
|
|
57
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { evalInObsidian } from "./obsidian-cli.mjs";
|
|
2
|
+
class ContextId {
|
|
3
|
+
id;
|
|
4
|
+
/**
|
|
5
|
+
* Creates a new context id.
|
|
6
|
+
*/
|
|
7
|
+
constructor() {
|
|
8
|
+
const SLICE_START = 2;
|
|
9
|
+
this.id = `__ctx_${String(Math.random()).slice(SLICE_START)}`;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Removes this context from the Obsidian process.
|
|
13
|
+
*
|
|
14
|
+
* @param vaultPath - The path to the Obsidian vault. Defaults to `process.cwd()`.
|
|
15
|
+
*/
|
|
16
|
+
async dispose(vaultPath) {
|
|
17
|
+
await evalInObsidian({
|
|
18
|
+
args: { id: this.id },
|
|
19
|
+
/* v8 ignore start -- Serialized via toString() and executed inside the Obsidian process. Covered by integration tests. */
|
|
20
|
+
fn({ id }) {
|
|
21
|
+
const holder = window;
|
|
22
|
+
if (holder.__obsidianContexts__) {
|
|
23
|
+
delete holder.__obsidianContexts__[id];
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
/* v8 ignore stop */
|
|
27
|
+
shouldSkipPreflightChecks: true,
|
|
28
|
+
...vaultPath === void 0 ? {} : { vaultPath }
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Disposes this context id.
|
|
33
|
+
*
|
|
34
|
+
* @returns A promise that resolves when the context id is disposed.
|
|
35
|
+
*/
|
|
36
|
+
async [Symbol.asyncDispose]() {
|
|
37
|
+
await this.dispose();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns the JSON representation of the context id.
|
|
41
|
+
*
|
|
42
|
+
* @returns The JSON representation of the context id.
|
|
43
|
+
*/
|
|
44
|
+
toJSON() {
|
|
45
|
+
return this.id;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns the string representation of the context id.
|
|
49
|
+
*
|
|
50
|
+
* @returns The string representation of the context id.
|
|
51
|
+
*/
|
|
52
|
+
toString() {
|
|
53
|
+
return this.id;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
ContextId
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbnRleHQtaWQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVHlwZWQgY29udGV4dCBpZGVudGlmaWVycyBmb3IgcGVyc2lzdGluZyBub24tc2VyaWFsaXphYmxlIHZhbHVlc1xuICogYWNyb3NzIHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbHMuXG4gKi9cblxuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL29ic2lkaWFuLWNsaS5tanMnO1xuXG4vKipcbiAqIFdyYXBzIGEge0BsaW5rIENvbnRleHRPZn0gZXh0cmFjdGlvbiBpbnRvIGFuIG9iamVjdCB3aXRoIGEgYGNvbnRleHRgIHByb3BlcnR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRBcmdzPFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+IHtcbiAgY29udGV4dDogQ29udGV4dE9mPFRDb250ZXh0SWQ+O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBjb250ZXh0IHR5cGUgZnJvbSBhIHtAbGluayBDb250ZXh0SWR9LlxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0T2Y8VD4gPSBUIGV4dGVuZHMgQ29udGV4dElkPGluZmVyIENvbnRleHQ+ID8gQ29udGV4dCA6IG5ldmVyO1xuXG4vKipcbiAqIEEgdHlwZWQgY29udGV4dCBpZGVudGlmaWVyIGZvciBwZXJzaXN0aW5nIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzXG4gKiBhY3Jvc3Mge0BsaW5rIGV2YWxJbk9ic2lkaWFufSBjYWxscy5cbiAqXG4gKiBUaGUgY29udGV4dCBpcyBhIHBlcnNpc3RlbnQgb2JqZWN0IHN0b3JlZCBvbiBgd2luZG93YCBpbiB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIEFsbCBjYWxscyBzaGFyaW5nIHRoZSBzYW1lIGBDb250ZXh0SWRgIHNoYXJlIHRoZSBzYW1lIGNvbnRleHQgb2JqZWN0LFxuICogYWxsb3dpbmcgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgKGUuZy4gYFRGaWxlYCwgYEVkaXRvcmApIHRvIHN1cnZpdmUgYWNyb3NzIGNhbGxzLlxuICpcbiAqIEltcGxlbWVudHMgYEFzeW5jRGlzcG9zYWJsZWAgZm9yIHVzZSB3aXRoIGBhd2FpdCB1c2luZ2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZXh0SWQ8X0NvbnRleHQ+IGltcGxlbWVudHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICAgIHRoaXMuaWQgPSBgX19jdHhfJHtTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpfWA7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGlzIGNvbnRleHQgZnJvbSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiB2YXVsdC4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UodmF1bHRQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgYXJnczogeyBpZDogdGhpcy5pZCB9LFxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFNlcmlhbGl6ZWQgdmlhIHRvU3RyaW5nKCkgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cbiAgICAgIGZuKHsgaWQgfSk6IHZvaWQge1xuICAgICAgICBpbnRlcmZhY2UgQ29udGV4dEhvbGRlciB7XG4gICAgICAgICAgX19vYnNpZGlhbkNvbnRleHRzX186IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvbGRlciA9IHdpbmRvdyBhcyBQYXJ0aWFsPENvbnRleHRIb2xkZXI+O1xuICAgICAgICBpZiAoaG9sZGVyLl9fb2JzaWRpYW5Db250ZXh0c19fKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBObyBvdGhlciB3YXkuXG4gICAgICAgICAgZGVsZXRlIGhvbGRlci5fX29ic2lkaWFuQ29udGV4dHNfX1tpZF07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZSxcbiAgICAgIC4uLih2YXVsdFBhdGggPT09IHVuZGVmaW5lZCA/IHt9IDogeyB2YXVsdFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGlzIGNvbnRleHQgaWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbnRleHQgaWQgaXMgZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRleHQgaWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZXh0IGlkLlxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGV4dCBpZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGV4dCBpZC5cbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFPQSxTQUFTLHNCQUFzQjtBQXdCeEIsTUFBTSxVQUErQztBQUFBLEVBQ3pDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLVixjQUFjO0FBQ25CLFVBQU0sY0FBYztBQUNwQixTQUFLLEtBQUssU0FBUyxPQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFBQSxFQUM3RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsUUFBUSxXQUFtQztBQUN0RCxVQUFNLGVBQWU7QUFBQSxNQUNuQixNQUFNLEVBQUUsSUFBSSxLQUFLLEdBQUc7QUFBQTtBQUFBLE1BRXBCLEdBQUcsRUFBRSxHQUFHLEdBQVM7QUFJZixjQUFNLFNBQVM7QUFDZixZQUFJLE9BQU8sc0JBQXNCO0FBRS9CLGlCQUFPLE9BQU8scUJBQXFCLEVBQUU7QUFBQSxRQUN2QztBQUFBLE1BQ0Y7QUFBQTtBQUFBLE1BRUEsMkJBQTJCO0FBQUEsTUFDM0IsR0FBSSxjQUFjLFNBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVTtBQUFBLElBQ2pELENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBYyxPQUFPLFlBQVksSUFBbUI7QUFDbEQsVUFBTSxLQUFLLFFBQVE7QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFNBQWlCO0FBQ3RCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxXQUFtQjtBQUN4QixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
*
|
|
4
|
+
* Contains utility functions for executing commands.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* A command part: either a plain string or an {@link ExecArg} with batched arguments.
|
|
8
|
+
*/
|
|
9
|
+
export type CommandPart = ExecArg | string;
|
|
10
|
+
/**
|
|
11
|
+
* A command argument that contains a list of args to be batched.
|
|
12
|
+
* If the expanded command exceeds the platform's max command length,
|
|
13
|
+
* the batched args are split into sequential executions.
|
|
14
|
+
*/
|
|
15
|
+
export interface ExecArg {
|
|
16
|
+
/**
|
|
17
|
+
* The arguments to batch.
|
|
18
|
+
*/
|
|
19
|
+
batchedArgs: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Options for {@link exec} that return detailed results.
|
|
23
|
+
*/
|
|
24
|
+
export interface ExecDetailedOptions extends ExecOption {
|
|
25
|
+
/**
|
|
26
|
+
* Must be `true` to receive detailed results.
|
|
27
|
+
*/
|
|
28
|
+
withDetails: true;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Options for executing a command.
|
|
32
|
+
*/
|
|
33
|
+
export interface ExecOption {
|
|
34
|
+
/**
|
|
35
|
+
* A current working folder for the command execution.
|
|
36
|
+
*/
|
|
37
|
+
readonly cwd?: string;
|
|
38
|
+
/**
|
|
39
|
+
* If `true`, suppresses the output of the command.
|
|
40
|
+
*/
|
|
41
|
+
readonly isQuiet?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* If `true`, ignores the exit code of the command.
|
|
44
|
+
*/
|
|
45
|
+
readonly shouldIgnoreExitCode?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* If `true`, returns detailed results.
|
|
48
|
+
*/
|
|
49
|
+
readonly shouldIncludeDetails?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* An input to be passed to the command.
|
|
52
|
+
*/
|
|
53
|
+
readonly stdin?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A result of {@link exec}.
|
|
57
|
+
*/
|
|
58
|
+
export interface ExecResult {
|
|
59
|
+
/**
|
|
60
|
+
* An exit code of the command. A value of `null` indicates that the process did not exit normally.
|
|
61
|
+
*/
|
|
62
|
+
exitCode: null | number;
|
|
63
|
+
/**
|
|
64
|
+
* A signal that caused the process to be terminated. A value of `null` indicates that no signal was received.
|
|
65
|
+
*/
|
|
66
|
+
exitSignal: NodeJS.Signals | null;
|
|
67
|
+
/**
|
|
68
|
+
* A standard error output from the command.
|
|
69
|
+
*/
|
|
70
|
+
stderr: string;
|
|
71
|
+
/**
|
|
72
|
+
* A standard output from the command.
|
|
73
|
+
*/
|
|
74
|
+
stdout: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Options for {@link exec} that return only stdout.
|
|
78
|
+
*/
|
|
79
|
+
export interface ExecSimpleOptions extends ExecOption {
|
|
80
|
+
/**
|
|
81
|
+
* Must be `false` or omitted to receive only stdout.
|
|
82
|
+
*/
|
|
83
|
+
withDetails?: false;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Executes a command.
|
|
87
|
+
*
|
|
88
|
+
* @param command - The command to execute. It can be a string or an array of strings.
|
|
89
|
+
* @param options - The options for the execution.
|
|
90
|
+
* @returns A {@link Promise} that resolves with the output of the command.
|
|
91
|
+
*/
|
|
92
|
+
export declare function exec(command: CommandPart[] | string, options?: ExecSimpleOptions): Promise<string>;
|
|
93
|
+
/**
|
|
94
|
+
* Executes a command.
|
|
95
|
+
*
|
|
96
|
+
* @param command - The command to execute. It can be a string or an array of strings.
|
|
97
|
+
* @param options - The options for the execution.
|
|
98
|
+
* @returns A {@link Promise} that resolves with ExecResult object.
|
|
99
|
+
*/
|
|
100
|
+
export declare function exec(command: CommandPart[] | string, options: ExecDetailedOptions): Promise<ExecResult>;
|
|
101
|
+
/**
|
|
102
|
+
* Converts an array of command-line arguments into a single command-line string
|
|
103
|
+
* using the `CommandLineToArgvW` convention.
|
|
104
|
+
*
|
|
105
|
+
* @param args - The array of command-line arguments to convert.
|
|
106
|
+
* @returns A string representing the command-line invocation.
|
|
107
|
+
*/
|
|
108
|
+
export declare function toCommandLine(args: string[]): string;
|