@mnaoumov/obsidian-dev-toolkit 0.0.0 → 1.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 (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -1
  3. package/bundlers/esbuild/package.json +6 -0
  4. package/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin/package.json +6 -0
  5. package/bundlers/esbuild-impl/dependency/package.json +6 -0
  6. package/bundlers/esbuild-impl/fix-source-maps-plugin/package.json +6 -0
  7. package/bundlers/esbuild-impl/index/package.json +6 -0
  8. package/bundlers/esbuild-impl/obsidian-plugin-builder/package.json +6 -0
  9. package/bundlers/esbuild-impl/package.json +6 -0
  10. package/bundlers/esbuild-impl/preprocess-plugin/package.json +6 -0
  11. package/bundlers/esbuild-impl/rename-css-plugin/package.json +6 -0
  12. package/bundlers/index/package.json +6 -0
  13. package/bundlers/package.json +6 -0
  14. package/dist/demo-vault-helper/main.js +782 -0
  15. package/dist/demo-vault-helper/manifest.json +9 -0
  16. package/dist/integration-test-plugin/main.js +45388 -0
  17. package/dist/integration-test-plugin/manifest.json +8 -0
  18. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +335 -0
  19. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +38 -0
  20. package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +253 -0
  21. package/dist/lib/cjs/bundlers/esbuild-impl/dependency.d.cts +20 -0
  22. package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +226 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +34 -0
  24. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +192 -0
  25. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +7 -0
  26. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +375 -0
  27. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +98 -0
  28. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +247 -0
  29. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +30 -0
  30. package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +184 -0
  31. package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.d.cts +14 -0
  32. package/dist/lib/cjs/bundlers/esbuild.cjs +177 -0
  33. package/dist/lib/cjs/bundlers/esbuild.d.cts +11 -0
  34. package/dist/lib/cjs/bundlers/index.cjs +180 -0
  35. package/dist/lib/cjs/bundlers/index.d.cts +3 -0
  36. package/dist/lib/cjs/demo-vault-app-json.cjs +199 -0
  37. package/dist/lib/cjs/demo-vault-app-json.d.cts +93 -0
  38. package/dist/lib/cjs/demo-vault-buttons.cjs +580 -0
  39. package/dist/lib/cjs/demo-vault-buttons.d.cts +259 -0
  40. package/dist/lib/cjs/demo-vault-coverage.cjs +725 -0
  41. package/dist/lib/cjs/demo-vault-coverage.d.cts +533 -0
  42. package/dist/lib/cjs/demo-vault.cjs +309 -0
  43. package/dist/lib/cjs/demo-vault.d.cts +33 -0
  44. package/dist/lib/cjs/formatters/dprint.cjs +173 -0
  45. package/dist/lib/cjs/formatters/dprint.d.cts +15 -0
  46. package/dist/lib/cjs/formatters/index.cjs +177 -0
  47. package/dist/lib/cjs/formatters/index.d.cts +2 -0
  48. package/dist/lib/cjs/index.cjs +207 -0
  49. package/dist/lib/cjs/index.d.cts +16 -0
  50. package/dist/lib/cjs/integration-test-setup.cjs +142 -0
  51. package/dist/lib/cjs/integration-test-setup.d.cts +33 -0
  52. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +176 -0
  53. package/dist/lib/cjs/integration-test-vitest-global-setup.d.cts +39 -0
  54. package/dist/lib/cjs/jest-setup.cjs +147 -0
  55. package/dist/lib/cjs/jest-setup.d.cts +13 -0
  56. package/dist/lib/cjs/linters/eslint-config.cjs +365 -0
  57. package/dist/lib/cjs/linters/eslint-config.d.cts +25 -0
  58. package/dist/lib/cjs/linters/eslint-rules/index.cjs +201 -0
  59. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +10 -0
  60. package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +268 -0
  61. package/dist/lib/cjs/linters/eslint-rules/manifest-description.d.cts +54 -0
  62. package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +231 -0
  63. package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.d.cts +141 -0
  64. package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +228 -0
  65. package/dist/lib/cjs/linters/eslint-rules/manifest-id.d.cts +32 -0
  66. package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +229 -0
  67. package/dist/lib/cjs/linters/eslint-rules/manifest-name.d.cts +30 -0
  68. package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +329 -0
  69. package/dist/lib/cjs/linters/eslint-rules/manifest-schema.d.cts +45 -0
  70. package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +670 -0
  71. package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.cts +10 -0
  72. package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +260 -0
  73. package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.d.cts +10 -0
  74. package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +186 -0
  75. package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +13 -0
  76. package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +291 -0
  77. package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.d.cts +18 -0
  78. package/dist/lib/cjs/linters/eslint.cjs +173 -0
  79. package/dist/lib/cjs/linters/eslint.d.cts +15 -0
  80. package/dist/lib/cjs/linters/index.cjs +189 -0
  81. package/dist/lib/cjs/linters/index.d.cts +6 -0
  82. package/dist/lib/cjs/linters/markdownlint.cjs +173 -0
  83. package/dist/lib/cjs/linters/markdownlint.d.cts +15 -0
  84. package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +189 -0
  85. package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.d.cts +40 -0
  86. package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +229 -0
  87. package/dist/lib/cjs/obsidian-plugin-repo-paths.d.cts +253 -0
  88. package/dist/lib/cjs/setup.cjs +176 -0
  89. package/dist/lib/cjs/setup.d.cts +21 -0
  90. package/dist/lib/cjs/templates.cjs +185 -0
  91. package/dist/lib/cjs/templates.d.cts +13 -0
  92. package/dist/lib/cjs/test-runners/index.cjs +183 -0
  93. package/dist/lib/cjs/test-runners/index.d.cts +4 -0
  94. package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +224 -0
  95. package/dist/lib/cjs/test-runners/integration-test-plugin.d.cts +44 -0
  96. package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +170 -0
  97. package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +27 -0
  98. package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +230 -0
  99. package/dist/lib/cjs/test-runners/stale-build-global-setup.d.cts +86 -0
  100. package/dist/lib/cjs/test-runners/vitest-config.cjs +497 -0
  101. package/dist/lib/cjs/test-runners/vitest-config.d.cts +200 -0
  102. package/dist/lib/cjs/version.cjs +275 -0
  103. package/dist/lib/cjs/version.d.cts +92 -0
  104. package/dist/lib/cjs/vitest-setup.cjs +147 -0
  105. package/dist/lib/cjs/vitest-setup.d.cts +11 -0
  106. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +38 -0
  107. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +226 -0
  108. package/dist/lib/esm/bundlers/esbuild-impl/dependency.d.mts +20 -0
  109. package/dist/lib/esm/bundlers/esbuild-impl/dependency.mjs +138 -0
  110. package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +34 -0
  111. package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +116 -0
  112. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +7 -0
  113. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +64 -0
  114. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +98 -0
  115. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +255 -0
  116. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +30 -0
  117. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +134 -0
  118. package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.d.mts +14 -0
  119. package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.mjs +71 -0
  120. package/dist/lib/esm/bundlers/esbuild.d.mts +11 -0
  121. package/dist/lib/esm/bundlers/esbuild.mjs +66 -0
  122. package/dist/lib/esm/bundlers/index.d.mts +3 -0
  123. package/dist/lib/esm/bundlers/index.mjs +56 -0
  124. package/dist/lib/esm/demo-vault-app-json.d.mts +93 -0
  125. package/dist/lib/esm/demo-vault-app-json.mjs +83 -0
  126. package/dist/lib/esm/demo-vault-buttons.d.mts +259 -0
  127. package/dist/lib/esm/demo-vault-buttons.mjs +460 -0
  128. package/dist/lib/esm/demo-vault-coverage.d.mts +533 -0
  129. package/dist/lib/esm/demo-vault-coverage.mjs +626 -0
  130. package/dist/lib/esm/demo-vault.d.mts +33 -0
  131. package/dist/lib/esm/demo-vault.mjs +205 -0
  132. package/dist/lib/esm/formatters/dprint.d.mts +15 -0
  133. package/dist/lib/esm/formatters/dprint.mjs +60 -0
  134. package/dist/lib/esm/formatters/index.d.mts +2 -0
  135. package/dist/lib/esm/formatters/index.mjs +54 -0
  136. package/dist/lib/esm/index.d.mts +16 -0
  137. package/dist/lib/esm/index.mjs +74 -0
  138. package/dist/lib/esm/integration-test-setup.d.mts +33 -0
  139. package/dist/lib/esm/integration-test-setup.mjs +52 -0
  140. package/dist/lib/esm/integration-test-vitest-global-setup.d.mts +39 -0
  141. package/dist/lib/esm/integration-test-vitest-global-setup.mjs +65 -0
  142. package/dist/lib/esm/jest-setup.d.mts +13 -0
  143. package/dist/lib/esm/jest-setup.mjs +61 -0
  144. package/dist/lib/esm/linters/eslint-config.d.mts +25 -0
  145. package/dist/lib/esm/linters/eslint-config.mjs +247 -0
  146. package/dist/lib/esm/linters/eslint-rules/index.d.mts +10 -0
  147. package/dist/lib/esm/linters/eslint-rules/index.mjs +70 -0
  148. package/dist/lib/esm/linters/eslint-rules/manifest-description.d.mts +54 -0
  149. package/dist/lib/esm/linters/eslint-rules/manifest-description.mjs +154 -0
  150. package/dist/lib/esm/linters/eslint-rules/manifest-helpers.d.mts +141 -0
  151. package/dist/lib/esm/linters/eslint-rules/manifest-helpers.mjs +98 -0
  152. package/dist/lib/esm/linters/eslint-rules/manifest-id.d.mts +32 -0
  153. package/dist/lib/esm/linters/eslint-rules/manifest-id.mjs +117 -0
  154. package/dist/lib/esm/linters/eslint-rules/manifest-name.d.mts +30 -0
  155. package/dist/lib/esm/linters/eslint-rules/manifest-name.mjs +118 -0
  156. package/dist/lib/esm/linters/eslint-rules/manifest-schema.d.mts +45 -0
  157. package/dist/lib/esm/linters/eslint-rules/manifest-schema.mjs +220 -0
  158. package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.mts +10 -0
  159. package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +559 -0
  160. package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.d.mts +10 -0
  161. package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.mjs +146 -0
  162. package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.d.mts +13 -0
  163. package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +73 -0
  164. package/dist/lib/esm/linters/eslint-rules/require-component-suffix.d.mts +18 -0
  165. package/dist/lib/esm/linters/eslint-rules/require-component-suffix.mjs +175 -0
  166. package/dist/lib/esm/linters/eslint.d.mts +15 -0
  167. package/dist/lib/esm/linters/eslint.mjs +60 -0
  168. package/dist/lib/esm/linters/index.d.mts +6 -0
  169. package/dist/lib/esm/linters/index.mjs +62 -0
  170. package/dist/lib/esm/linters/markdownlint.d.mts +15 -0
  171. package/dist/lib/esm/linters/markdownlint.mjs +60 -0
  172. package/dist/lib/esm/linters/obsidianmd-rule-custom-message.d.mts +40 -0
  173. package/dist/lib/esm/linters/obsidianmd-rule-custom-message.mjs +75 -0
  174. package/dist/lib/esm/obsidian-plugin-repo-paths.d.mts +253 -0
  175. package/dist/lib/esm/obsidian-plugin-repo-paths.mjs +116 -0
  176. package/dist/lib/esm/setup.d.mts +21 -0
  177. package/dist/lib/esm/setup.mjs +63 -0
  178. package/dist/lib/esm/templates.d.mts +13 -0
  179. package/dist/lib/esm/templates.mjs +65 -0
  180. package/dist/lib/esm/test-runners/index.d.mts +4 -0
  181. package/dist/lib/esm/test-runners/index.mjs +58 -0
  182. package/dist/lib/esm/test-runners/integration-test-plugin.d.mts +44 -0
  183. package/dist/lib/esm/test-runners/integration-test-plugin.mjs +102 -0
  184. package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +27 -0
  185. package/dist/lib/esm/test-runners/performance-eval-cap.mjs +56 -0
  186. package/dist/lib/esm/test-runners/stale-build-global-setup.d.mts +86 -0
  187. package/dist/lib/esm/test-runners/stale-build-global-setup.mjs +123 -0
  188. package/dist/lib/esm/test-runners/vitest-config.d.mts +200 -0
  189. package/dist/lib/esm/test-runners/vitest-config.mjs +377 -0
  190. package/dist/lib/esm/version.d.mts +92 -0
  191. package/dist/lib/esm/version.mjs +168 -0
  192. package/dist/lib/esm/vitest-setup.d.mts +11 -0
  193. package/dist/lib/esm/vitest-setup.mjs +61 -0
  194. package/dist/templates/.markdownlint-cli2.mjs +4 -0
  195. package/dist/templates/.nano-staged.mjs +4 -0
  196. package/dist/templates/commitlint.config.ts +3 -0
  197. package/dist/templates/dprint.json +26 -0
  198. package/dist/templates/eslint.config.mts +3 -0
  199. package/dist/templates/scripts/build/build-clean.ts +4 -0
  200. package/dist/templates/scripts/build/build-compile-svelte.ts +4 -0
  201. package/dist/templates/scripts/build/build-compile-typescript.ts +4 -0
  202. package/dist/templates/scripts/build/build-compile.ts +4 -0
  203. package/dist/templates/scripts/build/build-templates.ts +4 -0
  204. package/dist/templates/scripts/bundlers/esbuild/build.ts +4 -0
  205. package/dist/templates/scripts/bundlers/esbuild/dev.ts +4 -0
  206. package/dist/templates/scripts/commitlint-config.ts +3 -0
  207. package/dist/templates/scripts/eslint-config.ts +10 -0
  208. package/dist/templates/scripts/formatters/dprint/format-check.ts +8 -0
  209. package/dist/templates/scripts/formatters/dprint/format.ts +8 -0
  210. package/dist/templates/scripts/gate/gate.ts +10 -0
  211. package/dist/templates/scripts/linters/cspell/spellcheck.ts +8 -0
  212. package/dist/templates/scripts/linters/eslint/lint-fix.ts +8 -0
  213. package/dist/templates/scripts/linters/eslint/lint.ts +8 -0
  214. package/dist/templates/scripts/linters/markdownlint/lint-md-fix.ts +8 -0
  215. package/dist/templates/scripts/linters/markdownlint/lint-md.ts +8 -0
  216. package/dist/templates/scripts/linters/over-exposure/find-overexposed-fix.ts +25 -0
  217. package/dist/templates/scripts/linters/over-exposure/find-overexposed.ts +15 -0
  218. package/dist/templates/scripts/markdownlint-cli2-config.ts +3 -0
  219. package/dist/templates/scripts/nano-staged-config.ts +3 -0
  220. package/dist/templates/scripts/test-runners/vitest/test-coverage.ts +4 -0
  221. package/dist/templates/scripts/test-runners/vitest/test-watch.ts +4 -0
  222. package/dist/templates/scripts/test-runners/vitest/test.ts +4 -0
  223. package/dist/templates/scripts/version/version.ts +10 -0
  224. package/dist/templates/scripts/vitest-config.ts +3 -0
  225. package/dist/templates/vitest.config.ts +3 -0
  226. package/formatters/dprint/package.json +6 -0
  227. package/formatters/index/package.json +6 -0
  228. package/formatters/package.json +6 -0
  229. package/linters/eslint/package.json +6 -0
  230. package/linters/eslint-config/package.json +6 -0
  231. package/linters/eslint-rules/index/package.json +6 -0
  232. package/linters/eslint-rules/manifest-description/package.json +6 -0
  233. package/linters/eslint-rules/manifest-helpers/package.json +6 -0
  234. package/linters/eslint-rules/manifest-id/package.json +6 -0
  235. package/linters/eslint-rules/manifest-name/package.json +6 -0
  236. package/linters/eslint-rules/manifest-schema/package.json +6 -0
  237. package/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian/package.json +6 -0
  238. package/linters/eslint-rules/no-untrusted-input-events/package.json +6 -0
  239. package/linters/eslint-rules/obsidian-dev-utils-plugin/package.json +6 -0
  240. package/linters/eslint-rules/package.json +6 -0
  241. package/linters/eslint-rules/require-component-suffix/package.json +6 -0
  242. package/linters/index/package.json +6 -0
  243. package/linters/markdownlint/package.json +6 -0
  244. package/linters/obsidianmd-rule-custom-message/package.json +6 -0
  245. package/linters/package.json +6 -0
  246. package/package.json +241 -13
  247. package/test-runners/index/package.json +6 -0
  248. package/test-runners/integration-test-plugin/package.json +6 -0
  249. package/test-runners/package.json +6 -0
  250. package/test-runners/performance-eval-cap/package.json +6 -0
  251. package/test-runners/stale-build-global-setup/package.json +6 -0
  252. package/test-runners/vitest-config/package.json +6 -0
@@ -0,0 +1,33 @@
1
+ /// <reference path="./index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Archives a plugin's demo vault as a release artifact.
6
+ *
7
+ * A plugin can ship a curated demo vault at `demo-vault/` in its repo root. At release time this
8
+ * module installs the freshly built plugin into that vault's `.obsidian/plugins/<id>/` folder and
9
+ * zips the whole vault into `dist/build/<plugin-id>-demo-vault.zip`, so the existing GitHub-release
10
+ * step (which uploads every file in `dist/build/`) attaches it automatically.
11
+ *
12
+ * The version is deliberately absent from that name and lives INSIDE the archive instead — see
13
+ * `obsidian/demo-vault-naming.ts` for why — in the two places a person actually meets it: the vault
14
+ * sits under a single `<plugin-id>-demo-vault-<version>/` folder, so unzipping several releases by hand
15
+ * into one folder neither collides nor produces anonymous directories, and the vault's `README.md`
16
+ * heading gains the version it demonstrates.
17
+ *
18
+ * The archived copy also carries the `.obsidian/app.json` settings this package owns (see
19
+ * `demo-vault-app-json.ts`). Those settings and the README heading are written into the ZIP ENTRY and
20
+ * never into the repo folder: both files are tracked, and `updateVersion` archives after it has already
21
+ * pushed, so an in-place write would leave an uncommitted change behind a published release.
22
+ */
23
+ /**
24
+ * Archives the plugin's demo vault (`demo-vault/` in the repo root) as a release artifact.
25
+ *
26
+ * Installs the freshly built plugin from `dist/build/` into the vault's
27
+ * `.obsidian/plugins/<id>/` folder, then zips the whole vault to
28
+ * `dist/build/<plugin-id>-demo-vault.zip`, under a single `<plugin-id>-demo-vault-<version>/` folder.
29
+ *
30
+ * @returns A {@link Promise} that resolves to the absolute path of the created zip archive, or
31
+ * `null` if the repo has no `demo-vault/` folder.
32
+ */
33
+ export declare function archivePluginDemoVault(): Promise<null | string>;
@@ -0,0 +1,205 @@
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
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
+ const existingProcess = globalThis.process;
24
+
25
+ if (!existingProcess) {
26
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
+ globalThis.process = browserProcess;
28
+ return;
29
+ }
30
+
31
+ if (existingProcess.versions?.node) {
32
+ return;
33
+ }
34
+
35
+ const existingProcessRecord = existingProcess;
36
+
37
+ for (const [key, value] of Object.entries(browserProcess)) {
38
+ existingProcessRecord[key] ??= value;
39
+ }
40
+
41
+ existingProcessRecord['browser'] = true;
42
+ }
43
+
44
+ (function initEsm() {
45
+ ensureDisposeSymbols();
46
+ ensureBrowserProcess();
47
+ })();
48
+ })();
49
+
50
+ import {
51
+ getDemoVaultArchiveFileName,
52
+ getDemoVaultFolderName
53
+ } from "@mnaoumov/obsidian-lib/demo-vault-naming";
54
+ import { readdirPosix } from "@mnaoumov/typescript-dev-toolkit/fs";
55
+ import {
56
+ getRootFolder,
57
+ resolvePathFromRootSafe
58
+ } from "@mnaoumov/typescript-dev-toolkit/root";
59
+ import {
60
+ getFolderName,
61
+ join,
62
+ relative
63
+ } from "@mnaoumov/typescript-lib/path";
64
+ import { zipSync } from "fflate";
65
+ import { existsSync } from "node:fs";
66
+ import {
67
+ cp,
68
+ mkdir,
69
+ readFile,
70
+ writeFile
71
+ } from "node:fs/promises";
72
+ import {
73
+ buildArchivedDemoVaultAppJsonContent,
74
+ findOwnedDemoVaultAppJsonSettings,
75
+ parseDemoVaultAppJson
76
+ } from "./demo-vault-app-json.mjs";
77
+ import { ObsidianPluginRepoPaths } from "./obsidian-plugin-repo-paths.mjs";
78
+ const DEMO_VAULT_HELPER_PLUGIN_ID = "demo-vault-helper";
79
+ const DATA_JSON_FILE_NAME = "data.json";
80
+ const DATA_JSON_INDENT = 2;
81
+ const README_FILE_NAME = "README.md";
82
+ const OPENING_HEADING_REG_EXP = /^# .*/;
83
+ async function archivePluginDemoVault() {
84
+ const demoVaultPath = resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.DemoVault });
85
+ if (!existsSync(demoVaultPath)) {
86
+ return null;
87
+ }
88
+ const manifestPath = resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.ManifestJson });
89
+ const manifest = JSON.parse(await readFile(manifestPath, "utf-8"));
90
+ const pluginFolder = resolvePathFromRootSafe({
91
+ path: join(
92
+ ObsidianPluginRepoPaths.DemoVault,
93
+ ObsidianPluginRepoPaths.DotObsidian,
94
+ ObsidianPluginRepoPaths.Plugins,
95
+ manifest.id
96
+ )
97
+ });
98
+ await mkdir(pluginFolder, { recursive: true });
99
+ const distBuildPath = resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.DistBuild });
100
+ await cp(distBuildPath, pluginFolder, { recursive: true });
101
+ await injectDemoVaultHelper(manifest.id);
102
+ const zipPath = resolvePathFromRootSafe({
103
+ path: join(ObsidianPluginRepoPaths.DistBuild, getDemoVaultArchiveFileName(manifest.id))
104
+ });
105
+ const rootFolderName = getDemoVaultFolderName({
106
+ pluginId: manifest.id,
107
+ version: manifest.version
108
+ });
109
+ const entries = await readDemoVaultEntries({
110
+ demoVaultPath,
111
+ rootFolderName
112
+ });
113
+ injectAppJson({
114
+ appJson: await readCommittedAppJson(),
115
+ entries,
116
+ rootFolderName
117
+ });
118
+ injectReadmeVersion({
119
+ entries,
120
+ rootFolderName,
121
+ version: manifest.version
122
+ });
123
+ await writeFile(zipPath, zipSync(Object.fromEntries(entries)));
124
+ return zipPath;
125
+ }
126
+ function injectAppJson(params) {
127
+ const {
128
+ appJson,
129
+ entries,
130
+ rootFolderName
131
+ } = params;
132
+ const entryName = join(rootFolderName, ObsidianPluginRepoPaths.DotObsidian, ObsidianPluginRepoPaths.AppJson);
133
+ entries.set(entryName, Buffer.from(buildArchivedDemoVaultAppJsonContent({ appJson }), "utf-8"));
134
+ }
135
+ async function injectDemoVaultHelper(demoedPluginId) {
136
+ const packageFolder = getRootFolder(getFolderName(import.meta.url));
137
+ if (!packageFolder) {
138
+ throw new Error("Could not resolve the obsidian-dev-utils package folder to inject the demo-vault-helper plugin.");
139
+ }
140
+ const helperSourcePath = join(packageFolder, ObsidianPluginRepoPaths.DistDemoVaultHelper);
141
+ const helperFolder = resolvePathFromRootSafe({
142
+ path: join(
143
+ ObsidianPluginRepoPaths.DemoVault,
144
+ ObsidianPluginRepoPaths.DotObsidian,
145
+ ObsidianPluginRepoPaths.Plugins,
146
+ DEMO_VAULT_HELPER_PLUGIN_ID
147
+ )
148
+ });
149
+ await mkdir(helperFolder, { recursive: true });
150
+ await cp(helperSourcePath, helperFolder, { recursive: true });
151
+ const settings = { demoedPluginId };
152
+ await writeFile(join(helperFolder, DATA_JSON_FILE_NAME), `${JSON.stringify(settings, null, DATA_JSON_INDENT)}
153
+ `, "utf-8");
154
+ }
155
+ function injectReadmeVersion(params) {
156
+ const {
157
+ entries,
158
+ rootFolderName,
159
+ version
160
+ } = params;
161
+ const entryName = join(rootFolderName, README_FILE_NAME);
162
+ const entry = entries.get(entryName);
163
+ if (!entry) {
164
+ return;
165
+ }
166
+ const content = entry.toString("utf-8");
167
+ const versionedContent = content.replace(OPENING_HEADING_REG_EXP, (heading) => `${heading} v${version}`);
168
+ if (versionedContent === content) {
169
+ return;
170
+ }
171
+ entries.set(entryName, Buffer.from(versionedContent, "utf-8"));
172
+ }
173
+ async function readCommittedAppJson() {
174
+ const appJsonPath = resolvePathFromRootSafe({
175
+ path: join(ObsidianPluginRepoPaths.DemoVault, ObsidianPluginRepoPaths.DotObsidian, ObsidianPluginRepoPaths.AppJson)
176
+ });
177
+ const content = existsSync(appJsonPath) ? await readFile(appJsonPath, "utf-8") : null;
178
+ const appJson = parseDemoVaultAppJson({ content, path: appJsonPath });
179
+ const ownedSettings = findOwnedDemoVaultAppJsonSettings({ appJson });
180
+ if (ownedSettings.length > 0) {
181
+ throw new Error(
182
+ `${appJsonPath} sets ${ownedSettings.join(", ")}, which obsidian-dev-utils owns and writes into the archived demo vault. Settings it owns must not be committed.`
183
+ );
184
+ }
185
+ return appJson;
186
+ }
187
+ async function readDemoVaultEntries(params) {
188
+ const {
189
+ demoVaultPath,
190
+ rootFolderName
191
+ } = params;
192
+ const entries = /* @__PURE__ */ new Map();
193
+ for (const dirent of await readdirPosix(demoVaultPath, { recursive: true, withFileTypes: true })) {
194
+ if (!dirent.isFile()) {
195
+ continue;
196
+ }
197
+ const path = join(dirent.parentPath, dirent.name);
198
+ entries.set(join(rootFolderName, relative(demoVaultPath, path)), await readFile(path));
199
+ }
200
+ return entries;
201
+ }
202
+ export {
203
+ archivePluginDemoVault
204
+ };
205
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcmNoaXZlcyBhIHBsdWdpbidzIGRlbW8gdmF1bHQgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEEgcGx1Z2luIGNhbiBzaGlwIGEgY3VyYXRlZCBkZW1vIHZhdWx0IGF0IGBkZW1vLXZhdWx0L2AgaW4gaXRzIHJlcG8gcm9vdC4gQXQgcmVsZWFzZSB0aW1lIHRoaXNcbiAqIG1vZHVsZSBpbnN0YWxscyB0aGUgZnJlc2hseSBidWlsdCBwbHVnaW4gaW50byB0aGF0IHZhdWx0J3MgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIgYW5kXG4gKiB6aXBzIHRoZSB3aG9sZSB2YXVsdCBpbnRvIGBkaXN0L2J1aWxkLzxwbHVnaW4taWQ+LWRlbW8tdmF1bHQuemlwYCwgc28gdGhlIGV4aXN0aW5nIEdpdEh1Yi1yZWxlYXNlXG4gKiBzdGVwICh3aGljaCB1cGxvYWRzIGV2ZXJ5IGZpbGUgaW4gYGRpc3QvYnVpbGQvYCkgYXR0YWNoZXMgaXQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBUaGUgdmVyc2lvbiBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGZyb20gdGhhdCBuYW1lIGFuZCBsaXZlcyBJTlNJREUgdGhlIGFyY2hpdmUgaW5zdGVhZCBcdTIwMTQgc2VlXG4gKiBgb2JzaWRpYW4vZGVtby12YXVsdC1uYW1pbmcudHNgIGZvciB3aHkgXHUyMDE0IGluIHRoZSB0d28gcGxhY2VzIGEgcGVyc29uIGFjdHVhbGx5IG1lZXRzIGl0OiB0aGUgdmF1bHRcbiAqIHNpdHMgdW5kZXIgYSBzaW5nbGUgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+L2AgZm9sZGVyLCBzbyB1bnppcHBpbmcgc2V2ZXJhbCByZWxlYXNlcyBieSBoYW5kXG4gKiBpbnRvIG9uZSBmb2xkZXIgbmVpdGhlciBjb2xsaWRlcyBub3IgcHJvZHVjZXMgYW5vbnltb3VzIGRpcmVjdG9yaWVzLCBhbmQgdGhlIHZhdWx0J3MgYFJFQURNRS5tZGBcbiAqIGhlYWRpbmcgZ2FpbnMgdGhlIHZlcnNpb24gaXQgZGVtb25zdHJhdGVzLlxuICpcbiAqIFRoZSBhcmNoaXZlZCBjb3B5IGFsc28gY2FycmllcyB0aGUgYC5vYnNpZGlhbi9hcHAuanNvbmAgc2V0dGluZ3MgdGhpcyBwYWNrYWdlIG93bnMgKHNlZVxuICogYGRlbW8tdmF1bHQtYXBwLWpzb24udHNgKS4gVGhvc2Ugc2V0dGluZ3MgYW5kIHRoZSBSRUFETUUgaGVhZGluZyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBaSVAgRU5UUlkgYW5kXG4gKiBuZXZlciBpbnRvIHRoZSByZXBvIGZvbGRlcjogYm90aCBmaWxlcyBhcmUgdHJhY2tlZCwgYW5kIGB1cGRhdGVWZXJzaW9uYCBhcmNoaXZlcyBhZnRlciBpdCBoYXMgYWxyZWFkeVxuICogcHVzaGVkLCBzbyBhbiBpbi1wbGFjZSB3cml0ZSB3b3VsZCBsZWF2ZSBhbiB1bmNvbW1pdHRlZCBjaGFuZ2UgYmVoaW5kIGEgcHVibGlzaGVkIHJlbGVhc2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZW1vVmF1bHRIZWxwZXJTZXR0aW5ncyB9IGZyb20gJ0BtbmFvdW1vdi9vYnNpZGlhbi1saWIvZGVtby12YXVsdC1oZWxwZXItc2V0dGluZ3MnO1xuXG5pbXBvcnQge1xuICBnZXREZW1vVmF1bHRBcmNoaXZlRmlsZU5hbWUsXG4gIGdldERlbW9WYXVsdEZvbGRlck5hbWVcbn0gZnJvbSAnQG1uYW91bW92L29ic2lkaWFuLWxpYi9kZW1vLXZhdWx0LW5hbWluZyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9mcyc7XG5pbXBvcnQge1xuICBnZXRSb290Rm9sZGVyLFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yb290JztcbmltcG9ydCB7XG4gIGdldEZvbGRlck5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IHppcFN5bmMgfSBmcm9tICdmZmxhdGUnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgY3AsXG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7IERlbW9WYXVsdEFwcEpzb24gfSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuXG5pbXBvcnQge1xuICBidWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnQsXG4gIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyxcbiAgcGFyc2VEZW1vVmF1bHRBcHBKc29uXG59IGZyb20gJy4vZGVtby12YXVsdC1hcHAtanNvbi50cyc7XG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuXG5jb25zdCBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSUQgPSAnZGVtby12YXVsdC1oZWxwZXInO1xuY29uc3QgREFUQV9KU09OX0ZJTEVfTkFNRSA9ICdkYXRhLmpzb24nO1xuY29uc3QgREFUQV9KU09OX0lOREVOVCA9IDI7XG5jb25zdCBSRUFETUVfRklMRV9OQU1FID0gJ1JFQURNRS5tZCc7XG5cbi8vIFRoZSBSRUFETUUncyBvcGVuaW5nIGAjIEgxYCwgYW5kIG9ubHkgdGhhdCBvbmU6IHdpdGhvdXQgdGhlIGBtYCBmbGFnIHRoZSBtYXRjaCBpcyBhbmNob3JlZCB0byB0aGUgc3RhcnRcbi8vIG9mIHRoZSBmaWxlLCBhbmQgYC5gIHN0b3BzIGF0IHRoZSBuZXdsaW5lIHRoYXQgZW5kcyB0aGUgbGluZS5cbmNvbnN0IE9QRU5JTkdfSEVBRElOR19SRUdfRVhQID0gL14jIC4qLztcblxuLyoqXG4gKiBUaGUgYXJjaGl2ZSdzIGVudHJpZXMsIGtleWVkIGJ5IHRoZSBuYW1lIGVhY2ggb25lIHRha2VzIGluc2lkZSB0aGUgWklQLlxuICpcbiAqIFRoZSB3aG9sZSBhcmNoaXZlIGlzIGFzc2VtYmxlZCBhcyB0aGlzIG1hcCBhbmQgc2VyaWFsaXplZCBvbmNlLCBzbyBpbmplY3RpbmcgYW4gZW50cnkgaXMgYW4gb3JkaW5hcnlcbiAqIGBzZXRgIHJhdGhlciB0aGFuIGEgbXV0YXRpb24gb2YgYSBoYWxmLWJ1aWx0IGFyY2hpdmUgb2JqZWN0LlxuICovXG50eXBlIERlbW9WYXVsdFppcEVudHJpZXMgPSBNYXA8c3RyaW5nLCBCdWZmZXI+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbmplY3RBcHBKc29ufS5cbiAqL1xuaW50ZXJmYWNlIEluamVjdEFwcEpzb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBzZXR0aW5ncyB0aGUgb3duZWQgb25lcyBhcmUgbWVyZ2VkIG92ZXIuXG4gICAqL1xuICByZWFkb25seSBhcHBKc29uOiBEZW1vVmF1bHRBcHBKc29uO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIGVudHJpZXMsIGVkaXRlZCBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IERlbW9WYXVsdFppcEVudHJpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBhcmNoaXZlJ3Mgc2luZ2xlIHRvcC1sZXZlbCBmb2xkZXIsIHdoaWNoIGV2ZXJ5IGVudHJ5IG5hbWUgaXMgcmVsYXRpdmUgdG8uXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbmplY3RSZWFkbWVWZXJzaW9ufS5cbiAqL1xuaW50ZXJmYWNlIEluamVjdFJlYWRtZVZlcnNpb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyY2hpdmUncyBlbnRyaWVzLCBlZGl0ZWQgaW4gcGxhY2UuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiBEZW1vVmF1bHRaaXBFbnRyaWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIHNpbmdsZSB0b3AtbGV2ZWwgZm9sZGVyLCB3aGljaCBldmVyeSBlbnRyeSBuYW1lIGlzIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiB2ZXJzaW9uIHRoZSB2YXVsdCBkZW1vbnN0cmF0ZXMuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG1pbmltYWwgc2hhcGUgb2YgYSBwbHVnaW4gYG1hbmlmZXN0Lmpzb25gIHJlYWQgYnkge0BsaW5rIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTWFuaWZlc3Qge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZCwgdXNlZCBhcyB0aGUgZm9sZGVyIG5hbWUgdW5kZXIgYGRlbW8tdmF1bHQvLm9ic2lkaWFuL3BsdWdpbnMvYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gdmVyc2lvbiwgZW1iZWRkZWQgaW4gdGhlIGFyY2hpdmUncyB0b3AtbGV2ZWwgZm9sZGVyIG5hbWUgYW5kIGl0cyBSRUFETUUgaGVhZGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVhZERlbW9WYXVsdEVudHJpZXN9LlxuICovXG5pbnRlcmZhY2UgUmVhZERlbW9WYXVsdEVudHJpZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhdWx0IGZvbGRlciB0byByZWFkLCBhcyBhbiBhYnNvbHV0ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJjaGl2ZSdzIHNpbmdsZSB0b3AtbGV2ZWwgZm9sZGVyLCB3aGljaCBldmVyeSBlbnRyeSBuYW1lIGlzIHJlbGF0aXZlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlck5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcmNoaXZlcyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCBpbiB0aGUgcmVwbyByb290KSBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogSW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGZyb20gYGRpc3QvYnVpbGQvYCBpbnRvIHRoZSB2YXVsdCdzXG4gKiBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciwgdGhlbiB6aXBzIHRoZSB3aG9sZSB2YXVsdCB0b1xuICogYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4tZGVtby12YXVsdC56aXBgLCB1bmRlciBhIHNpbmdsZSBgPHBsdWdpbi1pZD4tZGVtby12YXVsdC08dmVyc2lvbj4vYCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgY3JlYXRlZCB6aXAgYXJjaGl2ZSwgb3JcbiAqIGBudWxsYCBpZiB0aGUgcmVwbyBoYXMgbm8gYGRlbW8tdmF1bHQvYCBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0KCk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBjb25zdCBkZW1vVmF1bHRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQgfSk7XG4gIGlmICghZXhpc3RzU3luYyhkZW1vVmF1bHRQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShtYW5pZmVzdFBhdGgsICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcblxuICBjb25zdCBwbHVnaW5Gb2xkZXIgPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCxcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuUGx1Z2lucyxcbiAgICAgIG1hbmlmZXN0LmlkXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBkaXN0QnVpbGRQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQgfSk7XG4gIGF3YWl0IGNwKGRpc3RCdWlsZFBhdGgsIHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgYXdhaXQgaW5qZWN0RGVtb1ZhdWx0SGVscGVyKG1hbmlmZXN0LmlkKTtcblxuICBjb25zdCB6aXBQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBnZXREZW1vVmF1bHRBcmNoaXZlRmlsZU5hbWUobWFuaWZlc3QuaWQpKVxuICB9KTtcbiAgY29uc3Qgcm9vdEZvbGRlck5hbWUgPSBnZXREZW1vVmF1bHRGb2xkZXJOYW1lKHtcbiAgICBwbHVnaW5JZDogbWFuaWZlc3QuaWQsXG4gICAgdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvblxuICB9KTtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWREZW1vVmF1bHRFbnRyaWVzKHtcbiAgICBkZW1vVmF1bHRQYXRoLFxuICAgIHJvb3RGb2xkZXJOYW1lXG4gIH0pO1xuICBpbmplY3RBcHBKc29uKHtcbiAgICBhcHBKc29uOiBhd2FpdCByZWFkQ29tbWl0dGVkQXBwSnNvbigpLFxuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWVcbiAgfSk7XG4gIGluamVjdFJlYWRtZVZlcnNpb24oe1xuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWUsXG4gICAgdmVyc2lvbjogbWFuaWZlc3QudmVyc2lvblxuICB9KTtcbiAgLy8gRXZlcnkgZW50cnkgaXMgc3RhbXBlZCB3aXRoIHRoZSBtb21lbnQgdGhlIGFyY2hpdmUgaXMgYnVpbHQgcmF0aGVyIHRoYW4gdGhlIGZpbGUncyBvd24gbXRpbWUsIHdoaWNoIGlzXG4gIC8vIHdoYXQgdGhlIHByZXZpb3VzIGFyY2hpdmVyIHdyb3RlLiBBIGRlbW8gdmF1bHQncyBjb21taXR0ZWQgdGltZXN0YW1wcyBhcmUgY2hlY2tvdXQgYXJ0aWZhY3RzIG9mIHdob2V2ZXJcbiAgLy8gcmFuIHRoZSByZWxlYXNlLCBzbyB0aGV5IGNhcnJ5IG5vdGhpbmcgYSByZWFkZXIgY291bGQgdXNlOyB0aGUgYnVpbGQgdGltZSBhdCBsZWFzdCBkZXNjcmliZXMgdGhlXG4gIC8vIGFyY2hpdmUuXG4gIGF3YWl0IHdyaXRlRmlsZSh6aXBQYXRoLCB6aXBTeW5jKE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKSkpO1xuICByZXR1cm4gemlwUGF0aDtcbn1cblxuLy8gU3RvcmVzIHRoZSBhcmNoaXZlZCB2YXVsdCdzIGAub2JzaWRpYW4vYXBwLmpzb25gIFx1MjAxNCB0aGUgY29tbWl0dGVkIHNldHRpbmdzIHdpdGggdGhlIG93bmVkIG9uZXMgbWVyZ2VkXG4vLyBvdmVyIHRoZW0uIFRoZSBFTlRSWSBpcyB3cml0dGVuIHJhdGhlciB0aGFuIHRoZSBmaWxlLCBzbyB0aGUgcmVwbyBmb2xkZXIgaXMgbGVmdCBleGFjdGx5IGFzIGl0IHdhcywgYW5kXG4vLyBBIHZhdWx0IHdpdGggbm90aGluZyBlbHNlIHRvIGNvbmZpZ3VyZSBcdTIwMTQgd2hpY2ggY29tbWl0cyBubyBgYXBwLmpzb25gIGF0IGFsbCBcdTIwMTQgZ2V0cyBvbmUgaGVyZSByZWdhcmRsZXNzLlxuZnVuY3Rpb24gaW5qZWN0QXBwSnNvbihwYXJhbXM6IEluamVjdEFwcEpzb25QYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGFwcEpzb24sXG4gICAgZW50cmllcyxcbiAgICByb290Rm9sZGVyTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJ5TmFtZSA9IGpvaW4ocm9vdEZvbGRlck5hbWUsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRvdE9ic2lkaWFuLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5BcHBKc29uKTtcbiAgZW50cmllcy5zZXQoZW50cnlOYW1lLCBCdWZmZXIuZnJvbShidWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnQoeyBhcHBKc29uIH0pLCAndXRmLTgnKSk7XG59XG5cbi8vIEluamVjdHMgdGhlIGJ1aWx0LCBgb2JzaWRpYW4tZGV2LXV0aWxzYC1vd25lZCBgZGVtby12YXVsdC1oZWxwZXJgIGJvb3RzdHJhcCBwbHVnaW4gKHNoaXBwZWQgaW4gdGhpcyBwYWNrYWdlKSBpbnRvIHRoZSBkZW1vIHZhdWx0LCBzbyBubyBwZXItdmF1bHQgY29weSBpcyBjb21taXR0ZWQgYW5kIGFuIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGJ1bXAgcHJvcGFnYXRlcyBmaXhlcy5cbi8vXG4vLyBBbG9uZ3NpZGUgdGhlIGJpbmFyaWVzIGl0IHdyaXRlcyB0aGUgaGVscGVyJ3Mgb3duIGBkYXRhLmpzb25gIG5hbWluZyB0aGUgZGVtb25zdHJhdGVkIHBsdWdpbi4gVGhhdCBpc1xuLy8gdGhlIG9uZSBtb21lbnQgdGhlIGlkIGlzIGtub3duIGZvciBjZXJ0YWluIFx1MjAxNCBpdCBjb21lcyBmcm9tIHRoZSBwbHVnaW4ncyBvd24gbWFuaWZlc3QgXHUyMDE0IHdoZXJlYXMgdGhlXG4vLyBvcGVuZWQgdmF1bHQgb25seSBvZmZlcnMgcGx1Z2luIGZvbGRlcnMgdG8gY291bnQsIHdoaWNoIHRoZSBib290c3RyYXAgaXRzZWxmIGFkZHMgdG8gKHNlZVxuLy8gYERlbW9WYXVsdEhlbHBlclNldHRpbmdzYCkuXG5hc3luYyBmdW5jdGlvbiBpbmplY3REZW1vVmF1bHRIZWxwZXIoZGVtb2VkUGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlRm9sZGVyID0gZ2V0Um9vdEZvbGRlcihnZXRGb2xkZXJOYW1lKGltcG9ydC5tZXRhLnVybCkpO1xuICBpZiAoIXBhY2thZ2VGb2xkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZXNvbHZlIHRoZSBvYnNpZGlhbi1kZXYtdXRpbHMgcGFja2FnZSBmb2xkZXIgdG8gaW5qZWN0IHRoZSBkZW1vLXZhdWx0LWhlbHBlciBwbHVnaW4uJyk7XG4gIH1cblxuICBjb25zdCBoZWxwZXJTb3VyY2VQYXRoID0gam9pbihwYWNrYWdlRm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0RGVtb1ZhdWx0SGVscGVyKTtcbiAgY29uc3QgaGVscGVyRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbixcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBsdWdpbnMsXG4gICAgICBERU1PX1ZBVUxUX0hFTFBFUl9QTFVHSU5fSURcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBjcChoZWxwZXJTb3VyY2VQYXRoLCBoZWxwZXJGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHNldHRpbmdzOiBEZW1vVmF1bHRIZWxwZXJTZXR0aW5ncyA9IHsgZGVtb2VkUGx1Z2luSWQgfTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oaGVscGVyRm9sZGVyLCBEQVRBX0pTT05fRklMRV9OQU1FKSwgYCR7SlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIG51bGwsIERBVEFfSlNPTl9JTkRFTlQpfVxcbmAsICd1dGYtOCcpO1xufVxuXG4vLyBOYW1lcyB0aGUgdmVyc2lvbiBvbiB0aGUgYXJjaGl2ZWQgYFJFQURNRS5tZGAncyBoZWFkaW5nLCBzbyB0aGUgdmF1bHQgc2F5cyB3aGljaCByZWxlYXNlIGl0IGRlbW9uc3RyYXRlc1xuLy8gaG93ZXZlciBmYXIgaXQgdHJhdmVscyBmcm9tIHRoZSByZWxlYXNlIHBhZ2UgaXQgd2FzIGRvd25sb2FkZWQgZnJvbS5cbi8vXG4vLyBFbnRyeS1vbmx5LCBmb3IgdGhlIHNhbWUgcmVhc29uIGBpbmplY3RBcHBKc29uYCBpczogdGhlIGNvbW1pdHRlZCBSRUFETUUgaXMgYSB0cmFja2VkLCBoYW5kLWF1dGhvcmVkXG4vLyBmaWxlIGFuZCBgdXBkYXRlVmVyc2lvbmAgYXJjaGl2ZXMgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgcHVzaGVkLlxuLy9cbi8vIEEgdmF1bHQgdGhhdCBzaGlwcyBubyBSRUFETUUsIG9yIG9uZSBvcGVuaW5nIG9uIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIGAjIEgxYCwgaXMgbGVmdCBhbG9uZSByYXRoZXJcbi8vIHRoYW4gY29ycmVjdGVkLiBUaGUgZGVtby12YXVsdCBjb3ZlcmFnZSBzdWl0ZSBleGVtcHRzIGBSRUFETUUubWRgIGZyb20gaXRzIEgxIGNoZWNrLCBzbyBuZWl0aGVyIHNoYXBlXG4vLyBpcyBhIGRlZmVjdCBcdTIwMTQgYW5kIGEgcmVsZWFzZSBpcyB0aGUgd3JvbmcgbW9tZW50IHRvIHN0YXJ0IGZhaWxpbmcgb24gb25lLlxuZnVuY3Rpb24gaW5qZWN0UmVhZG1lVmVyc2lvbihwYXJhbXM6IEluamVjdFJlYWRtZVZlcnNpb25QYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGVudHJpZXMsXG4gICAgcm9vdEZvbGRlck5hbWUsXG4gICAgdmVyc2lvblxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJ5TmFtZSA9IGpvaW4ocm9vdEZvbGRlck5hbWUsIFJFQURNRV9GSUxFX05BTUUpO1xuICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZ2V0KGVudHJ5TmFtZSk7XG4gIGlmICghZW50cnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZW50cnkudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGNvbnN0IHZlcnNpb25lZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoT1BFTklOR19IRUFESU5HX1JFR19FWFAsIChoZWFkaW5nKSA9PiBgJHtoZWFkaW5nfSB2JHt2ZXJzaW9ufWApO1xuICBpZiAodmVyc2lvbmVkQ29udGVudCA9PT0gY29udGVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVudHJpZXMuc2V0KGVudHJ5TmFtZSwgQnVmZmVyLmZyb20odmVyc2lvbmVkQ29udGVudCwgJ3V0Zi04JykpO1xufVxuXG4vLyBSZWFkcyB0aGUgZGVtbyB2YXVsdCdzIGNvbW1pdHRlZCBgLm9ic2lkaWFuL2FwcC5qc29uYCwgcmVmdXNpbmcgdGhlIHNldHRpbmdzIHRoaXMgcGFja2FnZSBvd25zLlxuLy9cbi8vIFRob3NlIHNldHRpbmdzIGFyZSBpbmplY3RlZCBpbnRvIHRoZSBhcmNoaXZlLCBzbyBhIGNvbW1pdHRlZCBvbmUgaXMgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoIHRoYXRcbi8vIG5vdGhpbmcga2VlcHMgaW4gc3RlcC4gVGhlIGRlbW8tdmF1bHQgY292ZXJhZ2Ugc3VpdGUgYWxyZWFkeSBmYWlscyBvbiBpdCwgd2hpY2ggbWVhbnMgcmVhY2hpbmcgaGVyZVxuLy8gbWVhbnMgdGhhdCBnYXRlIHdhcyBza2lwcGVkIFx1MjAxNCBzbyB0aGlzIHJlZnVzZXMgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcgYSB2YWx1ZSBzb21lYm9keSBjaG9zZSBvbiBwdXJwb3NlLlxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbW1pdHRlZEFwcEpzb24oKTogUHJvbWlzZTxEZW1vVmF1bHRBcHBKc29uPiB7XG4gIGNvbnN0IGFwcEpzb25QYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbilcbiAgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBleGlzdHNTeW5jKGFwcEpzb25QYXRoKSA/IGF3YWl0IHJlYWRGaWxlKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gIGNvbnN0IGFwcEpzb24gPSBwYXJzZURlbW9WYXVsdEFwcEpzb24oeyBjb250ZW50LCBwYXRoOiBhcHBKc29uUGF0aCB9KTtcblxuICBjb25zdCBvd25lZFNldHRpbmdzID0gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHsgYXBwSnNvbiB9KTtcbiAgaWYgKG93bmVkU2V0dGluZ3MubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2FwcEpzb25QYXRofSBzZXRzICR7b3duZWRTZXR0aW5ncy5qb2luKCcsICcpfSwgd2hpY2ggb2JzaWRpYW4tZGV2LXV0aWxzIG93bnMgYW5kIHdyaXRlcyBpbnRvIHRoZSBhcmNoaXZlZCBkZW1vIHZhdWx0LiBTZXR0aW5ncyBpdCBvd25zIG11c3Qgbm90IGJlIGNvbW1pdHRlZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhcHBKc29uO1xufVxuXG4vLyBSZWFkcyBldmVyeSBmaWxlIGluIHRoZSBkZW1vIHZhdWx0IGFzIGFuIGFyY2hpdmUgZW50cnksIHVuZGVyIHRoZSBzaW5nbGUgdG9wLWxldmVsIGZvbGRlciB0aGUgYXJjaGl2ZVxuLy8gc2l0cyBpbi5cbi8vXG4vLyBPbmx5IEZJTEVTIGJlY29tZSBlbnRyaWVzLiBHaXQgY2Fubm90IHRyYWNrIGFuIGVtcHR5IGZvbGRlciwgc28gYSBjb21taXR0ZWQgZGVtbyB2YXVsdCBoYXMgbm9uZSBcdTIwMTQgYW5kXG4vLyBgZXh0cmFjdFppcEFyY2hpdmVgIGNyZWF0ZXMgYW4gZW50cnkncyBwYXJlbnQgZm9sZGVycyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJjaGl2ZSBkZWNsYXJlZCB0aGVtLCBzbyBhXG4vLyBmb2xkZXIgZW50cnkgd291bGQgZWFybiBub3RoaW5nIGV2ZW4gaWYgb25lIGNvdWxkIGV4aXN0LlxuYXN5bmMgZnVuY3Rpb24gcmVhZERlbW9WYXVsdEVudHJpZXMocGFyYW1zOiBSZWFkRGVtb1ZhdWx0RW50cmllc1BhcmFtcyk6IFByb21pc2U8RGVtb1ZhdWx0WmlwRW50cmllcz4ge1xuICBjb25zdCB7XG4gICAgZGVtb1ZhdWx0UGF0aCxcbiAgICByb290Rm9sZGVyTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGVudHJpZXM6IERlbW9WYXVsdFppcEVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgQnVmZmVyPigpO1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGVtb1ZhdWx0UGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGpvaW4oZGlyZW50LnBhcmVudFBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBlbnRyaWVzLnNldChqb2luKHJvb3RGb2xkZXJOYW1lLCByZWxhdGl2ZShkZW1vVmF1bHRQYXRoLCBwYXRoKSksIGF3YWl0IHJlYWRGaWxlKHBhdGgpKTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBQzdCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLCtCQUErQjtBQUV4QyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLG1CQUFtQjtBQUN6QixNQUFNLG1CQUFtQjtBQUl6QixNQUFNLDBCQUEwQjtBQTBGaEMsZUFBc0IseUJBQWlEO0FBQ3JFLFFBQU0sZ0JBQWdCLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLFVBQVUsQ0FBQztBQUN6RixNQUFJLENBQUMsV0FBVyxhQUFhLEdBQUc7QUFDOUIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGVBQWUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsYUFBYSxDQUFDO0FBQzNGLFFBQU0sV0FBVyxLQUFLLE1BQU0sTUFBTSxTQUFTLGNBQWMsT0FBTyxDQUFDO0FBRWpFLFFBQU0sZUFBZSx3QkFBd0I7QUFBQSxJQUMzQyxNQUFNO0FBQUEsTUFDSix3QkFBd0I7QUFBQSxNQUN4Qix3QkFBd0I7QUFBQSxNQUN4Qix3QkFBd0I7QUFBQSxNQUN4QixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0YsQ0FBQztBQUNELFFBQU0sTUFBTSxjQUFjLEVBQUUsV0FBVyxLQUFL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
@@ -0,0 +1,15 @@
1
+ /// <reference path="../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Formats an Obsidian plugin with dprint: the generic runner from `@mnaoumov/typescript-dev-toolkit`, falling
6
+ * back to this package's `dprint.json` template when the project has none.
7
+ */
8
+ import type { FormatOptions } from '@mnaoumov/typescript-dev-toolkit/formatters/dprint';
9
+ /**
10
+ * Formats the source code.
11
+ *
12
+ * @param options - The {@link FormatOptions}.
13
+ */
14
+ export declare function format(options?: FormatOptions): Promise<void>;
15
+ export { type FormatOptions } from '@mnaoumov/typescript-dev-toolkit/formatters/dprint';
@@ -0,0 +1,60 @@
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
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
+ const existingProcess = globalThis.process;
24
+
25
+ if (!existingProcess) {
26
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
+ globalThis.process = browserProcess;
28
+ return;
29
+ }
30
+
31
+ if (existingProcess.versions?.node) {
32
+ return;
33
+ }
34
+
35
+ const existingProcessRecord = existingProcess;
36
+
37
+ for (const [key, value] of Object.entries(browserProcess)) {
38
+ existingProcessRecord[key] ??= value;
39
+ }
40
+
41
+ existingProcessRecord['browser'] = true;
42
+ }
43
+
44
+ (function initEsm() {
45
+ ensureDisposeSymbols();
46
+ ensureBrowserProcess();
47
+ })();
48
+ })();
49
+
50
+ import { format as formatGeneric } from "@mnaoumov/typescript-dev-toolkit/formatters/dprint";
51
+ import { RepoPaths } from "@mnaoumov/typescript-dev-toolkit/repo-paths";
52
+ import { getTemplateFilePath } from "../templates.mjs";
53
+ import {} from "@mnaoumov/typescript-dev-toolkit/formatters/dprint";
54
+ async function format(options) {
55
+ await formatGeneric({ defaultConfigFilePath: getTemplateFilePath(RepoPaths.DprintJson), ...options });
56
+ }
57
+ export {
58
+ format
59
+ };
60
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2Zvcm1hdHRlcnMvZHByaW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRm9ybWF0cyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBkcHJpbnQ6IHRoZSBnZW5lcmljIHJ1bm5lciBmcm9tIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdGAsIGZhbGxpbmdcbiAqIGJhY2sgdG8gdGhpcyBwYWNrYWdlJ3MgYGRwcmludC5qc29uYCB0ZW1wbGF0ZSB3aGVuIHRoZSBwcm9qZWN0IGhhcyBub25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybWF0T3B0aW9ucyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2Zvcm1hdHRlcnMvZHByaW50JztcblxuaW1wb3J0IHsgZm9ybWF0IGFzIGZvcm1hdEdlbmVyaWMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9mb3JtYXR0ZXJzL2RwcmludCc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZXBvLXBhdGhzJztcblxuaW1wb3J0IHsgZ2V0VGVtcGxhdGVGaWxlUGF0aCB9IGZyb20gJy4uL3RlbXBsYXRlcy50cyc7XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgc291cmNlIGNvZGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEZvcm1hdE9wdGlvbnN9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9ybWF0KG9wdGlvbnM/OiBGb3JtYXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZvcm1hdEdlbmVyaWMoeyBkZWZhdWx0Q29uZmlnRmlsZVBhdGg6IGdldFRlbXBsYXRlRmlsZVBhdGgoUmVwb1BhdGhzLkRwcmludEpzb24pLCAuLi5vcHRpb25zIH0pO1xufVxuZXhwb3J0IHsgdHlwZSBGb3JtYXRPcHRpb25zIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvZm9ybWF0dGVycy9kcHJpbnQnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLFNBQVMsVUFBVSxxQkFBcUI7QUFDeEMsU0FBUyxpQkFBaUI7QUFFMUIsU0FBUywyQkFBMkI7QUFVcEMsZUFBbUM7QUFIbkMsZUFBc0IsT0FBTyxTQUF3QztBQUNuRSxRQUFNLGNBQWMsRUFBRSx1QkFBdUIsb0JBQW9CLFVBQVUsVUFBVSxHQUFHLEdBQUcsUUFBUSxDQUFDO0FBQ3RHOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,2 @@
1
+ /// <reference path="../index.d.mts" />
2
+ export * as 'dprint' from './dprint.mjs';
@@ -0,0 +1,54 @@
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
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
+ const existingProcess = globalThis.process;
24
+
25
+ if (!existingProcess) {
26
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
+ globalThis.process = browserProcess;
28
+ return;
29
+ }
30
+
31
+ if (existingProcess.versions?.node) {
32
+ return;
33
+ }
34
+
35
+ const existingProcessRecord = existingProcess;
36
+
37
+ for (const [key, value] of Object.entries(browserProcess)) {
38
+ existingProcessRecord[key] ??= value;
39
+ }
40
+
41
+ existingProcessRecord['browser'] = true;
42
+ }
43
+
44
+ (function initEsm() {
45
+ ensureDisposeSymbols();
46
+ ensureBrowserProcess();
47
+ })();
48
+ })();
49
+
50
+ import * as dprint from "./dprint.mjs";
51
+ export {
52
+ dprint
53
+ };
54
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2Zvcm1hdHRlcnMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnZHByaW50JyBmcm9tICcuL2RwcmludC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsWUFBWSxZQUFjOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,16 @@
1
+ /// <reference lib="dom" />
2
+ /// <reference lib="dom.iterable" />
3
+ /// <reference lib="es2022" />
4
+ /// <reference lib="esnext.disposable" />
5
+ /// <reference types="node" />
6
+ export * as 'bundlers' from './bundlers/index.mjs';
7
+ export * as 'demo-vault-app-json' from './demo-vault-app-json.mjs';
8
+ export * as 'demo-vault-buttons' from './demo-vault-buttons.mjs';
9
+ export * as 'demo-vault-coverage' from './demo-vault-coverage.mjs';
10
+ export * as 'demo-vault' from './demo-vault.mjs';
11
+ export * as 'formatters' from './formatters/index.mjs';
12
+ export * as 'linters' from './linters/index.mjs';
13
+ export * as 'obsidian-plugin-repo-paths' from './obsidian-plugin-repo-paths.mjs';
14
+ export * as 'templates' from './templates.mjs';
15
+ export * as 'test-runners' from './test-runners/index.mjs';
16
+ export * as 'version' from './version.mjs';
@@ -0,0 +1,74 @@
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
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
+ const existingProcess = globalThis.process;
24
+
25
+ if (!existingProcess) {
26
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
+ globalThis.process = browserProcess;
28
+ return;
29
+ }
30
+
31
+ if (existingProcess.versions?.node) {
32
+ return;
33
+ }
34
+
35
+ const existingProcessRecord = existingProcess;
36
+
37
+ for (const [key, value] of Object.entries(browserProcess)) {
38
+ existingProcessRecord[key] ??= value;
39
+ }
40
+
41
+ existingProcessRecord['browser'] = true;
42
+ }
43
+
44
+ (function initEsm() {
45
+ ensureDisposeSymbols();
46
+ ensureBrowserProcess();
47
+ })();
48
+ })();
49
+
50
+ import * as bundlers from "./bundlers/index.mjs";
51
+ import * as demo_vault_app_json from "./demo-vault-app-json.mjs";
52
+ import * as demo_vault_buttons from "./demo-vault-buttons.mjs";
53
+ import * as demo_vault_coverage from "./demo-vault-coverage.mjs";
54
+ import * as demo_vault from "./demo-vault.mjs";
55
+ import * as formatters from "./formatters/index.mjs";
56
+ import * as linters from "./linters/index.mjs";
57
+ import * as obsidian_plugin_repo_paths from "./obsidian-plugin-repo-paths.mjs";
58
+ import * as templates from "./templates.mjs";
59
+ import * as test_runners from "./test-runners/index.mjs";
60
+ import * as version from "./version.mjs";
61
+ export {
62
+ bundlers,
63
+ demo_vault as "demo-vault",
64
+ demo_vault_app_json as "demo-vault-app-json",
65
+ demo_vault_buttons as "demo-vault-buttons",
66
+ demo_vault_coverage as "demo-vault-coverage",
67
+ formatters,
68
+ linters,
69
+ obsidian_plugin_repo_paths as "obsidian-plugin-repo-paths",
70
+ templates,
71
+ test_runners as "test-runners",
72
+ version
73
+ };
74
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1bmRsZXJzJyBmcm9tICcuL2J1bmRsZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdkZW1vLXZhdWx0LWFwcC1qc29uJyBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtYnV0dG9ucycgZnJvbSAnLi9kZW1vLXZhdWx0LWJ1dHRvbnMudHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtY292ZXJhZ2UnIGZyb20gJy4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyc7XG5leHBvcnQgKiBhcyAnZGVtby12YXVsdCcgZnJvbSAnLi9kZW1vLXZhdWx0LnRzJztcbmV4cG9ydCAqIGFzICdmb3JtYXR0ZXJzJyBmcm9tICcuL2Zvcm1hdHRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2xpbnRlcnMnIGZyb20gJy4vbGludGVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAnb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMnIGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuZXhwb3J0ICogYXMgJ3RlbXBsYXRlcycgZnJvbSAnLi90ZW1wbGF0ZXMudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsWUFBWSxjQUFnQjtBQUM1QixZQUFZQSx5QkFBMkI7QUFDdkMsWUFBWUMsd0JBQTBCO0FBQ3RDLFlBQVlDLHlCQUEyQjtBQUN2QyxZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWSxnQkFBa0I7QUFDOUIsWUFBWSxhQUFlO0FBQzNCLFlBQVlDLGdDQUFrQztBQUM5QyxZQUFZLGVBQWlCO0FBQzdCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZLGFBQWU7IiwKICAibmFtZXMiOiBbImRlbW8tdmF1bHQtYXBwLWpzb24iLCAiZGVtby12YXVsdC1idXR0b25zIiwgImRlbW8tdmF1bHQtY292ZXJhZ2UiLCAiZGVtby12YXVsdCIsICJvYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocyIsICJ0ZXN0LXJ1bm5lcnMiXQp9Cg==
@@ -0,0 +1,33 @@
1
+ /// <reference path="./index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Per-worker integration-test setup endpoint: makes every library helper reachable as `lib.<helper>` inside
6
+ * an `evalInObsidian` closure.
7
+ *
8
+ * Add it to the `setupFiles` of each integration-test project, after `obsidian-integration-testing`'s own
9
+ * setup:
10
+ *
11
+ * ```ts
12
+ * setupFiles: [
13
+ * 'obsidian-integration-testing/vitest-setup',
14
+ * 'obsidian-dev-utils/integration-test-setup'
15
+ * ]
16
+ * ```
17
+ *
18
+ * Importing this module registers a renderer-side resolver whose result the harness merges into the `lib`
19
+ * argument of every `evalInObsidian` callback. Two more pieces are needed for `lib.<helper>` to work:
20
+ *
21
+ * - The **harness plugin** must be loaded in the test vault, because it is what publishes the library on
22
+ * `window.__obsidianDevUtilsModule`. Seed and enable it via
23
+ * `obsidian-dev-utils/integration-test-vitest-global-setup` (or, when composing with your own vault
24
+ * fixtures, {@link getIntegrationTestPluginPopulate} +
25
+ * `createSetup({ enableCommunityPlugins: [OBSIDIAN_DEV_UTILS_INTEGRATION_TEST_PLUGIN_ID] })`).
26
+ * - The **types** must be activated, or `lib.<helper>` will not compile. Put
27
+ * `/// <reference types="obsidian-dev-utils/@types/obsidian-integration-testing" />` in a `.d.ts` your
28
+ * `tsconfig.json` already includes. A `compilerOptions.types` entry does NOT work for this.
29
+ *
30
+ * Registration is idempotent (the harness dedupes resolvers by source text), so importing this module from
31
+ * more than one setup file is safe.
32
+ */
33
+ export {};
@@ -0,0 +1,52 @@
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
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
+ const existingProcess = globalThis.process;
24
+
25
+ if (!existingProcess) {
26
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
+ globalThis.process = browserProcess;
28
+ return;
29
+ }
30
+
31
+ if (existingProcess.versions?.node) {
32
+ return;
33
+ }
34
+
35
+ const existingProcessRecord = existingProcess;
36
+
37
+ for (const [key, value] of Object.entries(browserProcess)) {
38
+ existingProcessRecord[key] ??= value;
39
+ }
40
+
41
+ existingProcessRecord['browser'] = true;
42
+ }
43
+
44
+ (function initEsm() {
45
+ ensureDisposeSymbols();
46
+ ensureBrowserProcess();
47
+ })();
48
+ })();
49
+
50
+ import { registerIntegrationTestLibResolver } from "./test-runners/integration-test-plugin.mjs";
51
+ registerIntegrationTestLibResolver();
52
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uLXRlc3Qtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQZXItd29ya2VyIGludGVncmF0aW9uLXRlc3Qgc2V0dXAgZW5kcG9pbnQ6IG1ha2VzIGV2ZXJ5IGxpYnJhcnkgaGVscGVyIHJlYWNoYWJsZSBhcyBgbGliLjxoZWxwZXI+YCBpbnNpZGVcbiAqIGFuIGBldmFsSW5PYnNpZGlhbmAgY2xvc3VyZS5cbiAqXG4gKiBBZGQgaXQgdG8gdGhlIGBzZXR1cEZpbGVzYCBvZiBlYWNoIGludGVncmF0aW9uLXRlc3QgcHJvamVjdCwgYWZ0ZXIgYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgJ3Mgb3duXG4gKiBzZXR1cDpcbiAqXG4gKiBgYGB0c1xuICogc2V0dXBGaWxlczogW1xuICogICAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnLFxuICogICAnb2JzaWRpYW4tZGV2LXV0aWxzL2ludGVncmF0aW9uLXRlc3Qtc2V0dXAnXG4gKiBdXG4gKiBgYGBcbiAqXG4gKiBJbXBvcnRpbmcgdGhpcyBtb2R1bGUgcmVnaXN0ZXJzIGEgcmVuZGVyZXItc2lkZSByZXNvbHZlciB3aG9zZSByZXN1bHQgdGhlIGhhcm5lc3MgbWVyZ2VzIGludG8gdGhlIGBsaWJgXG4gKiBhcmd1bWVudCBvZiBldmVyeSBgZXZhbEluT2JzaWRpYW5gIGNhbGxiYWNrLiBUd28gbW9yZSBwaWVjZXMgYXJlIG5lZWRlZCBmb3IgYGxpYi48aGVscGVyPmAgdG8gd29yazpcbiAqXG4gKiAtIFRoZSAqKmhhcm5lc3MgcGx1Z2luKiogbXVzdCBiZSBsb2FkZWQgaW4gdGhlIHRlc3QgdmF1bHQsIGJlY2F1c2UgaXQgaXMgd2hhdCBwdWJsaXNoZXMgdGhlIGxpYnJhcnkgb25cbiAqICAgYHdpbmRvdy5fX29ic2lkaWFuRGV2VXRpbHNNb2R1bGVgLiBTZWVkIGFuZCBlbmFibGUgaXQgdmlhXG4gKiAgIGBvYnNpZGlhbi1kZXYtdXRpbHMvaW50ZWdyYXRpb24tdGVzdC12aXRlc3QtZ2xvYmFsLXNldHVwYCAob3IsIHdoZW4gY29tcG9zaW5nIHdpdGggeW91ciBvd24gdmF1bHRcbiAqICAgZml4dHVyZXMsIHtAbGluayBnZXRJbnRlZ3JhdGlvblRlc3RQbHVnaW5Qb3B1bGF0ZX0gK1xuICogICBgY3JlYXRlU2V0dXAoeyBlbmFibGVDb21tdW5pdHlQbHVnaW5zOiBbT0JTSURJQU5fREVWX1VUSUxTX0lOVEVHUkFUSU9OX1RFU1RfUExVR0lOX0lEXSB9KWApLlxuICogLSBUaGUgKip0eXBlcyoqIG11c3QgYmUgYWN0aXZhdGVkLCBvciBgbGliLjxoZWxwZXI+YCB3aWxsIG5vdCBjb21waWxlLiBQdXRcbiAqICAgYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwib2JzaWRpYW4tZGV2LXV0aWxzL0B0eXBlcy9vYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nXCIgLz5gIGluIGEgYC5kLnRzYCB5b3VyXG4gKiAgIGB0c2NvbmZpZy5qc29uYCBhbHJlYWR5IGluY2x1ZGVzLiBBIGBjb21waWxlck9wdGlvbnMudHlwZXNgIGVudHJ5IGRvZXMgTk9UIHdvcmsgZm9yIHRoaXMuXG4gKlxuICogUmVnaXN0cmF0aW9uIGlzIGlkZW1wb3RlbnQgKHRoZSBoYXJuZXNzIGRlZHVwZXMgcmVzb2x2ZXJzIGJ5IHNvdXJjZSB0ZXh0KSwgc28gaW1wb3J0aW5nIHRoaXMgbW9kdWxlIGZyb21cbiAqIG1vcmUgdGhhbiBvbmUgc2V0dXAgZmlsZSBpcyBzYWZlLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGluIHNldHVwLWZpbGUgZ2x1ZTsgZXhlcmNpc2VkIGVuZC10by1lbmQgYnkgdGhlIE9ic2lkaWFuIGludGVncmF0aW9uIHN1aXRlcy4gKi9cbmltcG9ydCB7IHJlZ2lzdGVySW50ZWdyYXRpb25UZXN0TGliUmVzb2x2ZXIgfSBmcm9tICcuL3Rlc3QtcnVubmVycy9pbnRlZ3JhdGlvbi10ZXN0LXBsdWdpbi50cyc7XG5cbnJlZ2lzdGVySW50ZWdyYXRpb25UZXN0TGliUmVzb2x2ZXIoKTtcbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNBLFNBQVMsMENBQTBDO0FBRW5ELG1DQUFtQzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,39 @@
1
+ /// <reference path="./index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Turnkey Vitest `globalSetup` for a plugin's integration tests: does everything
6
+ * `obsidian-integration-testing`'s own global setup does (temp vault, install and enable the
7
+ * plugin-under-test), and additionally seeds and enables the `obsidian-dev-utils` integration-test harness
8
+ * plugin, so `lib.<helper>` works inside `evalInObsidian` closures.
9
+ *
10
+ * ```ts
11
+ * globalSetup: ['obsidian-dev-utils/integration-test-vitest-global-setup'],
12
+ * setupFiles: [
13
+ * 'obsidian-integration-testing/vitest-setup',
14
+ * 'obsidian-dev-utils/integration-test-setup'
15
+ * ]
16
+ * ```
17
+ *
18
+ * Replaces `obsidian-integration-testing/vitest-global-setup-plugin`; do not list both.
19
+ *
20
+ * If the project already needs its own `populate` (demo-vault fixtures, a large performance vault), skip
21
+ * this module and compose instead — merge {@link getIntegrationTestPluginPopulate} into that map and pass
22
+ * {@link OBSIDIAN_DEV_UTILS_INTEGRATION_TEST_PLUGIN_ID} to `enableCommunityPlugins`:
23
+ *
24
+ * ```ts
25
+ * export const { setup, teardown } = createSetup({
26
+ * enableCommunityPlugins: [OBSIDIAN_DEV_UTILS_INTEGRATION_TEST_PLUGIN_ID],
27
+ * populate: () => ({ ...myFixtures(), ...getIntegrationTestPluginPopulate() })
28
+ * });
29
+ * ```
30
+ */
31
+ /**
32
+ * Vitest global setup: creates the temp vault, installs and enables the plugin-under-test, then seeds and
33
+ * enables the `obsidian-dev-utils` integration-test harness plugin alongside it.
34
+ */
35
+ export declare const setup: (this: void, project: import("vitest/node").TestProject) => Promise<void>;
36
+ /**
37
+ * Vitest global teardown: removes the temp vault and disposes the transport.
38
+ */
39
+ export declare const teardown: (this: void) => Promise<void>;