obsidian-integration-testing 9.0.0 → 9.1.1

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 (60) hide show
  1. package/README.md +30 -0
  2. package/dist/lib/cjs/demo-vault-populate.cjs +77 -0
  3. package/dist/lib/cjs/demo-vault-populate.d.cts +71 -0
  4. package/dist/lib/cjs/enable-plugin.cjs +56 -5
  5. package/dist/lib/cjs/enable-plugin.d.cts +26 -1
  6. package/dist/lib/cjs/global-setup-core.cjs +78 -13
  7. package/dist/lib/cjs/global-setup-core.d.cts +9 -0
  8. package/dist/lib/cjs/index.cjs +7 -1
  9. package/dist/lib/cjs/index.d.cts +4 -0
  10. package/dist/lib/cjs/jest/global-setup.cjs +7 -2
  11. package/dist/lib/cjs/jest/global-setup.d.cts +9 -2
  12. package/dist/lib/cjs/library.cjs +1 -1
  13. package/dist/lib/cjs/plugin-enable-retry.cjs +53 -0
  14. package/dist/lib/cjs/plugin-enable-retry.d.cts +71 -0
  15. package/dist/lib/cjs/poll-in-obsidian.cjs +72 -0
  16. package/dist/lib/cjs/poll-in-obsidian.d.cts +92 -0
  17. package/dist/lib/cjs/poll-until.cjs +43 -0
  18. package/dist/lib/cjs/poll-until.d.cts +42 -0
  19. package/dist/lib/cjs/transport-appium.cjs +51 -1
  20. package/dist/lib/cjs/transport-appium.d.cts +24 -1
  21. package/dist/lib/cjs/transport-desktop-cdp.cjs +20 -11
  22. package/dist/lib/cjs/transport-desktop-cdp.d.cts +9 -2
  23. package/dist/lib/cjs/transport-options.cjs +1 -1
  24. package/dist/lib/cjs/transport-options.d.cts +28 -0
  25. package/dist/lib/cjs/transport.cjs +1 -1
  26. package/dist/lib/cjs/transport.d.cts +37 -0
  27. package/dist/lib/cjs/vault-path-match.cjs +49 -0
  28. package/dist/lib/cjs/vault-path-match.d.cts +36 -0
  29. package/dist/lib/cjs/vitest/global-setup.cjs +7 -2
  30. package/dist/lib/cjs/vitest/global-setup.d.cts +9 -2
  31. package/dist/lib/esm/demo-vault-populate.d.mts +71 -0
  32. package/dist/lib/esm/demo-vault-populate.mjs +57 -0
  33. package/dist/lib/esm/enable-plugin.d.mts +26 -1
  34. package/dist/lib/esm/enable-plugin.mjs +54 -4
  35. package/dist/lib/esm/global-setup-core.d.mts +9 -0
  36. package/dist/lib/esm/global-setup-core.mjs +87 -14
  37. package/dist/lib/esm/index.d.mts +4 -0
  38. package/dist/lib/esm/index.mjs +5 -1
  39. package/dist/lib/esm/jest/global-setup.d.mts +9 -2
  40. package/dist/lib/esm/jest/global-setup.mjs +7 -2
  41. package/dist/lib/esm/library.mjs +1 -1
  42. package/dist/lib/esm/plugin-enable-retry.d.mts +71 -0
  43. package/dist/lib/esm/plugin-enable-retry.mjs +24 -0
  44. package/dist/lib/esm/poll-in-obsidian.d.mts +92 -0
  45. package/dist/lib/esm/poll-in-obsidian.mjs +48 -0
  46. package/dist/lib/esm/poll-until.d.mts +42 -0
  47. package/dist/lib/esm/poll-until.mjs +19 -0
  48. package/dist/lib/esm/transport-appium.d.mts +24 -1
  49. package/dist/lib/esm/transport-appium.mjs +51 -1
  50. package/dist/lib/esm/transport-desktop-cdp.d.mts +9 -2
  51. package/dist/lib/esm/transport-desktop-cdp.mjs +20 -11
  52. package/dist/lib/esm/transport-options.d.mts +28 -0
  53. package/dist/lib/esm/transport.d.mts +37 -0
  54. package/dist/lib/esm/vault-path-match.d.mts +36 -0
  55. package/dist/lib/esm/vault-path-match.mjs +14 -0
  56. package/dist/lib/esm/vitest/global-setup.d.mts +9 -2
  57. package/dist/lib/esm/vitest/global-setup.mjs +7 -2
  58. package/dist/obsidian-integration-testing-9.1.1.tgz +0 -0
  59. package/package.json +1 -1
  60. package/dist/obsidian-integration-testing-9.0.0.tgz +0 -0
