@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.0.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 (129) hide show
  1. package/README.md +5 -1
  2. package/bin/archive-demo-vault.mjs +8 -0
  3. package/bin/generate-coverage-badge.mjs +8 -0
  4. package/bundlers/esbuild-impl/feature-options/package.json +6 -0
  5. package/bundlers/obsidian-cli-reload/package.json +6 -0
  6. package/bundlers/obsidian-plugin-build/package.json +6 -0
  7. package/bundlers/obsidian-plugin-features/package.json +6 -0
  8. package/bundlers/obsidian-plugin-transforms/package.json +6 -0
  9. package/bundlers/obsidian-plugin-webpack-loader/package.json +6 -0
  10. package/bundlers/obsidian-plugins-folder-deployment/package.json +6 -0
  11. package/bundlers/parcel/package.json +6 -0
  12. package/bundlers/rollup/package.json +6 -0
  13. package/bundlers/rollup-compatible/package.json +6 -0
  14. package/bundlers/rollup-compatible-features/package.json +6 -0
  15. package/bundlers/vite/package.json +6 -0
  16. package/bundlers/webpack/package.json +6 -0
  17. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -188
  18. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +2 -18
  19. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +173 -0
  20. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.d.cts +60 -0
  21. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
  22. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +30 -82
  24. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +7 -24
  25. package/dist/lib/cjs/bundlers/index.cjs +39 -3
  26. package/dist/lib/cjs/bundlers/index.d.cts +12 -0
  27. package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +182 -0
  28. package/dist/lib/cjs/bundlers/obsidian-cli-reload.d.cts +37 -0
  29. package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +278 -0
  30. package/dist/lib/cjs/bundlers/obsidian-plugin-build.d.cts +217 -0
  31. package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +242 -0
  32. package/dist/lib/cjs/bundlers/obsidian-plugin-features.d.cts +186 -0
  33. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +306 -0
  34. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.d.cts +231 -0
  35. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +182 -0
  36. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.d.cts +47 -0
  37. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +320 -0
  38. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.d.cts +44 -0
  39. package/dist/lib/cjs/bundlers/parcel.cjs +462 -0
  40. package/dist/lib/cjs/bundlers/parcel.d.cts +128 -0
  41. package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +181 -0
  42. package/dist/lib/cjs/bundlers/rollup-compatible-features.d.cts +128 -0
  43. package/dist/lib/cjs/bundlers/rollup-compatible.cjs +138 -0
  44. package/dist/lib/cjs/bundlers/rollup-compatible.d.cts +84 -0
  45. package/dist/lib/cjs/bundlers/rollup.cjs +218 -0
  46. package/dist/lib/cjs/bundlers/rollup.d.cts +99 -0
  47. package/dist/lib/cjs/bundlers/vite.cjs +229 -0
  48. package/dist/lib/cjs/bundlers/vite.d.cts +105 -0
  49. package/dist/lib/cjs/bundlers/webpack.cjs +354 -0
  50. package/dist/lib/cjs/bundlers/webpack.d.cts +133 -0
  51. package/dist/lib/cjs/demo-vault-cli.cjs +131 -0
  52. package/dist/lib/cjs/demo-vault-cli.d.cts +15 -0
  53. package/dist/lib/cjs/index.cjs +4 -1
  54. package/dist/lib/cjs/index.d.cts +1 -0
  55. package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +160 -0
  56. package/dist/lib/cjs/test-runners/coverage-badge-cli.d.cts +25 -0
  57. package/dist/lib/cjs/test-runners/coverage-badge.cjs +279 -0
  58. package/dist/lib/cjs/test-runners/coverage-badge.d.cts +143 -0
  59. package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +170 -0
  60. package/dist/lib/cjs/test-runners/e2e-runner-support.d.cts +36 -0
  61. package/dist/lib/cjs/test-runners/index.cjs +18 -3
  62. package/dist/lib/cjs/test-runners/index.d.cts +5 -0
  63. package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +147 -0
  64. package/dist/lib/cjs/test-runners/obsidian-test-runner.d.cts +42 -0
  65. package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +205 -0
  66. package/dist/lib/cjs/test-runners/wdio-obsidian.d.cts +199 -0
  67. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +2 -18
  68. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +3 -192
  69. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.d.mts +60 -0
  70. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.mjs +82 -0
  71. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
  72. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
  73. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +7 -24
  74. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +41 -87
  75. package/dist/lib/esm/bundlers/index.d.mts +12 -0
  76. package/dist/lib/esm/bundlers/index.mjs +26 -2
  77. package/dist/lib/esm/bundlers/obsidian-cli-reload.d.mts +37 -0
  78. package/dist/lib/esm/bundlers/obsidian-cli-reload.mjs +83 -0
  79. package/dist/lib/esm/bundlers/obsidian-plugin-build.d.mts +217 -0
  80. package/dist/lib/esm/bundlers/obsidian-plugin-build.mjs +166 -0
  81. package/dist/lib/esm/bundlers/obsidian-plugin-features.d.mts +186 -0
  82. package/dist/lib/esm/bundlers/obsidian-plugin-features.mjs +126 -0
  83. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.d.mts +231 -0
  84. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.mjs +194 -0
  85. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.d.mts +47 -0
  86. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.mjs +89 -0
  87. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.d.mts +44 -0
  88. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +228 -0
  89. package/dist/lib/esm/bundlers/parcel.d.mts +128 -0
  90. package/dist/lib/esm/bundlers/parcel.mjs +361 -0
  91. package/dist/lib/esm/bundlers/rollup-compatible-features.d.mts +128 -0
  92. package/dist/lib/esm/bundlers/rollup-compatible-features.mjs +93 -0
  93. package/dist/lib/esm/bundlers/rollup-compatible.d.mts +84 -0
  94. package/dist/lib/esm/bundlers/rollup-compatible.mjs +43 -0
  95. package/dist/lib/esm/bundlers/rollup.d.mts +99 -0
  96. package/dist/lib/esm/bundlers/rollup.mjs +130 -0
  97. package/dist/lib/esm/bundlers/vite.d.mts +105 -0
  98. package/dist/lib/esm/bundlers/vite.mjs +144 -0
  99. package/dist/lib/esm/bundlers/webpack.d.mts +133 -0
  100. package/dist/lib/esm/bundlers/webpack.mjs +259 -0
  101. package/dist/lib/esm/demo-vault-cli.d.mts +15 -0
  102. package/dist/lib/esm/demo-vault-cli.mjs +23 -0
  103. package/dist/lib/esm/index.d.mts +1 -0
  104. package/dist/lib/esm/index.mjs +3 -1
  105. package/dist/lib/esm/test-runners/coverage-badge-cli.d.mts +25 -0
  106. package/dist/lib/esm/test-runners/coverage-badge-cli.mjs +51 -0
  107. package/dist/lib/esm/test-runners/coverage-badge.d.mts +143 -0
  108. package/dist/lib/esm/test-runners/coverage-badge.mjs +181 -0
  109. package/dist/lib/esm/test-runners/e2e-runner-support.d.mts +36 -0
  110. package/dist/lib/esm/test-runners/e2e-runner-support.mjs +61 -0
  111. package/dist/lib/esm/test-runners/index.d.mts +5 -0
  112. package/dist/lib/esm/test-runners/index.mjs +12 -2
  113. package/dist/lib/esm/test-runners/obsidian-test-runner.d.mts +42 -0
  114. package/dist/lib/esm/test-runners/obsidian-test-runner.mjs +52 -0
  115. package/dist/lib/esm/test-runners/wdio-obsidian.d.mts +199 -0
  116. package/dist/lib/esm/test-runners/wdio-obsidian.mjs +110 -0
  117. package/package.json +102 -4
  118. package/test-runners/coverage-badge/package.json +6 -0
  119. package/test-runners/coverage-badge-cli/package.json +6 -0
  120. package/test-runners/e2e-runner-support/package.json +6 -0
  121. package/test-runners/obsidian-test-runner/package.json +6 -0
  122. package/test-runners/wdio-obsidian/package.json +6 -0
  123. package/tsconfig/preact.json +7 -0
  124. package/tsconfig/react.json +7 -0
  125. package/tsconfig/solid.json +7 -0
  126. package/tsconfig/svelte.json +7 -0
  127. package/tsconfig/vue.json +7 -0
  128. package/types/styles.d.ts +32 -0
  129. package/types/wasm.d.ts +11 -0
