obsidian-integration-testing 4.2.5 → 4.3.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 (60) hide show
  1. package/README.md +71 -0
  2. package/dist/lib/cjs/enable-plugin.cjs +1 -1
  3. package/dist/lib/cjs/enable-plugin.d.cts +4 -4
  4. package/dist/lib/cjs/eval-in-obsidian.cjs +3 -5
  5. package/dist/lib/cjs/eval-in-obsidian.d.cts +5 -5
  6. package/dist/lib/cjs/generate-function-call.cjs +1 -1
  7. package/dist/lib/cjs/generate-function-call.d.cts +4 -4
  8. package/dist/lib/cjs/global-setup-core.cjs +6 -1
  9. package/dist/lib/cjs/global-setup-core.d.cts +13 -5
  10. package/dist/lib/cjs/jest/global-setup.cjs +24 -14
  11. package/dist/lib/cjs/jest/global-setup.d.cts +37 -4
  12. package/dist/lib/cjs/jest/global-teardown.cjs +26 -0
  13. package/dist/lib/cjs/jest/global-teardown.d.cts +11 -0
  14. package/dist/lib/cjs/library.cjs +1 -1
  15. package/dist/lib/cjs/namespace-bootstrap.cjs +8 -4
  16. package/dist/lib/cjs/namespace-bootstrap.d.cts +4 -1
  17. package/dist/lib/cjs/obsidian-executable.cjs +8 -6
  18. package/dist/lib/cjs/obsidian-namespace.cjs +1 -1
  19. package/dist/lib/cjs/obsidian-namespace.d.cts +6 -6
  20. package/dist/lib/cjs/strict-proxy.cjs +1 -1
  21. package/dist/lib/cjs/strict-proxy.d.cts +3 -2
  22. package/dist/lib/cjs/transport-desktop-cdp.cjs +1 -1
  23. package/dist/lib/cjs/transport-desktop-cli.cjs +45 -11
  24. package/dist/lib/cjs/transport-desktop-cli.d.cts +24 -1
  25. package/dist/lib/cjs/transport-factory.cjs +1 -1
  26. package/dist/lib/cjs/transport-options.cjs +1 -1
  27. package/dist/lib/cjs/transport-options.d.cts +14 -14
  28. package/dist/lib/cjs/vitest/global-setup.cjs +27 -19
  29. package/dist/lib/cjs/vitest/global-setup.d.cts +35 -3
  30. package/dist/lib/cjs/vitest/typings.d.cts +1 -1
  31. package/dist/lib/esm/enable-plugin.d.mts +4 -4
  32. package/dist/lib/esm/enable-plugin.mjs +1 -1
  33. package/dist/lib/esm/eval-in-obsidian.d.mts +5 -5
  34. package/dist/lib/esm/eval-in-obsidian.mjs +3 -5
  35. package/dist/lib/esm/generate-function-call.d.mts +4 -4
  36. package/dist/lib/esm/generate-function-call.mjs +1 -1
  37. package/dist/lib/esm/global-setup-core.d.mts +13 -5
  38. package/dist/lib/esm/global-setup-core.mjs +6 -1
  39. package/dist/lib/esm/jest/global-setup.d.mts +37 -4
  40. package/dist/lib/esm/jest/global-setup.mjs +23 -14
  41. package/dist/lib/esm/jest/global-teardown.d.mts +11 -0
  42. package/dist/lib/esm/jest/global-teardown.mjs +6 -0
  43. package/dist/lib/esm/library.mjs +1 -1
  44. package/dist/lib/esm/namespace-bootstrap.d.mts +4 -1
  45. package/dist/lib/esm/namespace-bootstrap.mjs +8 -4
  46. package/dist/lib/esm/obsidian-executable.mjs +8 -6
  47. package/dist/lib/esm/obsidian-namespace.d.mts +6 -6
  48. package/dist/lib/esm/strict-proxy.d.mts +3 -2
  49. package/dist/lib/esm/strict-proxy.mjs +1 -1
  50. package/dist/lib/esm/transport-desktop-cdp.mjs +1 -1
  51. package/dist/lib/esm/transport-desktop-cli.d.mts +24 -1
  52. package/dist/lib/esm/transport-desktop-cli.mjs +45 -11
  53. package/dist/lib/esm/transport-factory.mjs +1 -1
  54. package/dist/lib/esm/transport-options.d.mts +14 -14
  55. package/dist/lib/esm/vitest/global-setup.d.mts +35 -3
  56. package/dist/lib/esm/vitest/global-setup.mjs +26 -19
  57. package/dist/lib/esm/vitest/typings.d.mts +1 -1
  58. package/dist/obsidian-integration-testing-4.3.0.tgz +0 -0
  59. package/package.json +34 -21
  60. package/dist/obsidian-integration-testing-4.2.5.tgz +0 -0
