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
package/README.md CHANGED
@@ -26,7 +26,7 @@ import { defineConfig } from 'vitest/config';
26
26
 
27
27
  export default defineConfig({
28
28
  test: {
29
- globalSetup: ['obsidian-integration-testing/vitest-global-setup'],
29
+ globalSetup: ['obsidian-integration-testing/vitest-global-setup-plugin'],
30
30
  },
31
31
  });
32
32
  ```
@@ -52,8 +52,8 @@ Or add it to `compilerOptions.types` in your `tsconfig.json`:
52
52
  ```ts
53
53
  // jest.config.ts
54
54
  export default {
55
- globalSetup: 'obsidian-integration-testing/jest-global-setup',
56
- globalTeardown: 'obsidian-integration-testing/jest-global-teardown',
55
+ globalSetup: 'obsidian-integration-testing/jest-global-setup-plugin',
56
+ globalTeardown: 'obsidian-integration-testing/jest-global-teardown-plugin',
57
57
  };
58
58
  ```
59
59
 
@@ -383,7 +383,7 @@ Use `getTempVault()` to get the temporary vault created by the global setup:
383
383
  ```ts
384
384
  import { describe, expect, it } from 'vitest';
385
385
  import { evalInObsidian } from 'obsidian-integration-testing';
386
- import { getTempVault } from 'obsidian-integration-testing/vitest-global-setup';
386
+ import { getTempVault } from 'obsidian-integration-testing/vitest-global-setup-plugin';
387
387
 