package/README.md CHANGED
@@ -500,6 +500,36 @@ Both files share the same `createSetup` instance (via the common module), so `te
500
500
 
501
501
  **Manual** — when wiring `TempVault` yourself (without a framework global setup), call `vault.populate()` before `vault.register()`, as shown in [Create a temporary vault](#create-a-temporary-vault).
502
502
 
503
+ ### Seed a plugin's `demo-vault/` and enable extra community plugins
504
+
505
+ A plugin's committed `demo-vault/` often needs more than the plugin-under-test — e.g. **CodeScript Toolkit** (`fix-require-modules`) to run its `code-button` blocks, or the `demo-vault-helper` bootstrap. Two pieces make this a one-liner:
506
+
507
+ - **`enableCommunityPlugins`** — a `createSetup` option listing community-plugin ids to enable **in addition to** the plugin-under-test, after it is enabled. Each id's built files must already be in the vault (seed them below). This replaces the hand-rolled `beforeAll` that turned off restricted mode and called `enablePlugin(...)` in every demo-vault test.
508
+ - **`buildDemoVaultPopulate`** — reads the repo's `demo-vault/` tree, carries over selected `.obsidian/*` config (`app.json`, `appearance.json`, `core-plugins.json` by default), and seeds each injected plugin's binaries (+ optional `data.json`) — returning a `populate` map. It complements the release-time demo-vault archiving in `obsidian-dev-utils`.
509
+
510
+ ```ts
511
+ // integration-global-setup.ts
512
+ import { buildDemoVaultPopulate } from 'obsidian-integration-testing';
513
+ import { createSetup } from 'obsidian-integration-testing/vitest-global-setup-plugin';
514
+ import { getRootFolder } from 'obsidian-dev-utils/script-utils/root';
515
+ import { join } from 'node:path';
516
+
517
+ const CST_ID = 'fix-require-modules';
518
+
519
+ export const { setup, teardown } = createSetup({
520
+ // Turn on the seeded extra plugins (the plugin-under-test is enabled automatically).
521
+ enableCommunityPlugins: [CST_ID],
522
+ populate: () =>
523
+ buildDemoVaultPopulate({
524
+ demoVaultPath: join(getRootFolder() ?? process.cwd(), 'demo-vault'),
525
+ // CST binaries come from the demo vault's local (gitignored) install; `data` writes its data.json.
526
+ injectPlugins: [{ pluginId: CST_ID, data: { modulesRoot: '_assets' } }]
527
+ })
528
+ });
529
+ ```
530
+
531
+ `buildDemoVaultPopulate` throws an actionable error if an injected plugin's `main.js`/`manifest.json` is missing from the demo vault — open `demo-vault/` in Obsidian once so `demo-vault-helper` installs it, then re-run. `enableCommunityPlugins` also composes with `installPlugin: false` (enable extras into an otherwise plugin-less vault).
532
+
503
533
  ### Non-plugin consumers
504
534
 
505
535
  If your project is **not** a plugin — a tool that only needs a registered, empty vault to `evalInObsidian` against (e.g. a typings crawler) — point `globalSetup` at the **`-no-plugin`** entry point instead of `-plugin`. It still launches one owned, off-screen Obsidian instance and publishes its endpoint to workers so each worker **attaches** to it, but skips reading `dist/manifest.json`, copying a plugin, writing `community-plugins.json`, and enabling a plugin. No wrapper module needed:
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var demo_vault_populate_exports = {};
20
+ __export(demo_vault_populate_exports, {
21
+ buildDemoVaultPopulate: () => buildDemoVaultPopulate
22
+ });
23
+ module.exports = __toCommonJS(demo_vault_populate_exports);
24
+ var import_node_fs = require("node:fs");
25
+ var import_node_path = require("node:path");
26
+ var import_demo_vault_tree = require("./demo-vault-tree.cjs");
27
+ var import_type_guards = require("./type-guards.cjs");
28
+ const OBSIDIAN_CONFIG_DIR = ".obsidian";
29
+ const PLUGINS_DIR = "plugins";
30
+ const DATA_JSON = "data.json";
31
+ const MANIFEST_JSON = "manifest.json";
32
+ const MAIN_JS = "main.js";
33
+ const DATA_JSON_INDENT = 2;
34
+ const DEFAULT_OBSIDIAN_CONFIG_FILES = ["app.json", "appearance.json", "core-plugins.json"];
35
+ function buildDemoVaultPopulate(params) {
36
+ const { demoVaultPath, excludedNames, injectPlugins = [], obsidianConfigFiles = DEFAULT_OBSIDIAN_CONFIG_FILES } = params;
37
+ const map = (0, import_demo_vault_tree.readDemoVaultTree)(excludedNames === void 0 ? { demoVaultPath } : { demoVaultPath, excludedNames });
38
+ for (const configFile of obsidianConfigFiles) {
39
+ const configPath = (0, import_node_path.join)(demoVaultPath, OBSIDIAN_CONFIG_DIR, configFile);
40
+ if ((0, import_node_fs.existsSync)(configPath)) {
41
+ map[`${OBSIDIAN_CONFIG_DIR}/${configFile}`] = (0, import_node_fs.readFileSync)(configPath);
42
+ }
43
+ }
44
+ for (const plugin of injectPlugins) {
45
+ seedPlugin(demoVaultPath, plugin, map);
46
+ }
47
+ return map;
48
+ }
49
+ function seedPlugin(demoVaultPath, plugin, map) {
50
+ const { data, pluginId } = plugin;
51
+ const sourceDir = plugin.sourceDir ?? (0, import_node_path.join)(demoVaultPath, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
52
+ const pluginPrefix = `${OBSIDIAN_CONFIG_DIR}/${PLUGINS_DIR}/${pluginId}`;
53
+ const fileNames = (0, import_node_fs.existsSync)(sourceDir) ? (0, import_node_fs.readdirSync)(sourceDir, { withFileTypes: true }).filter((entry) => entry.isFile()).map((entry) => entry.name) : [];
54
+ for (const requiredFile of [MAIN_JS, MANIFEST_JSON]) {
55
+ if (!fileNames.includes(requiredFile)) {
56
+ throw new Error(
57
+ `Community plugin "${pluginId}" is not installed in the demo vault (${(0, import_node_path.join)(sourceDir, requiredFile)} missing). Open demo-vault/ in Obsidian once so demo-vault-helper installs it, then re-run.`
58
+ );
59
+ }
60
+ }
61
+ for (const fileName of fileNames) {
62
+ if (fileName === DATA_JSON && data !== void 0) {
63
+ continue;
64
+ }
65
+ map[`${pluginPrefix}/${fileName}`] = (0, import_node_fs.readFileSync)((0, import_node_path.join)(sourceDir, fileName));
66
+ }
67
+ if (data !== void 0) {
68
+ const dataJson = (0, import_type_guards.ensureNonNullable)(JSON.stringify(data, null, DATA_JSON_INDENT));
69
+ map[`${pluginPrefix}/${DATA_JSON}`] = `${dataJson}
70
+ `;
71
+ }
72
+ }
73
+ // Annotate the CommonJS export names for ESM import in node:
74
+ 0 && (module.exports = {
75
+ buildDemoVaultPopulate
76
+ });
77
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuXG5pbXBvcnQgeyByZWFkRGVtb1ZhdWx0VHJlZSB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcblxuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBEQVRBX0pTT04gPSAnZGF0YS5qc29uJztcbmNvbnN0IE1BTklGRVNUX0pTT04gPSAnbWFuaWZlc3QuanNvbic7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgREFUQV9KU09OX0lOREVOVCA9IDI7XG5cbmNvbnN0IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTID0gWydhcHAuanNvbicsICdhcHBlYXJhbmNlLmpzb24nLCAnY29yZS1wbHVnaW5zLmpzb24nXTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lcyAob2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMsIG1hdGNoZWQgYXQgYW55IGRlcHRoKSB0byBza2lwIHdoaWxlIHJlYWRpbmcgdGhlIG5vdGUgdHJlZSBcdTIwMTQgZm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJy5naXQnLCAnLm9ic2lkaWFuJ11gXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5hbWVzPzogSXRlcmFibGU8c3RyaW5nPjtcblxuICAvKipcbiAgICogQ29tbXVuaXR5IHBsdWdpbnMgdG8gc2VlZCBpbnRvIGAub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+L2AgKGJpbmFyaWVzICsgb3B0aW9uYWwgYGRhdGEuanNvbmApLiBUdXJuXG4gICAqIHRoZW0gb24gd2l0aCB0aGUgZ2xvYmFsLXNldHVwIGBjcmVhdGVTZXR1cCh7IGVuYWJsZUNvbW11bml0eVBsdWdpbnMgfSlgIG9wdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGluamVjdFBsdWdpbnM/OiByZWFkb25seSBJbmplY3RQbHVnaW5QYXJhbXNbXTtcblxuICAvKipcbiAgICogYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMgdG8gY2Fycnkgb3ZlciBmcm9tIHRoZSBkZW1vIHZhdWx0LiB7QGxpbmsgcmVhZERlbW9WYXVsdFRyZWV9IGV4Y2x1ZGVzIHRoZSB3aG9sZVxuICAgKiBgLm9ic2lkaWFuYCBkaXJlY3RvcnksIHNvIGNvbmZpZyB0aGUgdmF1bHQgcmVsaWVzIG9uIChwcmV2aWV3LW1vZGUgZGVmYXVsdCwgY29yZSBwbHVnaW5zLCBhcHBlYXJhbmNlKSBtdXN0XG4gICAqIGJlIHJlLWFkZGVkIGV4cGxpY2l0bHkuIEZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBza2lwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydhcHAuanNvbicsICdhcHBlYXJhbmNlLmpzb24nLCAnY29yZS1wbHVnaW5zLmpzb24nXWBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuQ29uZmlnRmlsZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGNvbW11bml0eSBwbHVnaW4gdG8gc2VlZCBpbnRvIHRoZSBkZW1vIHZhdWx0IGFsb25nc2lkZSB0aGUgbm90ZSB0cmVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdFBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBPdmVybGF5IHdyaXR0ZW4gYXMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vZGF0YS5qc29uYCAoSlNPTiwgMi1zcGFjZSBpbmRlbnQpLiBPbWl0IHRvIGtlZXAgd2hhdGV2ZXJcbiAgICogYGRhdGEuanNvbmAgKGlmIGFueSkgYWxyZWFkeSBsaXZlcyBpbiB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnNvdXJjZURpcn0uXG4gICAqL1xuICByZWFkb25seSBkYXRhPzogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIGNvbW11bml0eSBwbHVnaW4ncyBpZCAoaXRzIGAub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+YCBmb2xkZXIgbmFtZSkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgdG8gcmVhZCB0aGUgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgZnJvbS4gRXZlcnkgZmlsZSBkaXJlY3RseSBpbnNpZGUgaXQgaXMgY29waWVkIGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYDsgYG1haW4uanNgIGFuZCBgbWFuaWZlc3QuanNvbmAgYXJlIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgPGRlbW9WYXVsdFBhdGg+Ly5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VEaXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBmdWxsIHBvcHVsYXRlIG1hcCBmb3IgYSBwbHVnaW4ncyBgZGVtby12YXVsdC9gOiB0aGUgbm90ZSB0cmVlLCB0aGUgc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWdcbiAqIGZpbGVzLCBhbmQgZXZlcnkgaW5qZWN0ZWQgcGx1Z2luJ3MgYmluYXJpZXMgKCsgb3B0aW9uYWwgYGRhdGEuanNvbmApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHBvcHVsYXRlIG1hcCwgcmVhZHkgdG8gaGFuZCB0byBhIGdsb2JhbCBzZXR1cCdzIGBwb3B1bGF0ZWAgb3Ige0BsaW5rIFRlbXBWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFNlZWRzIG9uZSBpbmplY3RlZCBwbHVnaW4ncyBiaW5hcmllcyAoYW5kIG9wdGlvbmFsIGBkYXRhLmpzb25gKSBpbnRvIHRoZSBwb3B1bGF0ZSBtYXAuXG4gKlxuICogQHBhcmFtIGRlbW9WYXVsdFBhdGggLSBUaGUgZGVtbyB2YXVsdCByb290LCB1c2VkIHRvIHJlc29sdmUgdGhlIGRlZmF1bHQgc291cmNlIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIHNlZWQuXG4gKiBAcGFyYW0gbWFwIC0gVGhlIHBvcHVsYXRlIG1hcCB0byB3cml0ZSBpbnRvLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpciA9IHBsdWdpbi5zb3VyY2VEaXIgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICBjb25zdCBwbHVnaW5QcmVmaXggPSBgJHtPQlNJRElBTl9DT05GSUdfRElSfS8ke1BMVUdJTlNfRElSfS8ke3BsdWdpbklkfWA7XG5cbiAgY29uc3QgZmlsZU5hbWVzID0gZXhpc3RzU3luYyhzb3VyY2VEaXIpXG4gICAgPyByZWFkZGlyU3luYyhzb3VyY2VEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSkubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSlcbiAgICA6IFtdO1xuXG4gIGZvciAoY29uc3QgcmVxdWlyZWRGaWxlIG9mIFtNQUlOX0pTLCBNQU5JRkVTVF9KU09OXSkge1xuICAgIGlmICghZmlsZU5hbWVzLmluY2x1ZGVzKHJlcXVpcmVkRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXIsIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiBgXG4gICAgICAgICAgKyAnT3BlbiBkZW1vLXZhdWx0LyBpbiBPYnNpZGlhbiBvbmNlIHNvIGRlbW8tdmF1bHQtaGVscGVyIGluc3RhbGxzIGl0LCB0aGVuIHJlLXJ1bi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyLCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUEscUJBSU87QUFDUCx1QkFBcUI7QUFJckIsNkJBQWtDO0FBQ2xDLHlCQUFrQztBQUVsQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0sVUFBVTtBQUNoQixNQUFNLG1CQUFtQjtBQUV6QixNQUFNLGdDQUFnQyxDQUFDLFlBQVksbUJBQW1CLG1CQUFtQjtBQWtFbEYsU0FBUyx1QkFBdUIsUUFBMkQ7QUFDaEcsUUFBTSxFQUFFLGVBQWUsZUFBZSxnQkFBZ0IsQ0FBQyxHQUFHLHNCQUFzQiw4QkFBOEIsSUFBSTtBQUVsSCxRQUFNLFVBQU0sMENBQWtCLGtCQUFrQixTQUFZLEVBQUUsY0FBYyxJQUFJLEVBQUUsZUFBZSxjQUFjLENBQUM7QUFFaEgsYUFBVyxjQUFjLHFCQUFxQjtBQUM1QyxVQUFNLGlCQUFhLHVCQUFLLGVBQWUscUJBQXFCLFVBQVU7QUFDdEUsWUFBSSwyQkFBVyxVQUFVLEdBQUc7QUFDMUIsVUFBSSxHQUFHLG1CQUFtQixJQUFJLFVBQVUsRUFBRSxRQUFJLDZCQUFhLFVBQVU7QUFBQSxJQUN2RTtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFVBQVUsZUFBZTtBQUNsQyxlQUFXLGVBQWUsUUFBUSxHQUFHO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7QUFTQSxTQUFTLFdBQVcsZUFBdUIsUUFBNEIsS0FBZ0M7QUFDckcsUUFBTSxFQUFFLE1BQU0sU0FBUyxJQUFJO0FBQzNCLFFBQU0sWUFBWSxPQUFPLGlCQUFhLHVCQUFLLGVBQWUscUJBQXFCLGFBQWEsUUFBUTtBQUNwRyxRQUFNLGVBQWUsR0FBRyxtQkFBbUIsSUFBSSxXQUFXLElBQUksUUFBUTtBQUV0RSxRQUFNLGdCQUFZLDJCQUFXLFNBQVMsUUFDbEMsNEJBQVksV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsTUFBTSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxNQUFNLElBQUksSUFDM0csQ0FBQztBQUVMLGFBQVcsZ0JBQWdCLENBQUMsU0FBUyxhQUFhLEdBQUc7QUFDbkQsUUFBSSxDQUFDLFVBQVUsU0FBUyxZQUFZLEdBQUc7QUFDckMsWUFBTSxJQUFJO0FBQUEsUUFDUixxQkFBcUIsUUFBUSw2Q0FBeUMsdUJBQUssV0FBVyxZQUFZLENBQUM7QUFBQSxNQUVyRztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsYUFBVyxZQUFZLFdBQVc7QUFFaEMsUUFBSSxhQUFhLGFBQWEsU0FBUyxRQUFXO0FBQ2hEO0FBQUEsSUFDRjtBQUNBLFFBQUksR0FBRyxZQUFZLElBQUksUUFBUSxFQUFFLFFBQUksaUNBQWEsdUJBQUssV0FBVyxRQUFRLENBQUM7QUFBQSxFQUM3RTtBQUVBLE1BQUksU0FBUyxRQUFXO0FBQ3RCLFVBQU0sZUFBbUIsc0NBQWtCLEtBQUssVUFBVSxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsUUFBSSxHQUFHLFlBQVksSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUFHLFFBQVE7QUFBQTtBQUFBLEVBQ25EO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Builds a complete {@link PopulateFilesParams} map for a plugin's in-repo `demo-vault/`, ready to seed into
5
+ * the temp vault before Obsidian opens it. Composes {@link readDemoVaultTree} (the note tree) with the two
6
+ * pieces it deliberately omits: selected `.obsidian/*` config files, and the built binaries (+ `data.json`)
7
+ * of any extra community plugins the demo vault depends on (e.g. CodeScript Toolkit, `demo-vault-helper`).
8
+ *
9
+ * Pairs with the `enableCommunityPlugins` option of the global-setup `createSetup`: this seeds the binaries,
10
+ * that turns them on. It intentionally does NOT write `community-plugins.json` — the harness owns that file
11
+ * (it lists the plugin-under-test), and enabling the extras persists them.
12
+ */
13
+ import type { PopulateFilesParams } from './temp-vault.cjs';
14
+ /**
15
+ * Parameters for {@link buildDemoVaultPopulate}.
16
+ */
17
+ export interface BuildDemoVaultPopulateParams {
18
+ /**
19
+ * Absolute path to the plugin repo's `demo-vault/` directory.
20
+ */
21
+ readonly demoVaultPath: string;
22
+ /**
23
+ * Names (of files or directories, matched at any depth) to skip while reading the note tree — forwarded to
24
+ * {@link readDemoVaultTree}.
25
+ *
26
+ * @default `['.git', '.obsidian']`
27
+ */
28
+ readonly excludedNames?: Iterable<string>;
29
+ /**
30
+ * Community plugins to seed into `.obsidian/plugins/<pluginId>/` (binaries + optional `data.json`). Turn
31
+ * them on with the global-setup `createSetup({ enableCommunityPlugins })` option.
32
+ */
33
+ readonly injectPlugins?: readonly InjectPluginParams[];
34
+ /**
35
+ * `.obsidian/*` config files to carry over from the demo vault. {@link readDemoVaultTree} excludes the whole
36
+ * `.obsidian` directory, so config the vault relies on (preview-mode default, core plugins, appearance) must
37
+ * be re-added explicitly. Files that do not exist are skipped.
38
+ *
39
+ * @default `['app.json', 'appearance.json', 'core-plugins.json']`
40
+ */
41
+ readonly obsidianConfigFiles?: readonly string[];
42
+ }
43
+ /**
44
+ * A community plugin to seed into the demo vault alongside the note tree.
45
+ */
46
+ export interface InjectPluginParams {
47
+ /**
48
+ * Overlay written as `.obsidian/plugins/<pluginId>/data.json` (JSON, 2-space indent). Omit to keep whatever
49
+ * `data.json` (if any) already lives in {@link InjectPluginParams.sourceDir}.
50
+ */
51
+ readonly data?: unknown;
52
+ /**
53
+ * The community plugin's id (its `.obsidian/plugins/<pluginId>` folder name).
54
+ */
55
+ readonly pluginId: string;
56
+ /**
57
+ * Directory to read the plugin's built files from. Every file directly inside it is copied into
58
+ * `.obsidian/plugins/<pluginId>/`; `main.js` and `manifest.json` are required.
59
+ *
60
+ * @default `<demoVaultPath>/.obsidian/plugins/<pluginId>`
61
+ */
62
+ readonly sourceDir?: string;
63
+ }
64
+ /**
65
+ * Builds the full populate map for a plugin's `demo-vault/`: the note tree, the selected `.obsidian/*` config
66
+ * files, and every injected plugin's binaries (+ optional `data.json`).
67
+ *
68
+ * @param params - The {@link BuildDemoVaultPopulateParams}.
69
+ * @returns The populate map, ready to hand to a global setup's `populate` or {@link TempVault.populate}.
70
+ */
71
+ export declare function buildDemoVaultPopulate(params: BuildDemoVaultPopulateParams): PopulateFilesParams;
@@ -18,13 +18,17 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var enable_plugin_exports = {};
20
20
  __export(enable_plugin_exports, {
21
- enablePluginWithErrorCapture: () => enablePluginWithErrorCapture
21
+ enablePluginWithErrorCapture: () => enablePluginWithErrorCapture,
22
+ getGenericPluginLoadFailureMessage: () => getGenericPluginLoadFailureMessage
22
23
  });