@@ -12,11 +12,11 @@ export interface ObsidianAndroidAppiumTransportOptions {
12
12
  * App package (Android) or bundle ID (iOS).
13
13
  * Defaults to `'md.obsidian'`
14
14
  */
15
- appId?: string;
15
+ readonly appId?: string;
16
16
  /**
17
17
  * The Appium server URL (e.g. `'http://localhost:4723'`).
18
18
  */
19
- appiumUrl: string;
19
+ readonly appiumUrl: string;
20
20
  /**
21
21
  * The Android AVD (Android Virtual Device) name.
22
22
  *
@@ -26,7 +26,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
26
26
  *
27
27
  * Run `emulator -list-avds` to see available AVD names.
28
28
  */
29
- avdName: string;
29
+ readonly avdName: string;
30
30
  /**
31
31
  * The device UDID to reuse (e.g. `'emulator-5554'`).
32
32
  *
@@ -34,7 +34,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
34
34
  * established. When present alongside {@link sessionId}, the transport
35
35
  * factory skips emulator startup and attaches to the existing session.
36
36
  */
37
- deviceId?: string;
37
+ readonly deviceId?: string;
38
38
  /**
39
39
  * An existing Appium session ID to reattach to.
40
40
  *
@@ -43,7 +43,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
43
43
  * When present, the transport factory uses WebDriverIO's `attach()` instead
44
44
  * of creating a new session, avoiding duplicate Appium/ADB connections.
45
45
  */
46
- sessionId?: string;
46
+ readonly sessionId?: string;
47
47
  /**
48
48
  * Whether to automatically start the Appium server if it is not reachable.
49
49
  *
@@ -53,11 +53,11 @@ export interface ObsidianAndroidAppiumTransportOptions {
53
53
  *
54
54
  * @default `true`
55
55
  */
56
- shouldAutoStartAppium?: boolean;
56
+ readonly shouldAutoStartAppium?: boolean;
57
57
  /**
58
58
  * Discriminant for the transport type.
59
59
  */
60
- type: 'obsidian-android-appium';
60
+ readonly type: 'obsidian-android-appium';
61
61
  /**
62
62
  * Base path on the device where Obsidian stores vaults.
63
63
  *
@@ -65,7 +65,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
65
65
  * - Android: `/sdcard/Documents/`
66
66
  * - iOS: `@md.obsidian:documents/`
67
67
  */
68
- vaultBasePath?: string;
68
+ readonly vaultBasePath?: string;
69
69
  /**
70
70
  * Timeout in milliseconds for waiting for the WebView context to become available.
71
71
  *
@@ -75,7 +75,7 @@ export interface ObsidianAndroidAppiumTransportOptions {
75
75
  *
76
76
  * @default `60000`
77
77
  */
78
- webviewTimeoutInMilliseconds?: number;
78
+ readonly webviewTimeoutInMilliseconds?: number;
79
79
  }
80
80
  /**
81
81
  * Transport options for desktop testing via Chrome DevTools Protocol.
@@ -85,21 +85,21 @@ export interface ObsidianCdpTransportOptions {
85
85
  * Timeout in milliseconds for individual CDP commands.
86
86
  * Defaults to 30000
87
87
  */
88
- commandTimeoutInMilliseconds?: number;
88
+ readonly commandTimeoutInMilliseconds?: number;
89
89
  /**
90
90
  * CDP host.
91
91
  * Defaults to `'localhost'`
92
92
  */
93
- host?: string;
93
+ readonly host?: string;
94
94
  /**
95
95
  * CDP port.
96
96
  * Defaults to 8315
97
97
  */
98
- port?: number;
98
+ readonly port?: number;
99
99
  /**
100
100
  * Discriminant for the transport type.
101
101
  */
102
- type: 'obsidian-cdp';
102
+ readonly type: 'obsidian-cdp';
103
103
  }
104
104
  /**
105
105
  * Transport options for desktop testing via the Obsidian CLI.
@@ -110,7 +110,7 @@ export interface ObsidianCliTransportOptions {
110
110
  /**
111
111
  * Discriminant for the transport type.
112
112
  */
113
- type: 'obsidian-cli';
113
+ readonly type: 'obsidian-cli';
114
114
  }
115
115
  /**
116
116
  * Discriminated union of all supported transport configurations.
@@ -7,7 +7,36 @@
7
7
  * to test workers via Vitest's `project.provide` / `inject`.
8
8
  */
9
9
  import type { TestProject } from 'vitest/node';
10
+ import type { PopulateFilesParams } from '../temp-vault.mjs';
10
11
  import { TempVault } from '../temp-vault.mjs';