388
388
  describe('my-plugin', () => {
389
389
  const vault = getTempVault();
@@ -418,7 +418,7 @@ describe('my-plugin', () => {
418
418
 
419
419
  ```ts
420
420
  import { evalInObsidian } from 'obsidian-integration-testing';
421
- import { getTempVault } from 'obsidian-integration-testing/jest-global-setup';
421
+ import { getTempVault } from 'obsidian-integration-testing/jest-global-setup-plugin';
422
422
 
423
423
  describe('my-plugin', () => {
424
424
  const vault = getTempVault();
@@ -444,7 +444,7 @@ This capability reaches all three consumption paths.
444
444
 
445
445
  ```ts
446
446
  // integration-global-setup.ts
447
- import { createSetup } from 'obsidian-integration-testing/vitest-global-setup';
447
+ import { createSetup } from 'obsidian-integration-testing/vitest-global-setup-plugin';
448
448
 
449
449
  export const { setup, teardown } = createSetup({
450
450
  populate: () => ({
@@ -469,7 +469,7 @@ export default defineConfig({
469
469
 
470
470
  ```ts
471
471
  // integration-global-setup.ts — shared createSetup pair
472
- import { createSetup } from 'obsidian-integration-testing/jest-global-setup';
472
+ import { createSetup } from 'obsidian-integration-testing/jest-global-setup-plugin';
473
473
 
474
474
  export const { setup, teardown } = createSetup({
475
475
  populate: () => ({
@@ -500,6 +500,58 @@ 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
+
533
+ ### Non-plugin consumers
534
+
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:
536
+
537
+ ```ts
538
+ // vitest.config.ts
539
+ import { defineConfig } from 'vitest/config';
540
+
541
+ export default defineConfig({
542
+ test: {
543
+ globalSetup: ['obsidian-integration-testing/vitest-global-setup-no-plugin']
544
+ }
545
+ });
546
+ ```
547
+
548
+ ```ts
549
+ // your.integration.test.ts — read the empty registered vault's path
550
+ import { getTempVault } from 'obsidian-integration-testing/vitest-global-setup-no-plugin';
551
+ ```
552
+
553
+ For Jest, use `obsidian-integration-testing/jest-global-setup-no-plugin` (`globalSetup`) + `obsidian-integration-testing/jest-global-teardown-no-plugin` (`globalTeardown`). If you also need to pre-populate the empty vault, build the pair yourself with `createSetup({ installPlugin: false, populate })` from the `-plugin` factory and re-export its `setup`/`teardown` (the same wrapper pattern shown above for `populate`).
554
+
503
555
  > [!WARNING]
504
556
  >
505
557
  > **Parallelism:**
@@ -591,7 +643,7 @@ By default the library **launches and owns an isolated Obsidian instance** in a
591
643
  export default defineConfig({
592
644
  test: {
593
645
  fileParallelism: false,
594
- globalSetup: ['obsidian-integration-testing/vitest-global-setup'],
646
+ globalSetup: ['obsidian-integration-testing/vitest-global-setup-plugin'],
595
647
  },
596
648
  });
597
649
  ```
@@ -721,7 +773,7 @@ Runs tests against Obsidian Mobile on an Android emulator or real device via App
721
773
  export default defineConfig({
722
774
  test: {
723
775
  fileParallelism: false,
724
- globalSetup: ['obsidian-integration-testing/vitest-global-setup'],
776
+ globalSetup: ['obsidian-integration-testing/vitest-global-setup-plugin'],
725
777
  environmentOptions: {
726
778
  obsidianTransport: {
727
779
  type: 'obsidian-android-appium',
@@ -765,6 +817,25 @@ save a snapshot, and always boot from that snapshot. Either way, an ANR signals
765
817
  under-provisioned, so also give the AVD more vCPUs/RAM and confirm hardware acceleration
766
818
  (`emulator -accel-check`).
767
819
 
820
+ #### Troubleshooting: "Android AVD ... not found" / "Appium server ... exited during startup"
821
+
822
+ The Android setup fails fast (rather than spinning out a timeout) when the toolchain cannot be brought
823
+ up, naming what is missing:
824
+
825
+ - **`Android AVD "<name>" not found. Available AVDs: ...`** — the `avdName` you passed does not exist.
826
+ Run `emulator -list-avds`, then either point `avdName` at a listed AVD or create the one you want
827
+ (Android Studio Device Manager, or `avdmanager create avd`). AVD creation is not automated — it needs a
828
+ system-image download, license acceptance, and hardware/API-level choices.
829
+ - **`Auto-started Appium server ... during startup` / `... did not become ready ...`** — the harness
830
+ auto-started Appium (`npx --no-install appium`) but it exited or never responded; the message appends
831
+ the captured server output. Usually a missing/broken toolchain: pass `isAppiumConsoleVisible: true` to
832
+ watch the live server log, or manage Appium yourself (`shouldAutoStartAppium: false`, pointing
833
+ `appiumUrl` at your own running server).
834
+ - **`Appium was installed ... but is still not resolvable ...`** — the auto-install ran
835
+ `npm install -g appium`, but the npm global bin dir is not on PATH (common with scoop/nvm-managed Node).
836
+ Add it to PATH (see `npm config get prefix`), or set `shouldAutoInstallAppiumDependencies: false` and
837
+ install Appium yourself.
838
+
768
839
  #### Troubleshooting: "Obsidian layout did not become ready"
769
840
 
770
841
  Registering a vault reloads the page, triggering a full Obsidian re-init (reopen the vault and
@@ -789,7 +860,7 @@ export default defineConfig({
789
860
  test: {
790
861
  name: 'integration-tests:desktop-cdp',
791
862
  fileParallelism: false,
792
- globalSetup: ['obsidian-integration-testing/vitest-global-setup'],
863
+ globalSetup: ['obsidian-integration-testing/vitest-global-setup-plugin'],
793
864
  include: ['src/**/*.integration.test.ts'],
794
865
  exclude: ['src/**/*.android.integration.test.ts'],
795
866
  // default transport, can be omitted
@@ -802,7 +873,7 @@ export default defineConfig({
802
873
  test: {
803
874
  name: 'integration-tests:android-appium',
804
875
  fileParallelism: false,
805
- globalSetup: ['obsidian-integration-testing/vitest-global-setup'],
876
+ globalSetup: ['obsidian-integration-testing/vitest-global-setup-plugin'],
806
877
  include: ['src/**/*.android.integration.test.ts'],
807
878
  environmentOptions: {
808
879
  obsidianTransport: {
@@ -0,0 +1,36 @@
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 avd_list_exports = {};
20
+ __export(avd_list_exports, {
21
+ checkAvdExists: () => checkAvdExists,
22
+ listAvailableAvds: () => listAvailableAvds
23
+ });
24
+ module.exports = __toCommonJS(avd_list_exports);
25
+ function checkAvdExists(params) {
26
+ return listAvailableAvds(params.avdListOutput).includes(params.avdName);
27
+ }
28
+ function listAvailableAvds(avdListOutput) {
29
+ return avdListOutput.split("\n").map((line) => line.trim()).filter((line) => line.length > 0 && !line.includes("|"));
30
+ }
31
+ // Annotate the CommonJS export names for ESM import in node:
32
+ 0 && (module.exports = {
33
+ checkAvdExists,
34
+ listAvailableAvds
35
+ });
36
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1saXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBoZWxwZXJzIGZvciBwYXJzaW5nIGBlbXVsYXRvciAtbGlzdC1hdmRzYCBvdXRwdXQ6IGV4dHJhY3RpbmcgdGhlXG4gKiBhdmFpbGFibGUgQVZEIG5hbWVzIGFuZCBjaGVja2luZyB3aGV0aGVyIGEgcmVxdWVzdGVkIEFWRCBleGlzdHMuXG4gKlxuICogS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBpbnRlZ3JhdGlvbi1vbmx5IGB0cmFuc3BvcnQtZmFjdG9yeWAgKGV4Y2x1ZGVkIGZyb21cbiAqIHVuaXQgdGVzdHMpIHNvIHRoZSBwYXJzaW5nIHN0YXlzIHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZSBmYWN0b3J5IGl0c2VsZiBzaGVsbHMgb3V0XG4gKiB0byB0aGUgYGVtdWxhdG9yYCBiaW5hcnkuXG4gKi9cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tBdmRFeGlzdHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrQXZkRXhpc3RzUGFyYW1zIHtcbiAgLyoqIFJhdyBzdGRvdXQgb2YgYGVtdWxhdG9yIC1saXN0LWF2ZHNgIFx1MjAxNCBvbmUgQVZEIG5hbWUgcGVyIGxpbmUuICovXG4gIHJlYWRvbmx5IGF2ZExpc3RPdXRwdXQ6IHN0cmluZztcblxuICAvKiogVGhlIEFWRCBuYW1lIHRvIGxvb2sgZm9yLiAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgZ2l2ZW4gQVZEIGV4aXN0cywgZnJvbSB0aGUgcmF3IHN0ZG91dCBvZlxuICogYGVtdWxhdG9yIC1saXN0LWF2ZHNgLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgbGlzdGluZyBvdXRwdXQgYW5kIHRoZSBBVkQgbmFtZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBBVkQgbmFtZSBhcHBlYXJzIGluIHRoZSBsaXN0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBdmRFeGlzdHMocGFyYW1zOiBDaGVja0F2ZEV4aXN0c1BhcmFtcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGlzdEF2YWlsYWJsZUF2ZHMocGFyYW1zLmF2ZExpc3RPdXRwdXQpLmluY2x1ZGVzKHBhcmFtcy5hdmROYW1lKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGF2YWlsYWJsZSBBVkQgbmFtZXMgZnJvbSB0aGUgcmF3IHN0ZG91dCBvZiBgZW11bGF0b3IgLWxpc3QtYXZkc2AuXG4gKlxuICogVGhlIGNvbW1hbmQgcHJpbnRzIG9uZSBBVkQgbmFtZSBwZXIgbGluZTsgYmxhbmsgbGluZXMgYW5kIHN1cnJvdW5kaW5nXG4gKiB3aGl0ZXNwYWNlIGFyZSBpZ25vcmVkLiBTb21lIGVtdWxhdG9yIGJ1aWxkcyBlbWl0IGFuIGluZm9ybWF0aW9uYWwgYmFubmVyXG4gKiAoZS5nLiBgSU5GTyAgICB8IC4uLmApIHRvIHN0ZG91dCBiZWZvcmUgdGhlIGxpc3QsIHNvIHRob3NlIGxpbmVzIGFyZSBkcm9wcGVkLlxuICpcbiAqIEBwYXJhbSBhdmRMaXN0T3V0cHV0IC0gUmF3IHN0ZG91dCBvZiBgZW11bGF0b3IgLWxpc3QtYXZkc2AuXG4gKiBAcmV0dXJucyBUaGUgYXZhaWxhYmxlIEFWRCBuYW1lcywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdEF2YWlsYWJsZUF2ZHMoYXZkTGlzdE91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gYXZkTGlzdE91dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDAgJiYgIWxpbmUuaW5jbHVkZXMoJ3wnKSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE2Qk8sU0FBUyxlQUFlLFFBQXVDO0FBQ3BFLFNBQU8sa0JBQWtCLE9BQU8sYUFBYSxFQUFFLFNBQVMsT0FBTyxPQUFPO0FBQ3hFO0FBWU8sU0FBUyxrQkFBa0IsZUFBaUM7QUFDakUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxLQUFLLENBQUMsS0FBSyxTQUFTLEdBQUcsQ0FBQztBQUM1RDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure helpers for parsing `emulator -list-avds` output: extracting the
5
+ * available AVD names and checking whether a requested AVD exists.
6
+ *
7
+ * Kept separate from the integration-only `transport-factory` (excluded from
8
+ * unit tests) so the parsing stays unit-testable — the factory itself shells out
9
+ * to the `emulator` binary.
10
+ */
11
+ /**
12
+ * Parameters for {@link checkAvdExists}.
13
+ */
14
+ export interface CheckAvdExistsParams {
15
+ /** Raw stdout of `emulator -list-avds` — one AVD name per line. */
16
+ readonly avdListOutput: string;
17
+ /** The AVD name to look for. */
18
+ readonly avdName: string;
19
+ }
20
+ /**
21
+ * Decides whether a given AVD exists, from the raw stdout of
22
+ * `emulator -list-avds`.
23
+ *
24
+ * @param params - The listing output and the AVD name to check.
25
+ * @returns `true` when the AVD name appears in the listing.
26
+ */
27
+ export declare function checkAvdExists(params: CheckAvdExistsParams): boolean;
28
+ /**
29
+ * Parses the available AVD names from the raw stdout of `emulator -list-avds`.
30
+ *
31
+ * The command prints one AVD name per line; blank lines and surrounding
32
+ * whitespace are ignored. Some emulator builds emit an informational banner
33
+ * (e.g. `INFO | ...`) to stdout before the list, so those lines are dropped.
34
+ *
35
+ * @param avdListOutput - Raw stdout of `emulator -list-avds`.
36
+ * @returns The available AVD names, in listed order.
37
+ */
38
+ export declare function listAvailableAvds(avdListOutput: string): string[];
@@ -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;
@@ -0,0 +1,52 @@
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_tree_exports = {};
20
+ __export(demo_vault_tree_exports, {
21
+ readDemoVaultTree: () => readDemoVaultTree
22
+ });
23
+ module.exports = __toCommonJS(demo_vault_tree_exports);
24
+ var import_node_fs = require("node:fs");
25
+ var import_node_path = require("node:path");
26
+ const DEFAULT_EXCLUDED_NAMES = [".git", ".obsidian"];
27
+ function readDemoVaultTree(params) {
28
+ const { demoVaultPath } = params;
29
+ const excludedNames = new Set(params.excludedNames ?? DEFAULT_EXCLUDED_NAMES);
30
+ const map = {};
31
+ collect(demoVaultPath, demoVaultPath, excludedNames, map);
32
+ return map;
33
+ }
34
+ function collect(root, dir, excludedNames, map) {
35
+ for (const entry of (0, import_node_fs.readdirSync)(dir, { withFileTypes: true })) {
36
+ if (excludedNames.has(entry.name)) {
37
+ continue;
38
+ }
39
+ const absolutePath = (0, import_node_path.join)(dir, entry.name);
40
+ if (entry.isDirectory()) {
41
+ collect(root, absolutePath, excludedNames, map);
42
+ continue;
43
+ }
44
+ const relativePath = (0, import_node_path.relative)(root, absolutePath).split(import_node_path.sep).join("/");
45
+ map[relativePath] = (0, import_node_fs.readFileSync)(absolutePath);
46
+ }
47
+ }
48
+ // Annotate the CommonJS export names for ESM import in node:
49
+ 0 && (module.exports = {
50
+ readDemoVaultTree
51
+ });
52
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtdHJlZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlYWRzIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIHRyZWUgaW50byBhIHBvcHVsYXRlIG1hcCBzbyBhIFZpdGVzdC9KZXN0IGdsb2JhbCBzZXR1cCBjYW5cbiAqIHNlZWQgaXQgaW50byB0aGUgdGVtcCB2YXVsdCBCRUZPUkUgT2JzaWRpYW4gb3BlbnMgaXQuIFNlZWRpbmcgcHJlLWxhdW5jaCBsZXRzIE9ic2lkaWFuJ3Mgc3RhcnR1cCBzY2FuXG4gKiBpbmRleCBldmVyeSBub3RlIGluIG9uZSBwYXNzLCBhdm9pZGluZyB0aGUgZmlsZS13YXRjaGVyIHJhY2UgdGhhdCBzaWxlbnRseSBkcm9wcyBldmVudHMgdW5kZXIgYSBidWxrXG4gKiBwb3N0LWxhdW5jaCB7QGxpbmsgVGVtcFZhdWx0LnBvcHVsYXRlfS5cbiAqL1xuXG5pbXBvcnQge1xuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHNlcFxufSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVhZERlbW9WYXVsdFRyZWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGRlbW8gdmF1bHQgZGlyZWN0b3J5IHRvIHJlYWQuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAuIERlZmF1bHRzIHRvIGAuZ2l0YCBhbmQgYC5vYnNpZGlhbmA6XG4gICAqIHRoZSBoYXJuZXNzIHByb3Zpc2lvbnMgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD5gIGl0c2VsZiwgc28gdGhlIHZhdWx0J3Mgb3duIGAub2JzaWRpYW5gIG11c3Qgbm90IGJlXG4gICAqIGNvcGllZCBvdmVyIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWycuZ2l0JywgJy5vYnNpZGlhbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROYW1lcz86IEl0ZXJhYmxlPHN0cmluZz47XG59XG5cbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTkFNRVMgPSBbJy5naXQnLCAnLm9ic2lkaWFuJ107XG5cbi8qKlxuICogUmVhZHMgYSBkZW1vIHZhdWx0IGRpcmVjdG9yeSB0cmVlIHJlY3Vyc2l2ZWx5IGludG8gYSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwICh2YXVsdC1yZWxhdGl2ZVxuICogUE9TSVggcGF0aCB0byBmaWxlIGJ5dGVzKSwgc2tpcHBpbmcge0BsaW5rIFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zLmV4Y2x1ZGVkTmFtZXN9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8ge0BsaW5rIFRlbXBWYXVsdC5wb3B1bGF0ZX0gb3IgYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZERlbW9WYXVsdFRyZWUocGFyYW1zOiBSZWFkRGVtb1ZhdWx0VHJlZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgZXhjbHVkZWROYW1lcyA9IG5ldyBTZXQocGFyYW1zLmV4Y2x1ZGVkTmFtZXMgPz8gREVGQVVMVF9FWENMVURFRF9OQU1FUyk7XG4gIGNvbnN0IG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyA9IHt9O1xuICBjb2xsZWN0KGRlbW9WYXVsdFBhdGgsIGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIG1hcCk7XG4gIHJldHVybiBtYXA7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3Qocm9vdDogc3RyaW5nLCBkaXI6IHN0cmluZywgZXhjbHVkZWROYW1lczogU2V0PHN0cmluZz4sIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGV4Y2x1ZGVkTmFtZXMuaGFzKGVudHJ5Lm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbGxlY3Qocm9vdCwgYWJzb2x1dGVQYXRoLCBleGNsdWRlZE5hbWVzLCBtYXApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUocm9vdCwgYWJzb2x1dGVQYXRoKS5zcGxpdChzZXApLmpvaW4oJy8nKTtcbiAgICBtYXBbcmVsYXRpdmVQYXRoXSA9IHJlYWRGaWxlU3luYyhhYnNvbHV0ZVBhdGgpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0EscUJBR087QUFDUCx1QkFJTztBQXVCUCxNQUFNLHlCQUF5QixDQUFDLFFBQVEsV0FBVztBQVM1QyxTQUFTLGtCQUFrQixRQUFzRDtBQUN0RixRQUFNLEVBQUUsY0FBYyxJQUFJO0FBQzFCLFFBQU0sZ0JBQWdCLElBQUksSUFBSSxPQUFPLGlCQUFpQixzQkFBc0I7QUFDNUUsUUFBTSxNQUEyQixDQUFDO0FBQ2xDLFVBQVEsZUFBZSxlQUFlLGVBQWUsR0FBRztBQUN4RCxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFFBQVEsTUFBYyxLQUFhLGVBQTRCLEtBQWdDO0FBQ3RHLGFBQVcsYUFBUyw0QkFBWSxLQUFLLEVBQUUsZUFBZSxLQUFLLENBQUMsR0FBRztBQUM3RCxRQUFJLGNBQWMsSUFBSSxNQUFNLElBQUksR0FBRztBQUNqQztBQUFBLElBQ0Y7QUFFQSxVQUFNLG1CQUFlLHVCQUFLLEtBQUssTUFBTSxJQUFJO0FBQ3pDLFFBQUksTUFBTSxZQUFZLEdBQUc7QUFDdkIsY0FBUSxNQUFNLGNBQWMsZUFBZSxHQUFHO0FBQzlDO0FBQUEsSUFDRjtBQUVBLFVBQU0sbUJBQWUsMkJBQVMsTUFBTSxZQUFZLEVBQUUsTUFBTSxvQkFBRyxFQUFFLEtBQUssR0FBRztBQUNyRSxRQUFJLFlBQVksUUFBSSw2QkFBYSxZQUFZO0FBQUEsRUFDL0M7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -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.cjs';
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;