obsidian-integration-testing 8.4.0 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -11
- package/dist/lib/cjs/avd-list.cjs +36 -0
- package/dist/lib/cjs/avd-list.d.cts +38 -0
- package/dist/lib/cjs/demo-vault-populate.cjs +77 -0
- package/dist/lib/cjs/demo-vault-populate.d.cts +71 -0
- package/dist/lib/cjs/demo-vault-tree.cjs +52 -0
- package/dist/lib/cjs/demo-vault-tree.d.cts +34 -0
- package/dist/lib/cjs/enable-plugin.cjs +56 -5
- package/dist/lib/cjs/enable-plugin.d.cts +26 -1
- package/dist/lib/cjs/global-setup-core.cjs +92 -26
- package/dist/lib/cjs/global-setup-core.d.cts +24 -3
- package/dist/lib/cjs/index.cjs +10 -1
- package/dist/lib/cjs/index.d.cts +6 -0
- package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +41 -0
- package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +26 -0
- package/dist/lib/cjs/jest/global-setup.cjs +7 -2
- package/dist/lib/cjs/jest/global-setup.d.cts +20 -3
- package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +26 -0
- package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +11 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/plugin-enable-retry.cjs +53 -0
- package/dist/lib/cjs/plugin-enable-retry.d.cts +71 -0
- package/dist/lib/cjs/poll-in-obsidian.cjs +72 -0
- package/dist/lib/cjs/poll-in-obsidian.d.cts +92 -0
- package/dist/lib/cjs/poll-until.cjs +43 -0
- package/dist/lib/cjs/poll-until.d.cts +42 -0
- package/dist/lib/cjs/process-exit-message.cjs +47 -0
- package/dist/lib/cjs/process-exit-message.d.cts +48 -0
- package/dist/lib/cjs/transport-appium.cjs +51 -1
- package/dist/lib/cjs/transport-appium.d.cts +24 -1
- package/dist/lib/cjs/transport-desktop-cdp.cjs +20 -11
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +9 -2
- package/dist/lib/cjs/transport-factory.cjs +122 -23
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +28 -0
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +37 -0
- package/dist/lib/cjs/vault-path-match.cjs +49 -0
- package/dist/lib/cjs/vault-path-match.d.cts +36 -0
- package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +37 -0
- package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +26 -0
- package/dist/lib/cjs/vitest/global-setup.cjs +7 -2
- package/dist/lib/cjs/vitest/global-setup.d.cts +20 -3
- package/dist/lib/esm/avd-list.d.mts +38 -0
- package/dist/lib/esm/avd-list.mjs +11 -0
- package/dist/lib/esm/demo-vault-populate.d.mts +71 -0
- package/dist/lib/esm/demo-vault-populate.mjs +57 -0
- package/dist/lib/esm/demo-vault-tree.d.mts +34 -0
- package/dist/lib/esm/demo-vault-tree.mjs +35 -0
- package/dist/lib/esm/enable-plugin.d.mts +26 -1
- package/dist/lib/esm/enable-plugin.mjs +54 -4
- package/dist/lib/esm/global-setup-core.d.mts +24 -3
- package/dist/lib/esm/global-setup-core.mjs +101 -27
- package/dist/lib/esm/index.d.mts +6 -0
- package/dist/lib/esm/index.mjs +7 -1
- package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +26 -0
- package/dist/lib/esm/jest/global-setup-no-plugin.mjs +17 -0
- package/dist/lib/esm/jest/global-setup.d.mts +20 -3
- package/dist/lib/esm/jest/global-setup.mjs +7 -2
- package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +11 -0
- package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +6 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/plugin-enable-retry.d.mts +71 -0
- package/dist/lib/esm/plugin-enable-retry.mjs +24 -0
- package/dist/lib/esm/poll-in-obsidian.d.mts +92 -0
- package/dist/lib/esm/poll-in-obsidian.mjs +48 -0
- package/dist/lib/esm/poll-until.d.mts +42 -0
- package/dist/lib/esm/poll-until.mjs +19 -0
- package/dist/lib/esm/process-exit-message.d.mts +48 -0
- package/dist/lib/esm/process-exit-message.mjs +23 -0
- package/dist/lib/esm/transport-appium.d.mts +24 -1
- package/dist/lib/esm/transport-appium.mjs +51 -1
- package/dist/lib/esm/transport-desktop-cdp.d.mts +9 -2
- package/dist/lib/esm/transport-desktop-cdp.mjs +20 -11
- package/dist/lib/esm/transport-factory.mjs +125 -23
- package/dist/lib/esm/transport-options.d.mts +28 -0
- package/dist/lib/esm/transport.d.mts +37 -0
- package/dist/lib/esm/vault-path-match.d.mts +36 -0
- package/dist/lib/esm/vault-path-match.mjs +14 -0
- package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +26 -0
- package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +11 -0
- package/dist/lib/esm/vitest/global-setup.d.mts +20 -3
- package/dist/lib/esm/vitest/global-setup.mjs +7 -2
- package/dist/obsidian-integration-testing-9.1.0.tgz +0 -0
- package/package.json +38 -8
- package/dist/obsidian-integration-testing-8.4.0.tgz +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
existsSync,
|
|
3
|
+
readdirSync,
|
|
4
|
+
readFileSync
|
|
5
|
+
} from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { readDemoVaultTree } from "./demo-vault-tree.mjs";
|
|
8
|
+
import { ensureNonNullable } from "./type-guards.mjs";
|
|
9
|
+
const OBSIDIAN_CONFIG_DIR = ".obsidian";
|
|
10
|
+
const PLUGINS_DIR = "plugins";
|
|
11
|
+
const DATA_JSON = "data.json";
|
|
12
|
+
const MANIFEST_JSON = "manifest.json";
|
|
13
|
+
const MAIN_JS = "main.js";
|
|
14
|
+
const DATA_JSON_INDENT = 2;
|
|
15
|
+
const DEFAULT_OBSIDIAN_CONFIG_FILES = ["app.json", "appearance.json", "core-plugins.json"];
|
|
16
|
+
function buildDemoVaultPopulate(params) {
|
|
17
|
+
const { demoVaultPath, excludedNames, injectPlugins = [], obsidianConfigFiles = DEFAULT_OBSIDIAN_CONFIG_FILES } = params;
|
|
18
|
+
const map = readDemoVaultTree(excludedNames === void 0 ? { demoVaultPath } : { demoVaultPath, excludedNames });
|
|
19
|
+
for (const configFile of obsidianConfigFiles) {
|
|
20
|
+
const configPath = join(demoVaultPath, OBSIDIAN_CONFIG_DIR, configFile);
|
|
21
|
+
if (existsSync(configPath)) {
|
|
22
|
+
map[`${OBSIDIAN_CONFIG_DIR}/${configFile}`] = readFileSync(configPath);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
for (const plugin of injectPlugins) {
|
|
26
|
+
seedPlugin(demoVaultPath, plugin, map);
|
|
27
|
+
}
|
|
28
|
+
return map;
|
|
29
|
+
}
|
|
30
|
+
function seedPlugin(demoVaultPath, plugin, map) {
|
|
31
|
+
const { data, pluginId } = plugin;
|
|
32
|
+
const sourceDir = plugin.sourceDir ?? join(demoVaultPath, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
|
|
33
|
+
const pluginPrefix = `${OBSIDIAN_CONFIG_DIR}/${PLUGINS_DIR}/${pluginId}`;
|
|
34
|
+
const fileNames = existsSync(sourceDir) ? readdirSync(sourceDir, { withFileTypes: true }).filter((entry) => entry.isFile()).map((entry) => entry.name) : [];
|
|
35
|
+
for (const requiredFile of [MAIN_JS, MANIFEST_JSON]) {
|
|
36
|
+
if (!fileNames.includes(requiredFile)) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
`Community plugin "${pluginId}" is not installed in the demo vault (${join(sourceDir, requiredFile)} missing). Open demo-vault/ in Obsidian once so demo-vault-helper installs it, then re-run.`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
for (const fileName of fileNames) {
|
|
43
|
+
if (fileName === DATA_JSON && data !== void 0) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
map[`${pluginPrefix}/${fileName}`] = readFileSync(join(sourceDir, fileName));
|
|
47
|
+
}
|
|
48
|
+
if (data !== void 0) {
|
|
49
|
+
const dataJson = ensureNonNullable(JSON.stringify(data, null, DATA_JSON_INDENT));
|
|
50
|
+
map[`${pluginPrefix}/${DATA_JSON}`] = `${dataJson}
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export {
|
|
55
|
+
buildDemoVaultPopulate
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuXG5pbXBvcnQgeyByZWFkRGVtb1ZhdWx0VHJlZSB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcblxuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBEQVRBX0pTT04gPSAnZGF0YS5qc29uJztcbmNvbnN0IE1BTklGRVNUX0pTT04gPSAnbWFuaWZlc3QuanNvbic7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgREFUQV9KU09OX0lOREVOVCA9IDI7XG5cbmNvbnN0IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTID0gWydhcHAuanNvbicsICdhcHBlYXJhbmNlLmpzb24nLCAnY29yZS1wbHVnaW5zLmpzb24nXTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lcyAob2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMsIG1hdGNoZWQgYXQgYW55IGRlcHRoKSB0byBza2lwIHdoaWxlIHJlYWRpbmcgdGhlIG5vdGUgdHJlZSBcdTIwMTQgZm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJy5naXQnLCAnLm9ic2lkaWFuJ11gXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5hbWVzPzogSXRlcmFibGU8c3RyaW5nPjtcblxuICAvKipcbiAgICogQ29tbXVuaXR5IHBsdWdpbnMgdG8gc2VlZCBpbnRvIGAub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+L2AgKGJpbmFyaWVzICsgb3B0aW9uYWwgYGRhdGEuanNvbmApLiBUdXJuXG4gICAqIHRoZW0gb24gd2l0aCB0aGUgZ2xvYmFsLXNldHVwIGBjcmVhdGVTZXR1cCh7IGVuYWJsZUNvbW11bml0eVBsdWdpbnMgfSlgIG9wdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGluamVjdFBsdWdpbnM/OiByZWFkb25seSBJbmplY3RQbHVnaW5QYXJhbXNbXTtcblxuICAvKipcbiAgICogYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMgdG8gY2Fycnkgb3ZlciBmcm9tIHRoZSBkZW1vIHZhdWx0LiB7QGxpbmsgcmVhZERlbW9WYXVsdFRyZWV9IGV4Y2x1ZGVzIHRoZSB3aG9sZVxuICAgKiBgLm9ic2lkaWFuYCBkaXJlY3RvcnksIHNvIGNvbmZpZyB0aGUgdmF1bHQgcmVsaWVzIG9uIChwcmV2aWV3LW1vZGUgZGVmYXVsdCwgY29yZSBwbHVnaW5zLCBhcHBlYXJhbmNlKSBtdXN0XG4gICAqIGJlIHJlLWFkZGVkIGV4cGxpY2l0bHkuIEZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBza2lwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydhcHAuanNvbicsICdhcHBlYXJhbmNlLmpzb24nLCAnY29yZS1wbHVnaW5zLmpzb24nXWBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuQ29uZmlnRmlsZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGNvbW11bml0eSBwbHVnaW4gdG8gc2VlZCBpbnRvIHRoZSBkZW1vIHZhdWx0IGFsb25nc2lkZSB0aGUgbm90ZSB0cmVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdFBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBPdmVybGF5IHdyaXR0ZW4gYXMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vZGF0YS5qc29uYCAoSlNPTiwgMi1zcGFjZSBpbmRlbnQpLiBPbWl0IHRvIGtlZXAgd2hhdGV2ZXJcbiAgICogYGRhdGEuanNvbmAgKGlmIGFueSkgYWxyZWFkeSBsaXZlcyBpbiB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnNvdXJjZURpcn0uXG4gICAqL1xuICByZWFkb25seSBkYXRhPzogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIGNvbW11bml0eSBwbHVnaW4ncyBpZCAoaXRzIGAub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+YCBmb2xkZXIgbmFtZSkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgdG8gcmVhZCB0aGUgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgZnJvbS4gRXZlcnkgZmlsZSBkaXJlY3RseSBpbnNpZGUgaXQgaXMgY29waWVkIGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYDsgYG1haW4uanNgIGFuZCBgbWFuaWZlc3QuanNvbmAgYXJlIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgPGRlbW9WYXVsdFBhdGg+Ly5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VEaXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBmdWxsIHBvcHVsYXRlIG1hcCBmb3IgYSBwbHVnaW4ncyBgZGVtby12YXVsdC9gOiB0aGUgbm90ZSB0cmVlLCB0aGUgc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWdcbiAqIGZpbGVzLCBhbmQgZXZlcnkgaW5qZWN0ZWQgcGx1Z2luJ3MgYmluYXJpZXMgKCsgb3B0aW9uYWwgYGRhdGEuanNvbmApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHBvcHVsYXRlIG1hcCwgcmVhZHkgdG8gaGFuZCB0byBhIGdsb2JhbCBzZXR1cCdzIGBwb3B1bGF0ZWAgb3Ige0BsaW5rIFRlbXBWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFNlZWRzIG9uZSBpbmplY3RlZCBwbHVnaW4ncyBiaW5hcmllcyAoYW5kIG9wdGlvbmFsIGBkYXRhLmpzb25gKSBpbnRvIHRoZSBwb3B1bGF0ZSBtYXAuXG4gKlxuICogQHBhcmFtIGRlbW9WYXVsdFBhdGggLSBUaGUgZGVtbyB2YXVsdCByb290LCB1c2VkIHRvIHJlc29sdmUgdGhlIGRlZmF1bHQgc291cmNlIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIHNlZWQuXG4gKiBAcGFyYW0gbWFwIC0gVGhlIHBvcHVsYXRlIG1hcCB0byB3cml0ZSBpbnRvLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpciA9IHBsdWdpbi5zb3VyY2VEaXIgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICBjb25zdCBwbHVnaW5QcmVmaXggPSBgJHtPQlNJRElBTl9DT05GSUdfRElSfS8ke1BMVUdJTlNfRElSfS8ke3BsdWdpbklkfWA7XG5cbiAgY29uc3QgZmlsZU5hbWVzID0gZXhpc3RzU3luYyhzb3VyY2VEaXIpXG4gICAgPyByZWFkZGlyU3luYyhzb3VyY2VEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSkubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSlcbiAgICA6IFtdO1xuXG4gIGZvciAoY29uc3QgcmVxdWlyZWRGaWxlIG9mIFtNQUlOX0pTLCBNQU5JRkVTVF9KU09OXSkge1xuICAgIGlmICghZmlsZU5hbWVzLmluY2x1ZGVzKHJlcXVpcmVkRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXIsIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiBgXG4gICAgICAgICAgKyAnT3BlbiBkZW1vLXZhdWx0LyBpbiBPYnNpZGlhbiBvbmNlIHNvIGRlbW8tdmF1bHQtaGVscGVyIGluc3RhbGxzIGl0LCB0aGVuIHJlLXJ1bi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyLCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFhQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFJckIsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyx5QkFBeUI7QUFFbEMsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sWUFBWTtBQUNsQixNQUFNLGdCQUFnQjtBQUN0QixNQUFNLFVBQVU7QUFDaEIsTUFBTSxtQkFBbUI7QUFFekIsTUFBTSxnQ0FBZ0MsQ0FBQyxZQUFZLG1CQUFtQixtQkFBbUI7QUFrRWxGLFNBQVMsdUJBQXVCLFFBQTJEO0FBQ2hHLFFBQU0sRUFBRSxlQUFlLGVBQWUsZ0JBQWdCLENBQUMsR0FBRyxzQkFBc0IsOEJBQThCLElBQUk7QUFFbEgsUUFBTSxNQUFNLGtCQUFrQixrQkFBa0IsU0FBWSxFQUFFLGNBQWMsSUFBSSxFQUFFLGVBQWUsY0FBYyxDQUFDO0FBRWhILGFBQVcsY0FBYyxxQkFBcUI7QUFDNUMsVUFBTSxhQUFhLEtBQUssZUFBZSxxQkFBcUIsVUFBVTtBQUN0RSxRQUFJLFdBQVcsVUFBVSxHQUFHO0FBQzFCLFVBQUksR0FBRyxtQkFBbUIsSUFBSSxVQUFVLEVBQUUsSUFBSSxhQUFhLFVBQVU7QUFBQSxJQUN2RTtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFVBQVUsZUFBZTtBQUNsQyxlQUFXLGVBQWUsUUFBUSxHQUFHO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7QUFTQSxTQUFTLFdBQVcsZUFBdUIsUUFBNEIsS0FBZ0M7QUFDckcsUUFBTSxFQUFFLE1BQU0sU0FBUyxJQUFJO0FBQzNCLFFBQU0sWUFBWSxPQUFPLGFBQWEsS0FBSyxlQUFlLHFCQUFxQixhQUFhLFFBQVE7QUFDcEcsUUFBTSxlQUFlLEdBQUcsbUJBQW1CLElBQUksV0FBVyxJQUFJLFFBQVE7QUFFdEUsUUFBTSxZQUFZLFdBQVcsU0FBUyxJQUNsQyxZQUFZLFdBQVcsRUFBRSxlQUFlLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLE1BQU0sT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsTUFBTSxJQUFJLElBQzNHLENBQUM7QUFFTCxhQUFXLGdCQUFnQixDQUFDLFNBQVMsYUFBYSxHQUFHO0FBQ25ELFFBQUksQ0FBQyxVQUFVLFNBQVMsWUFBWSxHQUFHO0FBQ3JDLFlBQU0sSUFBSTtBQUFBLFFBQ1IscUJBQXFCLFFBQVEseUNBQXlDLEtBQUssV0FBVyxZQUFZLENBQUM7QUFBQSxNQUVyRztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsYUFBVyxZQUFZLFdBQVc7QUFFaEMsUUFBSSxhQUFhLGFBQWEsU0FBUyxRQUFXO0FBQ2hEO0FBQUEsSUFDRjtBQUNBLFFBQUksR0FBRyxZQUFZLElBQUksUUFBUSxFQUFFLElBQUksYUFBYSxLQUFLLFdBQVcsUUFBUSxDQUFDO0FBQUEsRUFDN0U7QUFFQSxNQUFJLFNBQVMsUUFBVztBQUN0QixVQUFNLFdBQW1CLGtCQUFrQixLQUFLLFVBQVUsTUFBTSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZGLFFBQUksR0FBRyxZQUFZLElBQUksU0FBUyxFQUFFLElBQUksR0FBRyxRQUFRO0FBQUE7QUFBQSxFQUNuRDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Reads a plugin's in-repo `demo-vault/` tree into a populate map so a Vitest/Jest global setup can
|
|
5
|
+
* seed it into the temp vault BEFORE Obsidian opens it. Seeding pre-launch lets Obsidian's startup scan
|
|
6
|
+
* index every note in one pass, avoiding the file-watcher race that silently drops events under a bulk
|
|
7
|
+
* post-launch {@link TempVault.populate}.
|
|
8
|
+
*/
|
|
9
|
+
import type { PopulateFilesParams } from './temp-vault.mjs';
|
|
10
|
+
/**
|
|
11
|
+
* Parameters for {@link readDemoVaultTree}.
|
|
12
|
+
*/
|
|
13
|
+
export interface ReadDemoVaultTreeParams {
|
|
14
|
+
/**
|
|
15
|
+
* Absolute path to the demo vault directory to read.
|
|
16
|
+
*/
|
|
17
|
+
readonly demoVaultPath: string;
|
|
18
|
+
/**
|
|
19
|
+
* Names (of files or directories, matched at any depth) to skip. Defaults to `.git` and `.obsidian`:
|
|
20
|
+
* the harness provisions `.obsidian/plugins/<id>` itself, so the vault's own `.obsidian` must not be
|
|
21
|
+
* copied over it.
|
|
22
|
+
*
|
|
23
|
+
* @default `['.git', '.obsidian']`
|
|
24
|
+
*/
|
|
25
|
+
readonly excludedNames?: Iterable<string>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reads a demo vault directory tree recursively into a {@link PopulateFilesParams} map (vault-relative
|
|
29
|
+
* POSIX path to file bytes), skipping {@link ReadDemoVaultTreeParams.excludedNames}.
|
|
30
|
+
*
|
|
31
|
+
* @param params - The {@link ReadDemoVaultTreeParams}.
|
|
32
|
+
* @returns The populate map, ready to hand to {@link TempVault.populate} or a global setup's `populate`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readDemoVaultTree(params: ReadDemoVaultTreeParams): PopulateFilesParams;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readdirSync,
|
|
3
|
+
readFileSync
|
|
4
|
+
} from "node:fs";
|
|
5
|
+
import {
|
|
6
|
+
join,
|
|
7
|
+
relative,
|
|
8
|
+
sep
|
|
9
|
+
} from "node:path";
|
|
10
|
+
const DEFAULT_EXCLUDED_NAMES = [".git", ".obsidian"];
|
|
11
|
+
function readDemoVaultTree(params) {
|
|
12
|
+
const { demoVaultPath } = params;
|
|
13
|
+
const excludedNames = new Set(params.excludedNames ?? DEFAULT_EXCLUDED_NAMES);
|
|
14
|
+
const map = {};
|
|
15
|
+
collect(demoVaultPath, demoVaultPath, excludedNames, map);
|
|
16
|
+
return map;
|
|
17
|
+
}
|
|
18
|
+
function collect(root, dir, excludedNames, map) {
|
|
19
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
20
|
+
if (excludedNames.has(entry.name)) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const absolutePath = join(dir, entry.name);
|
|
24
|
+
if (entry.isDirectory()) {
|
|
25
|
+
collect(root, absolutePath, excludedNames, map);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const relativePath = relative(root, absolutePath).split(sep).join("/");
|
|
29
|
+
map[relativePath] = readFileSync(absolutePath);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
readDemoVaultTree
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtdHJlZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlYWRzIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIHRyZWUgaW50byBhIHBvcHVsYXRlIG1hcCBzbyBhIFZpdGVzdC9KZXN0IGdsb2JhbCBzZXR1cCBjYW5cbiAqIHNlZWQgaXQgaW50byB0aGUgdGVtcCB2YXVsdCBCRUZPUkUgT2JzaWRpYW4gb3BlbnMgaXQuIFNlZWRpbmcgcHJlLWxhdW5jaCBsZXRzIE9ic2lkaWFuJ3Mgc3RhcnR1cCBzY2FuXG4gKiBpbmRleCBldmVyeSBub3RlIGluIG9uZSBwYXNzLCBhdm9pZGluZyB0aGUgZmlsZS13YXRjaGVyIHJhY2UgdGhhdCBzaWxlbnRseSBkcm9wcyBldmVudHMgdW5kZXIgYSBidWxrXG4gKiBwb3N0LWxhdW5jaCB7QGxpbmsgVGVtcFZhdWx0LnBvcHVsYXRlfS5cbiAqL1xuXG5pbXBvcnQge1xuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHNlcFxufSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVhZERlbW9WYXVsdFRyZWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGRlbW8gdmF1bHQgZGlyZWN0b3J5IHRvIHJlYWQuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAuIERlZmF1bHRzIHRvIGAuZ2l0YCBhbmQgYC5vYnNpZGlhbmA6XG4gICAqIHRoZSBoYXJuZXNzIHByb3Zpc2lvbnMgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD5gIGl0c2VsZiwgc28gdGhlIHZhdWx0J3Mgb3duIGAub2JzaWRpYW5gIG11c3Qgbm90IGJlXG4gICAqIGNvcGllZCBvdmVyIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWycuZ2l0JywgJy5vYnNpZGlhbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROYW1lcz86IEl0ZXJhYmxlPHN0cmluZz47XG59XG5cbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTkFNRVMgPSBbJy5naXQnLCAnLm9ic2lkaWFuJ107XG5cbi8qKlxuICogUmVhZHMgYSBkZW1vIHZhdWx0IGRpcmVjdG9yeSB0cmVlIHJlY3Vyc2l2ZWx5IGludG8gYSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwICh2YXVsdC1yZWxhdGl2ZVxuICogUE9TSVggcGF0aCB0byBmaWxlIGJ5dGVzKSwgc2tpcHBpbmcge0BsaW5rIFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zLmV4Y2x1ZGVkTmFtZXN9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8ge0BsaW5rIFRlbXBWYXVsdC5wb3B1bGF0ZX0gb3IgYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZERlbW9WYXVsdFRyZWUocGFyYW1zOiBSZWFkRGVtb1ZhdWx0VHJlZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgZXhjbHVkZWROYW1lcyA9IG5ldyBTZXQocGFyYW1zLmV4Y2x1ZGVkTmFtZXMgPz8gREVGQVVMVF9FWENMVURFRF9OQU1FUyk7XG4gIGNvbnN0IG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyA9IHt9O1xuICBjb2xsZWN0KGRlbW9WYXVsdFBhdGgsIGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIG1hcCk7XG4gIHJldHVybiBtYXA7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3Qocm9vdDogc3RyaW5nLCBkaXI6IHN0cmluZywgZXhjbHVkZWROYW1lczogU2V0PHN0cmluZz4sIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGV4Y2x1ZGVkTmFtZXMuaGFzKGVudHJ5Lm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbGxlY3Qocm9vdCwgYWJzb2x1dGVQYXRoLCBleGNsdWRlZE5hbWVzLCBtYXApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUocm9vdCwgYWJzb2x1dGVQYXRoKS5zcGxpdChzZXApLmpvaW4oJy8nKTtcbiAgICBtYXBbcmVsYXRpdmVQYXRoXSA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFTQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXVCUCxNQUFNLHlCQUF5QixDQUFDLFFBQVEsV0FBVztBQVM1QyxTQUFTLGtCQUFrQixRQUFzRDtBQUN0RixRQUFNLEVBQUUsY0FBYyxJQUFJO0FBQzFCLFFBQU0sZ0JBQWdCLElBQUksSUFBSSxPQUFPLGlCQUFpQixzQkFBc0I7QUFDNUUsUUFBTSxNQUEyQixDQUFDO0FBQ2xDLFVBQVEsZUFBZSxlQUFlLGVBQWUsR0FBRztBQUN4RCxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFFBQVEsTUFBYyxLQUFhLGVBQTRCLEtBQWdDO0FBQ3RHLGFBQVcsU0FBUyxZQUFZLEtBQUssRUFBRSxlQUFlLEtBQUssQ0FBQyxHQUFHO0FBQzdELFFBQUksY0FBYyxJQUFJLE1BQU0sSUFBSSxHQUFHO0FBQ2pDO0FBQUEsSUFDRjtBQUVBLFVBQU0sZUFBZSxLQUFLLEtBQUssTUFBTSxJQUFJO0FBQ3pDLFFBQUksTUFBTSxZQUFZLEdBQUc7QUFDdkIsY0FBUSxNQUFNLGNBQWMsZUFBZSxHQUFHO0FBQzlDO0FBQUEsSUFDRjtBQUVBLFVBQU0sZUFBZSxTQUFTLE1BQU0sWUFBWSxFQUFFLE1BQU0sR0FBRyxFQUFFLEtBQUssR0FBRztBQUNyRSxRQUFJLFlBQVksSUFBSSxhQUFhLFlBQVk7QUFBQSxFQUMvQztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -19,7 +19,10 @@ export interface EnablePluginParams {
|
|
|
19
19
|
*/
|
|
20
20
|
export interface EnablePluginResult {
|
|
21
21
|
/**
|
|
22
|
-
* The error message
|
|
22
|
+
* The error message captured by the `loadPlugin` monkey-patch, or `undefined`
|
|
23
|
+
* when the patch saw no throw. When Obsidian swallows the error *before* the
|
|
24
|
+
* patch (leaving this empty) but the plugin still failed to load, the real
|
|
25
|
+
* cause — if it reached the renderer console — is in {@link EnablePluginResult.rendererConsoleErrors}.
|
|
23
26
|
*/
|
|
24
27
|
readonly errorMessage: string | undefined;
|
|
25
28
|
/**
|
|
@@ -32,6 +35,14 @@ export interface EnablePluginResult {
|
|
|
32
35
|
* This is the definitive check — a plugin that is enabled but not loaded has failed.
|
|
33
36
|
*/
|
|
34
37
|
readonly isLoaded: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Console/error output captured in the renderer during the enable window —
|
|
40
|
+
* populated **only** when the plugin failed to load and the monkey-patch saw
|
|
41
|
+
* no throw (`!errorMessage && !isLoaded`), i.e. exactly the case that would
|
|
42
|
+
* otherwise surface the generic {@link getGenericPluginLoadFailureMessage} text.
|
|
43
|
+
* `undefined` otherwise (including on success and when {@link EnablePluginResult.errorMessage} already has the error).
|
|
44
|
+
*/
|
|
45
|
+
readonly rendererConsoleErrors: string | undefined;
|
|
35
46
|
}
|
|
36
47
|
/**
|
|
37
48
|
* Enables a plugin inside Obsidian and captures any load error.
|
|
@@ -48,3 +59,17 @@ export interface EnablePluginResult {
|
|
|
48
59
|
* @returns The enable result with error message and enabled status.
|
|
49
60
|
*/
|
|
50
61
|
export declare function enablePluginWithErrorCapture({ app, pluginId }: CommonArgs & EnablePluginParams): Promise<EnablePluginResult>;
|
|
62
|
+
/**
|
|
63
|
+
* The generic last-resort message shown when a plugin is in the enabled set but
|
|
64
|
+
* not loaded and no real error could be captured (neither the `loadPlugin`
|
|
65
|
+
* monkey-patch nor the renderer console nor, on Android, `adb logcat` surfaced a
|
|
66
|
+
* cause).
|
|
67
|
+
*
|
|
68
|
+
* Host-side helper — used by the setup orchestration to compose the final
|
|
69
|
+
* failure message, so the renderer-injected {@link enablePluginWithErrorCapture}
|
|
70
|
+
* stays self-contained.
|
|
71
|
+
*
|
|
72
|
+
* @param pluginId - The ID of the plugin that failed to load.
|
|
73
|
+
* @returns The generic failure message.
|
|
74
|
+
*/
|
|
75
|
+
export declare function getGenericPluginLoadFailureMessage(pluginId: string): string;
|
|
@@ -2,6 +2,9 @@ async function enablePluginWithErrorCapture({ app, pluginId }) {
|
|
|
2
2
|
if (!app.plugins.isEnabled()) {
|
|
3
3
|
await app.plugins.setEnable(true);
|
|
4
4
|
}
|
|
5
|
+
if (app.plugins.enabledPlugins.has(pluginId) && !(pluginId in app.plugins.plugins)) {
|
|
6
|
+
await app.plugins.disablePluginAndSave(pluginId);
|
|
7
|
+
}
|
|
5
8
|
let errorMessage;
|
|
6
9
|
const origLoadPlugin = app.plugins.loadPlugin;
|
|
7
10
|
app.plugins.loadPlugin = async function loadPlugin(id, isUserEnabled) {
|
|
@@ -15,22 +18,69 @@ async function enablePluginWithErrorCapture({ app, pluginId }) {
|
|
|
15
18
|
throw error;
|
|
16
19
|
}
|
|
17
20
|
};
|
|
21
|
+
const capturedConsole = [];
|
|
22
|
+
const formatHolder = window;
|
|
23
|
+
function formatArg(arg) {
|
|
24
|
+
if (arg instanceof Error) {
|
|
25
|
+
return formatHolder.__obsidianIntegrationTesting?.errorToString(arg) ?? String(arg);
|
|
26
|
+
}
|
|
27
|
+
if (typeof arg === "string") {
|
|
28
|
+
return arg;
|
|
29
|
+
}
|
|
30
|
+
if (arg === void 0 || arg === null) {
|
|
31
|
+
return String(arg);
|
|
32
|
+
}
|
|
33
|
+
const json = JSON.stringify(arg);
|
|
34
|
+
return json ?? Object.prototype.toString.call(arg);
|
|
35
|
+
}
|
|
36
|
+
function recordConsole(...args) {
|
|
37
|
+
capturedConsole.push(args.map(formatArg).join(" "));
|
|
38
|
+
}
|
|
39
|
+
const origConsoleError = console.error;
|
|
40
|
+
const origConsoleWarn = console.warn;
|
|
41
|
+
console.error = (...args) => {
|
|
42
|
+
recordConsole(...args);
|
|
43
|
+
origConsoleError.apply(console, args);
|
|
44
|
+
};
|
|
45
|
+
console.warn = (...args) => {
|
|
46
|
+
recordConsole(...args);
|
|
47
|
+
origConsoleWarn.apply(console, args);
|
|
48
|
+
};
|
|
49
|
+
function onWindowError(event) {
|
|
50
|
+
capturedConsole.push(event.error instanceof Error ? formatArg(event.error) : event.message);
|
|
51
|
+
}
|
|
52
|
+
function onUnhandledRejection(event) {
|
|
53
|
+
capturedConsole.push(formatArg(event.reason));
|
|
54
|
+
}
|
|
55
|
+
window.addEventListener("error", onWindowError);
|
|
56
|
+
window.addEventListener("unhandledrejection", onUnhandledRejection);
|
|
18
57
|
try {
|
|
19
58
|
await app.plugins.enablePluginAndSave(pluginId);
|
|
20
59
|
} finally {
|
|
21
60
|
app.plugins.loadPlugin = origLoadPlugin;
|
|
61
|
+
console.error = origConsoleError;
|
|
62
|
+
console.warn = origConsoleWarn;
|
|
63
|
+
window.removeEventListener("error", onWindowError);
|
|
64
|
+
window.removeEventListener("unhandledrejection", onUnhandledRejection);
|
|
22
65
|
}
|
|
23
66
|
const isLoaded = pluginId in app.plugins.plugins;
|
|
67
|
+
let rendererConsoleErrors;
|
|
24
68
|
if (!errorMessage && !isLoaded) {
|
|
25
|
-
|
|
69
|
+
const joined = capturedConsole.join("\n").trim();
|
|
70
|
+
rendererConsoleErrors = joined ? joined : void 0;
|
|
26
71
|
}
|
|
27
72
|
return {
|
|
28
73
|
errorMessage,
|
|
29
74
|
isEnabled: app.plugins.enabledPlugins.has(pluginId),
|
|
30
|
-
isLoaded
|
|
75
|
+
isLoaded,
|
|
76
|
+
rendererConsoleErrors
|
|
31
77
|
};
|
|
32
78
|
}
|
|
79
|
+
function getGenericPluginLoadFailureMessage(pluginId) {
|
|
80
|
+
return `Plugin "${pluginId}" is in the enabled set but not loaded. Obsidian may have caught the error before the monkey-patch. Check the Obsidian console for details.`;
|
|
81
|
+
}
|
|
33
82
|
export {
|
|
34
|
-
enablePluginWithErrorCapture
|
|
83
|
+
enablePluginWithErrorCapture,
|
|
84
|
+
getGenericPluginLoadFailureMessage
|
|
35
85
|
};
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VuYWJsZS1wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgaGVscGVyIGZvciBlbmFibGluZyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBlcnJvciBjYXB0dXJlLlxuICogVXNlZCBieSBib3RoIHRoZSBnbG9iYWwgc2V0dXAgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1vbkFyZ3MgfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGVuYWJsaW5nIGEgcGx1Z2luIHdpdGggZXJyb3IgY2FwdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmFibGVQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHBsdWdpbiBmYWlsZWQgdG8gbG9hZCwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgbG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGVuYWJsZWQgc2V0IGFmdGVyIHRoZSBlbmFibGUgYXR0ZW1wdC5cbiAgICogQSBwbHVnaW4gY2FuIGJlIFwiZW5hYmxlZFwiIChjb25maWd1cmVkKSBidXQgbm90IFwibG9hZGVkXCIgKGZhaWxlZCB0byBpbml0aWFsaXplKS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luIGluc3RhbmNlIGFjdHVhbGx5IGV4aXN0cyBpbiBgYXBwLnBsdWdpbnMucGx1Z2luc2AuXG4gICAqIFRoaXMgaXMgdGhlIGRlZmluaXRpdmUgY2hlY2sgXHUyMDE0IGEgcGx1Z2luIHRoYXQgaXMgZW5hYmxlZCBidXQgbm90IGxvYWRlZCBoYXMgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNMb2FkZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdFcnJvclRvU3RyaW5nIHtcbiAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gIF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc6IEludGVncmF0aW9uVGVzdGluZ0Vycm9yVG9TdHJpbmc7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIHBsdWdpbiBpbnNpZGUgT2JzaWRpYW4gYW5kIGNhcHR1cmVzIGFueSBsb2FkIGVycm9yLlxuICpcbiAqIE1vbmtleS1wYXRjaGVzIGBhcHAucGx1Z2lucy5sb2FkUGx1Z2luYCB0byBpbnRlcmNlcHQgZXJyb3JzIGJlZm9yZVxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luYCB0cnktY2F0Y2ggc3dhbGxvd3MgdGhlbS4gVGhlIG9yaWdpbmFsIG1ldGhvZFxuICogaXMgYWx3YXlzIHJlc3RvcmVkIGluIGEgYGZpbmFsbHlgIGJsb2NrLlxuICpcbiAqIERlc2lnbmVkIHRvIGJlIHBhc3NlZCBhcyB0aGUgYGZuYCBhcmd1bWVudCB0byB7QGxpbmsgZXZhbEluT2JzaWRpYW59LlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGNvbW1vbiBhcmdzIHBsdXMgdGhlIHBsdWdpbiBJRC5cbiAqIEBwYXJhbSBhcmdzLmFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gYXJncy5wbHVnaW5JZCAtIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAqIEByZXR1cm5zIFRoZSBlbmFibGUgcmVzdWx0IHdpdGggZXJyb3IgbWVzc2FnZSBhbmQgZW5hYmxlZCBzdGF0dXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlKHsgYXBwLCBwbHVnaW5JZCB9OiBDb21tb25BcmdzICYgRW5hYmxlUGx1Z2luUGFyYW1zKTogUHJvbWlzZTxFbmFibGVQbHVnaW5SZXN1bHQ+IHtcbiAgaWYgKCFhcHAucGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgIGF3YWl0IGFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgfVxuXG4gIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAtLSBJbnRlbnRpb25hbCBtb25rZXktcGF0Y2g7IHJlc3RvcmVkIGluIGZpbmFsbHkuXG4gIGNvbnN0IG9yaWdMb2FkUGx1Z2luID0gYXBwLnBsdWdpbnMubG9hZFBsdWdpbjtcbiAgYXBwLnBsdWdpbnMubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uIGxvYWRQbHVnaW4oaWQ6IHN0cmluZywgaXNVc2VyRW5hYmxlZD86IGJvb2xlYW4pOiBQcm9taXNlPFBsdWdpbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmlnTG9hZFBsdWdpbi5jYWxsKHRoaXMsIGlkLCBpc1VzZXJFbmFibGVkKTtcbiAgICAgIGVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAgICAgY29uc3QgaG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICAgICAgZXJyb3JNZXNzYWdlID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmVycm9yVG9TdHJpbmcoZXJyb3IpID8/IFN0cmluZyhlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKHBsdWdpbklkKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBJbnRlbnRpb25hbCByZXN0b3JlIG9mIG1vbmtleS1wYXRjaC5cbiAgICBhcHAucGx1Z2lucy5sb2FkUGx1Z2luID0gb3JpZ0xvYWRQbHVnaW47XG4gIH1cblxuICBjb25zdCBpc0xvYWRlZCA9IHBsdWdpbklkIGluIGFwcC5wbHVnaW5zLnBsdWdpbnM7XG5cbiAgaWYgKCFlcnJvck1lc3NhZ2UgJiYgIWlzTG9hZGVkKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaXMgaW4gdGhlIGVuYWJsZWQgc2V0IGJ1dCBub3QgbG9hZGVkLiBgXG4gICAgICArICdPYnNpZGlhbiBtYXkgaGF2ZSBjYXVnaHQgdGhlIGVycm9yIGJlZm9yZSB0aGUgbW9ua2V5LXBhdGNoLiAnXG4gICAgICArICdDaGVjayB0aGUgT2JzaWRpYW4gY29uc29sZSBmb3IgZGV0YWlscy4nO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgaXNFbmFibGVkOiBhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMocGx1Z2luSWQpLFxuICAgIGlzTG9hZGVkXG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFtRUEsZUFBc0IsNkJBQTZCLEVBQUUsS0FBSyxTQUFTLEdBQWlFO0FBQ2xJLE1BQUksQ0FBQyxJQUFJLFFBQVEsVUFBVSxHQUFHO0FBQzVCLFVBQU0sSUFBSSxRQUFRLFVBQVUsSUFBSTtBQUFBLEVBQ2xDO0FBRUEsTUFBSTtBQUVKLFFBQU0saUJBQWlCLElBQUksUUFBUTtBQUNuQyxNQUFJLFFBQVEsYUFBYSxlQUFlLFdBQVcsSUFBWSxlQUEwQztBQUN2RyxRQUFJO0FBQ0YsWUFBTSxTQUFTLE1BQU0sZUFBZSxLQUFLLE1BQU0sSUFBSSxhQUFhO0FBQ2hFLHFCQUFlO0FBQ2YsYUFBTztBQUFBLElBQ1QsU0FBUyxPQUFPO0FBRWQsWUFBTSxTQUFTO0FBQ2YscUJBQWUsT0FBTyw4QkFBOEIsY0FBYyxLQUFLLEtBQUssT0FBTyxLQUFLO0FBQ3hGLFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFDRixVQUFNLElBQUksUUFBUSxvQkFBb0IsUUFBUTtBQUFBLEVBQ2hELFVBQUU7QUFFQSxRQUFJLFFBQVEsYUFBYTtBQUFBLEVBQzNCO0FBRUEsUUFBTSxXQUFXLFlBQVksSUFBSSxRQUFRO0FBRXpDLE1BQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVO0FBQzlCLG1CQUFlLFdBQVcsUUFBUTtBQUFBLEVBR3BDO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFdBQVcsSUFBSSxRQUFRLGVBQWUsSUFBSSxRQUFRO0FBQUEsSUFDbEQ7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VuYWJsZS1wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgaGVscGVyIGZvciBlbmFibGluZyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBlcnJvciBjYXB0dXJlLlxuICogVXNlZCBieSBib3RoIHRoZSBnbG9iYWwgc2V0dXAgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1vbkFyZ3MgfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGVuYWJsaW5nIGEgcGx1Z2luIHdpdGggZXJyb3IgY2FwdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmFibGVQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGVycm9yIG1lc3NhZ2UgY2FwdHVyZWQgYnkgdGhlIGBsb2FkUGx1Z2luYCBtb25rZXktcGF0Y2gsIG9yIGB1bmRlZmluZWRgXG4gICAqIHdoZW4gdGhlIHBhdGNoIHNhdyBubyB0aHJvdy4gV2hlbiBPYnNpZGlhbiBzd2FsbG93cyB0aGUgZXJyb3IgKmJlZm9yZSogdGhlXG4gICAqIHBhdGNoIChsZWF2aW5nIHRoaXMgZW1wdHkpIGJ1dCB0aGUgcGx1Z2luIHN0aWxsIGZhaWxlZCB0byBsb2FkLCB0aGUgcmVhbFxuICAgKiBjYXVzZSBcdTIwMTQgaWYgaXQgcmVhY2hlZCB0aGUgcmVuZGVyZXIgY29uc29sZSBcdTIwMTQgaXMgaW4ge0BsaW5rIEVuYWJsZVBsdWdpblJlc3VsdC5yZW5kZXJlckNvbnNvbGVFcnJvcnN9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbiBpcyBpbiB0aGUgZW5hYmxlZCBzZXQgYWZ0ZXIgdGhlIGVuYWJsZSBhdHRlbXB0LlxuICAgKiBBIHBsdWdpbiBjYW4gYmUgXCJlbmFibGVkXCIgKGNvbmZpZ3VyZWQpIGJ1dCBub3QgXCJsb2FkZWRcIiAoZmFpbGVkIHRvIGluaXRpYWxpemUpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4gaW5zdGFuY2UgYWN0dWFsbHkgZXhpc3RzIGluIGBhcHAucGx1Z2lucy5wbHVnaW5zYC5cbiAgICogVGhpcyBpcyB0aGUgZGVmaW5pdGl2ZSBjaGVjayBcdTIwMTQgYSBwbHVnaW4gdGhhdCBpcyBlbmFibGVkIGJ1dCBub3QgbG9hZGVkIGhhcyBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSBpc0xvYWRlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uc29sZS9lcnJvciBvdXRwdXQgY2FwdHVyZWQgaW4gdGhlIHJlbmRlcmVyIGR1cmluZyB0aGUgZW5hYmxlIHdpbmRvdyBcdTIwMTRcbiAgICogcG9wdWxhdGVkICoqb25seSoqIHdoZW4gdGhlIHBsdWdpbiBmYWlsZWQgdG8gbG9hZCBhbmQgdGhlIG1vbmtleS1wYXRjaCBzYXdcbiAgICogbm8gdGhyb3cgKGAhZXJyb3JNZXNzYWdlICYmICFpc0xvYWRlZGApLCBpLmUuIGV4YWN0bHkgdGhlIGNhc2UgdGhhdCB3b3VsZFxuICAgKiBvdGhlcndpc2Ugc3VyZmFjZSB0aGUgZ2VuZXJpYyB7QGxpbmsgZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZX0gdGV4dC5cbiAgICogYHVuZGVmaW5lZGAgb3RoZXJ3aXNlIChpbmNsdWRpbmcgb24gc3VjY2VzcyBhbmQgd2hlbiB7QGxpbmsgRW5hYmxlUGx1Z2luUmVzdWx0LmVycm9yTWVzc2FnZX0gYWxyZWFkeSBoYXMgdGhlIGVycm9yKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlcmVyQ29uc29sZUVycm9yczogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nRXJyb3JUb1N0cmluZyB7XG4gIGVycm9yVG9TdHJpbmcoZXJyb3I6IHVua25vd24pOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXIge1xuICBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nOiBJbnRlZ3JhdGlvblRlc3RpbmdFcnJvclRvU3RyaW5nO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgYSBwbHVnaW4gaW5zaWRlIE9ic2lkaWFuIGFuZCBjYXB0dXJlcyBhbnkgbG9hZCBlcnJvci5cbiAqXG4gKiBNb25rZXktcGF0Y2hlcyBgYXBwLnBsdWdpbnMubG9hZFBsdWdpbmAgdG8gaW50ZXJjZXB0IGVycm9ycyBiZWZvcmVcbiAqIE9ic2lkaWFuJ3MgYGVuYWJsZVBsdWdpbmAgdHJ5LWNhdGNoIHN3YWxsb3dzIHRoZW0uIFRoZSBvcmlnaW5hbCBtZXRob2RcbiAqIGlzIGFsd2F5cyByZXN0b3JlZCBpbiBhIGBmaW5hbGx5YCBibG9jay5cbiAqXG4gKiBEZXNpZ25lZCB0byBiZSBwYXNzZWQgYXMgdGhlIGBmbmAgYXJndW1lbnQgdG8ge0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBjb21tb24gYXJncyBwbHVzIHRoZSBwbHVnaW4gSUQuXG4gKiBAcGFyYW0gYXJncy5hcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGFyZ3MucGx1Z2luSWQgLSBUaGUgSUQgb2YgdGhlIHBsdWdpbiB0byBlbmFibGUuXG4gKiBAcmV0dXJucyBUaGUgZW5hYmxlIHJlc3VsdCB3aXRoIGVycm9yIG1lc3NhZ2UgYW5kIGVuYWJsZWQgc3RhdHVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSh7IGFwcCwgcGx1Z2luSWQgfTogQ29tbW9uQXJncyAmIEVuYWJsZVBsdWdpblBhcmFtcyk6IFByb21pc2U8RW5hYmxlUGx1Z2luUmVzdWx0PiB7XG4gIGlmICghYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICBhd2FpdCBhcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gIH1cblxuICAvKlxuICAgKiBGb3JjZSBhIGdlbnVpbmUgcmVsb2FkIHdoZW4gcmV0cnlpbmcuIElmIGEgcHJpb3IgYXR0ZW1wdCBsZWZ0IHRoZSBwbHVnaW4gaW5cbiAgICogdGhlIGVuYWJsZWQgc2V0IGJ1dCBub3QgbG9hZGVkICh0aGUgY29sZC1ib290IHJhY2UpLCBhIHBsYWluIHJlLWVuYWJsZSBjYW5cbiAgICogc2hvcnQtY2lyY3VpdCBvbiBzb21lIE9ic2lkaWFuIHZlcnNpb25zIHdpdGhvdXQgcmUtYXR0ZW1wdGluZyB0aGUgbG9hZC5cbiAgICogRnVsbHkgcmVzZXQgdGhlIGVuYWJsZWQgc3RhdGUgZmlyc3Qgc28gdGhlIGBlbmFibGVQbHVnaW5BbmRTYXZlYCBiZWxvdyBpcyBhXG4gICAqIHJlYWwgZnJlc2ggZW5hYmxlICsgbG9hZC4gTm8tb3Agb24gdGhlIGZpcnN0IGF0dGVtcHQgKG5vdCB5ZXQgZW5hYmxlZCkuXG4gICAqL1xuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSAmJiAhKHBsdWdpbklkIGluIGFwcC5wbHVnaW5zLnBsdWdpbnMpKSB7XG4gICAgYXdhaXQgYXBwLnBsdWdpbnMuZGlzYWJsZVBsdWdpbkFuZFNhdmUocGx1Z2luSWQpO1xuICB9XG5cbiAgbGV0IGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kIC0tIEludGVudGlvbmFsIG1vbmtleS1wYXRjaDsgcmVzdG9yZWQgaW4gZmluYWxseS5cbiAgY29uc3Qgb3JpZ0xvYWRQbHVnaW4gPSBhcHAucGx1Z2lucy5sb2FkUGx1Z2luO1xuICBhcHAucGx1Z2lucy5sb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24gbG9hZFBsdWdpbihpZDogc3RyaW5nLCBpc1VzZXJFbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8UGx1Z2luPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9yaWdMb2FkUGx1Z2luLmNhbGwodGhpcywgaWQsIGlzVXNlckVuYWJsZWQpO1xuICAgICAgZXJyb3JNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gICAgICBjb25zdCBob2xkZXIgPSB3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gICAgICBlcnJvck1lc3NhZ2UgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uZXJyb3JUb1N0cmluZyhlcnJvcikgPz8gU3RyaW5nKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICAvKlxuICAgKiBMYXllciAxIFx1MjAxNCBjYXB0dXJlIHRoZSByZW5kZXJlciBjb25zb2xlICsgdW5jYXVnaHQgZXJyb3JzIGZvciB0aGUgZHVyYXRpb24gb2ZcbiAgICogdGhlIGVuYWJsZS4gSWYgT2JzaWRpYW4gc3dhbGxvd3MgdGhlIGxvYWQgZXJyb3IgYmVmb3JlIHRoZSBtb25rZXktcGF0Y2ggYWJvdmVcbiAgICogc2VlcyBpdCAobGVhdmluZyBgZXJyb3JNZXNzYWdlYCBlbXB0eSksIHRoZSByZWFsIGNhdXNlIGlzIHR5cGljYWxseSBzdGlsbFxuICAgKiBgY29uc29sZS5lcnJvcmAnZCwgc28gY2FwdHVyaW5nIGl0IGhlcmUgc3VyZmFjZXMgaXQgaW4gcGxhY2Ugb2YgdGhlIGdlbmVyaWNcbiAgICogZmFsbGJhY2suIFdvcmtzIG9uIGRlc2t0b3AgYW5kIEFuZHJvaWQgYWxpa2Ugc2luY2UgdGhpcyB3aG9sZSBmdW5jdGlvbiBpc1xuICAgKiBzZXJpYWxpemVkIGFuZCBpbmplY3RlZCBpbnRvIHRoZSByZW5kZXJlci5cbiAgICovXG4gIGNvbnN0IGNhcHR1cmVkQ29uc29sZTogc3RyaW5nW10gPSBbXTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0LCBzYW1lIHJhdGlvbmFsZSBhcyBhYm92ZS5cbiAgY29uc3QgZm9ybWF0SG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICBmdW5jdGlvbiBmb3JtYXRBcmcoYXJnOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBmb3JtYXRIb2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uZXJyb3JUb1N0cmluZyhhcmcpID8/IFN0cmluZyhhcmcpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoYXJnKTtcbiAgICB9XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGFyZyk7XG4gICAgcmV0dXJuIGpzb24gPz8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZyk7XG4gIH1cbiAgZnVuY3Rpb24gcmVjb3JkQ29uc29sZSguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBjYXB0dXJlZENvbnNvbGUucHVzaChhcmdzLm1hcChmb3JtYXRBcmcpLmpvaW4oJyAnKSk7XG4gIH1cbiAgY29uc3Qgb3JpZ0NvbnNvbGVFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gIGNvbnN0IG9yaWdDb25zb2xlV2FybiA9IGNvbnNvbGUud2FybjtcbiAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkID0+IHtcbiAgICByZWNvcmRDb25zb2xlKC4uLmFyZ3MpO1xuICAgIG9yaWdDb25zb2xlRXJyb3IuYXBwbHkoY29uc29sZSwgYXJncyk7XG4gIH07XG4gIGNvbnNvbGUud2FybiA9ICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkID0+IHtcbiAgICByZWNvcmRDb25zb2xlKC4uLmFyZ3MpO1xuICAgIG9yaWdDb25zb2xlV2Fybi5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgfTtcbiAgZnVuY3Rpb24gb25XaW5kb3dFcnJvcihldmVudDogRXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNhcHR1cmVkQ29uc29sZS5wdXNoKGV2ZW50LmVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBmb3JtYXRBcmcoZXZlbnQuZXJyb3IpIDogZXZlbnQubWVzc2FnZSk7XG4gIH1cbiAgZnVuY3Rpb24gb25VbmhhbmRsZWRSZWplY3Rpb24oZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIGNhcHR1cmVkQ29uc29sZS5wdXNoKGZvcm1hdEFyZyhldmVudC5yZWFzb24pKTtcbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbldpbmRvd0Vycm9yKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIG9uVW5oYW5kbGVkUmVqZWN0aW9uKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbkFuZFNhdmUocGx1Z2luSWQpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIEludGVudGlvbmFsIHJlc3RvcmUgb2YgbW9ua2V5LXBhdGNoLlxuICAgIGFwcC5wbHVnaW5zLmxvYWRQbHVnaW4gPSBvcmlnTG9hZFBsdWdpbjtcbiAgICBjb25zb2xlLmVycm9yID0gb3JpZ0NvbnNvbGVFcnJvcjtcbiAgICBjb25zb2xlLndhcm4gPSBvcmlnQ29uc29sZVdhcm47XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25XaW5kb3dFcnJvcik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIG9uVW5oYW5kbGVkUmVqZWN0aW9uKTtcbiAgfVxuXG4gIGNvbnN0IGlzTG9hZGVkID0gcGx1Z2luSWQgaW4gYXBwLnBsdWdpbnMucGx1Z2lucztcblxuICBsZXQgcmVuZGVyZXJDb25zb2xlRXJyb3JzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghZXJyb3JNZXNzYWdlICYmICFpc0xvYWRlZCkge1xuICAgIGNvbnN0IGpvaW5lZCA9IGNhcHR1cmVkQ29uc29sZS5qb2luKCdcXG4nKS50cmltKCk7XG4gICAgcmVuZGVyZXJDb25zb2xlRXJyb3JzID0gam9pbmVkID8gam9pbmVkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgaXNFbmFibGVkOiBhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMocGx1Z2luSWQpLFxuICAgIGlzTG9hZGVkLFxuICAgIHJlbmRlcmVyQ29uc29sZUVycm9yc1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBnZW5lcmljIGxhc3QtcmVzb3J0IG1lc3NhZ2Ugc2hvd24gd2hlbiBhIHBsdWdpbiBpcyBpbiB0aGUgZW5hYmxlZCBzZXQgYnV0XG4gKiBub3QgbG9hZGVkIGFuZCBubyByZWFsIGVycm9yIGNvdWxkIGJlIGNhcHR1cmVkIChuZWl0aGVyIHRoZSBgbG9hZFBsdWdpbmBcbiAqIG1vbmtleS1wYXRjaCBub3IgdGhlIHJlbmRlcmVyIGNvbnNvbGUgbm9yLCBvbiBBbmRyb2lkLCBgYWRiIGxvZ2NhdGAgc3VyZmFjZWQgYVxuICogY2F1c2UpLlxuICpcbiAqIEhvc3Qtc2lkZSBoZWxwZXIgXHUyMDE0IHVzZWQgYnkgdGhlIHNldHVwIG9yY2hlc3RyYXRpb24gdG8gY29tcG9zZSB0aGUgZmluYWxcbiAqIGZhaWx1cmUgbWVzc2FnZSwgc28gdGhlIHJlbmRlcmVyLWluamVjdGVkIHtAbGluayBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlfVxuICogc3RheXMgc2VsZi1jb250YWluZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCBmYWlsZWQgdG8gbG9hZC5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmljIGZhaWx1cmUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbmVyaWNQbHVnaW5Mb2FkRmFpbHVyZU1lc3NhZ2UocGx1Z2luSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBpcyBpbiB0aGUgZW5hYmxlZCBzZXQgYnV0IG5vdCBsb2FkZWQuIGBcbiAgICArICdPYnNpZGlhbiBtYXkgaGF2ZSBjYXVnaHQgdGhlIGVycm9yIGJlZm9yZSB0aGUgbW9ua2V5LXBhdGNoLiAnXG4gICAgKyAnQ2hlY2sgdGhlIE9ic2lkaWFuIGNvbnNvbGUgZm9yIGRldGFpbHMuJztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQStFQSxlQUFzQiw2QkFBNkIsRUFBRSxLQUFLLFNBQVMsR0FBaUU7QUFDbEksTUFBSSxDQUFDLElBQUksUUFBUSxVQUFVLEdBQUc7QUFDNUIsVUFBTSxJQUFJLFFBQVEsVUFBVSxJQUFJO0FBQUEsRUFDbEM7QUFTQSxNQUFJLElBQUksUUFBUSxlQUFlLElBQUksUUFBUSxLQUFLLEVBQUUsWUFBWSxJQUFJLFFBQVEsVUFBVTtBQUNsRixVQUFNLElBQUksUUFBUSxxQkFBcUIsUUFBUTtBQUFBLEVBQ2pEO0FBRUEsTUFBSTtBQUVKLFFBQU0saUJBQWlCLElBQUksUUFBUTtBQUNuQyxNQUFJLFFBQVEsYUFBYSxlQUFlLFdBQVcsSUFBWSxlQUEwQztBQUN2RyxRQUFJO0FBQ0YsWUFBTSxTQUFTLE1BQU0sZUFBZSxLQUFLLE1BQU0sSUFBSSxhQUFhO0FBQ2hFLHFCQUFlO0FBQ2YsYUFBTztBQUFBLElBQ1QsU0FBUyxPQUFPO0FBRWQsWUFBTSxTQUFTO0FBQ2YscUJBQWUsT0FBTyw4QkFBOEIsY0FBYyxLQUFLLEtBQUssT0FBTyxLQUFLO0FBQ3hGLFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQVVBLFFBQU0sa0JBQTRCLENBQUM7QUFFbkMsUUFBTSxlQUFlO0FBQ3JCLFdBQVMsVUFBVSxLQUFzQjtBQUN2QyxRQUFJLGVBQWUsT0FBTztBQUN4QixhQUFPLGFBQWEsOEJBQThCLGNBQWMsR0FBRyxLQUFLLE9BQU8sR0FBRztBQUFBLElBQ3BGO0FBQ0EsUUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksUUFBUSxVQUFhLFFBQVEsTUFBTTtBQUNyQyxhQUFPLE9BQU8sR0FBRztBQUFBLElBQ25CO0FBQ0EsVUFBTSxPQUFPLEtBQUssVUFBVSxHQUFHO0FBQy9CLFdBQU8sUUFBUSxPQUFPLFVBQVUsU0FBUyxLQUFLLEdBQUc7QUFBQSxFQUNuRDtBQUNBLFdBQVMsaUJBQWlCLE1BQXVCO0FBQy9DLG9CQUFnQixLQUFLLEtBQUssSUFBSSxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUM7QUFBQSxFQUNwRDtBQUNBLFFBQU0sbUJBQW1CLFFBQVE7QUFDakMsUUFBTSxrQkFBa0IsUUFBUTtBQUNoQyxVQUFRLFFBQVEsSUFBSSxTQUEwQjtBQUM1QyxrQkFBYyxHQUFHLElBQUk7QUFDckIscUJBQWlCLE1BQU0sU0FBUyxJQUFJO0FBQUEsRUFDdEM7QUFDQSxVQUFRLE9BQU8sSUFBSSxTQUEwQjtBQUMzQyxrQkFBYyxHQUFHLElBQUk7QUFDckIsb0JBQWdCLE1BQU0sU0FBUyxJQUFJO0FBQUEsRUFDckM7QUFDQSxXQUFTLGNBQWMsT0FBeUI7QUFDOUMsb0JBQWdCLEtBQUssTUFBTSxpQkFBaUIsUUFBUSxVQUFVLE1BQU0sS0FBSyxJQUFJLE1BQU0sT0FBTztBQUFBLEVBQzVGO0FBQ0EsV0FBUyxxQkFBcUIsT0FBb0M7QUFDaEUsb0JBQWdCLEtBQUssVUFBVSxNQUFNLE1BQU0sQ0FBQztBQUFBLEVBQzlDO0FBQ0EsU0FBTyxpQkFBaUIsU0FBUyxhQUFhO0FBQzlDLFNBQU8saUJBQWlCLHNCQUFzQixvQkFBb0I7QUFFbEUsTUFBSTtBQUNGLFVBQU0sSUFBSSxRQUFRLG9CQUFvQixRQUFRO0FBQUEsRUFDaEQsVUFBRTtBQUVBLFFBQUksUUFBUSxhQUFhO0FBQ3pCLFlBQVEsUUFBUTtBQUNoQixZQUFRLE9BQU87QUFDZixXQUFPLG9CQUFvQixTQUFTLGFBQWE7QUFDakQsV0FBTyxvQkFBb0Isc0JBQXNCLG9CQUFvQjtBQUFBLEVBQ3ZFO0FBRUEsUUFBTSxXQUFXLFlBQVksSUFBSSxRQUFRO0FBRXpDLE1BQUk7QUFDSixNQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtBQUM5QixVQUFNLFNBQVMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLEtBQUs7QUFDL0MsNEJBQXdCLFNBQVMsU0FBUztBQUFBLEVBQzVDO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFdBQVcsSUFBSSxRQUFRLGVBQWUsSUFBSSxRQUFRO0FBQUEsSUFDbEQ7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBZU8sU0FBUyxtQ0FBbUMsVUFBMEI7QUFDM0UsU0FBTyxXQUFXLFFBQVE7QUFHNUI7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -13,6 +13,25 @@ import { TempVault } from './temp-vault.mjs';
|
|
|
13
13
|
* Parameters for {@link coreSetup}.
|
|
14
14
|
*/
|
|
15
15
|
export interface CoreSetupParams {
|
|
16
|
+
/**
|
|
17
|
+
* Community-plugin ids to enable in the vault **in addition to** the
|
|
18
|
+
* plugin-under-test, after it is enabled. Each id's built files must already be
|
|
19
|
+
* present under `.obsidian/plugins/<id>/` — seed them via {@link CoreSetupParams.populate}
|
|
20
|
+
* (e.g. with `buildDemoVaultPopulate`). Enabling goes through the same
|
|
21
|
+
* retry/load-verify path as the plugin-under-test. Composes with
|
|
22
|
+
* `installPlugin: false` (enable extras into an otherwise plugin-less vault).
|
|
23
|
+
*/
|
|
24
|
+
readonly enableCommunityPlugins?: readonly string[] | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Whether to install and enable the built plugin in the temp vault. Defaults
|
|
27
|
+
* to `true`. Set to `false` for a **non-plugin** consumer (e.g. a typings
|
|
28
|
+
* crawler) that only needs a registered, empty vault to `evalInObsidian`
|
|
29
|
+
* against: the plugin `dist`/`manifest.json` read, the copy into
|
|
30
|
+
* `.obsidian/plugins`, the `community-plugins.json` write, and the enable step
|
|
31
|
+
* are all skipped, while the transport, temp vault, registration, and
|
|
32
|
+
* worker-facing endpoint provisioning still run unchanged.
|
|
33
|
+
*/
|
|
34
|
+
readonly installPlugin?: boolean | undefined;
|
|
16
35
|
/**
|
|
17
36
|
* Files and folders to write into the vault **before** Obsidian opens it, so
|
|
18
37
|
* its startup scan indexes them in one pass (see {@link TempVault.populate}).
|
|
@@ -40,9 +59,11 @@ export interface CoreSetupResult {
|
|
|
40
59
|
/**
|
|
41
60
|
* Framework-agnostic global setup logic.
|
|
42
61
|
*
|
|
43
|
-
* Loads `.env` from the project root, creates a transport,
|
|
44
|
-
*
|
|
45
|
-
*
|
|
62
|
+
* Loads `.env` from the project root, creates a transport, creates and registers
|
|
63
|
+
* a temporary vault with Obsidian, and — unless {@link CoreSetupParams.installPlugin}
|
|
64
|
+
* is `false` — copies the built plugin into the vault and enables it. The
|
|
65
|
+
* plugin-less mode still launches the owned instance and publishes its
|
|
66
|
+
* worker-facing endpoint, so a non-plugin consumer reuses the same attach wiring.
|
|
46
67
|
*
|
|
47
68
|
* @param params - Setup parameters.
|
|
48
69
|
* @returns The setup result containing the temp vault, transport, and resolved options.
|