12
+ /**
13
+ * Options for {@link createSetup}.
14
+ */
15
+ export interface CreateSetupOptions {
16
+ /**
17
+ * Returns files/folders to write into the vault before Obsidian opens it (see
18
+ * {@link CoreSetupParams.populate}). A thunk so large fixtures are built lazily,
19
+ * once, in the setup process.
20
+ */
21
+ populate?(this: void): PopulateFilesParams;
22
+ }
23
+ /**
24
+ * A Vitest `globalSetup` module's `setup` / `teardown` pair.
25
+ */
26
+ export interface VitestGlobalSetup {
27
+ setup(this: void, project: TestProject): Promise<void>;
28
+ teardown(this: void): Promise<void>;
29
+ }
30
+ /**
31
+ * Creates a Vitest global setup/teardown pair, optionally pre-populating the vault
32
+ * before Obsidian opens it — use this for a dedicated large-vault/performance
33
+ * project. The plain {@link setup} / {@link teardown} exports are the no-populate
34
+ * case (`createSetup()`).
35
+ *
36
+ * @param options - Setup options.
37
+ * @returns The `setup` and `teardown` functions to re-export from a `globalSetup` module.
38
+ */
39
+ export declare function createSetup(options?: CreateSetupOptions): VitestGlobalSetup;
11
40
  /**
12
41
  * Returns the temporary vault provided by the global setup.
13
42
  *
@@ -15,17 +44,20 @@ import { TempVault } from '../temp-vault.mjs';
15
44
  */
16
45
  export declare function getTempVault(): TempVault;
17
46
  /**
18
- * Vitest global setup function.
47
+ * Vitest global setup function (no pre-population).
19
48
  *
20
49
  * Copies the built plugin into a temporary vault, enables it via the Obsidian CLI,
21
50
  * and provides `tempVaultPath` to tests.
22
51
  *
23
52
  * @param project - The Vitest project.
53
+ * @returns A promise that resolves when setup completes.
24
54
  */
25
- export declare function setup(project: TestProject): Promise<void>;
55
+ export declare const setup: (this: void, project: TestProject) => Promise<void>;
26
56
  /**
27
57
  * Vitest global teardown function.
28
58
  *
29
59
  * Removes the temporary vault created during setup.
60
+ *
61
+ * @returns A promise that resolves when teardown completes.
30
62
  */
31
- export declare function teardown(): Promise<void>;
63
+ export declare const teardown: (this: void) => Promise<void>;
@@ -12,7 +12,27 @@ import { serializeError } from "../serialize-error.mjs";
12
12
  import { TempVault } from "../temp-vault.mjs";
13
13
  setTransportOptionsResolver(() => inject("obsidianTransport"));
14
14
  setVaultPathResolver(() => inject("tempVaultPath"));
15
- let setupResult;
15
+ function createSetup(options) {
16
+ let setupResult;
17
+ return { setup: setup2, teardown: teardown2 };
18
+ async function setup2(project) {
19
+ const environmentOptions = project.config.environmentOptions;
20
+ const transportOptions = environmentOptions?.["obsidianTransport"];
21
+ const label = transportOptions?.type ?? "obsidian-cli";
22
+ try {
23
+ setupResult = await coreSetup({ populate: options?.populate?.(), transportOptions });
24
+ } catch (error) {
25
+ log(`[integration-setup:${label}] Setup failed (tests for this project will be skipped): ${serializeError(error)}`);
26
+ project.provide("setupError", serializeError(error));
27
+ return;
28
+ }
29
+ project.provide("obsidianTransport", setupResult.transportOptions);
30
+ project.provide("tempVaultPath", setupResult.tempVault.path);
31
+ }
32
+ async function teardown2() {
33
+ await coreTeardown(setupResult);
34
+ }
35
+ }
16
36
  function getTempVault() {
17
37
  const tempVaultPath = inject("tempVaultPath");
18
38
  const setupErrorMessage = inject("setupError");
@@ -21,26 +41,13 @@ function getTempVault() {
21
41
  }
22
42
  return new TempVault(tempVaultPath);
23
43
  }
24
- async function setup(project) {
25
- const environmentOptions = project.config.environmentOptions;
26
- const transportOptions = environmentOptions?.["obsidianTransport"];
27
- const label = transportOptions?.type ?? "obsidian-cli";
28
- try {
29
- setupResult = await coreSetup({ transportOptions });
30
- } catch (error) {
31
- log(`[integration-setup:${label}] Setup failed (tests for this project will be skipped): ${serializeError(error)}`);
32
- project.provide("setupError", serializeError(error));
33
- return;
34
- }
35
- project.provide("obsidianTransport", setupResult.transportOptions);
36
- project.provide("tempVaultPath", setupResult.tempVault.path);
37
- }
38
- async function teardown() {
39
- await coreTeardown(setupResult);
40
- }
44
+ const defaultGlobalSetup = createSetup();
45
+ const setup = defaultGlobalSetup.setup;
46
+ const teardown = defaultGlobalSetup.teardown;
41
47
  export {
48
+ createSetup,
42
49
  getTempVault,
43
50
  setup,
44
51
  teardown
45
52
  };
