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.
Files changed (86) hide show
  1. package/README.md +82 -11
  2. package/dist/lib/cjs/avd-list.cjs +36 -0
  3. package/dist/lib/cjs/avd-list.d.cts +38 -0
  4. package/dist/lib/cjs/demo-vault-populate.cjs +77 -0
  5. package/dist/lib/cjs/demo-vault-populate.d.cts +71 -0
  6. package/dist/lib/cjs/demo-vault-tree.cjs +52 -0
  7. package/dist/lib/cjs/demo-vault-tree.d.cts +34 -0
  8. package/dist/lib/cjs/enable-plugin.cjs +56 -5
  9. package/dist/lib/cjs/enable-plugin.d.cts +26 -1
  10. package/dist/lib/cjs/global-setup-core.cjs +92 -26
  11. package/dist/lib/cjs/global-setup-core.d.cts +24 -3
  12. package/dist/lib/cjs/index.cjs +10 -1
  13. package/dist/lib/cjs/index.d.cts +6 -0
  14. package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +41 -0
  15. package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +26 -0
  16. package/dist/lib/cjs/jest/global-setup.cjs +7 -2
  17. package/dist/lib/cjs/jest/global-setup.d.cts +20 -3
  18. package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +26 -0
  19. package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +11 -0
  20. package/dist/lib/cjs/library.cjs +1 -1
  21. package/dist/lib/cjs/plugin-enable-retry.cjs +53 -0
  22. package/dist/lib/cjs/plugin-enable-retry.d.cts +71 -0
  23. package/dist/lib/cjs/poll-in-obsidian.cjs +72 -0
  24. package/dist/lib/cjs/poll-in-obsidian.d.cts +92 -0
  25. package/dist/lib/cjs/poll-until.cjs +43 -0
  26. package/dist/lib/cjs/poll-until.d.cts +42 -0
  27. package/dist/lib/cjs/process-exit-message.cjs +47 -0
  28. package/dist/lib/cjs/process-exit-message.d.cts +48 -0
  29. package/dist/lib/cjs/transport-appium.cjs +51 -1
  30. package/dist/lib/cjs/transport-appium.d.cts +24 -1
  31. package/dist/lib/cjs/transport-desktop-cdp.cjs +20 -11
  32. package/dist/lib/cjs/transport-desktop-cdp.d.cts +9 -2
  33. package/dist/lib/cjs/transport-factory.cjs +122 -23
  34. package/dist/lib/cjs/transport-options.cjs +1 -1
  35. package/dist/lib/cjs/transport-options.d.cts +28 -0
  36. package/dist/lib/cjs/transport.cjs +1 -1
  37. package/dist/lib/cjs/transport.d.cts +37 -0
  38. package/dist/lib/cjs/vault-path-match.cjs +49 -0
  39. package/dist/lib/cjs/vault-path-match.d.cts +36 -0
  40. package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +37 -0
  41. package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +26 -0
  42. package/dist/lib/cjs/vitest/global-setup.cjs +7 -2
  43. package/dist/lib/cjs/vitest/global-setup.d.cts +20 -3
  44. package/dist/lib/esm/avd-list.d.mts +38 -0
  45. package/dist/lib/esm/avd-list.mjs +11 -0
  46. package/dist/lib/esm/demo-vault-populate.d.mts +71 -0
  47. package/dist/lib/esm/demo-vault-populate.mjs +57 -0
  48. package/dist/lib/esm/demo-vault-tree.d.mts +34 -0
  49. package/dist/lib/esm/demo-vault-tree.mjs +35 -0
  50. package/dist/lib/esm/enable-plugin.d.mts +26 -1
  51. package/dist/lib/esm/enable-plugin.mjs +54 -4
  52. package/dist/lib/esm/global-setup-core.d.mts +24 -3
  53. package/dist/lib/esm/global-setup-core.mjs +101 -27
  54. package/dist/lib/esm/index.d.mts +6 -0
  55. package/dist/lib/esm/index.mjs +7 -1
  56. package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +26 -0
  57. package/dist/lib/esm/jest/global-setup-no-plugin.mjs +17 -0
  58. package/dist/lib/esm/jest/global-setup.d.mts +20 -3
  59. package/dist/lib/esm/jest/global-setup.mjs +7 -2
  60. package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +11 -0
  61. package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +6 -0
  62. package/dist/lib/esm/library.mjs +1 -1
  63. package/dist/lib/esm/plugin-enable-retry.d.mts +71 -0
  64. package/dist/lib/esm/plugin-enable-retry.mjs +24 -0
  65. package/dist/lib/esm/poll-in-obsidian.d.mts +92 -0
  66. package/dist/lib/esm/poll-in-obsidian.mjs +48 -0
  67. package/dist/lib/esm/poll-until.d.mts +42 -0
  68. package/dist/lib/esm/poll-until.mjs +19 -0
  69. package/dist/lib/esm/process-exit-message.d.mts +48 -0
  70. package/dist/lib/esm/process-exit-message.mjs +23 -0
  71. package/dist/lib/esm/transport-appium.d.mts +24 -1
  72. package/dist/lib/esm/transport-appium.mjs +51 -1
  73. package/dist/lib/esm/transport-desktop-cdp.d.mts +9 -2
  74. package/dist/lib/esm/transport-desktop-cdp.mjs +20 -11
  75. package/dist/lib/esm/transport-factory.mjs +125 -23
  76. package/dist/lib/esm/transport-options.d.mts +28 -0
  77. package/dist/lib/esm/transport.d.mts +37 -0
  78. package/dist/lib/esm/vault-path-match.d.mts +36 -0
  79. package/dist/lib/esm/vault-path-match.mjs +14 -0
  80. package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +26 -0
  81. package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +11 -0
  82. package/dist/lib/esm/vitest/global-setup.d.mts +20 -3
  83. package/dist/lib/esm/vitest/global-setup.mjs +7 -2
  84. package/dist/obsidian-integration-testing-9.1.0.tgz +0 -0
  85. package/package.json +38 -8
  86. 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 if the plugin failed to load, or `undefined` if it loaded successfully.
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
- errorMessage = `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.`;
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, copies the built
44
- * plugin into a temporary vault, registers the vault with Obsidian, and
45
- * enables the plugin.
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.