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,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var integration_global_setup_exports = {};
|
|
20
|
+
__export(integration_global_setup_exports, {
|
|
21
|
+
getTempVaultPath: () => getTempVaultPath,
|
|
22
|
+
setup: () => setup,
|
|
23
|
+
teardown: () => teardown
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(integration_global_setup_exports);
|
|
26
|
+
var import_node_fs = require("node:fs");
|
|
27
|
+
var import_promises = require("node:fs/promises");
|
|
28
|
+
var import_node_os = require("node:os");
|
|
29
|
+
var import_node_path = require("node:path");
|
|
30
|
+
var import_vitest = require("vitest");
|
|
31
|
+
var import_obsidian_cli = require("./obsidian-cli.cjs");
|
|
32
|
+
function getTempVaultPath() {
|
|
33
|
+
return (0, import_vitest.inject)("tempVaultPath");
|
|
34
|
+
}
|
|
35
|
+
const DIST_DEV = "dist/dev";
|
|
36
|
+
const DIST_BUILD = "dist/build";
|
|
37
|
+
const MAIN_JS = "main.js";
|
|
38
|
+
const OBSIDIAN_CONFIG_DIR = ".obsidian";
|
|
39
|
+
const PLUGINS_DIR = "plugins";
|
|
40
|
+
const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
|
|
41
|
+
let tempVaultPath;
|
|
42
|
+
async function setup(project) {
|
|
43
|
+
const projectRoot = findProjectRoot();
|
|
44
|
+
const distPath = await resolveDistPath(projectRoot);
|
|
45
|
+
const manifestJson = JSON.parse(await (0, import_promises.readFile)((0, import_node_path.join)(distPath, "manifest.json"), "utf-8"));
|
|
46
|
+
const pluginId = manifestJson.id;
|
|
47
|
+
const mainJs = (0, import_node_path.join)(distPath, MAIN_JS);
|
|
48
|
+
const buildStat = await (0, import_promises.stat)(mainJs);
|
|
49
|
+
console.warn(`Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
|
|
50
|
+
tempVaultPath = await (0, import_promises.mkdtemp)((0, import_node_path.join)((0, import_node_os.tmpdir)(), `${pluginId}-`));
|
|
51
|
+
const pluginDir = (0, import_node_path.join)(tempVaultPath, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
|
|
52
|
+
await (0, import_promises.mkdir)(pluginDir, { recursive: true });
|
|
53
|
+
await (0, import_promises.cp)(distPath, pluginDir, { recursive: true });
|
|
54
|
+
await (0, import_promises.writeFile)((0, import_node_path.join)(tempVaultPath, OBSIDIAN_CONFIG_DIR, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
|
|
55
|
+
await (0, import_obsidian_cli.evalInObsidian)({
|
|
56
|
+
args: { pluginId },
|
|
57
|
+
// eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
|
|
58
|
+
fn: async ({ app, pluginId: pluginId2 }) => {
|
|
59
|
+
await app.plugins.enablePluginAndSave(pluginId2);
|
|
60
|
+
},
|
|
61
|
+
shouldSkipPreflightChecks: true,
|
|
62
|
+
vaultPath: tempVaultPath
|
|
63
|
+
});
|
|
64
|
+
project.provide("tempVaultPath", tempVaultPath);
|
|
65
|
+
}
|
|
66
|
+
async function teardown() {
|
|
67
|
+
await (0, import_promises.rm)(tempVaultPath, { recursive: true });
|
|
68
|
+
}
|
|
69
|
+
function findProjectRoot() {
|
|
70
|
+
let dir = process.cwd();
|
|
71
|
+
while (true) {
|
|
72
|
+
if ((0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "package.json"))) {
|
|
73
|
+
return dir;
|
|
74
|
+
}
|
|
75
|
+
const parent = (0, import_node_path.join)(dir, "..");
|
|
76
|
+
if (parent === dir) {
|
|
77
|
+
throw new Error("Could not find project root (no package.json found).");
|
|
78
|
+
}
|
|
79
|
+
dir = parent;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function resolveDistPath(projectRoot) {
|
|
83
|
+
const devPath = (0, import_node_path.join)(projectRoot, DIST_DEV);
|
|
84
|
+
const buildPath = (0, import_node_path.join)(projectRoot, DIST_BUILD);
|
|
85
|
+
const devMainJs = (0, import_node_path.join)(devPath, MAIN_JS);
|
|
86
|
+
const buildMainJs = (0, import_node_path.join)(buildPath, MAIN_JS);
|
|
87
|
+
const devStat = (0, import_node_fs.existsSync)(devMainJs) ? await (0, import_promises.stat)(devMainJs) : null;
|
|
88
|
+
const buildStat = (0, import_node_fs.existsSync)(buildMainJs) ? await (0, import_promises.stat)(buildMainJs) : null;
|
|
89
|
+
if (devStat && buildStat) {
|
|
90
|
+
return devStat.mtime > buildStat.mtime ? devPath : buildPath;
|
|
91
|
+
}
|
|
92
|
+
if (devStat) {
|
|
93
|
+
return devPath;
|
|
94
|
+
}
|
|
95
|
+
if (buildStat) {
|
|
96
|
+
return buildPath;
|
|
97
|
+
}
|
|
98
|
+
throw new Error("No build found. Run `npm run build` or `npm run dev` first.");
|
|
99
|
+
}
|
|
100
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
101
|
+
0 && (module.exports = {
|
|
102
|
+
getTempVaultPath,
|
|
103
|
+
setup,
|
|
104
|
+
teardown
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uLWdsb2JhbC1zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBDb250YWlucyB0aGUgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBmdW5jdGlvbnMgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIG1rZHRlbXAsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgc3RhdCxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ3ZpdGVzdCc7XG5cbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGkuY2pzJztcblxuZGVjbGFyZSBtb2R1bGUgJ3ZpdGVzdCcge1xuICBpbnRlcmZhY2UgUHJvdmlkZWRDb250ZXh0IHtcbiAgICB0ZW1wVmF1bHRQYXRoOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyB0aGUgbWFuaWZlc3QgZmlsZSBmb3JtYXQgZm9yIE9ic2lkaWFuIHBsdWdpbnMuXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vZG9jcy5vYnNpZGlhbi5tZC9SZWZlcmVuY2UvTWFuaWZlc3R9XG4gKi9cbmludGVyZmFjZSBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yJ3MgbmFtZS5cbiAgICovXG4gIGF1dGhvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIFVSTCB0byB0aGUgYXV0aG9yJ3Mgd2Vic2l0ZS5cbiAgICovXG4gIGF1dGhvclVybD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB5b3VyIHBsdWdpbi5cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgVVJMIG9yIG11bHRpcGxlIFVSTHMgdG8gd2hlcmUgdGhlIHVzZXJzIGNhbiBzdXBwb3J0IHlvdXIgcHJvamVjdCBmaW5hbmNpYWxseS5cbiAgICovXG4gIGZ1bmRpbmdVcmw/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgeW91ciBwbHVnaW4uIFRoZSBJRCBjYW4ndCBjb250YWluIG9ic2lkaWFuLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB5b3VyIHBsdWdpbiB1c2VzIE5vZGVKUyBvciBFbGVjdHJvbiBBUElzLlxuICAgKi9cbiAgaXNEZXNrdG9wT25seTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gcmVxdWlyZWQgT2JzaWRpYW4gdmVyc2lvbi5cbiAgICovXG4gIG1pbkFwcFZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24sIHVzaW5nIFtTZW1hbnRpYyBWZXJzaW9uaW5nXShodHRwczovL3NlbXZlci5vcmcvKSBpbiB0aGUgZm9ybWF0IGB4LnkuemAuXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdGVtcG9yYXJ5IHZhdWx0IHBhdGggcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdGVtcG9yYXJ5IHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFZhdWx0UGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gaW5qZWN0KCd0ZW1wVmF1bHRQYXRoJyk7XG59XG5cbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG5sZXQgdGVtcFZhdWx0UGF0aDogc3RyaW5nO1xuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgc2V0dXAgZnVuY3Rpb24uXG4gKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgZW5hYmxlcyBpdCB2aWEgdGhlIE9ic2lkaWFuIENMSSxcbiAqIGFuZCBwcm92aWRlcyBgdGVtcFZhdWx0UGF0aGAgdG8gdGVzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3QgLSBUaGUgVml0ZXN0IHByb2plY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChwcm9qZWN0OiBUZXN0UHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGZpbmRQcm9qZWN0Um9vdCgpO1xuICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIE1hbmlmZXN0O1xuICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRTdGF0ID0gYXdhaXQgc3RhdChtYWluSnMpO1xuXG4gIGNvbnNvbGUud2FybihgVXNpbmcgJHtkaXN0UGF0aH0gKCR7YnVpbGRTdGF0Lm10aW1lLnRvSVNPU3RyaW5nKCl9KS4gSWYgb3V0ZGF0ZWQsIHJlYnVpbGQuYCk7XG5cbiAgdGVtcFZhdWx0UGF0aCA9IGF3YWl0IG1rZHRlbXAoam9pbih0bXBkaXIoKSwgYCR7cGx1Z2luSWR9LWApKTtcbiAgY29uc3QgcGx1Z2luRGlyID0gam9pbih0ZW1wVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICBhd2FpdCBta2RpcihwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBjcChkaXN0UGF0aCwgcGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4odGVtcFZhdWx0UGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgYXJnczogeyBwbHVnaW5JZCB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gTm8gYWN0dWFsIHNoYWRvd2luZyBhcyB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZXh0ZXJuYWxseS5cbiAgICBmbjogYXN5bmMgKHsgYXBwLCBwbHVnaW5JZCB9KSA9PiB7XG4gICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKHBsdWdpbklkKTtcbiAgICB9LFxuICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgdmF1bHRQYXRoOiB0ZW1wVmF1bHRQYXRoXG4gIH0pO1xuXG4gIHByb2plY3QucHJvdmlkZSgndGVtcFZhdWx0UGF0aCcsIHRlbXBWYXVsdFBhdGgpO1xufVxuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgdGVhcmRvd24gZnVuY3Rpb24uXG4gKlxuICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVhcmRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJtKHRlbXBWYXVsdFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXIsICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEscUJBQTJCO0FBQzNCLHNCQVFPO0FBQ1AscUJBQXVCO0FBQ3ZCLHVCQUFxQjtBQUNyQixvQkFBdUI7QUFFdkIsMEJBQStCO0FBaUV4QixTQUFTLG1CQUEyQjtBQUN6QyxhQUFPLHNCQUFPLGVBQWU7QUFDL0I7QUFFQSxNQUFNLFdBQVc7QUFDakIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUFFL0IsSUFBSTtBQVVKLGVBQXNCLE1BQU0sU0FBcUM7QUFDL0QsUUFBTSxjQUFjLGdCQUFnQjtBQUNwQyxRQUFNLFdBQVcsTUFBTSxnQkFBZ0IsV0FBVztBQUNsRCxRQUFNLGVBQWUsS0FBSyxNQUFNLFVBQU0sOEJBQVMsdUJBQUssVUFBVSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3hGLFFBQU0sV0FBVyxhQUFhO0FBRTlCLFFBQU0sYUFBUyx1QkFBSyxVQUFVLE9BQU87QUFDckMsUUFBTSxZQUFZLFVBQU0sc0JBQUssTUFBTTtBQUVuQyxVQUFRLEtBQUssU0FBUyxRQUFRLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQywwQkFBMEI7QUFFMUYsa0JBQWdCLFVBQU0sNkJBQVEsMkJBQUssdUJBQU8sR0FBRyxHQUFHLFFBQVEsR0FBRyxDQUFDO0FBQzVELFFBQU0sZ0JBQVksdUJBQUssZUFBZSxxQkFBcUIsYUFBYSxRQUFRO0FBQ2hGLFlBQU0sdUJBQU0sV0FBVyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQzFDLFlBQU0sb0JBQUcsVUFBVSxXQUFXLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDakQsWUFBTSwrQkFBVSx1QkFBSyxlQUFlLHFCQUFxQixzQkFBc0IsR0FBRyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUU1RyxZQUFNLG9DQUFlO0FBQUEsSUFDbkIsTUFBTSxFQUFFLFNBQVM7QUFBQTtBQUFBLElBRWpCLElBQUksT0FBTyxFQUFFLEtBQUssVUFBQUEsVUFBUyxNQUFNO0FBQy9CLFlBQU0sSUFBSSxRQUFRLG9CQUFvQkEsU0FBUTtBQUFBLElBQ2hEO0FBQUEsSUFDQSwyQkFBMkI7QUFBQSxJQUMzQixXQUFXO0FBQUEsRUFDYixDQUFDO0FBRUQsVUFBUSxRQUFRLGlCQUFpQixhQUFhO0FBQ2hEO0FBT0EsZUFBc0IsV0FBMEI7QUFDOUMsWUFBTSxvQkFBRyxlQUFlLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDN0M7QUFPQSxTQUFTLGtCQUEwQjtBQUNqQyxNQUFJLE1BQU0sUUFBUSxJQUFJO0FBR3RCLFNBQU8sTUFBTTtBQUNYLFlBQUksK0JBQVcsdUJBQUssS0FBSyxjQUFjLENBQUMsR0FBRztBQUN6QyxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sYUFBUyx1QkFBSyxLQUFLLElBQUk7QUFDN0IsUUFBSSxXQUFXLEtBQUs7QUFDbEIsWUFBTSxJQUFJLE1BQU0sc0RBQXNEO0FBQUEsSUFDeEU7QUFDQSxVQUFNO0FBQUEsRUFDUjtBQUNGO0FBV0EsZUFBZSxnQkFBZ0IsYUFBc0M7QUFDbkUsUUFBTSxjQUFVLHVCQUFLLGFBQWEsUUFBUTtBQUMxQyxRQUFNLGdCQUFZLHVCQUFLLGFBQWEsVUFBVTtBQUM5QyxRQUFNLGdCQUFZLHVCQUFLLFNBQVMsT0FBTztBQUN2QyxRQUFNLGtCQUFjLHVCQUFLLFdBQVcsT0FBTztBQUMzQyxRQUFNLGNBQVUsMkJBQVcsU0FBUyxJQUFJLFVBQU0sc0JBQUssU0FBUyxJQUFJO0FBQ2hFLFFBQU0sZ0JBQVksMkJBQVcsV0FBVyxJQUFJLFVBQU0sc0JBQUssV0FBVyxJQUFJO0FBRXRFLE1BQUksV0FBVyxXQUFXO0FBQ3hCLFdBQU8sUUFBUSxRQUFRLFVBQVUsUUFBUSxVQUFVO0FBQUEsRUFDckQ7QUFFQSxNQUFJLFNBQVM7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksV0FBVztBQUNiLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJLE1BQU0sNkRBQTZEO0FBQy9FOyIsCiAgIm5hbWVzIjogWyJwbHVnaW5JZCJdCn0K
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
*
|
|
4
|
+
* Contains the global setup and teardown functions for integration tests.
|
|
5
|
+
*/
|
|
6
|
+
import type { TestProject } from 'vitest/node';
|
|
7
|
+
declare module 'vitest' {
|
|
8
|
+
interface ProvidedContext {
|
|
9
|
+
tempVaultPath: string;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns the temporary vault path provided by the global setup.
|
|
14
|
+
*
|
|
15
|
+
* @returns The absolute path to the temporary vault.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getTempVaultPath(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Vitest global setup function.
|
|
20
|
+
*
|
|
21
|
+
* Copies the built plugin into a temporary vault, enables it via the Obsidian CLI,
|
|
22
|
+
* and provides `tempVaultPath` to tests.
|
|
23
|
+
*
|
|
24
|
+
* @param project - The Vitest project.
|
|
25
|
+
*/
|
|
26
|
+
export declare function setup(project: TestProject): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Vitest global teardown function.
|
|
29
|
+
*
|
|
30
|
+
* Removes the temporary vault created during setup.
|
|
31
|
+
*/
|
|
32
|
+
export declare function teardown(): Promise<void>;
|
|
@@ -0,0 +1,46 @@
|
|
|
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 json_with_functions_exports = {};
|
|
20
|
+
__export(json_with_functions_exports, {
|
|
21
|
+
jsonWithFunctions: () => jsonWithFunctions
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(json_with_functions_exports);
|
|
24
|
+
var import_function_expression = require("./function-expression.cjs");
|
|
25
|
+
function jsonWithFunctions(value) {
|
|
26
|
+
const functionMap = /* @__PURE__ */ new Map();
|
|
27
|
+
const JSON_INDENT = 2;
|
|
28
|
+
const json = JSON.stringify(value, (_key, val) => {
|
|
29
|
+
if (typeof val === "function") {
|
|
30
|
+
const placeholder = `__fn_${String(functionMap.size)}__`;
|
|
31
|
+
functionMap.set(placeholder, (0, import_function_expression.getFunctionExpressionString)(val));
|
|
32
|
+
return placeholder;
|
|
33
|
+
}
|
|
34
|
+
return val;
|
|
35
|
+
}, JSON_INDENT);
|
|
36
|
+
let result = json;
|
|
37
|
+
for (const [placeholder, fnSource] of functionMap) {
|
|
38
|
+
result = result.replace(`"${placeholder}"`, fnSource);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
43
|
+
0 && (module.exports = {
|
|
44
|
+
jsonWithFunctions
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2pzb24td2l0aC1mdW5jdGlvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogU2VyaWFsaXplcyBhIHZhbHVlIHRvIEpTT04sIHByZXNlcnZpbmcgZnVuY3Rpb24gYm9kaWVzIGFzIHJhdyBzb3VyY2UgdGV4dC5cbiAqL1xuXG5pbXBvcnQgeyBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9uLWV4cHJlc3Npb24uY2pzJztcblxuLyoqXG4gKiBTZXJpYWxpemVzIGEgdmFsdWUgdG8gSlNPTiB3aXRoIGZ1bmN0aW9uIGJvZGllcyBpbmNsdWRlZCBhcyByYXcgc291cmNlIHRleHQuXG4gKlxuICogU3RhbmRhcmQgYEpTT04uc3RyaW5naWZ5YCBvbWl0cyBmdW5jdGlvbnMgZW50aXJlbHkuIFRoaXMgaGVscGVyIHJlcGxhY2VzXG4gKiBlYWNoIGZ1bmN0aW9uIHZhbHVlIHdpdGggYSB1bmlxdWUgcGxhY2Vob2xkZXIgZHVyaW5nIHN0cmluZ2lmaWNhdGlvbixcbiAqIHRoZW4gc3Vic3RpdHV0ZXMgdGhlIHBsYWNlaG9sZGVycyB3aXRoIHRoZSByZWFsIGB0b1N0cmluZygpYCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlcmlhbGl6ZS5cbiAqIEByZXR1cm5zIEEgSlNPTi1saWtlIHN0cmluZyB3aGVyZSBmdW5jdGlvbnMgYXBwZWFyIGFzIHRoZWlyIHNvdXJjZSB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbldpdGhGdW5jdGlvbnModmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBmdW5jdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgSlNPTl9JTkRFTlQgPSAyO1xuICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUsIChfa2V5LCB2YWw6IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBgX19mbl8ke1N0cmluZyhmdW5jdGlvbk1hcC5zaXplKX1fX2A7XG4gICAgICBmdW5jdGlvbk1hcC5zZXQocGxhY2Vob2xkZXIsIGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyh2YWwpKTtcbiAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfSwgSlNPTl9JTkRFTlQpO1xuXG4gIGxldCByZXN1bHQgPSBqc29uO1xuICBmb3IgKGNvbnN0IFtwbGFjZWhvbGRlciwgZm5Tb3VyY2VdIG9mIGZ1bmN0aW9uTWFwKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoYFwiJHtwbGFjZWhvbGRlcn1cImAsIGZuU291cmNlKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUEsaUNBQTRDO0FBWXJDLFNBQVMsa0JBQWtCLE9BQXdCO0FBQ3hELFFBQU0sY0FBYyxvQkFBSSxJQUFvQjtBQUU1QyxRQUFNLGNBQWM7QUFDcEIsUUFBTSxPQUFPLEtBQUssVUFBVSxPQUFPLENBQUMsTUFBTSxRQUFpQjtBQUN6RCxRQUFJLE9BQU8sUUFBUSxZQUFZO0FBQzdCLFlBQU0sY0FBYyxRQUFRLE9BQU8sWUFBWSxJQUFJLENBQUM7QUFDcEQsa0JBQVksSUFBSSxpQkFBYSx3REFBNEIsR0FBRyxDQUFDO0FBQzdELGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTztBQUFBLEVBQ1QsR0FBRyxXQUFXO0FBRWQsTUFBSSxTQUFTO0FBQ2IsYUFBVyxDQUFDLGFBQWEsUUFBUSxLQUFLLGFBQWE7QUFDakQsYUFBUyxPQUFPLFFBQVEsSUFBSSxXQUFXLEtBQUssUUFBUTtBQUFBLEVBQ3REO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
*
|
|
4
|
+
* Serializes a value to JSON, preserving function bodies as raw source text.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Serializes a value to JSON with function bodies included as raw source text.
|
|
8
|
+
*
|
|
9
|
+
* Standard `JSON.stringify` omits functions entirely. This helper replaces
|
|
10
|
+
* each function value with a unique placeholder during stringification,
|
|
11
|
+
* then substitutes the placeholders with the real `toString()` output.
|
|
12
|
+
*
|
|
13
|
+
* @param value - The value to serialize.
|
|
14
|
+
* @returns A JSON-like string where functions appear as their source text.
|
|
15
|
+
*/
|
|
16
|
+
export declare function jsonWithFunctions(value: unknown): string;
|
|
@@ -0,0 +1,191 @@
|
|
|
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 obsidian_cli_exports = {};
|
|
30
|
+
__export(obsidian_cli_exports, {
|
|
31
|
+
evalInObsidian: () => evalInObsidian
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(obsidian_cli_exports);
|
|
34
|
+
var import_node_fs = require("node:fs");
|
|
35
|
+
var import_node_process = __toESM(require("node:process"), 1);
|
|
36
|
+
var import_exec = require("./exec.cjs");
|
|
37
|
+
var import_function_expression = require("./function-expression.cjs");
|
|
38
|
+
var import_json_with_functions = require("./json-with-functions.cjs");
|
|
39
|
+
var import_obsidian_config = require("./obsidian-config.cjs");
|
|
40
|
+
const NO_OUTPUT = "(no output)";
|
|
41
|
+
const UNABLE_TO_FIND_OBSIDIAN = "unable to find Obsidian";
|
|
42
|
+
const AUTO_START_POLL_INTERVAL_MS = 2e3;
|
|
43
|
+
const AUTO_START_TIMEOUT_MS = 3e4;
|
|
44
|
+
async function evalInObsidian(params) {
|
|
45
|
+
const { args = {}, contextId, fn, shouldSkipPreflightChecks = false, vaultPath } = params;
|
|
46
|
+
const cwd = vaultPath ?? import_node_process.default.cwd();
|
|
47
|
+
if (vaultPath !== void 0 && !(0, import_node_fs.existsSync)(vaultPath)) {
|
|
48
|
+
throw new Error(`Vault path does not exist: ${vaultPath}`);
|
|
49
|
+
}
|
|
50
|
+
if (!shouldSkipPreflightChecks) {
|
|
51
|
+
if (!(0, import_obsidian_config.isVaultRegistered)(cwd)) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
`Vault is not registered in Obsidian: ${cwd}. Register the vault first with registerVault() or TempVault.register().`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
if (!(0, import_obsidian_config.isCliEnabled)()) {
|
|
57
|
+
throw new Error("Obsidian CLI is disabled. Enable it in Obsidian Settings \u2192 General \u2192 CLI.");
|
|
58
|
+
}
|
|
59
|
+
await assertObsidianCliAvailable();
|
|
60
|
+
}
|
|
61
|
+
const SLICE_START = 2;
|
|
62
|
+
const randomSuffix = String(Math.random()).slice(SLICE_START);
|
|
63
|
+
const contextExpr = contextId ? `((window.__obsidianContexts__ ??= {})["${String(contextId)}"] ??= {})` : "{}";
|
|
64
|
+
const expression = `
|
|
65
|
+
(async () => {
|
|
66
|
+
const fn${randomSuffix} = ${(0, import_function_expression.getFunctionExpressionString)(fn)};
|
|
67
|
+
const obsidianModule${randomSuffix} = await (async () => {
|
|
68
|
+
if (!app.workspace.app.workspace.layoutReady) {
|
|
69
|
+
await new Promise((resolve) => app.workspace.onLayoutReady(resolve));
|
|
70
|
+
}
|
|
71
|
+
if (!app.plugins.isEnabled()) {
|
|
72
|
+
await app.plugins.setEnable(true);
|
|
73
|
+
}
|
|
74
|
+
${(0, import_function_expression.getFunctionExpressionString)(getObsidianModulePluginFn)}
|
|
75
|
+
${(0, import_function_expression.getFunctionExpressionString)(getObsidianModule)}
|
|
76
|
+
return await getObsidianModule();
|
|
77
|
+
})();
|
|
78
|
+
const args${randomSuffix} = ${(0, import_json_with_functions.jsonWithFunctions)(args)};
|
|
79
|
+
const context${randomSuffix} = ${contextExpr};
|
|
80
|
+
const fullArgs${randomSuffix} = Object.assign(args${randomSuffix}, { app, obsidianModule: obsidianModule${randomSuffix}, context: context${randomSuffix} });
|
|
81
|
+
return JSON.stringify(await fn${randomSuffix}(fullArgs${randomSuffix}));
|
|
82
|
+
})()`;
|
|
83
|
+
const command = ["obsidian", "eval", `code=${expression}`];
|
|
84
|
+
let resultStr;
|
|
85
|
+
try {
|
|
86
|
+
resultStr = await (0, import_exec.exec)(command, { cwd, isQuiet: true });
|
|
87
|
+
} catch (error) {
|
|
88
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
89
|
+
if (message.includes(UNABLE_TO_FIND_OBSIDIAN)) {
|
|
90
|
+
resultStr = await ensureObsidianRunning({ command, cwd });
|
|
91
|
+
} else {
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (resultStr === "" || resultStr === "Vault not found.") {
|
|
96
|
+
throw new Error(`Unexpected empty response from Obsidian CLI for path: ${cwd}`);
|
|
97
|
+
}
|
|
98
|
+
const resultJson = resultStr.startsWith("=> ") ? resultStr.slice("=> ".length) : resultStr;
|
|
99
|
+
if (resultJson === NO_OUTPUT) {
|
|
100
|
+
return void 0;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
return JSON.parse(resultJson);
|
|
104
|
+
} catch {
|
|
105
|
+
throw new Error(`evalInObsidian: Obsidian returned non-JSON output: ${resultStr}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function assertObsidianCliAvailable() {
|
|
109
|
+
const command = import_node_process.default.platform === "win32" ? "where.exe obsidian.com" : "which obsidian";
|
|
110
|
+
try {
|
|
111
|
+
await (0, import_exec.exec)(command, { isQuiet: true });
|
|
112
|
+
} catch {
|
|
113
|
+
throw new Error("Obsidian CLI is not available. Ensure Obsidian is installed and its CLI is in your PATH.");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function ensureObsidianRunning(params) {
|
|
117
|
+
console.warn("Obsidian is not running. Starting Obsidian...");
|
|
118
|
+
const vaultId = (0, import_obsidian_config.getVaultId)(params.cwd);
|
|
119
|
+
const uri = vaultId ? `obsidian://open?vault=${vaultId}` : "obsidian://open";
|
|
120
|
+
try {
|
|
121
|
+
await (0, import_exec.exec)(getOpenUriCommand(uri), { isQuiet: true });
|
|
122
|
+
} catch {
|
|
123
|
+
}
|
|
124
|
+
const deadline = Date.now() + AUTO_START_TIMEOUT_MS;
|
|
125
|
+
while (Date.now() < deadline) {
|
|
126
|
+
await new Promise((r) => {
|
|
127
|
+
setTimeout(r, AUTO_START_POLL_INTERVAL_MS);
|
|
128
|
+
});
|
|
129
|
+
try {
|
|
130
|
+
return await (0, import_exec.exec)(params.command, { cwd: params.cwd, isQuiet: true });
|
|
131
|
+
} catch (error) {
|
|
132
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
133
|
+
if (!message.includes(UNABLE_TO_FIND_OBSIDIAN)) {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
throw new Error(`Obsidian did not start within ${String(AUTO_START_TIMEOUT_MS)}ms.`);
|
|
139
|
+
}
|
|
140
|
+
async function getObsidianModule() {
|
|
141
|
+
const app = window.app;
|
|
142
|
+
const obsidianModuleHolder = app;
|
|
143
|
+
if (obsidianModuleHolder.obsidianModule) {
|
|
144
|
+
return obsidianModuleHolder.obsidianModule;
|
|
145
|
+
}
|
|
146
|
+
const SLICE_START = 2;
|
|
147
|
+
const randomSuffix = String(Math.random()).slice(SLICE_START);
|
|
148
|
+
const tempModuleName = `get-obsidian-module-${randomSuffix}`;
|
|
149
|
+
const dir = `${app.vault.configDir}/plugins/${tempModuleName}`;
|
|
150
|
+
app.plugins.manifests[tempModuleName] = {
|
|
151
|
+
author: "",
|
|
152
|
+
description: "",
|
|
153
|
+
dir,
|
|
154
|
+
id: tempModuleName,
|
|
155
|
+
isDesktopOnly: true,
|
|
156
|
+
minAppVersion: "",
|
|
157
|
+
name: tempModuleName,
|
|
158
|
+
version: ""
|
|
159
|
+
};
|
|
160
|
+
await app.vault.adapter.mkdir(dir);
|
|
161
|
+
await app.vault.adapter.write(`${dir}/main.js`, `(${String(getObsidianModulePluginFn)})();`);
|
|
162
|
+
await app.plugins.loadPlugin(tempModuleName);
|
|
163
|
+
await app.plugins.uninstallPlugin(tempModuleName);
|
|
164
|
+
if (obsidianModuleHolder.obsidianModule) {
|
|
165
|
+
return obsidianModuleHolder.obsidianModule;
|
|
166
|
+
}
|
|
167
|
+
throw new Error("Failed to load obsidian module");
|
|
168
|
+
}
|
|
169
|
+
function getObsidianModulePluginFn() {
|
|
170
|
+
const app = window.app;
|
|
171
|
+
const obsidianModuleHolder = app;
|
|
172
|
+
const pluginRequire = require;
|
|
173
|
+
const pluginExports = exports;
|
|
174
|
+
const obsidianModule = pluginRequire("obsidian");
|
|
175
|
+
obsidianModuleHolder.obsidianModule = obsidianModule;
|
|
176
|
+
pluginExports.default = obsidianModule.Plugin;
|
|
177
|
+
}
|
|
178
|
+
function getOpenUriCommand(uri) {
|
|
179
|
+
if (import_node_process.default.platform === "win32") {
|
|
180
|
+
return `start "" "${uri}"`;
|
|
181
|
+
}
|
|
182
|
+
if (import_node_process.default.platform === "darwin") {
|
|
183
|
+
return `open "${uri}"`;
|
|
184
|
+
}
|
|
185
|
+
return `xdg-open "${uri}"`;
|
|
186
|
+
}
|
|
187
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
188
|
+
0 && (module.exports = {
|
|
189
|
+
evalInObsidian
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbnNpZGUgYSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSB0aGUgT2JzaWRpYW4gQ0xJLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLW5hbWVzcGFjZSAtLSBXZSBuZWVkIHRvIHJlZmVyZW5jZSBgb2JzaWRpYW5gIG1vZHVsZS5cbmltcG9ydCB0eXBlICogYXMgb2JzaWRpYW4gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICBDb250ZXh0QXJncyxcbiAgQ29udGV4dElkXG59IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9uLWV4cHJlc3Npb24uY2pzJztcbmltcG9ydCB7IGpzb25XaXRoRnVuY3Rpb25zIH0gZnJvbSAnLi9qc29uLXdpdGgtZnVuY3Rpb25zLmNqcyc7XG5pbXBvcnQge1xuICBnZXRWYXVsdElkLFxuICBpc0NsaUVuYWJsZWQsXG4gIGlzVmF1bHRSZWdpc3RlcmVkXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLmNqcyc7XG5cbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfTVMgPSAyMDAwO1xuY29uc3QgQVVUT19TVEFSVF9USU1FT1VUX01TID0gMzAwMDA7XG5cbi8qKlxuICogQ29tbW9uIGFyZ3VtZW50cyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHRvIGV2ZXJ5IHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4ge0BsaW5rIEFwcH0gaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGBvYnNpZGlhbmAgbW9kdWxlLCByZXNvbHZlZCBhdCBydW50aW1lIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAgICovXG4gIG9ic2lkaWFuTW9kdWxlOiB0eXBlb2Ygb2JzaWRpYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzIGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiB7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4gVmFsdWVzIG1heSBpbmNsdWRlIGZ1bmN0aW9ucyBcdTIwMTRcbiAgICogdGhleSBhcmUgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgLlxuICAgKi9cbiAgYXJncz86IEFyZ3M7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENvbnRleHRJZH0gbGlua2luZyB0aGlzIGNhbGwgdG8gYSBwZXJzaXN0ZW50IHN0b3JlIG9uIGB3aW5kb3dgXG4gICAqIGluIHRoZSBPYnNpZGlhbiBwcm9jZXNzLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSB0eXBlZCBgY29udGV4dGAgb2JqZWN0XG4gICAqIHRoYXQgc3Vydml2ZXMgYWNyb3NzIGNhbGxzIHNoYXJpbmcgdGhlIHNhbWUgSUQuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYGNvbnRleHRgIGlzIGEgZnJlc2ggZW1wdHkgb2JqZWN0IGVhY2ggY2FsbC5cbiAgICovXG4gIGNvbnRleHRJZD86IFRDb250ZXh0SWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSBpbiB0aGUgT2JzaWRpYW4gY29udGV4dC5cbiAgICovXG4gIGZuKGFyZ3M6IEFyZ3MgJiBDb21tb25BcmdzICYgQ29udGV4dEFyZ3M8VENvbnRleHRJZD4pOiBQcm9taXNhYmxlPFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIFNraXBzIHByZS1mbGlnaHQgY2hlY2tzICh2YXVsdCByZWdpc3RyYXRpb24sIENMSSBhdmFpbGFiaWxpdHkpLlxuICAgKiBVc2VkIGludGVybmFsbHkgYnkgdmF1bHQgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIE9ic2lkaWFuIHZhdWx0LiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwbGFpbiBvYmplY3Qgd2l0aCBzdHJpbmcga2V5cy5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY09iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIEV2YWx1YXRlcyBhIGZ1bmN0aW9uIGluc2lkZSB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZVxuICogdmlhIHRoZSBPYnNpZGlhbiBDTEkgYW5kIHJldHVybnMgdGhlIHBhcnNlZCByZXN1bHQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGFuIGFyZ3Mgb2JqZWN0IHRoYXQgaW5jbHVkZXMgYGFwcGAsIGBvYnNpZGlhbk1vZHVsZWAsXG4gKiBgY29udGV4dGAsIGFuZCBhbnkgYWRkaXRpb25hbCBgYXJnc2AgcGFzc2VkIGJ5IHRoZSBjYWxsZXIuXG4gKiBJdCBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGludm9rZWQgYXMgYW4gSUlGRS5cbiAqIFRoZSBmdW5jdGlvbiBtdXN0IGJlIHNlbGYtY29udGFpbmVkIFx1MjAxNCBjbG9zdXJlcyBvdmVyIGxvY2FsIHZhcmlhYmxlcyB3aWxsIG5vdCB3b3JrLlxuICogUGFzcyBhbnkgbmVlZGVkIHZhbHVlcyBhcyBgYXJnc2AgXHUyMDE0IHRoZXkgYXJlIEpTT04tc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIG9uIHRoZSBPYnNpZGlhbiBzaWRlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYEpTT04uc3RyaW5naWZ5YCdkIG9uIHRoZSBPYnNpZGlhbiBzaWRlIGFuZCBwYXJzZWQgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgZm5gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbEluT2JzaWRpYW48QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gIHBhcmFtczogRXZhbEluT2JzaWRpYW5QYXJhbXM8QXJncywgUmVzdWx0LCBUQ29udGV4dElkPlxuKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAtLSBgZm5gIGNhbiBiZSB1bmJvdW5kLlxuICBjb25zdCB7IGFyZ3MgPSB7fSwgY29udGV4dElkLCBmbiwgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrcyA9IGZhbHNlLCB2YXVsdFBhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgY3dkID0gdmF1bHRQYXRoID8/IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gQ2hlY2sgMTogVmF1bHQgcGF0aCBleGlzdHMgb24gZGlzay5cbiAgaWYgKHZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmICFleGlzdHNTeW5jKHZhdWx0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IHBhdGggZG9lcyBub3QgZXhpc3Q6ICR7dmF1bHRQYXRofWApO1xuICB9XG5cbiAgaWYgKCFzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzKSB7XG4gICAgLy8gQ2hlY2sgMjogVmF1bHQgaXMgcmVnaXN0ZXJlZCBpbiBPYnNpZGlhbi5cbiAgICBpZiAoIWlzVmF1bHRSZWdpc3RlcmVkKGN3ZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIE9ic2lkaWFuOiAke2N3ZH0uIFJlZ2lzdGVyIHRoZSB2YXVsdCBmaXJzdCB3aXRoIHJlZ2lzdGVyVmF1bHQoKSBvciBUZW1wVmF1bHQucmVnaXN0ZXIoKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIDM6IENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgIGlmICghaXNDbGlFbmFibGVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIGRpc2FibGVkLiBFbmFibGUgaXQgaW4gT2JzaWRpYW4gU2V0dGluZ3MgXFx1MjE5MiBHZW5lcmFsIFxcdTIxOTIgQ0xJLicpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIDQ6IE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgaW4gUEFUSC5cbiAgICBhd2FpdCBhc3NlcnRPYnNpZGlhbkNsaUF2YWlsYWJsZSgpO1xuICB9XG5cbiAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICBjb25zdCByYW5kb21TdWZmaXggPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICBjb25zdCBjb250ZXh0RXhwciA9IGNvbnRleHRJZFxuICAgID8gYCgod2luZG93Ll9fb2JzaWRpYW5Db250ZXh0c19fID8/PSB7fSlbXCIke1N0cmluZyhjb250ZXh0SWQpfVwiXSA/Pz0ge30pYFxuICAgIDogJ3t9JztcbiAgY29uc3QgZXhwcmVzc2lvbiA9IGBcbihhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGZuJHtyYW5kb21TdWZmaXh9ID0gJHtnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoZm4pfTtcbiAgY29uc3Qgb2JzaWRpYW5Nb2R1bGUke3JhbmRvbVN1ZmZpeH0gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmICghYXBwLndvcmtzcGFjZS5hcHAud29ya3NwYWNlLmxheW91dFJlYWR5KSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHJlc29sdmUpKTtcbiAgICB9XG4gICAgaWYgKCFhcHAucGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuc2V0RW5hYmxlKHRydWUpO1xuICAgIH1cbiAgICAke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhnZXRPYnNpZGlhbk1vZHVsZVBsdWdpbkZuKX1cbiAgICAke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhnZXRPYnNpZGlhbk1vZHVsZSl9XG4gICAgcmV0dXJuIGF3YWl0IGdldE9ic2lkaWFuTW9kdWxlKCk7XG4gIH0pKCk7XG4gIGNvbnN0IGFyZ3Mke3JhbmRvbVN1ZmZpeH0gPSAke2pzb25XaXRoRnVuY3Rpb25zKGFyZ3MpfTtcbiAgY29uc3QgY29udGV4dCR7cmFuZG9tU3VmZml4fSA9ICR7Y29udGV4dEV4cHJ9O1xuICBjb25zdCBmdWxsQXJncyR7cmFuZG9tU3VmZml4fSA9IE9iamVjdC5hc3NpZ24oYXJncyR7cmFuZG9tU3VmZml4fSwgeyBhcHAsIG9ic2lkaWFuTW9kdWxlOiBvYnNpZGlhbk1vZHVsZSR7cmFuZG9tU3VmZml4fSwgY29udGV4dDogY29udGV4dCR7cmFuZG9tU3VmZml4fSB9KTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGF3YWl0IGZuJHtyYW5kb21TdWZmaXh9KGZ1bGxBcmdzJHtyYW5kb21TdWZmaXh9KSk7XG59KSgpYDtcblxuICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsICdldmFsJywgYGNvZGU9JHtleHByZXNzaW9ufWBdO1xuXG4gIGxldCByZXN1bHRTdHI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICByZXN1bHRTdHIgPSBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAvLyBDaGVjayA1OiBPYnNpZGlhbiBpcyBub3QgcnVubmluZyBcdTIwMTQgYXV0by1zdGFydCBpdC5cbiAgICAgIHJlc3VsdFN0ciA9IGF3YWl0IGVuc3VyZU9ic2lkaWFuUnVubmluZyh7IGNvbW1hbmQsIGN3ZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlc3VsdFN0ciA9PT0gJycgfHwgcmVzdWx0U3RyID09PSAnVmF1bHQgbm90IGZvdW5kLicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZW1wdHkgcmVzcG9uc2UgZnJvbSBPYnNpZGlhbiBDTEkgZm9yIHBhdGg6ICR7Y3dkfWApO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0SnNvbiA9IHJlc3VsdFN0ci5zdGFydHNXaXRoKCc9PiAnKSA/IHJlc3VsdFN0ci5zbGljZSgnPT4gJy5sZW5ndGgpIDogcmVzdWx0U3RyO1xuICBpZiAocmVzdWx0SnNvbiA9PT0gTk9fT1VUUFVUKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSZXN1bHQ7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdEpzb24pIGFzIFJlc3VsdDtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBldmFsSW5PYnNpZGlhbjogT2JzaWRpYW4gcmV0dXJuZWQgbm9uLUpTT04gb3V0cHV0OiAke3Jlc3VsdFN0cn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBPYnNpZGlhbiBDTEkgYmluYXJ5IGlzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtIFBBVEguXG4gKlxuICogQHRocm93cyBJZiB0aGUgQ0xJIGJpbmFyeSBpcyBub3QgZm91bmQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydE9ic2lkaWFuQ2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICd3aGVyZS5leGUgb2JzaWRpYW4uY29tJyA6ICd3aGljaCBvYnNpZGlhbic7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICB9XG59XG5cbi8qKlxuICogTGF1bmNoZXMgT2JzaWRpYW4gdmlhIHRoZSBgb2JzaWRpYW46Ly9gIFVSSSBwcm90b2NvbCBhbmQgcmV0cmllcyB0aGUgZXZhbFxuICogdW50aWwgT2JzaWRpYW4gYmVjb21lcyBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBleGVjIHBhcmFtZXRlcnMgZm9yIHRoZSBldmFsIGNvbW1hbmQuXG4gKiBAcGFyYW0gcGFyYW1zLmNvbW1hbmQgLSBUaGUgQ0xJIGNvbW1hbmQgYXJyYXkgdG8gcmV0cnkuXG4gKiBAcGFyYW0gcGFyYW1zLmN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGV2YWwgY29tbWFuZC5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgc3RyaW5nIGZyb20gdGhlIHN1Y2Nlc3NmdWwgZXZhbC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlT2JzaWRpYW5SdW5uaW5nKHBhcmFtczogeyBjb21tYW5kOiBzdHJpbmdbXTsgY3dkOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnNvbGUud2FybignT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQocGFyYW1zLmN3ZCk7XG4gIGNvbnN0IHVyaSA9IHZhdWx0SWQgPyBgb2JzaWRpYW46Ly9vcGVuP3ZhdWx0PSR7dmF1bHRJZH1gIDogJ29ic2lkaWFuOi8vb3Blbic7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKGdldE9wZW5VcmlDb21tYW5kKHVyaSksIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gVGhlIG9wZW4gY29tbWFuZCBtYXkgZmFpbCBvbiBzb21lIHN5c3RlbXMgXHUyMDE0IHdlJ2xsIHN0aWxsIHRyeSBwb2xsaW5nLlxuICB9XG5cbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVVUT19TVEFSVF9USU1FT1VUX01TO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHtcbiAgICAgIHNldFRpbWVvdXQociwgQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX01TKTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWMocGFyYW1zLmNvbW1hbmQsIHsgY3dkOiBwYXJhbXMuY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgaWYgKCFtZXNzYWdlLmluY2x1ZGVzKFVOQUJMRV9UT19GSU5EX09CU0lESUFOKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9NUyl9bXMuYCk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBTZXJpYWxpemVkIHZpYSB0b1N0cmluZygpIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MsIG5vdCBpbiBOb2RlLiBDb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLiAqL1xuXG4vKipcbiAqIEluamVjdGVkIGludG8gdGhlIE9ic2lkaWFuIHByb2Nlc3MgdG8gcmVzb2x2ZSB0aGUgYG9ic2lkaWFuYCBtb2R1bGUuXG4gKiBVc2VzIGEgY2FjaGVkIHZhbHVlIG9uIGBhcHBgIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGluc3RhbGxzIGEgdGVtcG9yYXJ5XG4gKiBwbHVnaW4gdGhhdCBjYWxscyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAgYW5kIGNhY2hlcyB0aGUgcmVzdWx0LlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqIGBnZXRPYnNpZGlhbk1vZHVsZVBsdWdpbkZuYCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNhbWUgc2NvcGVcbiAqICh0aGUgZ2VuZXJhdGVkIElJRkUgaGFuZGxlcyB0aGlzKS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYG9ic2lkaWFuYCBtb2R1bGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE9ic2lkaWFuTW9kdWxlKCk6IFByb21pc2U8dHlwZW9mIG9ic2lkaWFuPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBXZSBuZWVkIGdsb2JhbCBgYXBwYCB2YXJpYWJsZS5cbiAgY29uc3QgYXBwID0gd2luZG93LmFwcDtcbiAgaW50ZXJmYWNlIE9ic2lkaWFuTW9kdWxlSG9sZGVyIHtcbiAgICBvYnNpZGlhbk1vZHVsZTogdHlwZW9mIG9ic2lkaWFuO1xuICB9XG4gIGNvbnN0IG9ic2lkaWFuTW9kdWxlSG9sZGVyID0gYXBwIGFzIFBhcnRpYWw8T2JzaWRpYW5Nb2R1bGVIb2xkZXI+O1xuICBpZiAob2JzaWRpYW5Nb2R1bGVIb2xkZXIub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICByZXR1cm4gb2JzaWRpYW5Nb2R1bGVIb2xkZXIub2JzaWRpYW5Nb2R1bGU7XG4gIH1cbiAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICBjb25zdCByYW5kb21TdWZmaXggPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICBjb25zdCB0ZW1wTW9kdWxlTmFtZSA9IGBnZXQtb2JzaWRpYW4tbW9kdWxlLSR7cmFuZG9tU3VmZml4fWA7XG4gIGNvbnN0IGRpciA9IGAke2FwcC52YXVsdC5jb25maWdEaXJ9L3BsdWdpbnMvJHt0ZW1wTW9kdWxlTmFtZX1gO1xuICBhcHAucGx1Z2lucy5tYW5pZmVzdHNbdGVtcE1vZHVsZU5hbWVdID0ge1xuICAgIGF1dGhvcjogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIGRpcixcbiAgICBpZDogdGVtcE1vZHVsZU5hbWUsXG4gICAgaXNEZXNrdG9wT25seTogdHJ1ZSxcbiAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICBuYW1lOiB0ZW1wTW9kdWxlTmFtZSxcbiAgICB2ZXJzaW9uOiAnJ1xuICB9O1xuICBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5ta2RpcihkaXIpO1xuICBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJ9L21haW4uanNgLCBgKCR7U3RyaW5nKGdldE9ic2lkaWFuTW9kdWxlUGx1Z2luRm4pfSkoKTtgKTtcbiAgYXdhaXQgYXBwLnBsdWdpbnMubG9hZFBsdWdpbih0ZW1wTW9kdWxlTmFtZSk7XG4gIGF3YWl0IGFwcC5wbHVnaW5zLnVuaW5zdGFsbFBsdWdpbih0ZW1wTW9kdWxlTmFtZSk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aGluIGBsb2FkUGx1Z2luYC5cbiAgaWYgKG9ic2lkaWFuTW9kdWxlSG9sZGVyLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgcmV0dXJuIG9ic2lkaWFuTW9kdWxlSG9sZGVyLm9ic2lkaWFuTW9kdWxlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgb2JzaWRpYW4gbW9kdWxlJyk7XG59XG5cbi8qKlxuICogVGhlIGJvZHkgb2YgdGhlIHRlbXBvcmFyeSBwbHVnaW4gdGhhdCBleHRyYWN0cyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUuXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIHdyaXR0ZW4gdG8gYG1haW4uanNgIGJ5IHtAbGluayBnZXRPYnNpZGlhbk1vZHVsZX0uXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICovXG5mdW5jdGlvbiBnZXRPYnNpZGlhbk1vZHVsZVBsdWdpbkZuKCk6IHZvaWQge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gV2UgbmVlZCBnbG9iYWwgYGFwcGAgdmFyaWFibGUuXG4gIGNvbnN0IGFwcCA9IHdpbmRvdy5hcHA7XG4gIGludGVyZmFjZSBPYnNpZGlhbk1vZHVsZUhvbGRlciB7XG4gICAgb2JzaWRpYW5Nb2R1bGU6IHR5cGVvZiBvYnNpZGlhbjtcbiAgfVxuICBjb25zdCBvYnNpZGlhbk1vZHVsZUhvbGRlciA9IGFwcCBhcyBQYXJ0aWFsPE9ic2lkaWFuTW9kdWxlSG9sZGVyPjtcblxuICBjb25zdCBwbHVnaW5SZXF1aXJlID0gcmVxdWlyZTtcbiAgY29uc3QgcGx1Z2luRXhwb3J0cyA9IGV4cG9ydHMgYXMge1xuICAgIGRlZmF1bHQ6IHVua25vd247XG4gIH07XG5cbiAgY29uc3Qgb2JzaWRpYW5Nb2R1bGUgPSBwbHVnaW5SZXF1aXJlKCdvYnNpZGlhbicpIGFzIHR5cGVvZiBvYnNpZGlhbjtcbiAgb2JzaWRpYW5Nb2R1bGVIb2xkZXIub2JzaWRpYW5Nb2R1bGUgPSBvYnNpZGlhbk1vZHVsZTtcbiAgcGx1Z2luRXhwb3J0cy5kZWZhdWx0ID0gb2JzaWRpYW5Nb2R1bGUuUGx1Z2luO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8gb3BlbiBhIFVSSS5cbiAqXG4gKiBAcGFyYW0gdXJpIC0gVGhlIFVSSSB0byBvcGVuLlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBnZXRPcGVuVXJpQ29tbWFuZCh1cmk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGBzdGFydCBcIlwiIFwiJHt1cml9XCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuIGBvcGVuIFwiJHt1cml9XCJgO1xuICB9XG5cbiAgcmV0dXJuIGB4ZGctb3BlbiBcIiR7dXJpfVwiYDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0EscUJBQTJCO0FBQzNCLDBCQUFvQjtBQU9wQixrQkFBcUI7QUFDckIsaUNBQTRDO0FBQzVDLGlDQUFrQztBQUNsQyw2QkFJTztBQUVQLE1BQU0sWUFBWTtBQUNsQixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLHdCQUF3QjtBQTJFOUIsZUFBc0IsZUFDcEIsUUFDaUI7QUFFakIsUUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFdBQVcsSUFBSSw0QkFBNEIsT0FBTyxVQUFVLElBQUk7QUFDbkYsUUFBTSxNQUFNLGFBQWEsb0JBQUFBLFFBQVEsSUFBSTtBQUdyQyxNQUFJLGNBQWMsVUFBYSxLQUFDLDJCQUFXLFNBQVMsR0FBRztBQUNyRCxVQUFNLElBQUksTUFBTSw4QkFBOEIsU0FBUyxFQUFFO0FBQUEsRUFDM0Q7QUFFQSxNQUFJLENBQUMsMkJBQTJCO0FBRTlCLFFBQUksS0FBQywwQ0FBa0IsR0FBRyxHQUFHO0FBQzNCLFlBQU0sSUFBSTtBQUFBLFFBQ1Isd0NBQXdDLEdBQUc7QUFBQSxNQUM3QztBQUFBLElBQ0Y7QUFHQSxRQUFJLEtBQUMscUNBQWEsR0FBRztBQUNuQixZQUFNLElBQUksTUFBTSxxRkFBcUY7QUFBQSxJQUN2RztBQUdBLFVBQU0sMkJBQTJCO0FBQUEsRUFDbkM7QUFFQSxRQUFNLGNBQWM7QUFDcEIsUUFBTSxlQUFlLE9BQU8sS0FBSyxPQUFPLENBQUMsRUFBRSxNQUFNLFdBQVc7QUFDNUQsUUFBTSxjQUFjLFlBQ2hCLDBDQUEwQyxPQUFPLFNBQVMsQ0FBQyxlQUMzRDtBQUNKLFFBQU0sYUFB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
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
*
|
|
4
|
+
* Evaluates a function inside a running Obsidian instance via the Obsidian CLI.
|
|
5
|
+
*/
|
|
6
|
+
import type { App } from 'obsidian';
|
|
7
|
+
import type * as obsidian from 'obsidian';
|
|
8
|
+
import type { Promisable } from 'type-fest';
|
|
9
|
+
import type { ContextArgs, ContextId } from './context-id.cjs';
|
|
10
|
+
/**
|
|
11
|
+
* Common arguments automatically provided to every {@link evalInObsidian} callback.
|
|
12
|
+
*/
|
|
13
|
+
export interface CommonArgs {
|
|
14
|
+
/**
|
|
15
|
+
* The Obsidian {@link App} instance.
|
|
16
|
+
*/
|
|
17
|
+
app: App;
|
|
18
|
+
/**
|
|
19
|
+
* The `obsidian` module, resolved at runtime inside the Obsidian process.
|
|
20
|
+
*/
|
|
21
|
+
obsidianModule: typeof obsidian;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parameters for {@link evalInObsidian}.
|
|
25
|
+
*/
|
|
26
|
+
export interface EvalInObsidianParams<Args extends GenericObject, Result, TContextId extends ContextId<unknown> | undefined = undefined> {
|
|
27
|
+
/**
|
|
28
|
+
* Additional arguments to pass to the function. Values may include functions —
|
|
29
|
+
* they are serialized via `toString()`.
|
|
30
|
+
*/
|
|
31
|
+
args?: Args;
|
|
32
|
+
/**
|
|
33
|
+
* A {@link ContextId} linking this call to a persistent store on `window`
|
|
34
|
+
* in the Obsidian process. The callback receives a typed `context` object
|
|
35
|
+
* that survives across calls sharing the same ID.
|
|
36
|
+
*
|
|
37
|
+
* When omitted, `context` is a fresh empty object each call.
|
|
38
|
+
*/
|
|
39
|
+
contextId?: TContextId;
|
|
40
|
+
/**
|
|
41
|
+
* The function to evaluate in the Obsidian context.
|
|
42
|
+
*/
|
|
43
|
+
fn(args: Args & CommonArgs & ContextArgs<TContextId>): Promisable<Result>;
|
|
44
|
+
/**
|
|
45
|
+
* Skips pre-flight checks (vault registration, CLI availability).
|
|
46
|
+
* Used internally by vault registration functions.
|
|
47
|
+
*
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
shouldSkipPreflightChecks?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* The path to the Obsidian vault. Defaults to `process.cwd()`.
|
|
53
|
+
*/
|
|
54
|
+
vaultPath?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A plain object with string keys.
|
|
58
|
+
*/
|
|
59
|
+
export type GenericObject = Record<string, unknown>;
|
|
60
|
+
/**
|
|
61
|
+
* Evaluates a function inside the running Obsidian instance
|
|
62
|
+
* via the Obsidian CLI and returns the parsed result.
|
|
63
|
+
*
|
|
64
|
+
* The function receives an args object that includes `app`, `obsidianModule`,
|
|
65
|
+
* `context`, and any additional `args` passed by the caller.
|
|
66
|
+
* It is serialized via `toString()` and invoked as an IIFE.
|
|
67
|
+
* The function must be self-contained — closures over local variables will not work.
|
|
68
|
+
* Pass any needed values as `args` — they are JSON-serialized and deserialized on the Obsidian side.
|
|
69
|
+
*
|
|
70
|
+
* The result is `JSON.stringify`'d on the Obsidian side and parsed back.
|
|
71
|
+
*
|
|
72
|
+
* @param params - The parameters for the function to evaluate.
|
|
73
|
+
* @returns A {@link Promise} that resolves to the return value of `fn`.
|
|
74
|
+
*/
|
|
75
|
+
export declare function evalInObsidian<Args extends GenericObject, Result, TContextId extends ContextId<unknown> | undefined = undefined>(params: EvalInObsidianParams<Args, Result, TContextId>): Promise<Result>;
|
|
@@ -0,0 +1,91 @@
|
|
|
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 obsidian_config_exports = {};
|
|
30
|
+
__export(obsidian_config_exports, {
|
|
31
|
+
getVaultId: () => getVaultId,
|
|
32
|
+
isCliEnabled: () => isCliEnabled,
|
|
33
|
+
isVaultRegistered: () => isVaultRegistered
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(obsidian_config_exports);
|
|
36
|
+
var import_node_fs = require("node:fs");
|
|
37
|
+
var import_node_os = require("node:os");
|
|
38
|
+
var import_node_path = require("node:path");
|
|
39
|
+
var import_node_process = __toESM(require("node:process"), 1);
|
|
40
|
+
function getVaultId(vaultPath) {
|
|
41
|
+
const config = readObsidianJson();
|
|
42
|
+
if (!config) {
|
|
43
|
+
return void 0;
|
|
44
|
+
}
|
|
45
|
+
const normalizedTarget = normalizePath(vaultPath);
|
|
46
|
+
for (const [id, entry] of Object.entries(config.vaults)) {
|
|
47
|
+
if (normalizePath(entry.path) === normalizedTarget) {
|
|
48
|
+
return id;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return void 0;
|
|
52
|
+
}
|
|
53
|
+
function isCliEnabled() {
|
|
54
|
+
const config = readObsidianJson();
|
|
55
|
+
return config?.cli === true;
|
|
56
|
+
}
|
|
57
|
+
function isVaultRegistered(vaultPath) {
|
|
58
|
+
return getVaultId(vaultPath) !== void 0;
|
|
59
|
+
}
|
|
60
|
+
function getObsidianConfigDir() {
|
|
61
|
+
if (import_node_process.default.platform === "win32") {
|
|
62
|
+
const appData = import_node_process.default.env["APPDATA"];
|
|
63
|
+
if (appData) {
|
|
64
|
+
return (0, import_node_path.join)(appData, "obsidian");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (import_node_process.default.platform === "darwin") {
|
|
68
|
+
return (0, import_node_path.join)((0, import_node_os.homedir)(), "Library", "Application Support", "obsidian");
|
|
69
|
+
}
|
|
70
|
+
return (0, import_node_path.join)(import_node_process.default.env["XDG_CONFIG_HOME"] ?? (0, import_node_path.join)((0, import_node_os.homedir)(), ".config"), "obsidian");
|
|
71
|
+
}
|
|
72
|
+
function normalizePath(vaultPath) {
|
|
73
|
+
const resolved = (0, import_node_path.resolve)(vaultPath);
|
|
74
|
+
return import_node_process.default.platform === "win32" ? resolved.toLowerCase() : resolved;
|
|
75
|
+
}
|
|
76
|
+
function readObsidianJson() {
|
|
77
|
+
const configPath = (0, import_node_path.join)(getObsidianConfigDir(), "obsidian.json");
|
|
78
|
+
try {
|
|
79
|
+
const content = (0, import_node_fs.readFileSync)(configPath, "utf-8");
|
|
80
|
+
return JSON.parse(content);
|
|
81
|
+
} catch {
|
|
82
|
+
return void 0;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
86
|
+
0 && (module.exports = {
|
|
87
|
+
getVaultId,
|
|
88
|
+
isCliEnabled,
|
|
89
|
+
isVaultRegistered
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBSZWFkcyBhbmQgcXVlcmllcyBPYnNpZGlhbidzIGxvY2FsIGNvbmZpZ3VyYXRpb24gKGBvYnNpZGlhbi5qc29uYCkuXG4gKi9cblxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQge1xuICBqb2luLFxuICByZXNvbHZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG4vKipcbiAqIFRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIG9mIE9ic2lkaWFuJ3MgYG9ic2lkaWFuLmpzb25gIGNvbmZpZyBmaWxlLlxuICovXG5pbnRlcmZhY2UgT2JzaWRpYW5Kc29uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgY2xpPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWFwIG9mIHZhdWx0IElEcyB0byB2YXVsdCBlbnRyaWVzLlxuICAgKi9cbiAgdmF1bHRzOiBSZWNvcmQ8c3RyaW5nLCBPYnNpZGlhblZhdWx0RW50cnk+O1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIHZhdWx0IGVudHJ5IGluIGBvYnNpZGlhbi5qc29uYC5cbiAqL1xuaW50ZXJmYWNlIE9ic2lkaWFuVmF1bHRFbnRyeSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB2YXVsdCBpcyBjdXJyZW50bHkgb3Blbi5cbiAgICovXG4gIG9wZW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgb2YgdGhlIGxhc3QgYWNjZXNzLlxuICAgKi9cbiAgdHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBoZXggdmF1bHQgSUQgZm9yIGEgZ2l2ZW4gdmF1bHQgcGF0aCBmcm9tIE9ic2lkaWFuJ3MgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKiBAcmV0dXJucyBUaGUgdmF1bHQgSUQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSB2YXVsdCBpcyBub3QgcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhdWx0SWQodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYXRoKHZhdWx0UGF0aCk7XG5cbiAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudmF1bHRzKSkge1xuICAgIGlmIChub3JtYWxpemVQYXRoKGVudHJ5LnBhdGgpID09PSBub3JtYWxpemVkVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gQ0xJIGlzIGVuYWJsZWQgaW4gT2JzaWRpYW4ncyBzZXR0aW5ncy5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIENMSSBpcyBlbmFibGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgY29uZmlnID0gcmVhZE9ic2lkaWFuSnNvbigpO1xuICByZXR1cm4gY29uZmlnPy5jbGkgPT09IHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXVsdCBwYXRoIGlzIHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW4ncyB2YXVsdCByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmF1bHQgaXMgcmVnaXN0ZXJlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhdWx0UmVnaXN0ZXJlZCh2YXVsdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCB0byBPYnNpZGlhbidzIGNvbmZpZyBkaXJlY3RvcnkuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGBvYnNpZGlhbi9gIGNvbmZpZyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuQ29uZmlnRGlyKCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc3QgYXBwRGF0YSA9IHByb2Nlc3MuZW52WydBUFBEQVRBJ107XG4gICAgaWYgKGFwcERhdGEpIHtcbiAgICAgIHJldHVybiBqb2luKGFwcERhdGEsICdvYnNpZGlhbicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBqb2luKGhvbWVkaXIoKSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdvYnNpZGlhbicpO1xuICB9XG5cbiAgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnZbJ1hER19DT05GSUdfSE9NRSddID8/IGpvaW4oaG9tZWRpcigpLCAnLmNvbmZpZycpLCAnb2JzaWRpYW4nKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgdmF1bHQgcGF0aCBmb3IgY29tcGFyaXNvbi5cbiAqIE9uIFdpbmRvd3MsIHBhdGhzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBzZXBhcmF0b3JzIG1heSB2YXJ5LlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgcGF0aCB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXRoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHZhdWx0UGF0aCk7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gcmVzb2x2ZWQudG9Mb3dlckNhc2UoKSA6IHJlc29sdmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgY29uZmlnIGZpbGUuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBjb25maWcsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkLlxuICovXG5mdW5jdGlvbiByZWFkT2JzaWRpYW5Kc29uKCk6IE9ic2lkaWFuSnNvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGdldE9ic2lkaWFuQ29uZmlnRGlyKCksICdvYnNpZGlhbi5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KSBhcyBPYnNpZGlhbkpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLHFCQUE2QjtBQUM3QixxQkFBd0I7QUFDeEIsdUJBR087QUFDUCwwQkFBb0I7QUEyQ2IsU0FBUyxXQUFXLFdBQXVDO0FBQ2hFLFFBQU0sU0FBUyxpQkFBaUI7QUFDaEMsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sbUJBQW1CLGNBQWMsU0FBUztBQUVoRCxhQUFXLENBQUMsSUFBSSxLQUFLLEtBQUssT0FBTyxRQUFRLE9BQU8sTUFBTSxHQUFHO0FBQ3ZELFFBQUksY0FBYyxNQUFNLElBQUksTUFBTSxrQkFBa0I7QUFDbEQsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBT08sU0FBUyxlQUF3QjtBQUN0QyxRQUFNLFNBQVMsaUJBQWlCO0FBQ2hDLFNBQU8sUUFBUSxRQUFRO0FBQ3pCO0FBUU8sU0FBUyxrQkFBa0IsV0FBNEI7QUFDNUQsU0FBTyxXQUFXLFNBQVMsTUFBTTtBQUNuQztBQU9BLFNBQVMsdUJBQStCO0FBQ3RDLE1BQUksb0JBQUFBLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFVBQU0sVUFBVSxvQkFBQUEsUUFBUSxJQUFJLFNBQVM7QUFDckMsUUFBSSxTQUFTO0FBQ1gsaUJBQU8sdUJBQUssU0FBUyxVQUFVO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBRUEsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFVBQVU7QUFDakMsZUFBTywyQkFBSyx3QkFBUSxHQUFHLFdBQVcsdUJBQXVCLFVBQVU7QUFBQSxFQUNyRTtBQUVBLGFBQU8sdUJBQUssb0JBQUFBLFFBQVEsSUFBSSxpQkFBaUIsU0FBSywyQkFBSyx3QkFBUSxHQUFHLFNBQVMsR0FBRyxVQUFVO0FBQ3RGO0FBU0EsU0FBUyxjQUFjLFdBQTJCO0FBQ2hELFFBQU0sZUFBVywwQkFBUSxTQUFTO0FBQ2xDLFNBQU8sb0JBQUFBLFFBQVEsYUFBYSxVQUFVLFNBQVMsWUFBWSxJQUFJO0FBQ2pFO0FBT0EsU0FBUyxtQkFBNkM7QUFDcEQsUUFBTSxpQkFBYSx1QkFBSyxxQkFBcUIsR0FBRyxlQUFlO0FBQy9ELE1BQUk7QUFDRixVQUFNLGNBQVUsNkJBQWEsWUFBWSxPQUFPO0FBQ2hELFdBQU8sS0FBSyxNQUFNLE9BQU87QUFBQSxFQUMzQixRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
|