46
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7XG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi4vY29udGV4dC1wcm92aWRlci5tanMnO1xuaW1wb3J0IHtcbiAgY29yZVNldHVwLFxuICBjb3JlVGVhcmRvd25cbn0gZnJvbSAnLi4vZ2xvYmFsLXNldHVwLWNvcmUubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4uL2xvZy5tanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuLi9zZXJpYWxpemUtZXJyb3IubWpzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4uL3RlbXAtdmF1bHQubWpzJztcblxuc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyKCgpID0+IGluamVjdCgnb2JzaWRpYW5UcmFuc3BvcnQnKSk7XG5zZXRWYXVsdFBhdGhSZXNvbHZlcigoKSA9PiBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKSk7XG5cbmxldCBzZXR1cFJlc3VsdDogQ29yZVNldHVwUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRlbXBvcmFyeSB2YXVsdCBwcm92aWRlZCBieSB0aGUgZ2xvYmFsIHNldHVwLlxuICpcbiAqIEByZXR1cm5zIFRoZSB0ZW1wb3JhcnkgdmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wVmF1bHQoKTogVGVtcFZhdWx0IHtcbiAgY29uc3QgdGVtcFZhdWx0UGF0aCA9IGluamVjdCgndGVtcFZhdWx0UGF0aCcpO1xuICBjb25zdCBzZXR1cEVycm9yTWVzc2FnZSA9IGluamVjdCgnc2V0dXBFcnJvcicpO1xuICBpZiAoc2V0dXBFcnJvck1lc3NhZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVncmF0aW9uIHNldHVwIGZhaWxlZCBcdTIwMTQgY2Fubm90IGdldCB0ZW1wIHZhdWx0OiAke3NldHVwRXJyb3JNZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiBuZXcgVGVtcFZhdWx0KHRlbXBWYXVsdFBhdGgpO1xufVxuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgc2V0dXAgZnVuY3Rpb24uXG4gKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgZW5hYmxlcyBpdCB2aWEgdGhlIE9ic2lkaWFuIENMSSxcbiAqIGFuZCBwcm92aWRlcyBgdGVtcFZhdWx0UGF0aGAgdG8gdGVzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3QgLSBUaGUgVml0ZXN0IHByb2plY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChwcm9qZWN0OiBUZXN0UHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBlbnZpcm9ubWVudE9wdGlvbnMgPSBwcm9qZWN0LmNvbmZpZy5lbnZpcm9ubWVudE9wdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBlbnZpcm9ubWVudE9wdGlvbnM/Llsnb2JzaWRpYW5UcmFuc3BvcnQnXSBhcyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucz8udHlwZSA/PyAnb2JzaWRpYW4tY2xpJztcblxuICB0cnkge1xuICAgIHNldHVwUmVzdWx0ID0gYXdhaXQgY29yZVNldHVwKHsgdHJhbnNwb3J0T3B0aW9ucyB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAvLyBDYXRjaCBzZXR1cCBlcnJvcnMgc28gdGhhdCBvdGhlciBwcm9qZWN0cycgdGVzdHMgY2FuIHN0aWxsIHJ1bi5cbiAgICAvLyBJbmRpdmlkdWFsIHRlc3RzIGluIHRoaXMgcHJvamVjdCB3aWxsIGZhaWwgd2l0aCB0aGUgc3RvcmVkIGVycm9yXG4gICAgLy8gV2hlbiB0aGV5IHRyeSB0byBpbmplY3QgdGhlIHRlbXAgdmF1bHQgcGF0aC5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2V0dXAgZmFpbGVkICh0ZXN0cyBmb3IgdGhpcyBwcm9qZWN0IHdpbGwgYmUgc2tpcHBlZCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgIHByb2plY3QucHJvdmlkZSgnc2V0dXBFcnJvcicsIHNlcmlhbGl6ZUVycm9yKGVycm9yKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHNldHVwUmVzdWx0LnRyYW5zcG9ydE9wdGlvbnMpO1xuICBwcm9qZWN0LnByb3ZpZGUoJ3RlbXBWYXVsdFBhdGgnLCBzZXR1cFJlc3VsdC50ZW1wVmF1bHQucGF0aCk7XG59XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCB0ZWFyZG93biBmdW5jdGlvbi5cbiAqXG4gKiBSZW1vdmVzIHRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZWFyZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY29yZVRlYXJkb3duKHNldHVwUmVzdWx0KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWFBLFNBQVMsY0FBYztBQUt2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUJBQWlCO0FBRTFCLDRCQUE0QixNQUFNLE9BQU8sbUJBQW1CLENBQUM7QUFDN0QscUJBQXFCLE1BQU0sT0FBTyxlQUFlLENBQUM7QUFFbEQsSUFBSTtBQU9HLFNBQVMsZUFBMEI7QUFDeEMsUUFBTSxnQkFBZ0IsT0FBTyxlQUFlO0FBQzVDLFFBQU0sb0JBQW9CLE9BQU8sWUFBWTtBQUM3QyxNQUFJLG1CQUFtQjtBQUNyQixVQUFNLElBQUksTUFBTSwwREFBcUQsaUJBQWlCLEVBQUU7QUFBQSxFQUMxRjtBQUNBLFNBQU8sSUFBSSxVQUFVLGFBQWE7QUFDcEM7QUFVQSxlQUFzQixNQUFNLFNBQXFDO0FBQy9ELFFBQU0scUJBQXFCLFFBQVEsT0FBTztBQUMxQyxRQUFNLG1CQUFtQixxQkFBcUIsbUJBQW1CO0FBQ2pFLFFBQU0sUUFBUSxrQkFBa0IsUUFBUTtBQUV4QyxNQUFJO0FBQ0Ysa0JBQWMsTUFBTSxVQUFVLEVBQUUsaUJBQWlCLENBQUM7QUFBQSxFQUNwRCxTQUFTLE9BQWdCO0FBSXZCLFFBQUksc0JBQXNCLEtBQUssNERBQTRELGVBQWUsS0FBSyxDQUFDLEVBQUU7QUFDbEgsWUFBUSxRQUFRLGNBQWMsZUFBZSxLQUFLLENBQUM7QUFDbkQ7QUFBQSxFQUNGO0FBRUEsVUFBUSxRQUFRLHFCQUFxQixZQUFZLGdCQUFnQjtBQUNqRSxVQUFRLFFBQVEsaUJBQWlCLFlBQVksVUFBVSxJQUFJO0FBQzdEO0FBT0EsZUFBc0IsV0FBMEI7QUFDOUMsUUFBTSxhQUFhLFdBQVc7QUFDaEM7IiwKICAibmFtZXMiOiBbXQp9Cg==
53
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuLi90ZW1wLXZhdWx0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7XG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi4vY29udGV4dC1wcm92aWRlci5tanMnO1xuaW1wb3J0IHtcbiAgY29yZVNldHVwLFxuICBjb3JlVGVhcmRvd25cbn0gZnJvbSAnLi4vZ2xvYmFsLXNldHVwLWNvcmUubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4uL2xvZy5tanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuLi9zZXJpYWxpemUtZXJyb3IubWpzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4uL3RlbXAtdmF1bHQubWpzJztcblxuc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyKCgpID0+IGluamVjdCgnb2JzaWRpYW5UcmFuc3BvcnQnKSk7XG5zZXRWYXVsdFBhdGhSZXNvbHZlcigoKSA9PiBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKSk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTZXR1cE9wdGlvbnMge1xuICAvKipcbiAgICogUmV0dXJucyBmaWxlcy9mb2xkZXJzIHRvIHdyaXRlIGludG8gdGhlIHZhdWx0IGJlZm9yZSBPYnNpZGlhbiBvcGVucyBpdCAoc2VlXG4gICAqIHtAbGluayBDb3JlU2V0dXBQYXJhbXMucG9wdWxhdGV9KS4gQSB0aHVuayBzbyBsYXJnZSBmaXh0dXJlcyBhcmUgYnVpbHQgbGF6aWx5LFxuICAgKiBvbmNlLCBpbiB0aGUgc2V0dXAgcHJvY2Vzcy5cbiAgICovXG4gIHBvcHVsYXRlPyh0aGlzOiB2b2lkKTogUG9wdWxhdGVGaWxlc1BhcmFtcztcbn1cblxuLyoqXG4gKiBBIFZpdGVzdCBgZ2xvYmFsU2V0dXBgIG1vZHVsZSdzIGBzZXR1cGAgLyBgdGVhcmRvd25gIHBhaXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml0ZXN0R2xvYmFsU2V0dXAge1xuICBzZXR1cCh0aGlzOiB2b2lkLCBwcm9qZWN0OiBUZXN0UHJvamVjdCk6IFByb21pc2U8dm9pZD47XG4gIHRlYXJkb3duKHRoaXM6IHZvaWQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBWaXRlc3QgZ2xvYmFsIHNldHVwL3RlYXJkb3duIHBhaXIsIG9wdGlvbmFsbHkgcHJlLXBvcHVsYXRpbmcgdGhlIHZhdWx0XG4gKiBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQgXHUyMDE0IHVzZSB0aGlzIGZvciBhIGRlZGljYXRlZCBsYXJnZS12YXVsdC9wZXJmb3JtYW5jZVxuICogcHJvamVjdC4gVGhlIHBsYWluIHtAbGluayBzZXR1cH0gLyB7QGxpbmsgdGVhcmRvd259IGV4cG9ydHMgYXJlIHRoZSBuby1wb3B1bGF0ZVxuICogY2FzZSAoYGNyZWF0ZVNldHVwKClgKS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNldHVwIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgYHNldHVwYCBhbmQgYHRlYXJkb3duYCBmdW5jdGlvbnMgdG8gcmUtZXhwb3J0IGZyb20gYSBgZ2xvYmFsU2V0dXBgIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldHVwKG9wdGlvbnM/OiBDcmVhdGVTZXR1cE9wdGlvbnMpOiBWaXRlc3RHbG9iYWxTZXR1cCB7XG4gIGxldCBzZXR1cFJlc3VsdDogQ29yZVNldHVwUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7IHNldHVwLCB0ZWFyZG93biB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHNldHVwKHByb2plY3Q6IFRlc3RQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zID0gcHJvamVjdC5jb25maWcuZW52aXJvbm1lbnRPcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBlbnZpcm9ubWVudE9wdGlvbnM/Llsnb2JzaWRpYW5UcmFuc3BvcnQnXSBhcyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFiZWwgPSB0cmFuc3BvcnRPcHRpb25zPy50eXBlID8/ICdvYnNpZGlhbi1jbGknO1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldHVwUmVzdWx0ID0gYXdhaXQgY29yZVNldHVwKHsgcG9wdWxhdGU6IG9wdGlvbnM/LnBvcHVsYXRlPy4oKSwgdHJhbnNwb3J0T3B0aW9ucyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gQ2F0Y2ggc2V0dXAgZXJyb3JzIHNvIHRoYXQgb3RoZXIgcHJvamVjdHMnIHRlc3RzIGNhbiBzdGlsbCBydW4uXG4gICAgICAvLyBJbmRpdmlkdWFsIHRlc3RzIGluIHRoaXMgcHJvamVjdCB3aWxsIGZhaWwgd2l0aCB0aGUgc3RvcmVkIGVycm9yXG4gICAgICAvLyBXaGVuIHRoZXkgdHJ5IHRvIGluamVjdCB0aGUgdGVtcCB2YXVsdCBwYXRoLlxuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCAodGVzdHMgZm9yIHRoaXMgcHJvamVjdCB3aWxsIGJlIHNraXBwZWQpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIHByb2plY3QucHJvdmlkZSgnc2V0dXBFcnJvcicsIHNlcmlhbGl6ZUVycm9yKGVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHNldHVwUmVzdWx0LnRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIHByb2plY3QucHJvdmlkZSgndGVtcFZhdWx0UGF0aCcsIHNldHVwUmVzdWx0LnRlbXBWYXVsdC5wYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGNvcmVUZWFyZG93bihzZXR1cFJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgdmF1bHQgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdGVtcG9yYXJ5IHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFZhdWx0KCk6IFRlbXBWYXVsdCB7XG4gIGNvbnN0IHRlbXBWYXVsdFBhdGggPSBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKTtcbiAgY29uc3Qgc2V0dXBFcnJvck1lc3NhZ2UgPSBpbmplY3QoJ3NldHVwRXJyb3InKTtcbiAgaWYgKHNldHVwRXJyb3JNZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlZ3JhdGlvbiBzZXR1cCBmYWlsZWQgXHUyMDE0IGNhbm5vdCBnZXQgdGVtcCB2YXVsdDogJHtzZXR1cEVycm9yTWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gbmV3IFRlbXBWYXVsdCh0ZW1wVmF1bHRQYXRoKTtcbn1cblxuY29uc3QgZGVmYXVsdEdsb2JhbFNldHVwID0gY3JlYXRlU2V0dXAoKTtcblxuLyoqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGZ1bmN0aW9uIChubyBwcmUtcG9wdWxhdGlvbikuXG4gKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgZW5hYmxlcyBpdCB2aWEgdGhlIE9ic2lkaWFuIENMSSxcbiAqIGFuZCBwcm92aWRlcyBgdGVtcFZhdWx0UGF0aGAgdG8gdGVzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3QgLSBUaGUgVml0ZXN0IHByb2plY3QuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNldHVwIGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHNldHVwID0gZGVmYXVsdEdsb2JhbFNldHVwLnNldHVwO1xuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgdGVhcmRvd24gZnVuY3Rpb24uXG4gKlxuICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGVhcmRvd24gY29tcGxldGVzLlxuICovXG5leHBvcnQgY29uc3QgdGVhcmRvd24gPSBkZWZhdWx0R2xvYmFsU2V0dXAudGVhcmRvd247XG4iXSwKICAibWFwcGluZ3MiOiAiQUFhQSxTQUFTLGNBQWM7QUFNdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsV0FBVztBQUNwQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGlCQUFpQjtBQUUxQiw0QkFBNEIsTUFBTSxPQUFPLG1CQUFtQixDQUFDO0FBQzdELHFCQUFxQixNQUFNLE9BQU8sZUFBZSxDQUFDO0FBK0IzQyxTQUFTLFlBQVksU0FBaUQ7QUFDM0UsTUFBSTtBQUVKLFNBQU8sRUFBRSxPQUFBQSxRQUFPLFVBQUFDLFVBQVM7QUFFekIsaUJBQWVELE9BQU0sU0FBcUM7QUFDeEQsVUFBTSxxQkFBcUIsUUFBUSxPQUFPO0FBQzFDLFVBQU0sbUJBQW1CLHFCQUFxQixtQkFBbUI7QUFDakUsVUFBTSxRQUFRLGtCQUFrQixRQUFRO0FBRXhDLFFBQUk7QUFDRixvQkFBYyxNQUFNLFVBQVUsRUFBRSxVQUFVLFNBQVMsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0FBQUEsSUFDckYsU0FBUyxPQUFnQjtBQUl2QixVQUFJLHNCQUFzQixLQUFLLDREQUE0RCxlQUFlLEtBQUssQ0FBQyxFQUFFO0FBQ2xILGNBQVEsUUFBUSxjQUFjLGVBQWUsS0FBSyxDQUFDO0FBQ25EO0FBQUEsSUFDRjtBQUVBLFlBQVEsUUFBUSxxQkFBcUIsWUFBWSxnQkFBZ0I7QUFDakUsWUFBUSxRQUFRLGlCQUFpQixZQUFZLFVBQVUsSUFBSTtBQUFBLEVBQzdEO0FBRUEsaUJBQWVDLFlBQTBCO0FBQ3ZDLFVBQU0sYUFBYSxXQUFXO0FBQUEsRUFDaEM7QUFDRjtBQU9PLFNBQVMsZUFBMEI7QUFDeEMsUUFBTSxnQkFBZ0IsT0FBTyxlQUFlO0FBQzVDLFFBQU0sb0JBQW9CLE9BQU8sWUFBWTtBQUM3QyxNQUFJLG1CQUFtQjtBQUNyQixVQUFNLElBQUksTUFBTSwwREFBcUQsaUJBQWlCLEVBQUU7QUFBQSxFQUMxRjtBQUNBLFNBQU8sSUFBSSxVQUFVLGFBQWE7QUFDcEM7QUFFQSxNQUFNLHFCQUFxQixZQUFZO0FBV2hDLE1BQU0sUUFBUSxtQkFBbUI7QUFTakMsTUFBTSxXQUFXLG1CQUFtQjsiLAogICJuYW1lcyI6IFsic2V0dXAiLCAidGVhcmRvd24iXQp9Cg==
@@ -48,6 +48,6 @@ declare module 'vitest/node' {
48
48
  *
49
49
  * When omitted, defaults to the CLI transport (`obsidian-cli`).
50
50
  */
51
- obsidianTransport?: ObsidianTransportOptions;
51
+ readonly obsidianTransport?: ObsidianTransportOptions;
52
52
  }