@@ -0,0 +1,199 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * End-to-end tests with `wdio-obsidian-service`: WebdriverIO drives a sandboxed copy of Obsidian, downloaded per
6
+ * version into a cache, with the plugin installed into a copy of the test vault.
7
+ *
8
+ * {@link defineWdioObsidianConfig} derives the `wdio.conf.mts` from the project's layout, and
9
+ * {@link testEndToEndWithWdioObsidian} is the `test:e2e` script: a production build, then `wdio run`.
10
+ *
11
+ * The config is typed structurally rather than through `@wdio/types`, so this module costs a project that does not
12
+ * use WebdriverIO nothing, and the returned object is assignable to `WebdriverIO.Config` in one that does.
13
+ */
14
+ /**
15
+ * The per-test timeout {@link defineWdioObsidianConfig} gives mocha by default, in milliseconds. Obsidian is
16
+ * started once per spec file, which a single test's budget has to absorb.
17
+ */
18
+ export declare const DEFAULT_WDIO_OBSIDIAN_TEST_TIMEOUT_IN_MILLISECONDS = 60000;
19
+ /**
20
+ * The config files {@link testEndToEndWithWdioObsidian} looks for, in order.
21
+ */
22
+ export declare const WDIO_CONFIG_FILE_NAMES: readonly string[];
23
+ /**
24
+ * Options for {@link defineWdioObsidianConfig}.
25
+ */
26
+ export interface DefineWdioObsidianConfigOptions {
27
+ /**
28
+ * The Obsidian app versions to test, one capability each: a version such as `1.8.10`, `latest`, `latest-beta`, or
29
+ * `earliest` (the `minAppVersion` of `manifest.json`). Defaults to `['latest']`; `['earliest', 'latest']` tests
30
+ * both ends of the supported range.
31
+ */
32
+ readonly appVersions?: readonly string[];
33
+ /**
34
+ * The folder Obsidian versions are downloaded into, relative to the project root. Defaults to `.obsidian-cache`,
35
+ * which belongs in `.gitignore`.
36
+ */
37
+ readonly cacheFolder?: string;
38
+ /**
39
+ * The Obsidian installer (Electron) version, `earliest` or `latest` compatible with each app version, or an exact
40
+ * one. Defaults to the service's own choice.
41
+ */
42
+ readonly installerVersion?: string;
43
+ /**
44
+ * How many Obsidian instances run in parallel. Defaults to WebdriverIO's.
45
+ */
46
+ readonly maxInstances?: number;
47
+ /**
48
+ * The folder holding the built plugin (`main.js`, `manifest.json`, `styles.css`), relative to the project root.
49
+ * Defaults to `dist/build`, where the production build writes it.
50
+ */
51
+ readonly pluginFolder?: string;
52
+ /**
53
+ * The spec files, relative to the project root. Defaults to {@link DEFAULT_END_TO_END_SPECS}.
54
+ */
55
+ readonly specs?: readonly string[];
56
+ /**
57
+ * The per-test timeout, in milliseconds. Defaults to {@link DEFAULT_WDIO_OBSIDIAN_TEST_TIMEOUT_IN_MILLISECONDS}.
58
+ */
59
+ readonly testTimeoutInMilliseconds?: number;
60
+ /**
61
+ * The vault every test starts from, relative to the project root. The service opens a COPY of it, so the tests
62
+ * never change the folder. Defaults to the plugin's demo vault (`demo-vault`) when the project has one, and to an
63
+ * empty vault otherwise; `false` forces the empty vault.
64
+ */
65
+ readonly vault?: false | string;
66
+ }
67
+ /**
68
+ * Options for {@link testEndToEndWithWdioObsidian}.
69
+ */
70
+ export interface TestEndToEndWithWdioObsidianOptions {
71
+ /**
72
+ * The WebdriverIO config file, relative to the project root. Defaults to the first of
73
+ * {@link WDIO_CONFIG_FILE_NAMES} that exists.
74
+ */
75
+ readonly configPath?: string;
76
+ /**
77
+ * Whether to run the production build first, so the tests load the current `dist/build`. Defaults to `true`.
78
+ */
79
+ readonly shouldBuild?: boolean;
80
+ }
81
+ /**
82
+ * A `wdio-obsidian-service` capability: one Obsidian version to run the specs against.
83
+ */
84
+ export interface WdioObsidianCapability {
85
+ /**
86
+ * Always `obsidian`, which is what routes the capability to the service.
87
+ */
88
+ 'browserName': 'obsidian';
89
+ /**
90
+ * The Obsidian app version.
91
+ */
92
+ 'browserVersion': string;
93
+ /**
94
+ * The service's own options for this capability.
95
+ */
96
+ 'wdio:obsidianOptions': WdioObsidianCapabilityOptions;
97
+ }
98
+ /**
99
+ * The `wdio:obsidianOptions` of a {@link WdioObsidianCapability}.
100
+ */
101
+ export interface WdioObsidianCapabilityOptions {
102
+ /**
103
+ * The Obsidian installer version.
104
+ */
105
+ readonly installerVersion?: string;
106
+ /**
107
+ * The plugin folders to install into the vault.
108
+ */
109
+ readonly plugins: string[];
110
+ /**
111
+ * The vault to open a copy of.
112
+ */
113
+ readonly vault?: string;
114
+ }
115
+ /**
116
+ * The WebdriverIO configuration {@link defineWdioObsidianConfig} returns. Every field is plain data, so a project
117
+ * changes any of them by spreading the result: `{ ...defineWdioObsidianConfig(), logLevel: 'info' }`.
118
+ */
119
+ export interface WdioObsidianConfig {
120
+ /**
121
+ * Where Obsidian versions are downloaded.
122
+ */
123
+ cacheDir: string;
124
+ /**
125
+ * One capability per Obsidian version.
126
+ */
127
+ capabilities: WdioObsidianCapability[];
128
+ /**
129
+ * The test framework.
130
+ */
131
+ framework: 'mocha';
132
+ /**
133
+ * WebdriverIO's log level.
134
+ */
135
+ logLevel: 'debug' | 'error' | 'info' | 'silent' | 'trace' | 'warn';
136
+ /**
137
+ * How many Obsidian instances run in parallel.
138
+ */
139
+ maxInstances?: number;
140
+ /**
141
+ * Mocha's options.
142
+ */
143
+ mochaOpts: WdioObsidianMochaOptions;
144
+ /**
145
+ * The reporters. `obsidian` is the spec reporter, naming the Obsidian version instead of Chromium's.
146
+ */
147
+ reporters: string[];
148
+ /**
149
+ * Where the specs run.
150
+ */
151
+ runner: 'local';
152
+ /**
153
+ * The services. `obsidian` is `wdio-obsidian-service`.
154
+ */
155
+ services: string[];
156
+ /**
157
+ * The spec files.
158
+ */
159
+ specs: string[];
160
+ }
161
+ /**
162
+ * The `mochaOpts` of a {@link WdioObsidianConfig}.
163
+ */
164
+ export interface WdioObsidianMochaOptions {
165
+ /**
166
+ * The per-test timeout, in milliseconds.
167
+ */
168
+ readonly timeout: number;
169
+ /**
170
+ * The interface the specs are written in.
171
+ */
172
+ readonly ui: 'bdd';
173
+ }
174
+ /**
175
+ * Builds the WebdriverIO configuration for end-to-end tests with `wdio-obsidian-service`, derived from the plugin's
176
+ * layout: the production build in `dist/build` is the plugin under test, the demo vault (when there is one) is the
177
+ * vault, and the specs live in `e2e/`.
178
+ *
179
+ * `wdio.conf.mts`:
180
+ *
181
+ * ```ts
182
+ * import { defineWdioObsidianConfig } from '@mnaoumov/obsidian-dev-toolkit/test-runners/wdio-obsidian';
183
+ *
184
+ * export const config: WebdriverIO.Config = defineWdioObsidianConfig({ appVersions: ['earliest', 'latest'] });
185
+ * ```
186
+ *
187
+ * @param options - The {@link DefineWdioObsidianConfigOptions}.
188
+ * @returns The configuration, to export as `config`.
189
+ */
190
+ export declare function defineWdioObsidianConfig(options?: DefineWdioObsidianConfigOptions): WdioObsidianConfig;
191
+ /**
192
+ * Runs the end-to-end tests with `wdio-obsidian-service`: the production build, then `wdio run <config>`. It is the
193
+ * body of a plugin's `test:e2e` script.
194
+ *
195
+ * @param options - The {@link TestEndToEndWithWdioObsidianOptions}.
196
+ * @returns A {@link Promise} that resolves once the tests pass.
197
+ * @throws When a package is missing, no config file is found, the build fails or a test fails.
198
+ */
199
+ export declare function testEndToEndWithWdioObsidian(options?: TestEndToEndWithWdioObsidianOptions): Promise<void>;
@@ -8,27 +8,11 @@
8
8
  * in the correct Obsidian folder for testing and use.
9
9
  */
10
10
  import type { Plugin } from 'esbuild';
11
+ import type { DeployToObsidianPluginsFolderParams } from '../obsidian-plugins-folder-deployment.mjs';
11
12
  /**
12
13
  * Parameters for {@link copyToObsidianPluginsFolderPlugin}.
13
14
  */
