obsidian-integration-testing 8.4.0 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -11
- package/dist/lib/cjs/avd-list.cjs +36 -0
- package/dist/lib/cjs/avd-list.d.cts +38 -0
- package/dist/lib/cjs/demo-vault-populate.cjs +77 -0
- package/dist/lib/cjs/demo-vault-populate.d.cts +71 -0
- package/dist/lib/cjs/demo-vault-tree.cjs +52 -0
- package/dist/lib/cjs/demo-vault-tree.d.cts +34 -0
- package/dist/lib/cjs/enable-plugin.cjs +56 -5
- package/dist/lib/cjs/enable-plugin.d.cts +26 -1
- package/dist/lib/cjs/global-setup-core.cjs +92 -26
- package/dist/lib/cjs/global-setup-core.d.cts +24 -3
- package/dist/lib/cjs/index.cjs +10 -1
- package/dist/lib/cjs/index.d.cts +6 -0
- package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +41 -0
- package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +26 -0
- package/dist/lib/cjs/jest/global-setup.cjs +7 -2
- package/dist/lib/cjs/jest/global-setup.d.cts +20 -3
- package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +26 -0
- package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +11 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/plugin-enable-retry.cjs +53 -0
- package/dist/lib/cjs/plugin-enable-retry.d.cts +71 -0
- package/dist/lib/cjs/poll-in-obsidian.cjs +72 -0
- package/dist/lib/cjs/poll-in-obsidian.d.cts +92 -0
- package/dist/lib/cjs/poll-until.cjs +43 -0
- package/dist/lib/cjs/poll-until.d.cts +42 -0
- package/dist/lib/cjs/process-exit-message.cjs +47 -0
- package/dist/lib/cjs/process-exit-message.d.cts +48 -0
- package/dist/lib/cjs/transport-appium.cjs +51 -1
- package/dist/lib/cjs/transport-appium.d.cts +24 -1
- package/dist/lib/cjs/transport-desktop-cdp.cjs +20 -11
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +9 -2
- package/dist/lib/cjs/transport-factory.cjs +122 -23
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +28 -0
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +37 -0
- package/dist/lib/cjs/vault-path-match.cjs +49 -0
- package/dist/lib/cjs/vault-path-match.d.cts +36 -0
- package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +37 -0
- package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +26 -0
- package/dist/lib/cjs/vitest/global-setup.cjs +7 -2
- package/dist/lib/cjs/vitest/global-setup.d.cts +20 -3
- package/dist/lib/esm/avd-list.d.mts +38 -0
- package/dist/lib/esm/avd-list.mjs +11 -0
- package/dist/lib/esm/demo-vault-populate.d.mts +71 -0
- package/dist/lib/esm/demo-vault-populate.mjs +57 -0
- package/dist/lib/esm/demo-vault-tree.d.mts +34 -0
- package/dist/lib/esm/demo-vault-tree.mjs +35 -0
- package/dist/lib/esm/enable-plugin.d.mts +26 -1
- package/dist/lib/esm/enable-plugin.mjs +54 -4
- package/dist/lib/esm/global-setup-core.d.mts +24 -3
- package/dist/lib/esm/global-setup-core.mjs +101 -27
- package/dist/lib/esm/index.d.mts +6 -0
- package/dist/lib/esm/index.mjs +7 -1
- package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +26 -0
- package/dist/lib/esm/jest/global-setup-no-plugin.mjs +17 -0
- package/dist/lib/esm/jest/global-setup.d.mts +20 -3
- package/dist/lib/esm/jest/global-setup.mjs +7 -2
- package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +11 -0
- package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +6 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/plugin-enable-retry.d.mts +71 -0
- package/dist/lib/esm/plugin-enable-retry.mjs +24 -0
- package/dist/lib/esm/poll-in-obsidian.d.mts +92 -0
- package/dist/lib/esm/poll-in-obsidian.mjs +48 -0
- package/dist/lib/esm/poll-until.d.mts +42 -0
- package/dist/lib/esm/poll-until.mjs +19 -0
- package/dist/lib/esm/process-exit-message.d.mts +48 -0
- package/dist/lib/esm/process-exit-message.mjs +23 -0
- package/dist/lib/esm/transport-appium.d.mts +24 -1
- package/dist/lib/esm/transport-appium.mjs +51 -1
- package/dist/lib/esm/transport-desktop-cdp.d.mts +9 -2
- package/dist/lib/esm/transport-desktop-cdp.mjs +20 -11
- package/dist/lib/esm/transport-factory.mjs +125 -23
- package/dist/lib/esm/transport-options.d.mts +28 -0
- package/dist/lib/esm/transport.d.mts +37 -0
- package/dist/lib/esm/vault-path-match.d.mts +36 -0
- package/dist/lib/esm/vault-path-match.mjs +14 -0
- package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +26 -0
- package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +11 -0
- package/dist/lib/esm/vitest/global-setup.d.mts +20 -3
- package/dist/lib/esm/vitest/global-setup.mjs +7 -2
- package/dist/obsidian-integration-testing-9.1.0.tgz +0 -0
- package/package.json +38 -8
- package/dist/obsidian-integration-testing-8.4.0.tgz +0 -0
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;
|