23
24
  module.exports = __toCommonJS(enable_plugin_exports);
24
25
  async function enablePluginWithErrorCapture({ app, pluginId }) {
25
26
  if (!app.plugins.isEnabled()) {
26
27
  await app.plugins.setEnable(true);
27
28
  }
29
+ if (app.plugins.enabledPlugins.has(pluginId) && !(pluginId in app.plugins.plugins)) {
30
+ await app.plugins.disablePluginAndSave(pluginId);
31
+ }
28
32
  let errorMessage;
29
33
  const origLoadPlugin = app.plugins.loadPlugin;
30
34
  app.plugins.loadPlugin = async function loadPlugin(id, isUserEnabled) {
@@ -38,23 +42,70 @@ async function enablePluginWithErrorCapture({ app, pluginId }) {
38
42
  throw error;
39
43
  }
40
44
  };
45
+ const capturedConsole = [];
46
+ const formatHolder = window;
47
+ function formatArg(arg) {
48
+ if (arg instanceof Error) {
49
+ return formatHolder.__obsidianIntegrationTesting?.errorToString(arg) ?? String(arg);
50
+ }
51
+ if (typeof arg === "string") {
52
+ return arg;
53
+ }
54
+ if (arg === void 0 || arg === null) {
55
+ return String(arg);
56
+ }
57
+ const json = JSON.stringify(arg);
58
+ return json ?? Object.prototype.toString.call(arg);
59
+ }
60
+ function recordConsole(...args) {
61
+ capturedConsole.push(args.map(formatArg).join(" "));
62
+ }
63
+ const origConsoleError = console.error;
64
+ const origConsoleWarn = console.warn;
65
+ console.error = (...args) => {
66
+ recordConsole(...args);
67
+ origConsoleError.apply(console, args);
68
+ };
69
+ console.warn = (...args) => {
70
+ recordConsole(...args);
71
+ origConsoleWarn.apply(console, args);
72
+ };
73
+ function onWindowError(event) {
74
+ capturedConsole.push(event.error instanceof Error ? formatArg(event.error) : event.message);
75
+ }
76
+ function onUnhandledRejection(event) {
77
+ capturedConsole.push(formatArg(event.reason));
78
+ }
79
+ window.addEventListener("error", onWindowError);
80
+ window.addEventListener("unhandledrejection", onUnhandledRejection);
41
81
  try {
42
82
  await app.plugins.enablePluginAndSave(pluginId);
43
83
  } finally {
44
84
  app.plugins.loadPlugin = origLoadPlugin;
85
+ console.error = origConsoleError;
86
+ console.warn = origConsoleWarn;
87
+ window.removeEventListener("error", onWindowError);
88
+ window.removeEventListener("unhandledrejection", onUnhandledRejection);
45
89
  }
46
90
  const isLoaded = pluginId in app.plugins.plugins;
91
+ let rendererConsoleErrors;
47
92
  if (!errorMessage && !isLoaded) {
48
- 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.`;
93
+ const joined = capturedConsole.join("\n").trim();
94
+ rendererConsoleErrors = joined ? joined : void 0;
49
95
  }
50
96
  return {
51
97
  errorMessage,
52
98
  isEnabled: app.plugins.enabledPlugins.has(pluginId),
53
- isLoaded
99
+ isLoaded,
100
+ rendererConsoleErrors
54
101
  };
55
102
  }
103
+ function getGenericPluginLoadFailureMessage(pluginId) {
104
+ 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.`;
105
+ }
56
106
  // Annotate the CommonJS export names for ESM import in node:
57
107
  0 && (module.exports = {
58
- enablePluginWithErrorCapture
108
+ enablePluginWithErrorCapture,
109
+ getGenericPluginLoadFailureMessage
59
110
  });
60
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VuYWJsZS1wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgaGVscGVyIGZvciBlbmFibGluZyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBlcnJvciBjYXB0dXJlLlxuICogVXNlZCBieSBib3RoIHRoZSBnbG9iYWwgc2V0dXAgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1vbkFyZ3MgfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGVuYWJsaW5nIGEgcGx1Z2luIHdpdGggZXJyb3IgY2FwdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmFibGVQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHBsdWdpbiBmYWlsZWQgdG8gbG9hZCwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgbG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGVuYWJsZWQgc2V0IGFmdGVyIHRoZSBlbmFibGUgYXR0ZW1wdC5cbiAgICogQSBwbHVnaW4gY2FuIGJlIFwiZW5hYmxlZFwiIChjb25maWd1cmVkKSBidXQgbm90IFwibG9hZGVkXCIgKGZhaWxlZCB0byBpbml0aWFsaXplKS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luIGluc3RhbmNlIGFjdHVhbGx5IGV4aXN0cyBpbiBgYXBwLnBsdWdpbnMucGx1Z2luc2AuXG4gICAqIFRoaXMgaXMgdGhlIGRlZmluaXRpdmUgY2hlY2sgXHUyMDE0IGEgcGx1Z2luIHRoYXQgaXMgZW5hYmxlZCBidXQgbm90IGxvYWRlZCBoYXMgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNMb2FkZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdFcnJvclRvU3RyaW5nIHtcbiAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gIF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc6IEludGVncmF0aW9uVGVzdGluZ0Vycm9yVG9TdHJpbmc7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIHBsdWdpbiBpbnNpZGUgT2JzaWRpYW4gYW5kIGNhcHR1cmVzIGFueSBsb2FkIGVycm9yLlxuICpcbiAqIE1vbmtleS1wYXRjaGVzIGBhcHAucGx1Z2lucy5sb2FkUGx1Z2luYCB0byBpbnRlcmNlcHQgZXJyb3JzIGJlZm9yZVxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luYCB0cnktY2F0Y2ggc3dhbGxvd3MgdGhlbS4gVGhlIG9yaWdpbmFsIG1ldGhvZFxuICogaXMgYWx3YXlzIHJlc3RvcmVkIGluIGEgYGZpbmFsbHlgIGJsb2NrLlxuICpcbiAqIERlc2lnbmVkIHRvIGJlIHBhc3NlZCBhcyB0aGUgYGZuYCBhcmd1bWVudCB0byB7QGxpbmsgZXZhbEluT2JzaWRpYW59LlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGNvbW1vbiBhcmdzIHBsdXMgdGhlIHBsdWdpbiBJRC5cbiAqIEBwYXJhbSBhcmdzLmFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gYXJncy5wbHVnaW5JZCAtIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAqIEByZXR1cm5zIFRoZSBlbmFibGUgcmVzdWx0IHdpdGggZXJyb3IgbWVzc2FnZSBhbmQgZW5hYmxlZCBzdGF0dXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlKHsgYXBwLCBwbHVnaW5JZCB9OiBDb21tb25BcmdzICYgRW5hYmxlUGx1Z2luUGFyYW1zKTogUHJvbWlzZTxFbmFibGVQbHVnaW5SZXN1bHQ+IHtcbiAgaWYgKCFhcHAucGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgIGF3YWl0IGFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgfVxuXG4gIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAtLSBJbnRlbnRpb25hbCBtb25rZXktcGF0Y2g7IHJlc3RvcmVkIGluIGZpbmFsbHkuXG4gIGNvbnN0IG9yaWdMb2FkUGx1Z2luID0gYXBwLnBsdWdpbnMubG9hZFBsdWdpbjtcbiAgYXBwLnBsdWdpbnMubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uIGxvYWRQbHVnaW4oaWQ6IHN0cmluZywgaXNVc2VyRW5hYmxlZD86IGJvb2xlYW4pOiBQcm9taXNlPFBsdWdpbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmlnTG9hZFBsdWdpbi5jYWxsKHRoaXMsIGlkLCBpc1VzZXJFbmFibGVkKTtcbiAgICAgIGVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAgICAgY29uc3QgaG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICAgICAgZXJyb3JNZXNzYWdlID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmVycm9yVG9TdHJpbmcoZXJyb3IpID8/IFN0cmluZyhlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKHBsdWdpbklkKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBJbnRlbnRpb25hbCByZXN0b3JlIG9mIG1vbmtleS1wYXRjaC5cbiAgICBhcHAucGx1Z2lucy5sb2FkUGx1Z2luID0gb3JpZ0xvYWRQbHVnaW47XG4gIH1cblxuICBjb25zdCBpc0xvYWRlZCA9IHBsdWdpbklkIGluIGFwcC5wbHVnaW5zLnBsdWdpbnM7XG5cbiAgaWYgKCFlcnJvck1lc3NhZ2UgJiYgIWlzTG9hZGVkKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaXMgaW4gdGhlIGVuYWJsZWQgc2V0IGJ1dCBub3QgbG9hZGVkLiBgXG4gICAgICArICdPYnNpZGlhbiBtYXkgaGF2ZSBjYXVnaHQgdGhlIGVycm9yIGJlZm9yZSB0aGUgbW9ua2V5LXBhdGNoLiAnXG4gICAgICArICdDaGVjayB0aGUgT2JzaWRpYW4gY29uc29sZSBmb3IgZGV0YWlscy4nO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgaXNFbmFibGVkOiBhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMocGx1Z2luSWQpLFxuICAgIGlzTG9hZGVkXG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUVBLGVBQXNCLDZCQUE2QixFQUFFLEtBQUssU0FBUyxHQUFpRTtBQUNsSSxNQUFJLENBQUMsSUFBSSxRQUFRLFVBQVUsR0FBRztBQUM1QixVQUFNLElBQUksUUFBUSxVQUFVLElBQUk7QUFBQSxFQUNsQztBQUVBLE1BQUk7QUFFSixRQUFNLGlCQUFpQixJQUFJLFFBQVE7QUFDbkMsTUFBSSxRQUFRLGFBQWEsZUFBZSxXQUFXLElBQVksZUFBMEM7QUFDdkcsUUFBSTtBQUNGLFlBQU0sU0FBUyxNQUFNLGVBQWUsS0FBSyxNQUFNLElBQUksYUFBYTtBQUNoRSxxQkFBZTtBQUNmLGFBQU87QUFBQSxJQUNULFNBQVMsT0FBTztBQUVkLFlBQU0sU0FBUztBQUNmLHFCQUFlLE9BQU8sOEJBQThCLGNBQWMsS0FBSyxLQUFLLE9BQU8sS0FBSztBQUN4RixZQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0YsVUFBTSxJQUFJLFFBQVEsb0JBQW9CLFFBQVE7QUFBQSxFQUNoRCxVQUFFO0FBRUEsUUFBSSxRQUFRLGFBQWE7QUFBQSxFQUMzQjtBQUVBLFFBQU0sV0FBVyxZQUFZLElBQUksUUFBUTtBQUV6QyxNQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtBQUM5QixtQkFBZSxXQUFXLFFBQVE7QUFBQSxFQUdwQztBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQSxXQUFXLElBQUksUUFBUSxlQUFlLElBQUksUUFBUTtBQUFBLElBQ2xEO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
111
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VuYWJsZS1wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgaGVscGVyIGZvciBlbmFibGluZyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBlcnJvciBjYXB0dXJlLlxuICogVXNlZCBieSBib3RoIHRoZSBnbG9iYWwgc2V0dXAgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1vbkFyZ3MgfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGVuYWJsaW5nIGEgcGx1Z2luIHdpdGggZXJyb3IgY2FwdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmFibGVQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGVycm9yIG1lc3NhZ2UgY2FwdHVyZWQgYnkgdGhlIGBsb2FkUGx1Z2luYCBtb25rZXktcGF0Y2gsIG9yIGB1bmRlZmluZWRgXG4gICAqIHdoZW4gdGhlIHBhdGNoIHNhdyBubyB0aHJvdy4gV2hlbiBPYnNpZGlhbiBzd2FsbG93cyB0aGUgZXJyb3IgKmJlZm9yZSogdGhlXG4gICAqIHBhdGNoIChsZWF2aW5nIHRoaXMgZW1wdHkpIGJ1dCB0aGUgcGx1Z2luIHN0aWxsIGZhaWxlZCB0byBsb2FkLCB0aGUgcmVhbFxuICAgKiBjYXVzZSBcdTIwMTQgaWYgaXQgcmVhY2hlZCB0aGUgcmVuZGVyZXIgY29uc29sZSBcdTIwMTQgaXMgaW4ge0BsaW5rIEVuYWJsZVBsdWdpblJlc3VsdC5yZW5kZXJlckNvbnNvbGVFcnJvcnN9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbiBpcyBpbiB0aGUgZW5hYmxlZCBzZXQgYWZ0ZXIgdGhlIGVuYWJsZSBhdHRlbXB0LlxuICAgKiBBIHBsdWdpbiBjYW4gYmUgXCJlbmFibGVkXCIgKGNvbmZpZ3VyZWQpIGJ1dCBub3QgXCJsb2FkZWRcIiAoZmFpbGVkIHRvIGluaXRpYWxpemUpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4gaW5zdGFuY2UgYWN0dWFsbHkgZXhpc3RzIGluIGBhcHAucGx1Z2lucy5wbHVnaW5zYC5cbiAgICogVGhpcyBpcyB0aGUgZGVmaW5pdGl2ZSBjaGVjayBcdTIwMTQgYSBwbHVnaW4gdGhhdCBpcyBlbmFibGVkIGJ1dCBub3QgbG9hZGVkIGhhcyBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSBpc0xvYWRlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uc29sZS9lcnJvciBvdXRwdXQgY2FwdHVyZWQgaW4gdGhlIHJlbmRlcmVyIGR1cmluZyB0aGUgZW5hYmxlIHdpbmRvdyBcdTIwMTRcbiAgICogcG9wdWxhdGVkICoqb25seSoqIHdoZW4gdGhlIHBsdWdpbiBmYWlsZWQgdG8gbG9hZCBhbmQgdGhlIG1vbmtleS1wYXRjaCBzYXdcbiAgICogbm8gdGhyb3cgKGAhZXJyb3JNZXNzYWdlICYmICFpc0xvYWRlZGApLCBpLmUuIGV4YWN0bHkgdGhlIGNhc2UgdGhhdCB3b3VsZFxuICAgKiBvdGhlcndpc2Ugc3VyZmFjZSB0aGUgZ2VuZXJpYyB7QGxpbmsgZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZX0gdGV4dC5cbiAgICogYHVuZGVmaW5lZGAgb3RoZXJ3aXNlIChpbmNsdWRpbmcgb24gc3VjY2VzcyBhbmQgd2hlbiB7QGxpbmsgRW5hYmxlUGx1Z2luUmVzdWx0LmVycm9yTWVzc2FnZX0gYWxyZWFkeSBoYXMgdGhlIGVycm9yKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlcmVyQ29uc29sZUVycm9yczogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nRXJyb3JUb1N0cmluZyB7XG4gIGVycm9yVG9TdHJpbmcoZXJyb3I6IHVua25vd24pOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXIge1xuICBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nOiBJbnRlZ3JhdGlvblRlc3RpbmdFcnJvclRvU3RyaW5nO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgYSBwbHVnaW4gaW5zaWRlIE9ic2lkaWFuIGFuZCBjYXB0dXJlcyBhbnkgbG9hZCBlcnJvci5cbiAqXG4gKiBNb25rZXktcGF0Y2hlcyBgYXBwLnBsdWdpbnMubG9hZFBsdWdpbmAgdG8gaW50ZXJjZXB0IGVycm9ycyBiZWZvcmVcbiAqIE9ic2lkaWFuJ3MgYGVuYWJsZVBsdWdpbmAgdHJ5LWNhdGNoIHN3YWxsb3dzIHRoZW0uIFRoZSBvcmlnaW5hbCBtZXRob2RcbiAqIGlzIGFsd2F5cyByZXN0b3JlZCBpbiBhIGBmaW5hbGx5YCBibG9jay5cbiAqXG4gKiBEZXNpZ25lZCB0byBiZSBwYXNzZWQgYXMgdGhlIGBmbmAgYXJndW1lbnQgdG8ge0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBjb21tb24gYXJncyBwbHVzIHRoZSBwbHVnaW4gSUQuXG4gKiBAcGFyYW0gYXJncy5hcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGFyZ3MucGx1Z2luSWQgLSBUaGUgSUQgb2YgdGhlIHBsdWdpbiB0byBlbmFibGUuXG4gKiBAcmV0dXJucyBUaGUgZW5hYmxlIHJlc3VsdCB3aXRoIGVycm9yIG1lc3NhZ2UgYW5kIGVuYWJsZWQgc3RhdHVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSh7IGFwcCwgcGx1Z2luSWQgfTogQ29tbW9uQXJncyAmIEVuYWJsZVBsdWdpblBhcmFtcyk6IFByb21pc2U8RW5hYmxlUGx1Z2luUmVzdWx0PiB7XG4gIGlmICghYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICBhd2FpdCBhcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gIH1cblxuICAvKlxuICAgKiBGb3JjZSBhIGdlbnVpbmUgcmVsb2FkIHdoZW4gcmV0cnlpbmcuIElmIGEgcHJpb3IgYXR0ZW1wdCBsZWZ0IHRoZSBwbHVnaW4gaW5cbiAgICogdGhlIGVuYWJsZWQgc2V0IGJ1dCBub3QgbG9hZGVkICh0aGUgY29sZC1ib290IHJhY2UpLCBhIHBsYWluIHJlLWVuYWJsZSBjYW5cbiAgICogc2hvcnQtY2lyY3VpdCBvbiBzb21lIE9ic2lkaWFuIHZlcnNpb25zIHdpdGhvdXQgcmUtYXR0ZW1wdGluZyB0aGUgbG9hZC5cbiAgICogRnVsbHkgcmVzZXQgdGhlIGVuYWJsZWQgc3RhdGUgZmlyc3Qgc28gdGhlIGBlbmFibGVQbHVnaW5BbmRTYXZlYCBiZWxvdyBpcyBhXG4gICAqIHJlYWwgZnJlc2ggZW5hYmxlICsgbG9hZC4gTm8tb3Agb24gdGhlIGZpcnN0IGF0dGVtcHQgKG5vdCB5ZXQgZW5hYmxlZCkuXG4gICAqL1xuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSAmJiAhKHBsdWdpbklkIGluIGFwcC5wbHVnaW5zLnBsdWdpbnMpKSB7XG4gICAgYXdhaXQgYXBwLnBsdWdpbnMuZGlzYWJsZVBsdWdpbkFuZFNhdmUocGx1Z2luSWQpO1xuICB9XG5cbiAgbGV0IGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kIC0tIEludGVudGlvbmFsIG1vbmtleS1wYXRjaDsgcmVzdG9yZWQgaW4gZmluYWxseS5cbiAgY29uc3Qgb3JpZ0xvYWRQbHVnaW4gPSBhcHAucGx1Z2lucy5sb2FkUGx1Z2luO1xuICBhcHAucGx1Z2lucy5sb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24gbG9hZFBsdWdpbihpZDogc3RyaW5nLCBpc1VzZXJFbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8UGx1Z2luPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9yaWdMb2FkUGx1Z2luLmNhbGwodGhpcywgaWQsIGlzVXNlckVuYWJsZWQpO1xuICAgICAgZXJyb3JNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gICAgICBjb25zdCBob2xkZXIgPSB3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gICAgICBlcnJvck1lc3NhZ2UgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uZXJyb3JUb1N0cmluZyhlcnJvcikgPz8gU3RyaW5nKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICAvKlxuICAgKiBMYXllciAxIFx1MjAxNCBjYXB0dXJlIHRoZSByZW5kZXJlciBjb25zb2xlICsgdW5jYXVnaHQgZXJyb3JzIGZvciB0aGUgZHVyYXRpb24gb2ZcbiAgICogdGhlIGVuYWJsZS4gSWYgT2JzaWRpYW4gc3dhbGxvd3MgdGhlIGxvYWQgZXJyb3IgYmVmb3JlIHRoZSBtb25rZXktcGF0Y2ggYWJvdmVcbiAgICogc2VlcyBpdCAobGVhdmluZyBgZXJyb3JNZXNzYWdlYCBlbXB0eSksIHRoZSByZWFsIGNhdXNlIGlzIHR5cGljYWxseSBzdGlsbFxuICAgKiBgY29uc29sZS5lcnJvcmAnZCwgc28gY2FwdHVyaW5nIGl0IGhlcmUgc3VyZmFjZXMgaXQgaW4gcGxhY2Ugb2YgdGhlIGdlbmVyaWNcbiAgICogZmFsbGJhY2suIFdvcmtzIG9uIGRlc2t0b3AgYW5kIEFuZHJvaWQgYWxpa2Ugc2luY2UgdGhpcyB3aG9sZSBmdW5jdGlvbiBpc1xuICAgKiBzZXJpYWxpemVkIGFuZCBpbmplY3RlZCBpbnRvIHRoZSByZW5kZXJlci5cbiAgICovXG4gIGNvbnN0IGNhcHR1cmVkQ29uc29sZTogc3RyaW5nW10gPSBbXTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0LCBzYW1lIHJhdGlvbmFsZSBhcyBhYm92ZS5cbiAgY29uc3QgZm9ybWF0SG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICBmdW5jdGlvbiBmb3JtYXRBcmcoYXJnOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiBmb3JtYXRIb2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uZXJyb3JUb1N0cmluZyhhcmcpID8/IFN0cmluZyhhcmcpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoYXJnKTtcbiAgICB9XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGFyZyk7XG4gICAgcmV0dXJuIGpzb24gPz8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZyk7XG4gIH1cbiAgZnVuY3Rpb24gcmVjb3JkQ29uc29sZSguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBjYXB0dXJlZENvbnNvbGUucHVzaChhcmdzLm1hcChmb3JtYXRBcmcpLmpvaW4oJyAnKSk7XG4gIH1cbiAgY29uc3Qgb3JpZ0NvbnNvbGVFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gIGNvbnN0IG9yaWdDb25zb2xlV2FybiA9IGNvbnNvbGUud2FybjtcbiAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkID0+IHtcbiAgICByZWNvcmRDb25zb2xlKC4uLmFyZ3MpO1xuICAgIG9yaWdDb25zb2xlRXJyb3IuYXBwbHkoY29uc29sZSwgYXJncyk7XG4gIH07XG4gIGNvbnNvbGUud2FybiA9ICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkID0+IHtcbiAgICByZWNvcmRDb25zb2xlKC4uLmFyZ3MpO1xuICAgIG9yaWdDb25zb2xlV2Fybi5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgfTtcbiAgZnVuY3Rpb24gb25XaW5kb3dFcnJvcihldmVudDogRXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNhcHR1cmVkQ29uc29sZS5wdXNoKGV2ZW50LmVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBmb3JtYXRBcmcoZXZlbnQuZXJyb3IpIDogZXZlbnQubWVzc2FnZSk7XG4gIH1cbiAgZnVuY3Rpb24gb25VbmhhbmRsZWRSZWplY3Rpb24oZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIGNhcHR1cmVkQ29uc29sZS5wdXNoKGZvcm1hdEFyZyhldmVudC5yZWFzb24pKTtcbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbldpbmRvd0Vycm9yKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIG9uVW5oYW5kbGVkUmVqZWN0aW9uKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbkFuZFNhdmUocGx1Z2luSWQpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIEludGVudGlvbmFsIHJlc3RvcmUgb2YgbW9ua2V5LXBhdGNoLlxuICAgIGFwcC5wbHVnaW5zLmxvYWRQbHVnaW4gPSBvcmlnTG9hZFBsdWdpbjtcbiAgICBjb25zb2xlLmVycm9yID0gb3JpZ0NvbnNvbGVFcnJvcjtcbiAgICBjb25zb2xlLndhcm4gPSBvcmlnQ29uc29sZVdhcm47XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25XaW5kb3dFcnJvcik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIG9uVW5oYW5kbGVkUmVqZWN0aW9uKTtcbiAgfVxuXG4gIGNvbnN0IGlzTG9hZGVkID0gcGx1Z2luSWQgaW4gYXBwLnBsdWdpbnMucGx1Z2lucztcblxuICBsZXQgcmVuZGVyZXJDb25zb2xlRXJyb3JzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghZXJyb3JNZXNzYWdlICYmICFpc0xvYWRlZCkge1xuICAgIGNvbnN0IGpvaW5lZCA9IGNhcHR1cmVkQ29uc29sZS5qb2luKCdcXG4nKS50cmltKCk7XG4gICAgcmVuZGVyZXJDb25zb2xlRXJyb3JzID0gam9pbmVkID8gam9pbmVkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgaXNFbmFibGVkOiBhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMocGx1Z2luSWQpLFxuICAgIGlzTG9hZGVkLFxuICAgIHJlbmRlcmVyQ29uc29sZUVycm9yc1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBnZW5lcmljIGxhc3QtcmVzb3J0IG1lc3NhZ2Ugc2hvd24gd2hlbiBhIHBsdWdpbiBpcyBpbiB0aGUgZW5hYmxlZCBzZXQgYnV0XG4gKiBub3QgbG9hZGVkIGFuZCBubyByZWFsIGVycm9yIGNvdWxkIGJlIGNhcHR1cmVkIChuZWl0aGVyIHRoZSBgbG9hZFBsdWdpbmBcbiAqIG1vbmtleS1wYXRjaCBub3IgdGhlIHJlbmRlcmVyIGNvbnNvbGUgbm9yLCBvbiBBbmRyb2lkLCBgYWRiIGxvZ2NhdGAgc3VyZmFjZWQgYVxuICogY2F1c2UpLlxuICpcbiAqIEhvc3Qtc2lkZSBoZWxwZXIgXHUyMDE0IHVzZWQgYnkgdGhlIHNldHVwIG9yY2hlc3RyYXRpb24gdG8gY29tcG9zZSB0aGUgZmluYWxcbiAqIGZhaWx1cmUgbWVzc2FnZSwgc28gdGhlIHJlbmRlcmVyLWluamVjdGVkIHtAbGluayBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlfVxuICogc3RheXMgc2VsZi1jb250YWluZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCBmYWlsZWQgdG8gbG9hZC5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmljIGZhaWx1cmUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbmVyaWNQbHVnaW5Mb2FkRmFpbHVyZU1lc3NhZ2UocGx1Z2luSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBpcyBpbiB0aGUgZW5hYmxlZCBzZXQgYnV0IG5vdCBsb2FkZWQuIGBcbiAgICArICdPYnNpZGlhbiBtYXkgaGF2ZSBjYXVnaHQgdGhlIGVycm9yIGJlZm9yZSB0aGUgbW9ua2V5LXBhdGNoLiAnXG4gICAgKyAnQ2hlY2sgdGhlIE9ic2lkaWFuIGNvbnNvbGUgZm9yIGRldGFpbHMuJztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQStFQSxlQUFzQiw2QkFBNkIsRUFBRSxLQUFLLFNBQVMsR0FBaUU7QUFDbEksTUFBSSxDQUFDLElBQUksUUFBUSxVQUFVLEdBQUc7QUFDNUIsVUFBTSxJQUFJLFFBQVEsVUFBVSxJQUFJO0FBQUEsRUFDbEM7QUFTQSxNQUFJLElBQUksUUFBUSxlQUFlLElBQUksUUFBUSxLQUFLLEVBQUUsWUFBWSxJQUFJLFFBQVEsVUFBVTtBQUNsRixVQUFNLElBQUksUUFBUSxxQkFBcUIsUUFBUTtBQUFBLEVBQ2pEO0FBRUEsTUFBSTtBQUVKLFFBQU0saUJBQWlCLElBQUksUUFBUTtBQUNuQyxNQUFJLFFBQVEsYUFBYSxlQUFlLFdBQVcsSUFBWSxlQUEwQztBQUN2RyxRQUFJO0FBQ0YsWUFBTSxTQUFTLE1BQU0sZUFBZSxLQUFLLE1BQU0sSUFBSSxhQUFhO0FBQ2hFLHFCQUFlO0FBQ2YsYUFBTztBQUFBLElBQ1QsU0FBUyxPQUFPO0FBRWQsWUFBTSxTQUFTO0FBQ2YscUJBQWUsT0FBTyw4QkFBOEIsY0FBYyxLQUFLLEtBQUssT0FBTyxLQUFLO0FBQ3hGLFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQVVBLFFBQU0sa0JBQTRCLENBQUM7QUFFbkMsUUFBTSxlQUFlO0FBQ3JCLFdBQVMsVUFBVSxLQUFzQjtBQUN2QyxRQUFJLGVBQWUsT0FBTztBQUN4QixhQUFPLGFBQWEsOEJBQThCLGNBQWMsR0FBRyxLQUFLLE9BQU8sR0FBRztBQUFBLElBQ3BGO0FBQ0EsUUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksUUFBUSxVQUFhLFFBQVEsTUFBTTtBQUNyQyxhQUFPLE9BQU8sR0FBRztBQUFBLElBQ25CO0FBQ0EsVUFBTSxPQUFPLEtBQUssVUFBVSxHQUFHO0FBQy9CLFdBQU8sUUFBUSxPQUFPLFVBQVUsU0FBUyxLQUFLLEdBQUc7QUFBQSxFQUNuRDtBQUNBLFdBQVMsaUJBQWlCLE1BQXVCO0FBQy9DLG9CQUFnQixLQUFLLEtBQUssSUFBSSxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUM7QUFBQSxFQUNwRDtBQUNBLFFBQU0sbUJBQW1CLFFBQVE7QUFDakMsUUFBTSxrQkFBa0IsUUFBUTtBQUNoQyxVQUFRLFFBQVEsSUFBSSxTQUEwQjtBQUM1QyxrQkFBYyxHQUFHLElBQUk7QUFDckIscUJBQWlCLE1BQU0sU0FBUyxJQUFJO0FBQUEsRUFDdEM7QUFDQSxVQUFRLE9BQU8sSUFBSSxTQUEwQjtBQUMzQyxrQkFBYyxHQUFHLElBQUk7QUFDckIsb0JBQWdCLE1BQU0sU0FBUyxJQUFJO0FBQUEsRUFDckM7QUFDQSxXQUFTLGNBQWMsT0FBeUI7QUFDOUMsb0JBQWdCLEtBQUssTUFBTSxpQkFBaUIsUUFBUSxVQUFVLE1BQU0sS0FBSyxJQUFJLE1BQU0sT0FBTztBQUFBLEVBQzVGO0FBQ0EsV0FBUyxxQkFBcUIsT0FBb0M7QUFDaEUsb0JBQWdCLEtBQUssVUFBVSxNQUFNLE1BQU0sQ0FBQztBQUFBLEVBQzlDO0FBQ0EsU0FBTyxpQkFBaUIsU0FBUyxhQUFhO0FBQzlDLFNBQU8saUJBQWlCLHNCQUFzQixvQkFBb0I7QUFFbEUsTUFBSTtBQUNGLFVBQU0sSUFBSSxRQUFRLG9CQUFvQixRQUFRO0FBQUEsRUFDaEQsVUFBRTtBQUVBLFFBQUksUUFBUSxhQUFhO0FBQ3pCLFlBQVEsUUFBUTtBQUNoQixZQUFRLE9BQU87QUFDZixXQUFPLG9CQUFvQixTQUFTLGFBQWE7QUFDakQsV0FBTyxvQkFBb0Isc0JBQXNCLG9CQUFvQjtBQUFBLEVBQ3ZFO0FBRUEsUUFBTSxXQUFXLFlBQVksSUFBSSxRQUFRO0FBRXpDLE1BQUk7QUFDSixNQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtBQUM5QixVQUFNLFNBQVMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLEtBQUs7QUFDL0MsNEJBQXdCLFNBQVMsU0FBUztBQUFBLEVBQzVDO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFdBQVcsSUFBSSxRQUFRLGVBQWUsSUFBSSxRQUFRO0FBQUEsSUFDbEQ7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBZU8sU0FBUyxtQ0FBbUMsVUFBMEI7QUFDM0UsU0FBTyxXQUFXLFFBQVE7QUFHNUI7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -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;