14
- export interface CopyToObsidianPluginsFolderPluginParams {
15
- /**
16
- * The folder where the built files are located.
17
- */
18
- readonly distFolder: string;
19
- /**
20
- * A boolean indicating whether the build is a production build.
21
- */
22
- readonly isProductionBuild: boolean;
23
- /**
24
- * The folder of the Obsidian configuration. If not provided, the plugin will not copy files.
25
- */
26
- readonly obsidianConfigFolder: string;
27
- /**
28
- * The name of the Obsidian plugin.
29
- */
30
- readonly pluginName: string;
31
- }
15
+ export type CopyToObsidianPluginsFolderPluginParams = DeployToObsidianPluginsFolderParams;
32
16
  /**
33
17
  * Creates an esbuild plugin that copies the build output to the Obsidian plugins folder.
34
18
  *
@@ -2,208 +2,19 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
- (function () {
6
- function ensureBrowserProcess() {
7
- const browserProcess = {
8
- browser: true,
9
- cwd() {
10
- return "/";
11
- },
12
- env: {},
13
- platform: "android"
14
- };
15
- const existingProcess = globalThis.process;
16
- if (!existingProcess) {
17
- globalThis.process = browserProcess;
18
- return;
19
- }
20
- if (existingProcess.versions?.node) {
21
- return;
22
- }
23
- const existingProcessRecord = existingProcess;
24
- for (const [key, value] of Object.entries(browserProcess)) {
25
- existingProcessRecord[key] ??= value;
26
- }
27
- existingProcessRecord["browser"] = true;
28
- }
29
-
30
- ensureBrowserProcess();
31
- })();
32
5
 
33
- import {
34
- invokeAsyncSafely,
35
- sleep
36
- } from "@mnaoumov/typescript-lib/async";
37
- import { getLibDebugger } from "@mnaoumov/typescript-lib/debug";
38
- import {
39
- dirname,
40
- join,
41
- toPosixPath
42
- } from "@mnaoumov/typescript-lib/path";
43
- import {
44
- cp,
45
- mkdir
46
- } from "node:fs/promises";
47
- import process from "node:process";
48
- import {
49
- createTransportFromOptions,
50
- DesktopCdpTransport,
51
- evalInObsidian
52
- } from "obsidian-integration-testing";
53
- const moduleState = {
54
- devInstanceTransportPromise: void 0,
55
- isDevInstanceCleanupRegistered: false,
56
- isDevInstanceDisposed: false
57
- };
58
- const DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS = 2e3;
59
- const DEV_INSTANCE_CLOSED_PROBE_COUNT = 3;
6
+ import { deployToObsidianPluginsFolder } from "../obsidian-plugins-folder-deployment.mjs";
60
7
  function copyToObsidianPluginsFolderPlugin(params) {
61
- const {
62
- distFolder,
63
- isProductionBuild,
64
- pluginName
65
- } = params;
66
- let {
67
- obsidianConfigFolder
68
- } = params;
69
8
  return {
70
9
  name: "copy-to-obsidian-plugins-folder",
71
10
  setup(build) {
72
11
  build.onEnd(async () => {
73
- if (isProductionBuild) {
74
- return;
75
- }
76
- if (!obsidianConfigFolder) {
77
- getLibDebugger("copyToObsidianPluginsFolderPlugin")(
78
- "No Obsidian config folder configured. `OBSIDIAN_CONFIG_FOLDER` environment variable is not set in system or in `.env` file. The compiled plugin will not be copied into Obsidian plugins folder."
79
- );
80
- return;
81
- }
82
- obsidianConfigFolder = toPosixPath(obsidianConfigFolder);
83
- const pluginFolder = join(obsidianConfigFolder, "plugins", pluginName);
84
- await mkdir(pluginFolder, { recursive: true });
85
- await cp(distFolder, pluginFolder, { recursive: true });
86
- await installAndEnableHotReload({
87
- obsidianConfigFolder,
88
- pluginName
89
- });
12
+ await deployToObsidianPluginsFolder(params);
90
13
  });
91
14
  }
92
15
  };
93
16
  }
94
- async function getOrLaunchDevInstance(vaultPath) {
95
- moduleState.devInstanceTransportPromise ??= launchDevInstance(vaultPath);
96
- try {
97
- return await moduleState.devInstanceTransportPromise;
98
- } catch (error) {
99
- moduleState.devInstanceTransportPromise = void 0;
100
- throw error;
101
- }
102
- }
103
- async function installAndEnableHotReload(params) {
104
- const {
105
- obsidianConfigFolder,
106
- pluginName
107
- } = params;
108
- const vaultPath = dirname(obsidianConfigFolder);
109
- const transport = await getOrLaunchDevInstance(vaultPath);
110
- await evalInObsidian({
111
- // eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
112
- async callback({ app, obsidianModule, pluginName: pluginName2 }) {
113
- const HOT_RELOAD_PLUGIN_ID = "hot-reload";
114
- const COMMUNITY_PLUGINS_REGISTRY_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";
115
- const { requestUrl } = obsidianModule;
116
- await app.plugins.setEnable(true);
117
- if (!Object.hasOwn(app.plugins.manifests, HOT_RELOAD_PLUGIN_ID)) {
118
- const registryResponse = await requestUrl(COMMUNITY_PLUGINS_REGISTRY_URL);
119
- const registryEntries = registryResponse.json;
120
- const entry = registryEntries.find((candidate) => candidate.id === HOT_RELOAD_PLUGIN_ID);
121
- if (!entry) {
122
- throw new Error(`Plugin '${HOT_RELOAD_PLUGIN_ID}' was not found in the Obsidian community plugins registry.`);
123
- }
124
- const latestReleaseResponse = await requestUrl(`https://api.github.com/repos/${entry.repo}/releases/latest`);
125
- const latestRelease = latestReleaseResponse.json;
126
- const version = latestRelease.tag_name;
127
- const manifestResponse = await requestUrl(`https://github.com/${entry.repo}/releases/download/${version}/manifest.json`);
128
- const manifest = manifestResponse.json;
129
- await app.plugins.installPlugin(entry.repo, version, manifest);
130
- }
131
- if (!Object.hasOwn(app.plugins.plugins, HOT_RELOAD_PLUGIN_ID)) {
132
- await app.plugins.enablePluginAndSave(HOT_RELOAD_PLUGIN_ID);
133
- }
134
- await app.plugins.enablePluginAndSave(pluginName2);
135
- },
136
- input: { pluginName },
137
- shouldSkipPreflightChecks: true,
138
- transport,
139
- vaultPath
140
- });
141
- }
142
- async function isDevInstanceRunning(cdpUrl) {
143
- try {
144
- const response = await fetch(`${cdpUrl}/json`);
145
- const targets = await response.json();
146
- return targets.some((target) => target.type === "page");
147
- } catch {
148
- return false;
149
- }
150
- }
151
- async function launchDevInstance(vaultPath) {
152
- const transport = await createTransportFromOptions();
153
- try {
154
- await transport.registerVault(vaultPath);
155
- } catch (error) {
156
- transport.disposeSync?.();
157
- throw error;
158
- }
159
- registerDevInstanceCleanup(transport);
160
- watchDevInstanceAndStopOnClose(transport);
161
- return transport;
162
- }
163
- function registerDevInstanceCleanup(transport) {
164
- if (moduleState.isDevInstanceCleanupRegistered) {
165
- return;
166
- }
167
- moduleState.isDevInstanceCleanupRegistered = true;
168
- process.on("exit", disposeDevInstance);
169
- for (const signal of ["SIGHUP", "SIGINT", "SIGTERM"]) {
170
- process.once(signal, () => {
171
- disposeDevInstance();
172
- process.exit();
173
- });
174
- }
175
- function disposeDevInstance() {
176
- if (moduleState.isDevInstanceDisposed) {
177
- return;
178
- }
179
- moduleState.isDevInstanceDisposed = true;
180
- transport.disposeSync?.();
181
- }
182
- }
183
- function watchDevInstanceAndStopOnClose(transport) {
184
- if (!(transport instanceof DesktopCdpTransport)) {
185
- return;
186
- }
187
- const endpoint = transport.getOwnedInstanceEndpoint();
188
- if (!endpoint) {
189
- return;
190
- }
191
- const cdpUrl = `http://${endpoint.host}:${String(endpoint.port)}`;
192
- invokeAsyncSafely(stopWhenDevInstanceCloses);
193
- async function stopWhenDevInstanceCloses() {
194
- let consecutiveFailedProbeCount = 0;
195
- while (consecutiveFailedProbeCount < DEV_INSTANCE_CLOSED_PROBE_COUNT) {
196
- await sleep({ milliseconds: DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS });
197
- if (moduleState.isDevInstanceDisposed) {
198
- return;
199
- }
200
- consecutiveFailedProbeCount = await isDevInstanceRunning(cdpUrl) ? 0 : consecutiveFailedProbeCount + 1;
201
- }
202
- console.warn("The Obsidian instance owned by `npm run dev` was closed. Stopping the development build.");
203
- process.exit();
204
- }
205
- }
206
17
  export {
207
18
  copyToObsidianPluginsFolderPlugin
208
19
  };
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9lc2J1aWxkLWltcGwvY29weS10by1vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1wbHVnaW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZXNidWlsZCBwbHVnaW4gdGhhdCBhdXRvbWF0aWNhbGx5IGNvcGllcyB0aGUgYnVpbGQgb3V0cHV0XG4gKiB0byB0aGUgT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIgZHVyaW5nIGRldmVsb3BtZW50LiBUaGlzIHBsdWdpbiBoZWxwcyBzdHJlYW1saW5lXG4gKiB0aGUgZGV2ZWxvcG1lbnQgd29ya2Zsb3cgYnkgZW5zdXJpbmcgdGhhdCB0aGUgbGF0ZXN0IGJ1aWxkIGlzIGFsd2F5cyBhdmFpbGFibGVcbiAqIGluIHRoZSBjb3JyZWN0IE9ic2lkaWFuIGZvbGRlciBmb3IgdGVzdGluZyBhbmQgdXNlLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBlc2J1aWxkIHBsdWdpbiB0aGF0IGNvcGllcyBidWlsZCBvdXRwdXQgdG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXI7IHJlcXVpcmVzIGEgbGl2ZSBlc2J1aWxkIGNvbnRleHQuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuXG5pbXBvcnQge1xuICBpbnZva2VBc3luY1NhZmVseSxcbiAgc2xlZXBcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7XG4gIGRpcm5hbWUsXG4gIGpvaW4sXG4gIHRvUG9zaXhQYXRoXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIGNwLFxuICBta2RpclxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyxcbiAgRGVza3RvcENkcFRyYW5zcG9ydCxcbiAgZXZhbEluT2JzaWRpYW5cbn0gZnJvbSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcHlUb09ic2lkaWFuUGx1Z2luc0ZvbGRlclBsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2hlcmUgdGhlIGJ1aWx0IGZpbGVzIGFyZSBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBidWlsZCBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi4gSWYgbm90IHByb3ZpZGVkLCB0aGUgcGx1Z2luIHdpbGwgbm90IGNvcHkgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYSBDRFAgdGFyZ2V0IGRlc2NyaXB0b3IgcmVhZCBmcm9tIHRoZSBvd25lZCBpbnN0YW5jZSdzIGAvanNvbmAgZW5kcG9pbnQuXG4gKi9cbmludGVyZmFjZSBDZHBUYXJnZXQge1xuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIHRhcmdldCwgZS5nLiBgcGFnZWAuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgZW50cnkgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeSAoYGNvbW11bml0eS1wbHVnaW5zLmpzb25gKS5cbiAqL1xuaW50ZXJmYWNlIENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnkge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgb3duZXIvbmFtZWAgR2l0SHViIHJlcG9zaXRvcnkgdGhlIHBsdWdpbiBpcyBwdWJsaXNoZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgR2l0SHViIHJlbGVhc2Ugd2UgcmVhZC5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2Uge1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgdGFnLCBhIGJhcmUgdmVyc2lvbiBzdWNoIGFzIGAxLjIuM2AuXG4gICAqL1xuICByZWFkb25seSB0YWdfbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuQ29uZmlnRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBidWlsdCBPYnNpZGlhbiBwbHVnaW4gdG8gZW5hYmxlIG9uY2UgSG90UmVsb2FkIGlzIGluIHBsYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vLyBUaGUgYG5wbSBydW4gZGV2YC1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZTogbGF1bmNoZWQgb24gdGhlIGZpcnN0IHJlYnVpbGQgYW5kIHJldXNlZCBhY3Jvc3MgcmVidWlsZHMuXG4vLyBJdHMgbGlmZXRpbWUgaXMgdGllZCB0byB0aGUgYG5wbSBydW4gZGV2YCBwcm9jZXNzIGluIEJPVEggZGlyZWN0aW9ucy5cbi8vIFRoZSBpbnN0YW5jZSBpcyBjbG9zZWQgd2hlbiB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzIChzZWUgYHJlZ2lzdGVyRGV2SW5zdGFuY2VDbGVhbnVwYCkuXG4vLyBUaGUgcHJvY2VzcyBzdG9wcyB3aGVuIHRoZSBpbnN0YW5jZSBpcyBjbG9zZWQgKHNlZSBgd2F0Y2hEZXZJbnN0YW5jZUFuZFN0b3BPbkNsb3NlYCkuXG4vKipcbk1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlLCBoZWxkIGluIG9uZSBvYmplY3Qgc28gZWFjaCBtdXRhdGlvbiBuYW1lcyBpdCBleHBsaWNpdGx5LlxuICovXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICBkZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHwgdW5kZWZpbmVkO1xuICBpc0Rldkluc3RhbmNlQ2xlYW51cFJlZ2lzdGVyZWQ6IGJvb2xlYW47XG4gIGlzRGV2SW5zdGFuY2VEaXNwb3NlZDogYm9vbGVhbjtcbn1cblxuY29uc3QgbW9kdWxlU3RhdGU6IE1vZHVsZVN0YXRlID0ge1xuICBkZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U6IHVuZGVmaW5lZCxcbiAgaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkOiBmYWxzZSxcbiAgaXNEZXZJbnN0YW5jZURpc3Bvc2VkOiBmYWxzZVxufTtcblxuLyoqXG4gKiBIb3cgb2Z0ZW4gdGhlIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGlzIHByb2JlZCB0byBkZXRlY3QgdGhhdCBpdCB3YXMgY2xvc2VkLlxuICovXG5jb25zdCBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcblxuLyoqXG4gKiBIb3cgbWFueSBjb25zZWN1dGl2ZSBmYWlsZWQgcHJvYmVzIGFyZSB0b2xlcmF0ZWQgYmVmb3JlIHRoZSBvd25lZCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGNsb3NlZC4gQVxuICogc2luZ2xlIGZhaWx1cmUgY2FuIGJlIGEgdHJhbnNpZW50IGhpY2N1cCAoYSBidXN5IHJlbmRlcmVyLCBhIG1vbWVudGFyaWx5IHJlZnVzZWQgY29ubmVjdGlvbiksIHNvIHRoZVxuICogZGV2ZWxvcG1lbnQgYnVpbGQgaXMgb25seSBzdG9wcGVkIG9uY2UgdGhlIGVuZHBvaW50IHN0YXlzIHVucmVhY2hhYmxlLlxuICovXG5jb25zdCBERVZfSU5TVEFOQ0VfQ0xPU0VEX1BST0JFX0NPVU5UID0gMztcbi8qKlxuICogQ3JlYXRlcyBhbiBlc2J1aWxkIHBsdWdpbiB0aGF0IGNvcGllcyB0aGUgYnVpbGQgb3V0cHV0IHRvIHRoZSBPYnNpZGlhbiBwbHVnaW5zIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEFuIGVzYnVpbGQgYFBsdWdpbmAgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luKHBhcmFtczogQ29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luUGFyYW1zKTogUGx1Z2luIHtcbiAgY29uc3Qge1xuICAgIGRpc3RGb2xkZXIsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuICBsZXQge1xuICAgIG9ic2lkaWFuQ29uZmlnRm9sZGVyXG4gIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2NvcHktdG8tb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXInLFxuICAgIHNldHVwKGJ1aWxkKTogdm9pZCB7XG4gICAgICBidWlsZC5vbkVuZChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2JzaWRpYW5Db25maWdGb2xkZXIpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luJykoXG4gICAgICAgICAgICAnTm8gT2JzaWRpYW4gY29uZmlnIGZvbGRlciBjb25maWd1cmVkLiBgT0JTSURJQU5fQ09ORklHX0ZPTERFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCBpbiBzeXN0ZW0gb3IgaW4gYC5lbnZgIGZpbGUuIFRoZSBjb21waWxlZCBwbHVnaW4gd2lsbCBub3QgYmUgY29waWVkIGludG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIuJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzaWRpYW5Db25maWdGb2xkZXIgPSB0b1Bvc2l4UGF0aChvYnNpZGlhbkNvbmZpZ0ZvbGRlcik7XG5cbiAgICAgICAgY29uc3QgcGx1Z2luRm9sZGVyID0gam9pbihvYnNpZGlhbkNvbmZpZ0ZvbGRlciwgJ3BsdWdpbnMnLCBwbHVnaW5OYW1lKTtcbiAgICAgICAgYXdhaXQgbWtkaXIocGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgY3AoZGlzdEZvbGRlciwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHtcbiAgICAgICAgICBvYnNpZGlhbkNvbmZpZ0ZvbGRlcixcbiAgICAgICAgICBwbHVnaW5OYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB2YXVsdCwgbGF1bmNoaW5nIGl0IG9uIGZpcnN0IHVzZSBhbmRcbiAqIHJldXNpbmcgaXQgb24gc3Vic2VxdWVudCByZWJ1aWxkcy5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlciB0byBvcGVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBvd25lZCB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnR9LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPckxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2UgPz89IGxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG1vZHVsZVN0YXRlLmRldkluc3RhbmNlVHJhbnNwb3J0UHJvbWlzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBDbGVhciB0aGUgY2FjaGUgc28gYSBsYXRlciByZWJ1aWxkIHJldHJpZXMgdGhlIGxhdW5jaC5cbiAgICBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgSG90UmVsb2FkIHBsdWdpbiBmcm9tIHRoZSBvZmZpY2lhbCBjb21tdW5pdHkgc3RvcmUgKGlmIG5vdCBhbHJlYWR5IGluc3RhbGxlZCksIGxvYWRzIGl0XG4gKiAoaWYgbm90IGFscmVhZHkgcnVubmluZyksIGFuZCBlbmFibGVzIHRoZSBmcmVzaGx5LWJ1aWx0IHBsdWdpbiDigJQgYWxsIHRocm91Z2ggdGhlIGBucG0gcnVuIGRldmAtb3duZWRcbiAqIE9ic2lkaWFuIGluc3RhbmNlLCBzbyBIb3RSZWxvYWQgdGhlbiBhdXRvLXJlZnJlc2hlcyB0aGUgZGVwbG95ZWQgcGx1Z2luIG9uIGV2ZXJ5IHJlYnVpbGQuXG4gKlxuICogVGhlIGluc3RhbGwgZ29lcyB0aHJvdWdoIE9ic2lkaWFuJ3Mgb3duIGBpbnN0YWxsUGx1Z2luYCAodGhlIGNvbW11bml0eS1zdG9yZSBtZWNoYW5pc20pLCBhbmQgZXZlcnkgc3RlcFxuICogcnVucyBhZ2FpbnN0IHRoZSBvd25lZCBpbnN0YW5jZSBvdmVyIENEUDsgYW55IGZhaWx1cmUgc3VyZmFjZXMgKHRoZSBkZXYgYnVpbGQgcmVwb3J0cyBpdCkgcmF0aGVyIHRoYW5cbiAqIGJlaW5nIHNpbGVudGx5IHN3YWxsb3dlZC5cbiAqXG4gKiBUaGUgZmlyc3Qgc3RlcCBpcyBsZWF2aW5nIHJlc3RyaWN0ZWQgbW9kZSBmb3IgcmVhbCwgd2hpY2ggdGhlIG93bmVkIGluc3RhbmNlIGhhcyBvbmx5IGZha2VkIHNvIGZhciDigJRcbiAqIHdpdGhvdXQgaXQgXCJlbmFibGVkXCIgYW5kIFwibG9hZGVkXCIgY29tZSBhcGFydCBhbmQgbm9uZSBvZiB0aGUgdmF1bHQncyBwbHVnaW5zLCBIb3RSZWxvYWQgaW5jbHVkZWQsIGFyZVxuICogcnVubmluZy4gU2VlIHRoZSBjb21tZW50IG9uIHRoZSBgc2V0RW5hYmxlYCBjYWxsLlxuICpcbiAqIFRoZSBpbnN0YWxsLWlmLW1pc3NpbmcgLyBlbmFibGUtaWYtZGlzYWJsZWQgbG9naWMgYmVsb3cgaW50ZW50aW9uYWxseSBtaXJyb3JzIHRoZSBwdWJsaWNcbiAqIGBpbnN0YWxsQ29tbXVuaXR5UGx1Z2luYCAvIGBlbmFibGVDb21tdW5pdHlQbHVnaW5gIGhlbHBlcnMgaW4gYHNyYy9vYnNpZGlhbi9jb21tdW5pdHktcGx1Z2lucy50c2AuIEl0XG4gKiBjYW5ub3QgaW1wb3J0IGFuZCBjYWxsIHRoZW06IHRoZSBgZm5gIGlzIHNlcmlhbGl6ZWQgKGB0b1N0cmluZygpYCkgYW5kIGV4ZWN1dGVkIGluIHRoZSByZW5kZXJlciwgYW5kXG4gKiB0aGlzIGJ1aWxkLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGlzIGJhcmUg4oCUIGl0IGhhcyBubyBkZXYtdXRpbHMgYGxpYmAgcHJvdmlkZXIgd2lyZWQgKHRoYXQgcmVzb2x2ZXIgaXNcbiAqIHJlZ2lzdGVyZWQgb25seSBpbiB0aGUgaW50ZWdyYXRpb24tdGVzdCBzZXR1cCwgd2hvc2UgZml4dHVyZSBwdWJsaXNoZXMgdGhlIG1lcmdlZCBzdXJmYWNlIG9uIGB3aW5kb3dgKSxcbiAqIHNvIHRoZSBjbG9zdXJlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIGxpYnJhcnkgc3VyZmFjZSBhbmQgbXVzdCBpbmxpbmUgdGhlIGVxdWl2YWxlbnQgc3RlcHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgSW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZFBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgSG90UmVsb2FkIGFuZCB0aGUgYnVpbHQgcGx1Z2luIGFyZSBpbnN0YWxsZWQgYW5kIGVuYWJsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWQocGFyYW1zOiBJbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBvYnNpZGlhbkNvbmZpZ0ZvbGRlcixcbiAgICBwbHVnaW5OYW1lXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHZhdWx0UGF0aCA9IGRpcm5hbWUob2JzaWRpYW5Db25maWdGb2xkZXIpO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBnZXRPckxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aCk7XG4gIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIE5vIGFjdHVhbCBzaGFkb3dpbmcgYXMgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGV4dGVybmFsbHkuXG4gICAgYXN5bmMgY2FsbGJhY2soeyBhcHAsIG9ic2lkaWFuTW9kdWxlLCBwbHVnaW5OYW1lIH0pIHtcbiAgICAgIGNvbnN0IEhPVF9SRUxPQURfUExVR0lOX0lEID0gJ2hvdC1yZWxvYWQnO1xuICAgICAgY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMID0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG4gICAgICBjb25zdCB7IHJlcXVlc3RVcmwgfSA9IG9ic2lkaWFuTW9kdWxlO1xuXG4gICAgICAvKlxuICAgICAgICogR2VudWluZWx5IGxlYXZlIHJlc3RyaWN0ZWQgbW9kZSBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcgZWxzZS4gVGhlIG93bmVkIGluc3RhbmNlIGJvb3RzIHdpdGggYVxuICAgICAgICogZnJlc2ggdXNlci1kYXRhIGRpciwgc28gT2JzaWRpYW4gc3RhcnRzIHJlc3RyaWN0ZWQgYW5kIGBQbHVnaW5zLmluaXRpYWxpemUoKWAgcmV0dXJucyBiZWZvcmVcbiAgICAgICAqIGxvYWRpbmcgYSBzaW5nbGUgcGx1Z2luLiBUaGUgaGFybmVzcyB0aGVuIGNsb3NlcyB0aGUgdHJ1c3QgbW9kYWwgYW5kIHdyaXRlcyB0aGVcbiAgICAgICAqIGBlbmFibGUtcGx1Z2luLTxhcHBJZD5gIGxvY2FsU3RvcmFnZSBmbGFnIGRpcmVjdGx5IOKAlCBkZWxpYmVyYXRlbHksIHRvIGF2b2lkIGEgc3luY2hyb25vdXMgbG9hZCDigJRcbiAgICAgICAqIHdoaWNoIGxlYXZlcyBgaXNFbmFibGVkKClgIHJlcG9ydGluZyBgdHJ1ZWAgb3ZlciBhIHZhdWx0IHdoZXJlIG5vdGhpbmcgaXMgYWN0dWFsbHkgcnVubmluZy4gRXZlcnlcbiAgICAgICAqIGBlbmFibGVkUGx1Z2luc2AgcmVhZGluZyBiZWxvdyAoYW5kIGluIHRoZSBtaXJyb3JlZCBgY29tbXVuaXR5LXBsdWdpbnMudHNgIGhlbHBlcnMpIHdvdWxkIGJlXG4gICAgICAgKiBhbnN3ZXJpbmcgYWJvdXQgdGhlIHZhdWx0J3MgY29uZmlnIGZpbGUgcmF0aGVyIHRoYW4gdGhpcyBpbnN0YW5jZS5cbiAgICAgICAqXG4gICAgICAgKiBgc2V0RW5hYmxlKHRydWUpYCBpcyB3aGF0IE9ic2lkaWFuJ3Mgb3duIFwiRXhpdCByZXN0cmljdGVkIG1vZGVcIiBidXR0b24gY2FsbHM6IGl0IHJlLWFzc2VydHMgdGhlXG4gICAgICAgKiBmbGFnIGFuZCBsb2FkcyBldmVyeXRoaW5nIGluIGBlbmFibGVkUGx1Z2luc2AuIFVuY29uZGl0aW9uYWwgb24gcHVycG9zZSDigJQgdGhlIGZsYWcgaXMgYWxyZWFkeVxuICAgICAgICogYHRydWVgLCBzbyBhbiBgaXNFbmFibGVkKClgIGd1YXJkIHdvdWxkIHNraXAgdGhlIGxvYWQgdGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQuIElkZW1wb3RlbnQgYW5kXG4gICAgICAgKiBlZmZlY3RpdmVseSBmcmVlIG9uY2Ugd2FybSAoYGxvYWRQbHVnaW5gIHJldHVybnMgdGhlIGxpdmUgaW5zdGFuY2UpLCBzbyByZS1ydW5uaW5nIGl0IG9uIGV2ZXJ5XG4gICAgICAgKiByZWJ1aWxkIGNvc3RzIG5vdGhpbmcuXG4gICAgICAgKi9cbiAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcblxuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLm1hbmlmZXN0cywgSE9UX1JFTE9BRF9QTFVHSU5fSUQpKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5UmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5RW50cmllcyA9IHJlZ2lzdHJ5UmVzcG9uc2UuanNvbiBhcyBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W107XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gcmVnaXN0cnlFbnRyaWVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSBIT1RfUkVMT0FEX1BMVUdJTl9JRCk7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtIT1RfUkVMT0FEX1BMVUdJTl9JRH0nIHdhcyBub3QgZm91bmQgaW4gdGhlIE9ic2lkaWFuIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGF0ZXN0UmVsZWFzZVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke2VudHJ5LnJlcG99L3JlbGVhc2VzL2xhdGVzdGApO1xuICAgICAgICBjb25zdCBsYXRlc3RSZWxlYXNlID0gbGF0ZXN0UmVsZWFzZVJlc3BvbnNlLmpzb24gYXMgR2l0SHViUmVsZWFzZTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGxhdGVzdFJlbGVhc2UudGFnX25hbWU7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0UmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKGBodHRwczovL2dpdGh1Yi5jb20vJHtlbnRyeS5yZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259L21hbmlmZXN0Lmpzb25gKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBtYW5pZmVzdFJlc3BvbnNlLmpzb24gYXMgUGx1Z2luTWFuaWZlc3Q7XG4gICAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLmluc3RhbGxQbHVnaW4oZW50cnkucmVwbywgdmVyc2lvbiwgbWFuaWZlc3QpO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICogQXNrIHdoZXRoZXIgSG90UmVsb2FkIGlzIFJVTk5JTkcsIG5vdCB3aGV0aGVyIHRoZSB2YXVsdCBjb25maWcgbGlzdHMgaXQgYXMgZW5hYmxlZC4gQWZ0ZXIgdGhlXG4gICAgICAgKiBgc2V0RW5hYmxlYCBhYm92ZSB0aGUgdHdvIG5vcm1hbGx5IGFncmVlLCBidXQgYSBIb3RSZWxvYWQgdGhhdCBpcyBsaXN0ZWQgYW5kIGZhaWxlZCB0byBsb2FkIHdvdWxkXG4gICAgICAgKiBwYXNzIGFuIGBlbmFibGVkUGx1Z2luc2AgY2hlY2sgd2hpbGUgbGVhdmluZyB0aGUgZGV2IGJ1aWxkIHdpdGhvdXQgYXV0by1yZWZyZXNoLlxuICAgICAgICovXG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oYXBwLnBsdWdpbnMucGx1Z2lucywgSE9UX1JFTE9BRF9QTFVHSU5fSUQpKSB7XG4gICAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbkFuZFNhdmUoSE9UX1JFTE9BRF9QTFVHSU5fSUQpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKHBsdWdpbk5hbWUpO1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgcGx1Z2luTmFtZSB9LFxuICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9KTtcbn1cblxuLyoqXG4gKiBQcm9iZXMgdGhlIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlJ3MgQ0RQIGVuZHBvaW50IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHN0aWxsIHJ1bm5pbmcuXG4gKlxuICogQSBjbG9zZWQgaW5zdGFuY2Ugc3RvcHMgc2VydmluZyBDRFAgYWx0b2dldGhlciwgc28gYW4gdW5yZWFjaGFibGUgZW5kcG9pbnQg4oCUIG9yIG9uZSBsZWZ0IHdpdGggbm8gcGFnZVxuICogdGFyZ2V0cyB3aGlsZSB0aGUgYXBwIHRlYXJzIGl0c2VsZiBkb3duIOKAlCBtZWFucyB0aGUgaW5zdGFuY2UgaXMgZ29uZS5cbiAqXG4gKiBAcGFyYW0gY2RwVXJsIC0gVGhlIGJhc2UgQ0RQIFVSTCBvZiB0aGUgb3duZWQgaW5zdGFuY2UsIGUuZy4gYGh0dHA6Ly9sb2NhbGhvc3Q6NTE4ODhgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIGB0cnVlYCB3aGlsZSB0aGUgaW5zdGFuY2UgaXMgc3RpbGwgc2VydmluZyBhIHBhZ2UgdGFyZ2V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBpc0Rldkluc3RhbmNlUnVubmluZyhjZHBVcmw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gV2UgcnVuIHRoaXMgb3V0c2lkZSBvZiBPYnNpZGlhbiwgc28gd2UgZG9uJ3QgaGF2ZSBgcmVxdWVzdFVybCgpYC5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2NkcFVybH0vanNvbmApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2RwVGFyZ2V0W107XG4gICAgcmV0dXJuIHRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQudHlwZSA9PT0gJ3BhZ2UnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogTGF1bmNoZXMgYSBmcmVzaCBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSAoaXNvbGF0ZWQgdXNlci1kYXRhIGRpcikgYW5kIG9wZW5zIHRoZSBnaXZlbiB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlciB0byBvcGVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBsYXVuY2hlZCB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnR9LlxuICovXG5hc3luYyBmdW5jdGlvbiBsYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0cmFuc3BvcnQucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRyYW5zcG9ydC5kaXNwb3NlU3luYz8uKCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0KTtcbiAgd2F0Y2hEZXZJbnN0YW5jZUFuZFN0b3BPbkNsb3NlKHRyYW5zcG9ydCk7XG4gIHJldHVybiB0cmFuc3BvcnQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2Nlc3MtZXhpdCBhbmQgc2lnbmFsIGhhbmRsZXJzIChvbmNlKSB0aGF0IHN5bmNocm9ub3VzbHkgY2xvc2UgdGhlIG93bmVkIE9ic2lkaWFuXG4gKiBpbnN0YW5jZSB3aGVuIHRoZSBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcy5cbiAqXG4gKiBUaGVzZSBoYW5kbGVycyBjb3ZlciBhbiBvcmRlcmx5IHNodXRkb3duLiBBIGBTSUdLSUxMYCAob3IgYSBUYXNrIE1hbmFnZXIgLyBJREUgc3RvcCkgcnVucyBubyBoYW5kbGVyXG4gKiBhdCBhbGwsIGFuZCBubyBvcGVyYXRpbmcgc3lzdGVtIGtpbGxzIHRoZSBpbnN0YW5jZSBqdXN0IGZvciBiZWluZyBvdXIgY2hpbGQg4oCUIHNvIHRoYXQgY2FzZSBpcyBjYXVnaHRcbiAqIGZyb20gdGhlIG90aGVyIHNpZGUsIGJ5IHRoZSBoYXJuZXNzJ3MgcGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nOiB0aGUgaW5zdGFuY2UncyByZW5kZXJlciBob2xkcyBhIHNvY2tldFxuICogYmFjayB0byB0aGlzIHByb2Nlc3MgYW5kIGRlc3Ryb3lzIGl0cyB3aW5kb3cgd2hlbiB0aGUga2VybmVsIGNsb3NlcyBpdC4gU2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgIGluXG4gKiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSBvd25lZCB0cmFuc3BvcnQgdG8gZGlzcG9zZSBvbiBzaHV0ZG93bi5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gYGV4aXRgIGNvdmVycyBhbnkgYHByb2Nlc3MuZXhpdCgpYCwgYnV0IGEgZGVmYXVsdCBDdHJsK0MgdGVybWluYXRlcyBXSVRIT1VUIGZpcmluZyBgZXhpdGAsIHNvIHRoZSBzaWduYWwgaGFuZGxlcnMgZ3VhcmFudGVlIHRoZSBvd25lZCBPYnNpZGlhbiBpcyBraWxsZWQgb24gc2h1dGRvd24uXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCBkaXNwb3NlRGV2SW5zdGFuY2UpO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTSddIGFzIGNvbnN0KSB7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgZGlzcG9zZURldkluc3RhbmNlKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VEZXZJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VEaXNwb3NlZCA9IHRydWU7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoZXMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYW5kIHN0b3BzIHRoZSBkZXZlbG9wbWVudCBidWlsZCBvbmNlIHRoZSBpbnN0YW5jZSBpc1xuICogY2xvc2VkLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1pcnJvciBpbWFnZSBvZiB7QGxpbmsgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXB9OiB0aGF0IG9uZSBjbG9zZXMgdGhlIGluc3RhbmNlIHdoZW4gdGhlXG4gKiBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcywgdGhpcyBvbmUgdGVybWluYXRlcyB0aGUgcHJvY2VzcyB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgaW5zdGFuY2UsIHNvXG4gKiB0aGUgdHdvIG5ldmVyIG91dGxpdmUgZWFjaCBvdGhlci4gQSBidWlsZCB3YXRjaGluZyBhbiBPYnNpZGlhbiB0aGF0IGlzIG5vIGxvbmdlciBydW5uaW5nIGhhcyBub3RoaW5nXG4gKiBsZWZ0IHRvIGRlcGxveSB0by5cbiAqXG4gKiBPbmx5IGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSBpcyB3YXRjaGVkLiBXaGVuIHRoZSB0cmFuc3BvcnQgYXR0YWNoZXMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuXG4gKiAodGhlIHVzZXIncyBvd24pLCB0aGF0IGluc3RhbmNlIGlzIG5vdCBvdXJzIHRvIGJlIHRpZWQgdG8gYW5kIGNsb3NpbmcgaXQgbGVhdmVzIHRoZSBidWlsZCBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgb3duZWQgdHJhbnNwb3J0IHdob3NlIGluc3RhbmNlIHRvIHdhdGNoLlxuICovXG5mdW5jdGlvbiB3YXRjaERldkluc3RhbmNlQW5kU3RvcE9uQ2xvc2UodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAoISh0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2VuZHBvaW50Lmhvc3R9OiR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWA7XG4gIGludm9rZUFzeW5jU2FmZWx5KHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA9IDA7XG4gICAgd2hpbGUgKGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA8IERFVl9JTlNUQU5DRV9DTE9TRURfUFJPQkVfQ09VTlQpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTIH0pO1xuXG4gICAgICAvLyBUaGUgcHJvY2VzcyBpcyBhbHJlYWR5IHNodXR0aW5nIGRvd24gYW5kIGtpbGxlZCB0aGUgaW5zdGFuY2UgaXRzZWxmOyB0aGUgcHJvYmVzIHdvdWxkIGp1c3QgcmFjZSB0aGUgdGVhcmRvd24uXG4gICAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc2VjdXRpdmVGYWlsZWRQcm9iZUNvdW50ID0gYXdhaXQgaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsKSA/IDAgOiBjb25zZWN1dGl2ZUZhaWxlZFByb2JlQ291bnQgKyAxO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybignVGhlIE9ic2lkaWFuIGluc3RhbmNlIG93bmVkIGJ5IGBucG0gcnVuIGRldmAgd2FzIGNsb3NlZC4gU3RvcHBpbmcgdGhlIGRldmVsb3BtZW50IGJ1aWxkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sYUFBYTtBQUNwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUEwRlAsTUFBTSxjQUEyQjtBQUFBLEVBQy9CLDZCQUE2QjtBQUFBLEVBQzdCLGdDQUFnQztBQUFBLEVBQ2hDLHVCQUF1QjtBQUN6QjtBQUtBLE1BQU0sOENBQThDO0FBT3BELE1BQU0sa0NBQWtDO0FBT2pDLFNBQVMsa0NBQWtDLFFBQXlEO0FBQ3pHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJO0FBQUEsSUFDRjtBQUFBLEVBQ0YsSUFBSTtBQUNKLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLE1BQU0sT0FBYTtBQUNqQixZQUFNLE1BQU0sWUFBWTtBQUN0QixZQUFJLG1CQUFtQjtBQUNyQjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLENBQUMsc0JBQXNCO0FBQ3pCLHlCQUFlLG1DQUFtQztBQUFBLFlBQ2hEO0FBQUEsVUFDRjtBQUNBO0FBQUEsUUFDRjtBQUVBLCtC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
20
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jb3B5LXRvLW9ic2lkaWFuLXBsdWdpbnMtZm9sZGVyLXBsdWdpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZXNidWlsZCBwbHVnaW4gdGhhdCBhdXRvbWF0aWNhbGx5IGNvcGllcyB0aGUgYnVpbGQgb3V0cHV0XG4gKiB0byB0aGUgT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIgZHVyaW5nIGRldmVsb3BtZW50LiBUaGlzIHBsdWdpbiBoZWxwcyBzdHJlYW1saW5lXG4gKiB0aGUgZGV2ZWxvcG1lbnQgd29ya2Zsb3cgYnkgZW5zdXJpbmcgdGhhdCB0aGUgbGF0ZXN0IGJ1aWxkIGlzIGFsd2F5cyBhdmFpbGFibGVcbiAqIGluIHRoZSBjb3JyZWN0IE9ic2lkaWFuIGZvbGRlciBmb3IgdGVzdGluZyBhbmQgdXNlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnZXNidWlsZCc7XG5cbmltcG9ydCB0eXBlIHsgRGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJQYXJhbXMgfSBmcm9tICcuLi9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzJztcblxuaW1wb3J0IHsgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIgfSBmcm9tICcuLi9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2lufS5cbiAqL1xuZXhwb3J0IHR5cGUgQ29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luUGFyYW1zID0gRGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJQYXJhbXM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlc2J1aWxkIHBsdWdpbiB0aGF0IGNvcGllcyB0aGUgYnVpbGQgb3V0cHV0IHRvIHRoZSBPYnNpZGlhbiBwbHVnaW5zIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEFuIGVzYnVpbGQgYFBsdWdpbmAgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luKHBhcmFtczogQ29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luUGFyYW1zKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnY29weS10by1vYnNpZGlhbi1wbHVnaW5zLWZvbGRlcicsXG4gICAgc2V0dXAoYnVpbGQpOiB2b2lkIHtcbiAgICAgIGJ1aWxkLm9uRW5kKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIocGFyYW1zKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBYUEsU0FBUyxxQ0FBcUM7QUFhdkMsU0FBUyxrQ0FBa0MsUUFBeUQ7QUFDekcsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sTUFBTSxPQUFhO0FBQ2pCLFlBQU0sTUFBTSxZQUFZO0FBQ3RCLGNBQU0sOEJBQThCLE1BQU07QUFBQSxNQUM1QyxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,60 @@
1
+ /// <reference path="../../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * What the {@link ObsidianPluginFeatureOptions} add to the esbuild build: the JSX runtime, the framework's
6
+ * compile-time constants, the `.wasm` loader, the Solid and Vue plugins, and the stylesheet options of the Sass plugin
7
+ * that loads every stylesheet.
8
+ */
9
+ import type { BuildOptions, Plugin } from 'esbuild';
10
+ import type { SassPluginOptions } from 'esbuild-sass-plugin';
11
+ import type { ObsidianPluginFeatureOptions } from '../obsidian-plugin-features.mjs';
12
+ /**
13
+ * The esbuild options of {@link getEsbuildFeatureBuildOptions}.
14
+ */
15
+ export type EsbuildFeatureBuildOptions = Pick<BuildOptions, 'define' | 'jsx' | 'jsxImportSource' | 'loader'>;
16
+ /**
17
+ * Parameters for {@link getEsbuildFeatureBuildOptions}.
18
+ */
19
+ export interface GetEsbuildFeatureBuildOptionsParams {
20
+ /**
21
+ * The build features.
22
+ */
23
+ readonly features: ObsidianPluginFeatureOptions;
24
+ /**
25
+ * Whether this is a production build.
26
+ */
27
+ readonly isProductionBuild: boolean;
28
+ }
29
+ /**
30
+ * Parameters for {@link getEsbuildFeaturePlugins}.
31
+ */
32
+ export type GetEsbuildFeaturePluginsParams = GetEsbuildFeatureBuildOptionsParams;
33
+ /**
34
+ * Parameters for {@link getSassPluginOptionsList}.
35
+ */
36
+ export type GetSassPluginOptionsListParams = GetEsbuildFeatureBuildOptionsParams;
37
+ /**
38
+ * Builds the esbuild options the features set: the automatic JSX runtime for React and Preact, the framework's
39
+ * compile-time constants, and the `binary` loader for `.wasm`.
40
+ *
41
+ * @param params - The {@link GetEsbuildFeatureBuildOptionsParams}.
42
+ * @returns The options, to merge under the consumer's own.
43
+ */
44
+ export declare function getEsbuildFeatureBuildOptions(params: GetEsbuildFeatureBuildOptionsParams): EsbuildFeatureBuildOptions;
45
+ /**
46
+ * Creates the esbuild plugins the framework needs: `unplugin-vue` for Vue, and the shared Solid transform for Solid.
47
+ *
48
+ * @param params - The {@link GetEsbuildFeaturePluginsParams}.
49
+ * @returns A {@link Promise} that resolves to the plugins, empty when the framework needs none.
50
+ */
51
+ export declare function getEsbuildFeaturePlugins(params: GetEsbuildFeaturePluginsParams): Promise<Plugin[]>;
52
+ /**
53
+ * Builds the option sets of the Sass plugin that loads every stylesheet: one for ordinary stylesheets, and with CSS
54
+ * modules on, one before it that loads `*.module.css` with esbuild's own `local-css` loader. Each runs the stylesheet
55
+ * through PostCSS and Tailwind when the options ask for it.
56
+ *
57
+ * @param params - The {@link GetSassPluginOptionsListParams}.
58
+ * @returns The option sets, in the order their plugins must be registered.
59
+ */
60
+ export declare function getSassPluginOptionsList(params: GetSassPluginOptionsListParams): SassPluginOptions[];
@@ -0,0 +1,82 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ import { readFile } from "node:fs/promises";
7
+ import {
8
+ getFrameworkDefines,
9
+ getJsxImportSource,
10
+ importOptionalPeer,
11
+ isPostcssNeeded
12
+ } from "../obsidian-plugin-features.mjs";
13
+ import {
14
+ appendInlineSourceMap,
15
+ transformCss,
16
+ transformSolid
17
+ } from "../obsidian-plugin-transforms.mjs";
18
+ const CSS_MODULE_FILTER = /\.module\.(?:css|s[ac]ss)$/i;
19
+ const SOLID_FILTER = /\.[jt]sx$/i;
20
+ function getEsbuildFeatureBuildOptions(params) {
21
+ const { features, isProductionBuild } = params;
22
+ const defines = getFrameworkDefines({ framework: features.framework, isProductionBuild });
23
+ const jsxImportSource = getJsxImportSource(features.framework);
24
+ return {
25
+ ...Object.keys(defines).length > 0 && { define: defines },
26
+ ...jsxImportSource !== void 0 && { jsx: "automatic", jsxImportSource },
27
+ ...features.wasm && { loader: { ".wasm": "binary" } }
28
+ };
29
+ }
30
+ async function getEsbuildFeaturePlugins(params) {
31
+ const { features, isProductionBuild } = params;
32
+ switch (features.framework) {
33
+ case "solid": {
34
+ return [solidEsbuildPlugin(isProductionBuild)];
35
+ }
36
+ case "vue": {
37
+ const unpluginVue = await importOptionalPeer({
38
+ feature: "framework: 'vue'",
39
+ packageName: "unplugin-vue",
40
+ specifier: "unplugin-vue/esbuild"
41
+ });
42
+ return [unpluginVue.default({ isProduction: isProductionBuild })];
43
+ }
44
+ default: {
45
+ return [];
46
+ }
47
+ }
48
+ }
49
+ function getSassPluginOptionsList(params) {
50
+ const { features, isProductionBuild } = params;
51
+ const styles = features.styles ?? {};
52
+ const baseOptions = {
53
+ sourceMap: !isProductionBuild,
54
+ ...isPostcssNeeded(styles) && {
55
+ async transform(css, _resolveDirectory, filePath) {
56
+ const result = await transformCss({ filePath, isCssModuleScoped: false, isProductionBuild, source: css, styles });
57
+ return result.css;
58
+ }
59
+ }
60
+ };
61
+ return styles.cssModules ? [{ ...baseOptions, filter: CSS_MODULE_FILTER, type: "local-css" }, baseOptions] : [baseOptions];
62
+ }
63
+ function solidEsbuildPlugin(isProductionBuild) {
64
+ return {
65
+ name: "obsidian-plugin-solid",
66
+ setup(build) {
67
+ build.onLoad({ filter: SOLID_FILTER }, async ({ path }) => {
68
+ const code = await readFile(path, "utf-8");
69
+ return {
70
+ contents: appendInlineSourceMap(await transformSolid({ code, filePath: path, isProductionBuild })),
71
+ loader: "js"
72
+ };
73
+ });
74
+ }
75
+ };
76
+ }
77
+ export {
78
+ getEsbuildFeatureBuildOptions,
79
+ getEsbuildFeaturePlugins,
80
+ getSassPluginOptionsList
81
+ };
82
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9mZWF0dXJlLW9wdGlvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBXaGF0IHRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9uc30gYWRkIHRvIHRoZSBlc2J1aWxkIGJ1aWxkOiB0aGUgSlNYIHJ1bnRpbWUsIHRoZSBmcmFtZXdvcmsnc1xuICogY29tcGlsZS10aW1lIGNvbnN0YW50cywgdGhlIGAud2FzbWAgbG9hZGVyLCB0aGUgU29saWQgYW5kIFZ1ZSBwbHVnaW5zLCBhbmQgdGhlIHN0eWxlc2hlZXQgb3B0aW9ucyBvZiB0aGUgU2FzcyBwbHVnaW5cbiAqIHRoYXQgbG9hZHMgZXZlcnkgc3R5bGVzaGVldC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEJ1aWxkT3B0aW9ucyxcbiAgUGx1Z2luXG59IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHR5cGUgeyBTYXNzUGx1Z2luT3B0aW9ucyB9IGZyb20gJ2VzYnVpbGQtc2Fzcy1wbHVnaW4nO1xuXG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMgfSBmcm9tICcuLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuXG5pbXBvcnQge1xuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBnZXRKc3hJbXBvcnRTb3VyY2UsXG4gIGltcG9ydE9wdGlvbmFsUGVlcixcbiAgaXNQb3N0Y3NzTmVlZGVkXG59IGZyb20gJy4uL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5pbXBvcnQge1xuICBhcHBlbmRJbmxpbmVTb3VyY2VNYXAsXG4gIHRyYW5zZm9ybUNzcyxcbiAgdHJhbnNmb3JtU29saWRcbn0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMudHMnO1xuXG4vKipcbiAqIFRoZSBlc2J1aWxkIG9wdGlvbnMgb2Yge0BsaW5rIGdldEVzYnVpbGRGZWF0dXJlQnVpbGRPcHRpb25zfS5cbiAqL1xuZXhwb3J0IHR5cGUgRXNidWlsZEZlYXR1cmVCdWlsZE9wdGlvbnMgPSBQaWNrPEJ1aWxkT3B0aW9ucywgJ2RlZmluZScgfCAnanN4JyB8ICdqc3hJbXBvcnRTb3VyY2UnIHwgJ2xvYWRlcic+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRFc2J1aWxkRmVhdHVyZUJ1aWxkT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RXNidWlsZEZlYXR1cmVCdWlsZE9wdGlvbnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJ1aWxkIGZlYXR1cmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM6IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0RXNidWlsZEZlYXR1cmVQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0RXNidWlsZEZlYXR1cmVQbHVnaW5zUGFyYW1zID0gR2V0RXNidWlsZEZlYXR1cmVCdWlsZE9wdGlvbnNQYXJhbXM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFNhc3NQbHVnaW5PcHRpb25zTGlzdH0uXG4gKi9cbmV4cG9ydCB0eXBlIEdldFNhc3NQbHVnaW5PcHRpb25zTGlzdFBhcmFtcyA9IEdldEVzYnVpbGRGZWF0dXJlQnVpbGRPcHRpb25zUGFyYW1zO1xuXG5pbnRlcmZhY2UgVW5wbHVnaW5WdWVFc2J1aWxkTW9kdWxlIHtcbiAgcmVhZG9ubHkgZGVmYXVsdDogKG9wdGlvbnM/OiBvYmplY3QpID0+IFBsdWdpbjtcbn1cblxuLy8gRXNidWlsZCdzIGZpbHRlcnMgYXJlIEdvIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHdoaWNoIHRha2Ugbm8gYHVgIGZsYWcuXG5jb25zdCBDU1NfTU9EVUxFX0ZJTFRFUiA9IC9cXC5tb2R1bGVcXC4oPzpjc3N8c1thY11zcykkL2k7XG5jb25zdCBTT0xJRF9GSUxURVIgPSAvXFwuW2p0XXN4JC9pO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXNidWlsZCBvcHRpb25zIHRoZSBmZWF0dXJlcyBzZXQ6IHRoZSBhdXRvbWF0aWMgSlNYIHJ1bnRpbWUgZm9yIFJlYWN0IGFuZCBQcmVhY3QsIHRoZSBmcmFtZXdvcmsnc1xuICogY29tcGlsZS10aW1lIGNvbnN0YW50cywgYW5kIHRoZSBgYmluYXJ5YCBsb2FkZXIgZm9yIGAud2FzbWAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0RXNidWlsZEZlYXR1cmVCdWlsZE9wdGlvbnNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG9wdGlvbnMsIHRvIG1lcmdlIHVuZGVyIHRoZSBjb25zdW1lcidzIG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVzYnVpbGRGZWF0dXJlQnVpbGRPcHRpb25zKHBhcmFtczogR2V0RXNidWlsZEZlYXR1cmVCdWlsZE9wdGlvbnNQYXJhbXMpOiBFc2J1aWxkRmVhdHVyZUJ1aWxkT3B0aW9ucyB7XG4gIGNvbnN0IHsgZmVhdHVyZXMsIGlzUHJvZHVjdGlvbkJ1aWxkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGRlZmluZXMgPSBnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBmZWF0dXJlcy5mcmFtZXdvcmssIGlzUHJvZHVjdGlvbkJ1aWxkIH0pO1xuICBjb25zdCBqc3hJbXBvcnRTb3VyY2UgPSBnZXRKc3hJbXBvcnRTb3VyY2UoZmVhdHVyZXMuZnJhbWV3b3JrKTtcbiAgcmV0dXJuIHtcbiAgICAuLi4oT2JqZWN0LmtleXMoZGVmaW5lcykubGVuZ3RoID4gMCAmJiB7IGRlZmluZTogZGVmaW5lcyB9KSxcbiAgICAuLi4oanN4SW1wb3J0U291cmNlICE9PSB1bmRlZmluZWQgJiYgeyBqc3g6ICdhdXRvbWF0aWMnLCBqc3hJbXBvcnRTb3VyY2UgfSksXG4gICAgLi4uKGZlYXR1cmVzLndhc20gJiYgeyBsb2FkZXI6IHsgJy53YXNtJzogJ2JpbmFyeScgfSB9KVxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGVzYnVpbGQgcGx1Z2lucyB0aGUgZnJhbWV3b3JrIG5lZWRzOiBgdW5wbHVnaW4tdnVlYCBmb3IgVnVlLCBhbmQgdGhlIHNoYXJlZCBTb2xpZCB0cmFuc2Zvcm0gZm9yIFNvbGlkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldEVzYnVpbGRGZWF0dXJlUGx1Z2luc1BhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBwbHVnaW5zLCBlbXB0eSB3aGVuIHRoZSBmcmFtZXdvcmsgbmVlZHMgbm9uZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEVzYnVpbGRGZWF0dXJlUGx1Z2lucyhwYXJhbXM6IEdldEVzYnVpbGRGZWF0dXJlUGx1Z2luc1BhcmFtcyk6IFByb21pc2U8UGx1Z2luW10+IHtcbiAgY29uc3QgeyBmZWF0dXJlcywgaXNQcm9kdWN0aW9uQnVpbGQgfSA9IHBhcmFtcztcbiAgc3dpdGNoIChmZWF0dXJlcy5mcmFtZXdvcmspIHtcbiAgICBjYXNlICdzb2xpZCc6IHtcbiAgICAgIHJldHVybiBbc29saWRFc2J1aWxkUGx1Z2luKGlzUHJvZHVjdGlvbkJ1aWxkKV07XG4gICAgfVxuICAgIGNhc2UgJ3Z1ZSc6IHtcbiAgICAgIGNvbnN0IHVucGx1Z2luVnVlID0gYXdhaXQgaW1wb3J0T3B0aW9uYWxQZWVyPFVucGx1Z2luVnVlRXNidWlsZE1vZHVsZT4oe1xuICAgICAgICBmZWF0dXJlOiAnZnJhbWV3b3JrOiBcXCd2dWVcXCcnLFxuICAgICAgICBwYWNrYWdlTmFtZTogJ3VucGx1Z2luLXZ1ZScsXG4gICAgICAgIHNwZWNpZmllcjogJ3VucGx1Z2luLXZ1ZS9lc2J1aWxkJ1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW3VucGx1Z2luVnVlLmRlZmF1bHQoeyBpc1Byb2R1Y3Rpb246IGlzUHJvZHVjdGlvbkJ1aWxkIH0pXTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgb3B0aW9uIHNldHMgb2YgdGhlIFNhc3MgcGx1Z2luIHRoYXQgbG9hZHMgZXZlcnkgc3R5bGVzaGVldDogb25lIGZvciBvcmRpbmFyeSBzdHlsZXNoZWV0cywgYW5kIHdpdGggQ1NTXG4gKiBtb2R1bGVzIG9uLCBvbmUgYmVmb3JlIGl0IHRoYXQgbG9hZHMgYCoubW9kdWxlLmNzc2Agd2l0aCBlc2J1aWxkJ3Mgb3duIGBsb2NhbC1jc3NgIGxvYWRlci4gRWFjaCBydW5zIHRoZSBzdHlsZXNoZWV0XG4gKiB0aHJvdWdoIFBvc3RDU1MgYW5kIFRhaWx3aW5kIHdoZW4gdGhlIG9wdGlvbnMgYXNrIGZvciBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRTYXNzUGx1Z2luT3B0aW9uc0xpc3RQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG9wdGlvbiBzZXRzLCBpbiB0aGUgb3JkZXIgdGhlaXIgcGx1Z2lucyBtdXN0IGJlIHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYXNzUGx1Z2luT3B0aW9uc0xpc3QocGFyYW1zOiBHZXRTYXNzUGx1Z2luT3B0aW9uc0xpc3RQYXJhbXMpOiBTYXNzUGx1Z2luT3B0aW9uc1tdIHtcbiAgY29uc3QgeyBmZWF0dXJlcywgaXNQcm9kdWN0aW9uQnVpbGQgfSA9IHBhcmFtcztcbiAgY29uc3Qgc3R5bGVzID0gZmVhdHVyZXMuc3R5bGVzID8/IHt9O1xuICBjb25zdCBiYXNlT3B0aW9uczogU2Fzc1BsdWdpbk9wdGlvbnMgPSB7XG4gICAgc291cmNlTWFwOiAhaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgLi4uKGlzUG9zdGNzc05lZWRlZChzdHlsZXMpICYmIHtcbiAgICAgIGFzeW5jIHRyYW5zZm9ybShjc3M6IHN0cmluZywgX3Jlc29sdmVEaXJlY3Rvcnk6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybUNzcyh7IGZpbGVQYXRoLCBpc0Nzc01vZHVsZVNjb3BlZDogZmFsc2UsIGlzUHJvZHVjdGlvbkJ1aWxkLCBzb3VyY2U6IGNzcywgc3R5bGVzIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0LmNzcztcbiAgICAgIH1cbiAgICB9KVxuICB9O1xuXG4gIHJldHVybiBzdHlsZXMuY3NzTW9kdWxlcyA/IFt7IC4uLmJhc2VPcHRpb25zLCBmaWx0ZXI6IENTU19NT0RVTEVfRklMVEVSLCB0eXBlOiAnbG9jYWwtY3NzJyB9LCBiYXNlT3B0aW9uc10gOiBbYmFzZU9wdGlvbnNdO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gQW4gZXNidWlsZCBwbHVnaW47IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0IGFnYWluc3QgYSByZWFsIGVzYnVpbGQgYnVpbGQuICovXG5mdW5jdGlvbiBzb2xpZEVzYnVpbGRQbHVnaW4oaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW4pOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdvYnNpZGlhbi1wbHVnaW4tc29saWQnLFxuICAgIHNldHVwKGJ1aWxkKTogdm9pZCB7XG4gICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IFNPTElEX0ZJTFRFUiB9LCBhc3luYyAoeyBwYXRoIH0pID0+IHtcbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IHJlYWRGaWxlKHBhdGgsICd1dGYtOCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnRzOiBhcHBlbmRJbmxpbmVTb3VyY2VNYXAoYXdhaXQgdHJhbnNmb3JtU29saWQoeyBjb2RlLCBmaWxlUGF0aDogcGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSkpLFxuICAgICAgICAgIGxvYWRlcjogJ2pzJ1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBY0EsU0FBUyxnQkFBZ0I7QUFJekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXFDUCxNQUFNLG9CQUFvQjtBQUMxQixNQUFNLGVBQWU7QUFTZCxTQUFTLDhCQUE4QixRQUF5RTtBQUNySCxRQUFNLEVBQUUsVUFBVSxrQkFBa0IsSUFBSTtBQUN4QyxRQUFNLFVBQVUsb0JBQW9CLEVBQUUsV0FBVyxTQUFTLFdBQVcsa0JBQWtCLENBQUM7QUFDeEYsUUFBTSxrQkFBa0IsbUJBQW1CLFNBQVMsU0FBUztBQUM3RCxTQUFPO0FBQUEsSUFDTCxHQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUUsU0FBUyxLQUFLLEVBQUUsUUFBUSxRQUFRO0FBQUEsSUFDekQsR0FBSSxvQkFBb0IsVUFBYSxFQUFFLEtBQUssYUFBYSxnQkFBZ0I7QUFBQSxJQUN6RSxHQUFJLFNBQVMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLFNBQVMsRUFBRTtBQUFBLEVBQ3ZEO0FBQ0Y7QUFRQSxlQUFzQix5QkFBeUIsUUFBMkQ7QUFDeEcsUUFBTSxFQUFFLFVBQVUsa0JBQWtCLElBQUk7QUFDeEMsVUFBUSxTQUFTLFdBQVc7QUFBQSxJQUMxQixLQUFLLFNBQVM7QUFDWixhQUFPLENBQUMsbUJBQW1CLGlCQUFpQixDQUFDO0FBQUEsSUFDL0M7QUFBQSxJQUNBLEtBQUssT0FBTztBQUNWLFlBQU0sY0FBYyxNQUFNLG1CQUE2QztBQUFBLFFBQ3JFLFNBQVM7QUFBQSxRQUNULGFBQWE7QUFBQSxRQUNiLFdBQVc7QUFBQSxNQUNiLENBQUM7QUFDRCxhQUFPLENBQUMsWUFBWSxRQUFRLEVBQUUsY0FBYyxrQkFBa0IsQ0FBQyxDQUFDO0FBQUEsSUFDbEU7QUFBQSxJQUNBLFNBQVM7QUFDUCxhQUFPLENBQUM7QUFBQSxJQUNWO0FBQUEsRUFDRjtBQUNGO0FBVU8sU0FBUyx5QkFBeUIsUUFBNkQ7QUFDcEcsUUFBTSxFQUFFLFVBQVUsa0JBQWtCLElBQUk7QUFDeEMsUUFBTSxTQUFTLFNBQVMsVUFBVSxDQUFDO0FBQ25DLFFBQU0sY0FBaUM7QUFBQSxJQUNyQyxXQUFXLENBQUM7QUFBQSxJQUNaLEdBQUksZ0JBQWdCLE1BQU0sS0FBSztBQUFBLE1BQzdCLE1BQU0sVUFBVSxLQUFhLG1CQUEyQixVQUFtQztBQUN6RixjQUFNLFNBQVMsTUFBTSxhQUFhLEVBQUUsVUFBVSxtQkFBbUIsT0FBTyxtQkFBbUIsUUFBUSxLQUFLLE9BQU8sQ0FBQztBQUNoSCxlQUFPLE9BQU87QUFBQSxNQUNoQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxPQUFPLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxRQUFRLG1CQUFtQixNQUFNLFlBQVksR0FBRyxXQUFXLElBQUksQ0FBQyxXQUFXO0FBQzNIO0FBR0EsU0FBUyxtQkFBbUIsbUJBQW9DO0FBQzlELFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLE1BQU0sT0FBYTtBQUNqQixZQUFNLE9BQU8sRUFBRSxRQUFRLGFBQWEsR0FBRyxPQUFPLEVBQUUsS0FBSyxNQUFNO0FBQ3pELGNBQU0sT0FBTyxNQUFNLFNBQVMsTUFBTSxPQUFPO0FBQ3pDLGVBQU87QUFBQSxVQUNMLFVBQVUsc0JBQXNCLE1BQU0sZUFBZSxFQUFFLE1BQU0sVUFBVSxNQUFNLGtCQUFrQixDQUFDLENBQUM7QUFBQSxVQUNqRyxRQUFRO0FBQUEsUUFDVjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../../library-references.d.mts" />
2
2
  export * as 'copy-to-obsidian-plugins-folder-plugin' from './copy-to-obsidian-plugins-folder-plugin.mjs';
3
3
  export * as 'dependency' from './dependency.mjs';
4
+ export * as 'feature-options' from './feature-options.mjs';
4
5
  export * as 'fix-source-maps-plugin' from './fix-source-maps-plugin.mjs';
5
6
  export * as 'obsidian-plugin-builder' from './obsidian-plugin-builder.mjs';
6
7
  export * as 'preprocess-plugin' from './preprocess-plugin.mjs';