53
53
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-integration-testing",
3
- "version": "4.2.5",
3
+ "version": "4.3.0",
4
4
  "description": "Simplifies integration testing of Obsidian plugins.",
5
5
  "keywords": [
6
6
  "obsidian",
@@ -40,6 +40,16 @@
40
40
  "default": "./dist/lib/cjs/jest/global-setup.cjs"
41
41
  }
42
42
  },
43
+ "./jest-global-teardown": {
44
+ "import": {
45
+ "types": "./dist/lib/esm/jest/global-teardown.d.mts",
46
+ "default": "./dist/lib/esm/jest/global-teardown.mjs"
47
+ },
48
+ "require": {
49
+ "types": "./dist/lib/cjs/jest/global-teardown.d.cts",
50
+ "default": "./dist/lib/cjs/jest/global-teardown.cjs"
51
+ }
52
+ },
43
53
  "./vitest-global-setup": {
44
54
  "import": {
45
55
  "types": "./dist/lib/esm/vitest/global-setup.d.mts",
@@ -96,27 +106,30 @@
96
106
  "@sinonjs/fake-timers": "13.0.5",
97
107
  "electron": "42.0.1",
98
108
  "eslint-plugin-import": "$eslint-plugin-import-x",
109
+ "js-yaml": "^4.2.0",
99
110
  "lodash": "4.18.1",
100
111
  "lodash-es": "4.18.1",
112
+ "markdown-it": "^14.2.0",
101
113
  "mermaid": "11.15.0",
102
114
  "tmp": "0.2.5",
103
115
  "type-fest": "$type-fest",
104
116
  "typescript": "$typescript",
105
- "urlpattern-polyfill": "npm:dry-uninstall"
117
+ "urlpattern-polyfill": "npm:dry-uninstall",
118
+ "vite": "$vite"
106
119
  },
107
120
  "dependencies": {
108
121
  "puppeteer-core": "^25.1.0",
109
122
  "webdriverio": "9.27.0"
110
123
  },
111
124
  "devDependencies": {
112
- "@commitlint/cli": "^21.0.1",
113
- "@commitlint/config-conventional": "^21.0.1",
125
+ "@commitlint/cli": "^21.0.2",
126
+ "@commitlint/config-conventional": "^21.0.2",
114
127
  "@commitlint/types": "^21.0.1",
115
128
  "@eslint-community/eslint-plugin-eslint-comments": "^4.7.2",
116
129
  "@eslint/compat": "^2.1.0",
117
130
  "@eslint/config-helpers": "^0.6.0",
118
131
  "@eslint/js": "^10.0.1",
119
- "@obsidian-typings/obsidian-public-latest": "^6.12.0",
132
+ "@obsidian-typings/obsidian-public-latest": "^6.15.0",
120
133
  "@stylistic/eslint-plugin": "^5.10.0",
121
134
  "@total-typescript/ts-reset": "^0.6.1",
122
135
  "@tsconfig/strictest": "^2.0.8",
@@ -124,22 +137,22 @@
124
137
  "@types/markdown-it": "^14.1.2",
125
138
  "@types/semver": "^7.7.1",
126
139
  "@types/turndown": "^5.0.6",
127
- "@typescript-eslint/rule-tester": "^8.60.0",
128
- "@typescript-eslint/utils": "^8.60.0",
129
- "@vitest/coverage-v8": "^4.1.7",
140
+ "@typescript-eslint/rule-tester": "^8.61.1",
141
+ "@typescript-eslint/utils": "^8.61.1",
142
+ "@vitest/coverage-v8": "^4.1.9",
130
143
  "@vitest/runner": "4.1.0",
131
144
  "@wdio/protocols": "9.27.0",
132
145
  "@wdio/types": "9.27.0",
133
146
  "better-typescript-lib": "^2.12.0",
134
- "cspell": "^10.0.0",
147
+ "cspell": "^10.0.1",
135
148
  "czg": "^1.13.1",
136
149
  "dprint": "^0.54.0",
137
- "esbuild": "^0.28.0",
138
- "eslint": "^10.4.0",
139
- "eslint-import-resolver-typescript": "^4.4.4",
150
+ "esbuild": "^0.28.1",
151
+ "eslint": "^10.5.0",
152
+ "eslint-import-resolver-typescript": "^4.4.5",
140
153
  "eslint-plugin-import-x": "^4.16.2",
141
- "eslint-plugin-jsdoc": "^63.0.0",
142
- "eslint-plugin-perfectionist": "^5.9.0",
154
+ "eslint-plugin-jsdoc": "^63.0.6",
155
+ "eslint-plugin-perfectionist": "^5.9.1",
143
156
  "eslint-plugin-tsdoc": "^0.5.2",
144
157
  "globals": "^17.6.0",
145
158
  "husky": "^9.1.7",
@@ -147,18 +160,18 @@
147
160
  "jest-config": "^30.4.2",
148
161
  "jiti": "^2.7.0",
149
162
  "jsdom": "^29.1.1",
150
- "markdownlint": "^0.40.0",
163
+ "markdownlint": "^0.41.0",
151
164
  "markdownlint-cli2": "^0.22.1",
152
165
  "markdownlint-rule-relative-links": "^5.1.0",
153
166
  "nano-staged": "^1.0.2",
154
- "obsidian": "^1.12.3",
155
- "semver": "^7.8.1",
167
+ "obsidian": "^1.13.1",
168
+ "semver": "^7.8.5",
156
169
  "ts-jest": "^29.4.11",
157
- "type-fest": "^5.6.0",
170
+ "type-fest": "^5.7.0",
158
171
  "typescript": "^6.0.3",
159
- "typescript-eslint": "^8.60.0",
160
- "vite": "8.0.12",
161
- "vitest": "^4.1.7"
172
+ "typescript-eslint": "^8.61.1",
173
+ "vite": "^8.0.12",
174
+ "vitest": "^4.1.9"
162
175
  },
163
176
  "peerDependencies": {
164
177
  "obsidian": "^1.12.3",