@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,147 @@
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 keepName($unknown) {
45
+ return $unknown;
46
+ }
47
+
48
+ (function initCjs() {
49
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
50
+ const globalThisRecord = globalThis;
51
+ ensureDisposeSymbols();
52
+ globalThisRecord['__name'] ??= keepName;
53
+ globalThisRecord['__extractDefault'] ??= extractDefault;
54
+
55
+ ensureBrowserProcess();
56
+
57
+ // eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
58
+ function extractDefault(module) {
59
+ return module && module.__esModule && 'default' in module ? module.default : module;
60
+ }
61
+ })();
62
+ })();
63
+ (function patchObsidianRequire() {
64
+ const originalRequire = require;
65
+ if (!originalRequire || originalRequire.__isPatched) {
66
+ return;
67
+ }
68
+
69
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
70
+ require = Object.assign(
71
+ (id) => requirePatched(id),
72
+ originalRequire,
73
+ {
74
+ __isPatched: true
75
+ }
76
+ );
77
+
78
+ function extractDefault(module) {
79
+ return module && module.__esModule && 'default' in module ? module.default : module;
80
+ }
81
+
82
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
83
+ '@codemirror/autocomplete',
84
+ '@codemirror/collab',
85
+ '@codemirror/commands',
86
+ '@codemirror/language',
87
+ '@codemirror/lint',
88
+ '@codemirror/search',
89
+ '@codemirror/state',
90
+ '@codemirror/text',
91
+ '@codemirror/view',
92
+ '@lezer/common',
93
+ '@lezer/highlight',
94
+ '@lezer/lr',
95
+ 'obsidian']
96
+ );
97
+
98
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
99
+ '@codemirror/closebrackets',
100
+ '@codemirror/comment',
101
+ '@codemirror/fold',
102
+ '@codemirror/gutter',
103
+ '@codemirror/highlight',
104
+ '@codemirror/history',
105
+ '@codemirror/matchbrackets',
106
+ '@codemirror/panel',
107
+ '@codemirror/rangeset',
108
+ '@codemirror/rectangular-selection',
109
+ '@codemirror/stream-parser',
110
+ '@codemirror/tooltip']
111
+ );
112
+
113
+ function requirePatched(id) {
114
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
115
+ return originalRequire?.(id);
116
+ }
117
+
118
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
119
+ if (globalThis.app.isMobile) {
120
+ if (id === 'process' || id === 'node:process') {
121
+ // eslint-disable-next-line no-console -- Valid usage.
122
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
123
+
124
+ return process;
125
+ }
126
+ } else {
127
+ const module = originalRequire?.(id);
128
+ if (module) {
129
+ return extractDefault(module);
130
+ }
131
+ }
132
+
133
+ // eslint-disable-next-line no-console -- Valid usage.
134
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
135
+ return {};
136
+ }
137
+ })();
138
+
139
+ "use strict";
140
+ var import_vitest = require('vitest');
141
+ var import_setup = require('./setup.cjs');
142
+ (0, import_setup.setup)({
143
+ afterAll: import_vitest.afterAll,
144
+ afterEach: import_vitest.afterEach,
145
+ beforeEach: import_vitest.beforeEach
146
+ });
147
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZpdGVzdC1zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFZpdGVzdCBzZXR1cCBmaWxlIGZvciBPYnNpZGlhbiBwbHVnaW5zIGJ1aWx0IG9uIGBAbW5hb3Vtb3Yvb2JzaWRpYW4tbGliYC5cbiAqXG4gKiBBZGQgaXQgdG8geW91ciBWaXRlc3QgY29uZmlnJ3MgYHNldHVwRmlsZXNgIChvciBpbXBvcnQgaXQgZnJvbSBhbm90aGVyIHNldHVwIGZpbGUpLiBCZWZvcmUgZWFjaFxuICogdGVzdCBpdCByZXNldHMgdGhlIGdlbmVyaWMgc2hhcmVkLXN0YXRlIHNsb3QsIHRoZSBgX19vYnNpZGlhbkRldlV0aWxzYCBiYWcgYW5kIHRoZSBsaWJyYXJ5IGNvbnRleHRzLCBhbmQgZW5hYmxlcyBhc3luYy1vcGVyYXRpb24gdHJhY2tpbmc7IGFmdGVyIGVhY2ggdGVzdCBpdFxuICogZGlzYWJsZXMgdHJhY2tpbmcsIHNvIHRlc3RzIGNhbiBgYXdhaXQgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9ucygpYCBhZ2FpbnN0IGlzb2xhdGVkIHN0YXRlLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGluIFZpdGVzdCBzZXR1cC1maWxlIGdsdWU7IHNldHVwIGlzIHVuaXQtdGVzdGVkIHNlcGFyYXRlbHkuICovXG5pbXBvcnQge1xuICBhZnRlckFsbCxcbiAgYWZ0ZXJFYWNoLFxuICBiZWZvcmVFYWNoXG59IGZyb20gJ3ZpdGVzdCc7XG5cbmltcG9ydCB7IHNldHVwIH0gZnJvbSAnLi9zZXR1cC50cyc7XG5cbnNldHVwKHtcbiAgYWZ0ZXJBbGwsXG4gIGFmdGVyRWFjaCxcbiAgYmVmb3JlRWFjaFxufSk7XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLG9CQUlPO0FBRVAsbUJBQXNCO0FBQUEsSUFFdEIsb0JBQU07QUFBQSxFQUNKO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,11 @@
1
+ /// <reference path="./index.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Vitest setup file for Obsidian plugins built on `@mnaoumov/obsidian-lib`.
6
+ *
7
+ * Add it to your Vitest config's `setupFiles` (or import it from another setup file). Before each
8
+ * test it resets the generic shared-state slot, the `__obsidianDevUtils` bag and the library contexts, and enables async-operation tracking; after each test it
9
+ * disables tracking, so tests can `await waitForAllAsyncOperations()` against isolated state.
10
+ */
11
+ export {};
@@ -0,0 +1,38 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * This module defines an esbuild plugin that automatically copies the build output
6
+ * to the Obsidian plugins folder during development. This plugin helps streamline
7
+ * the development workflow by ensuring that the latest build is always available
8
+ * in the correct Obsidian folder for testing and use.
9
+ */
10
+ import type { Plugin } from 'esbuild';
11
+ /**
12
+ * Parameters for {@link copyToObsidianPluginsFolderPlugin}.
13
+ */
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
+ }
32
+ /**
33
+ * Creates an esbuild plugin that copies the build output to the Obsidian plugins folder.
34
+ *
35
+ * @param params - The parameters for the function.
36
+ * @returns An esbuild `Plugin` object.
37
+ */
38
+ export declare function copyToObsidianPluginsFolderPlugin(params: CopyToObsidianPluginsFolderPluginParams): Plugin;
@@ -0,0 +1,226 @@
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
+ invokeAsyncSafely,
52
+ sleep
53
+ } from "@mnaoumov/typescript-lib/async";
54
+ import { getLibDebugger } from "@mnaoumov/typescript-lib/debug";
55
+ import {
56
+ dirname,
57
+ join,
58
+ toPosixPath
59
+ } from "@mnaoumov/typescript-lib/path";
60
+ import {
61
+ cp,
62
+ mkdir
63
+ } from "node:fs/promises";
64
+ import process from "node:process";
65
+ import {
66
+ createTransportFromOptions,
67
+ DesktopCdpTransport,
68
+ evalInObsidian
69
+ } from "obsidian-integration-testing";
70
+ const moduleState = {
71
+ devInstanceTransportPromise: void 0,
72
+ isDevInstanceCleanupRegistered: false,
73
+ isDevInstanceDisposed: false
74
+ };
75
+ const DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS = 2e3;
76
+ const DEV_INSTANCE_CLOSED_PROBE_COUNT = 3;
77
+ function copyToObsidianPluginsFolderPlugin(params) {
78
+ const {
79
+ distFolder,
80
+ isProductionBuild,
81
+ pluginName
82
+ } = params;
83
+ let {
84
+ obsidianConfigFolder
85
+ } = params;
86
+ return {
87
+ name: "copy-to-obsidian-plugins-folder",
88
+ setup(build) {
89
+ build.onEnd(async () => {
90
+ if (isProductionBuild) {
91
+ return;
92
+ }
93
+ if (!obsidianConfigFolder) {
94
+ getLibDebugger("copyToObsidianPluginsFolderPlugin")(
95
+ "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."
96
+ );
97
+ return;
98
+ }
99
+ obsidianConfigFolder = toPosixPath(obsidianConfigFolder);
100
+ const pluginFolder = join(obsidianConfigFolder, "plugins", pluginName);
101
+ await mkdir(pluginFolder, { recursive: true });
102
+ await cp(distFolder, pluginFolder, { recursive: true });
103
+ await installAndEnableHotReload({
104
+ obsidianConfigFolder,
105
+ pluginName
106
+ });
107
+ });
108
+ }
109
+ };
110
+ }
111
+ async function getOrLaunchDevInstance(vaultPath) {
112
+ moduleState.devInstanceTransportPromise ??= launchDevInstance(vaultPath);
113
+ try {
114
+ return await moduleState.devInstanceTransportPromise;
115
+ } catch (error) {
116
+ moduleState.devInstanceTransportPromise = void 0;
117
+ throw error;
118
+ }
119
+ }
120
+ async function installAndEnableHotReload(params) {
121
+ const {
122
+ obsidianConfigFolder,
123
+ pluginName
124
+ } = params;
125
+ const vaultPath = dirname(obsidianConfigFolder);
126
+ const transport = await getOrLaunchDevInstance(vaultPath);
127
+ await evalInObsidian({
128
+ // eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
129
+ async callback({ app, obsidianModule, pluginName: pluginName2 }) {
130
+ const HOT_RELOAD_PLUGIN_ID = "hot-reload";
131
+ const COMMUNITY_PLUGINS_REGISTRY_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";
132
+ const { requestUrl } = obsidianModule;
133
+ await app.plugins.setEnable(true);
134
+ if (!Object.hasOwn(app.plugins.manifests, HOT_RELOAD_PLUGIN_ID)) {
135
+ const registryResponse = await requestUrl(COMMUNITY_PLUGINS_REGISTRY_URL);
136
+ const registryEntries = registryResponse.json;
137
+ const entry = registryEntries.find((candidate) => candidate.id === HOT_RELOAD_PLUGIN_ID);
138
+ if (!entry) {
139
+ throw new Error(`Plugin '${HOT_RELOAD_PLUGIN_ID}' was not found in the Obsidian community plugins registry.`);
140
+ }
141
+ const latestReleaseResponse = await requestUrl(`https://api.github.com/repos/${entry.repo}/releases/latest`);
142
+ const latestRelease = latestReleaseResponse.json;
143
+ const version = latestRelease.tag_name;
144
+ const manifestResponse = await requestUrl(`https://github.com/${entry.repo}/releases/download/${version}/manifest.json`);
145
+ const manifest = manifestResponse.json;
146
+ await app.plugins.installPlugin(entry.repo, version, manifest);
147
+ }
148
+ if (!Object.hasOwn(app.plugins.plugins, HOT_RELOAD_PLUGIN_ID)) {
149
+ await app.plugins.enablePluginAndSave(HOT_RELOAD_PLUGIN_ID);
150
+ }
151
+ await app.plugins.enablePluginAndSave(pluginName2);
152
+ },
153
+ input: { pluginName },
154
+ shouldSkipPreflightChecks: true,
155
+ transport,
156
+ vaultPath
157
+ });
158
+ }
159
+ async function isDevInstanceRunning(cdpUrl) {
160
+ try {
161
+ const response = await fetch(`${cdpUrl}/json`);
162
+ const targets = await response.json();
163
+ return targets.some((target) => target.type === "page");
164
+ } catch {
165
+ return false;
166
+ }
167
+ }
168
+ async function launchDevInstance(vaultPath) {
169
+ const transport = await createTransportFromOptions();
170
+ try {
171
+ await transport.registerVault(vaultPath);
172
+ } catch (error) {
173
+ transport.disposeSync?.();
174
+ throw error;
175
+ }
176
+ registerDevInstanceCleanup(transport);
177
+ watchDevInstanceAndStopOnClose(transport);
178
+ return transport;
179
+ }
180
+ function registerDevInstanceCleanup(transport) {
181
+ if (moduleState.isDevInstanceCleanupRegistered) {
182
+ return;
183
+ }
184
+ moduleState.isDevInstanceCleanupRegistered = true;
185
+ process.on("exit", disposeDevInstance);
186
+ for (const signal of ["SIGHUP", "SIGINT", "SIGTERM"]) {
187
+ process.once(signal, () => {
188
+ disposeDevInstance();
189
+ process.exit();
190
+ });
191
+ }
192
+ function disposeDevInstance() {
193
+ if (moduleState.isDevInstanceDisposed) {
194
+ return;
195
+ }
196
+ moduleState.isDevInstanceDisposed = true;
197
+ transport.disposeSync?.();
198
+ }
199
+ }
200
+ function watchDevInstanceAndStopOnClose(transport) {
201
+ if (!(transport instanceof DesktopCdpTransport)) {
202
+ return;
203
+ }
204
+ const endpoint = transport.getOwnedInstanceEndpoint();
205
+ if (!endpoint) {
206
+ return;
207
+ }
208
+ const cdpUrl = `http://${endpoint.host}:${String(endpoint.port)}`;
209
+ invokeAsyncSafely(stopWhenDevInstanceCloses);
210
+ async function stopWhenDevInstanceCloses() {
211
+ let consecutiveFailedProbeCount = 0;
212
+ while (consecutiveFailedProbeCount < DEV_INSTANCE_CLOSED_PROBE_COUNT) {
213
+ await sleep({ milliseconds: DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS });
214
+ if (moduleState.isDevInstanceDisposed) {
215
+ return;
216
+ }
217
+ consecutiveFailedProbeCount = await isDevInstanceRunning(cdpUrl) ? 0 : consecutiveFailedProbeCount + 1;
218
+ }
219
+ console.warn("The Obsidian instance owned by `npm run dev` was closed. Stopping the development build.");
220
+ process.exit();
221
+ }
222
+ }
223
+ export {
224
+ copyToObsidianPluginsFolderPlugin
225
+ };
226
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jb3B5LXRvLW9ic2lkaWFuLXBsdWdpbnMtZm9sZGVyLXBsdWdpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZXNidWlsZCBwbHVnaW4gdGhhdCBhdXRvbWF0aWNhbGx5IGNvcGllcyB0aGUgYnVpbGQgb3V0cHV0XG4gKiB0byB0aGUgT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIgZHVyaW5nIGRldmVsb3BtZW50LiBUaGlzIHBsdWdpbiBoZWxwcyBzdHJlYW1saW5lXG4gKiB0aGUgZGV2ZWxvcG1lbnQgd29ya2Zsb3cgYnkgZW5zdXJpbmcgdGhhdCB0aGUgbGF0ZXN0IGJ1aWxkIGlzIGFsd2F5cyBhdmFpbGFibGVcbiAqIGluIHRoZSBjb3JyZWN0IE9ic2lkaWFuIGZvbGRlciBmb3IgdGVzdGluZyBhbmQgdXNlLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBlc2J1aWxkIHBsdWdpbiB0aGF0IGNvcGllcyBidWlsZCBvdXRwdXQgdG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXI7IHJlcXVpcmVzIGEgbGl2ZSBlc2J1aWxkIGNvbnRleHQuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuXG5pbXBvcnQge1xuICBpbnZva2VBc3luY1NhZmVseSxcbiAgc2xlZXBcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7XG4gIGRpcm5hbWUsXG4gIGpvaW4sXG4gIHRvUG9zaXhQYXRoXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIGNwLFxuICBta2RpclxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyxcbiAgRGVza3RvcENkcFRyYW5zcG9ydCxcbiAgZXZhbEluT2JzaWRpYW5cbn0gZnJvbSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcHlUb09ic2lkaWFuUGx1Z2luc0ZvbGRlclBsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2hlcmUgdGhlIGJ1aWx0IGZpbGVzIGFyZSBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBidWlsZCBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi4gSWYgbm90IHByb3ZpZGVkLCB0aGUgcGx1Z2luIHdpbGwgbm90IGNvcHkgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYSBDRFAgdGFyZ2V0IGRlc2NyaXB0b3IgcmVhZCBmcm9tIHRoZSBvd25lZCBpbnN0YW5jZSdzIGAvanNvbmAgZW5kcG9pbnQuXG4gKi9cbmludGVyZmFjZSBDZHBUYXJnZXQge1xuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIHRhcmdldCwgZS5nLiBgcGFnZWAuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgZW50cnkgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeSAoYGNvbW11bml0eS1wbHVnaW5zLmpzb25gKS5cbiAqL1xuaW50ZXJmYWNlIENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnkge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgb3duZXIvbmFtZWAgR2l0SHViIHJlcG9zaXRvcnkgdGhlIHBsdWdpbiBpcyBwdWJsaXNoZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgR2l0SHViIHJlbGVhc2Ugd2UgcmVhZC5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2Uge1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgdGFnLCBhIGJhcmUgdmVyc2lvbiBzdWNoIGFzIGAxLjIuM2AuXG4gICAqL1xuICByZWFkb25seSB0YWdfbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuQ29uZmlnRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBidWlsdCBPYnNpZGlhbiBwbHVnaW4gdG8gZW5hYmxlIG9uY2UgSG90UmVsb2FkIGlzIGluIHBsYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vLyBUaGUgYG5wbSBydW4gZGV2YC1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZTogbGF1bmNoZWQgb24gdGhlIGZpcnN0IHJlYnVpbGQgYW5kIHJldXNlZCBhY3Jvc3MgcmVidWlsZHMuXG4vLyBJdHMgbGlmZXRpbWUgaXMgdGllZCB0byB0aGUgYG5wbSBydW4gZGV2YCBwcm9jZXNzIGluIEJPVEggZGlyZWN0aW9ucy5cbi8vIFRoZSBpbnN0YW5jZSBpcyBjbG9zZWQgd2hlbiB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzIChzZWUgYHJlZ2lzdGVyRGV2SW5zdGFuY2VDbGVhbnVwYCkuXG4vLyBUaGUgcHJvY2VzcyBzdG9wcyB3aGVuIHRoZSBpbnN0YW5jZSBpcyBjbG9zZWQgKHNlZSBgd2F0Y2hEZXZJbnN0YW5jZUFuZFN0b3BPbkNsb3NlYCkuXG4vKipcbk1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlLCBoZWxkIGluIG9uZSBvYmplY3Qgc28gZWFjaCBtdXRhdGlvbiBuYW1lcyBpdCBleHBsaWNpdGx5LlxuICovXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICBkZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHwgdW5kZWZpbmVkO1xuICBpc0Rldkluc3RhbmNlQ2xlYW51cFJlZ2lzdGVyZWQ6IGJvb2xlYW47XG4gIGlzRGV2SW5zdGFuY2VEaXNwb3NlZDogYm9vbGVhbjtcbn1cblxuY29uc3QgbW9kdWxlU3RhdGU6IE1vZHVsZVN0YXRlID0ge1xuICBkZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U6IHVuZGVmaW5lZCxcbiAgaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkOiBmYWxzZSxcbiAgaXNEZXZJbnN0YW5jZURpc3Bvc2VkOiBmYWxzZVxufTtcblxuLyoqXG4gKiBIb3cgb2Z0ZW4gdGhlIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGlzIHByb2JlZCB0byBkZXRlY3QgdGhhdCBpdCB3YXMgY2xvc2VkLlxuICovXG5jb25zdCBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcblxuLyoqXG4gKiBIb3cgbWFueSBjb25zZWN1dGl2ZSBmYWlsZWQgcHJvYmVzIGFyZSB0b2xlcmF0ZWQgYmVmb3JlIHRoZSBvd25lZCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGNsb3NlZC4gQVxuICogc2luZ2xlIGZhaWx1cmUgY2FuIGJlIGEgdHJhbnNpZW50IGhpY2N1cCAoYSBidXN5IHJlbmRlcmVyLCBhIG1vbWVudGFyaWx5IHJlZnVzZWQgY29ubmVjdGlvbiksIHNvIHRoZVxuICogZGV2ZWxvcG1lbnQgYnVpbGQgaXMgb25seSBzdG9wcGVkIG9uY2UgdGhlIGVuZHBvaW50IHN0YXlzIHVucmVhY2hhYmxlLlxuICovXG5jb25zdCBERVZfSU5TVEFOQ0VfQ0xPU0VEX1BST0JFX0NPVU5UID0gMztcbi8qKlxuICogQ3JlYXRlcyBhbiBlc2J1aWxkIHBsdWdpbiB0aGF0IGNvcGllcyB0aGUgYnVpbGQgb3V0cHV0IHRvIHRoZSBPYnNpZGlhbiBwbHVnaW5zIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEFuIGVzYnVpbGQgYFBsdWdpbmAgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luKHBhcmFtczogQ29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luUGFyYW1zKTogUGx1Z2luIHtcbiAgY29uc3Qge1xuICAgIGRpc3RGb2xkZXIsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuICBsZXQge1xuICAgIG9ic2lkaWFuQ29uZmlnRm9sZGVyXG4gIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2NvcHktdG8tb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXInLFxuICAgIHNldHVwKGJ1aWxkKTogdm9pZCB7XG4gICAgICBidWlsZC5vbkVuZChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2JzaWRpYW5Db25maWdGb2xkZXIpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luJykoXG4gICAgICAgICAgICAnTm8gT2JzaWRpYW4gY29uZmlnIGZvbGRlciBjb25maWd1cmVkLiBgT0JTSURJQU5fQ09ORklHX0ZPTERFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCBpbiBzeXN0ZW0gb3IgaW4gYC5lbnZgIGZpbGUuIFRoZSBjb21waWxlZCBwbHVnaW4gd2lsbCBub3QgYmUgY29waWVkIGludG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIuJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzaWRpYW5Db25maWdGb2xkZXIgPSB0b1Bvc2l4UGF0aChvYnNpZGlhbkNvbmZpZ0ZvbGRlcik7XG5cbiAgICAgICAgY29uc3QgcGx1Z2luRm9sZGVyID0gam9pbihvYnNpZGlhbkNvbmZpZ0ZvbGRlciwgJ3BsdWdpbnMnLCBwbHVnaW5OYW1lKTtcbiAgICAgICAgYXdhaXQgbWtkaXIocGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgY3AoZGlzdEZvbGRlciwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHtcbiAgICAgICAgICBvYnNpZGlhbkNvbmZpZ0ZvbGRlcixcbiAgICAgICAgICBwbHVnaW5OYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB2YXVsdCwgbGF1bmNoaW5nIGl0IG9uIGZpcnN0IHVzZSBhbmRcbiAqIHJldXNpbmcgaXQgb24gc3Vic2VxdWVudCByZWJ1aWxkcy5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlciB0byBvcGVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBvd25lZCB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnR9LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPckxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2UgPz89IGxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG1vZHVsZVN0YXRlLmRldkluc3RhbmNlVHJhbnNwb3J0UHJvbWlzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBDbGVhciB0aGUgY2FjaGUgc28gYSBsYXRlciByZWJ1aWxkIHJldHJpZXMgdGhlIGxhdW5jaC5cbiAgICBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgSG90UmVsb2FkIHBsdWdpbiBmcm9tIHRoZSBvZmZpY2lhbCBjb21tdW5pdHkgc3RvcmUgKGlmIG5vdCBhbHJlYWR5IGluc3RhbGxlZCksIGxvYWRzIGl0XG4gKiAoaWYgbm90IGFscmVhZHkgcnVubmluZyksIGFuZCBlbmFibGVzIHRoZSBmcmVzaGx5LWJ1aWx0IHBsdWdpbiBcdTIwMTQgYWxsIHRocm91Z2ggdGhlIGBucG0gcnVuIGRldmAtb3duZWRcbiAqIE9ic2lkaWFuIGluc3RhbmNlLCBzbyBIb3RSZWxvYWQgdGhlbiBhdXRvLXJlZnJlc2hlcyB0aGUgZGVwbG95ZWQgcGx1Z2luIG9uIGV2ZXJ5IHJlYnVpbGQuXG4gKlxuICogVGhlIGluc3RhbGwgZ29lcyB0aHJvdWdoIE9ic2lkaWFuJ3Mgb3duIGBpbnN0YWxsUGx1Z2luYCAodGhlIGNvbW11bml0eS1zdG9yZSBtZWNoYW5pc20pLCBhbmQgZXZlcnkgc3RlcFxuICogcnVucyBhZ2FpbnN0IHRoZSBvd25lZCBpbnN0YW5jZSBvdmVyIENEUDsgYW55IGZhaWx1cmUgc3VyZmFjZXMgKHRoZSBkZXYgYnVpbGQgcmVwb3J0cyBpdCkgcmF0aGVyIHRoYW5cbiAqIGJlaW5nIHNpbGVudGx5IHN3YWxsb3dlZC5cbiAqXG4gKiBUaGUgZmlyc3Qgc3RlcCBpcyBsZWF2aW5nIHJlc3RyaWN0ZWQgbW9kZSBmb3IgcmVhbCwgd2hpY2ggdGhlIG93bmVkIGluc3RhbmNlIGhhcyBvbmx5IGZha2VkIHNvIGZhciBcdTIwMTRcbiAqIHdpdGhvdXQgaXQgXCJlbmFibGVkXCIgYW5kIFwibG9hZGVkXCIgY29tZSBhcGFydCBhbmQgbm9uZSBvZiB0aGUgdmF1bHQncyBwbHVnaW5zLCBIb3RSZWxvYWQgaW5jbHVkZWQsIGFyZVxuICogcnVubmluZy4gU2VlIHRoZSBjb21tZW50IG9uIHRoZSBgc2V0RW5hYmxlYCBjYWxsLlxuICpcbiAqIFRoZSBpbnN0YWxsLWlmLW1pc3NpbmcgLyBlbmFibGUtaWYtZGlzYWJsZWQgbG9naWMgYmVsb3cgaW50ZW50aW9uYWxseSBtaXJyb3JzIHRoZSBwdWJsaWNcbiAqIGBpbnN0YWxsQ29tbXVuaXR5UGx1Z2luYCAvIGBlbmFibGVDb21tdW5pdHlQbHVnaW5gIGhlbHBlcnMgaW4gYHNyYy9vYnNpZGlhbi9jb21tdW5pdHktcGx1Z2lucy50c2AuIEl0XG4gKiBjYW5ub3QgaW1wb3J0IGFuZCBjYWxsIHRoZW06IHRoZSBgZm5gIGlzIHNlcmlhbGl6ZWQgKGB0b1N0cmluZygpYCkgYW5kIGV4ZWN1dGVkIGluIHRoZSByZW5kZXJlciwgYW5kXG4gKiB0aGlzIGJ1aWxkLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGlzIGJhcmUgXHUyMDE0IGl0IGhhcyBubyBkZXYtdXRpbHMgYGxpYmAgcHJvdmlkZXIgd2lyZWQgKHRoYXQgcmVzb2x2ZXIgaXNcbiAqIHJlZ2lzdGVyZWQgb25seSBpbiB0aGUgaW50ZWdyYXRpb24tdGVzdCBzZXR1cCwgd2hvc2UgZml4dHVyZSBwdWJsaXNoZXMgdGhlIG1lcmdlZCBzdXJmYWNlIG9uIGB3aW5kb3dgKSxcbiAqIHNvIHRoZSBjbG9zdXJlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIGxpYnJhcnkgc3VyZmFjZSBhbmQgbXVzdCBpbmxpbmUgdGhlIGVxdWl2YWxlbnQgc3RlcHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgSW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZFBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgSG90UmVsb2FkIGFuZCB0aGUgYnVpbHQgcGx1Z2luIGFyZSBpbnN0YWxsZWQgYW5kIGVuYWJsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWQocGFyYW1zOiBJbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBvYnNpZGlhbkNvbmZpZ0ZvbGRlcixcbiAgICBwbHVnaW5OYW1lXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHZhdWx0UGF0aCA9IGRpcm5hbWUob2JzaWRpYW5Db25maWdGb2xkZXIpO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBnZXRPckxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aCk7XG4gIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIE5vIGFjdHVhbCBzaGFkb3dpbmcgYXMgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGV4dGVybmFsbHkuXG4gICAgYXN5bmMgY2FsbGJhY2soeyBhcHAsIG9ic2lkaWFuTW9kdWxlLCBwbHVnaW5OYW1lIH0pIHtcbiAgICAgIGNvbnN0IEhPVF9SRUxPQURfUExVR0lOX0lEID0gJ2hvdC1yZWxvYWQnO1xuICAgICAgY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMID0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG4gICAgICBjb25zdCB7IHJlcXVlc3RVcmwgfSA9IG9ic2lkaWFuTW9kdWxlO1xuXG4gICAgICAvKlxuICAgICAgICogR2VudWluZWx5IGxlYXZlIHJlc3RyaWN0ZWQgbW9kZSBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcgZWxzZS4gVGhlIG93bmVkIGluc3RhbmNlIGJvb3RzIHdpdGggYVxuICAgICAgICogZnJlc2ggdXNlci1kYXRhIGRpciwgc28gT2JzaWRpYW4gc3RhcnRzIHJlc3RyaWN0ZWQgYW5kIGBQbHVnaW5zLmluaXRpYWxpemUoKWAgcmV0dXJucyBiZWZvcmVcbiAgICAgICAqIGxvYWRpbmcgYSBzaW5nbGUgcGx1Z2luLiBUaGUgaGFybmVzcyB0aGVuIGNsb3NlcyB0aGUgdHJ1c3QgbW9kYWwgYW5kIHdyaXRlcyB0aGVcbiAgICAgICAqIGBlbmFibGUtcGx1Z2luLTxhcHBJZD5gIGxvY2FsU3RvcmFnZSBmbGFnIGRpcmVjdGx5IFx1MjAxNCBkZWxpYmVyYXRlbHksIHRvIGF2b2lkIGEgc3luY2hyb25vdXMgbG9hZCBcdTIwMTRcbiAgICAgICAqIHdoaWNoIGxlYXZlcyBgaXNFbmFibGVkKClgIHJlcG9ydGluZyBgdHJ1ZWAgb3ZlciBhIHZhdWx0IHdoZXJlIG5vdGhpbmcgaXMgYWN0dWFsbHkgcnVubmluZy4gRXZlcnlcbiAgICAgICAqIGBlbmFibGVkUGx1Z2luc2AgcmVhZGluZyBiZWxvdyAoYW5kIGluIHRoZSBtaXJyb3JlZCBgY29tbXVuaXR5LXBsdWdpbnMudHNgIGhlbHBlcnMpIHdvdWxkIGJlXG4gICAgICAgKiBhbnN3ZXJpbmcgYWJvdXQgdGhlIHZhdWx0J3MgY29uZmlnIGZpbGUgcmF0aGVyIHRoYW4gdGhpcyBpbnN0YW5jZS5cbiAgICAgICAqXG4gICAgICAgKiBgc2V0RW5hYmxlKHRydWUpYCBpcyB3aGF0IE9ic2lkaWFuJ3Mgb3duIFwiRXhpdCByZXN0cmljdGVkIG1vZGVcIiBidXR0b24gY2FsbHM6IGl0IHJlLWFzc2VydHMgdGhlXG4gICAgICAgKiBmbGFnIGFuZCBsb2FkcyBldmVyeXRoaW5nIGluIGBlbmFibGVkUGx1Z2luc2AuIFVuY29uZGl0aW9uYWwgb24gcHVycG9zZSBcdTIwMTQgdGhlIGZsYWcgaXMgYWxyZWFkeVxuICAgICAgICogYHRydWVgLCBzbyBhbiBgaXNFbmFibGVkKClgIGd1YXJkIHdvdWxkIHNraXAgdGhlIGxvYWQgdGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQuIElkZW1wb3RlbnQgYW5kXG4gICAgICAgKiBlZmZlY3RpdmVseSBmcmVlIG9uY2Ugd2FybSAoYGxvYWRQbHVnaW5gIHJldHVybnMgdGhlIGxpdmUgaW5zdGFuY2UpLCBzbyByZS1ydW5uaW5nIGl0IG9uIGV2ZXJ5XG4gICAgICAgKiByZWJ1aWxkIGNvc3RzIG5vdGhpbmcuXG4gICAgICAgKi9cbiAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcblxuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLm1hbmlmZXN0cywgSE9UX1JFTE9BRF9QTFVHSU5fSUQpKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5UmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5RW50cmllcyA9IHJlZ2lzdHJ5UmVzcG9uc2UuanNvbiBhcyBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W107XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gcmVnaXN0cnlFbnRyaWVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSBIT1RfUkVMT0FEX1BMVUdJTl9JRCk7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtIT1RfUkVMT0FEX1BMVUdJTl9JRH0nIHdhcyBub3QgZm91bmQgaW4gdGhlIE9ic2lkaWFuIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGF0ZXN0UmVsZWFzZVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke2VudHJ5LnJlcG99L3JlbGVhc2VzL2xhdGVzdGApO1xuICAgICAgICBjb25zdCBsYXRlc3RSZWxlYXNlID0gbGF0ZXN0UmVsZWFzZVJlc3BvbnNlLmpzb24gYXMgR2l0SHViUmVsZWFzZTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGxhdGVzdFJlbGVhc2UudGFnX25hbWU7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0UmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKGBodHRwczovL2dpdGh1Yi5jb20vJHtlbnRyeS5yZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259L21hbmlmZXN0Lmpzb25gKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBtYW5pZmVzdFJlc3BvbnNlLmpzb24gYXMgUGx1Z2luTWFuaWZlc3Q7XG4gICAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLmluc3RhbGxQbHVnaW4oZW50cnkucmVwbywgdmVyc2lvbiwgbWFuaWZlc3QpO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICogQXNrIHdoZXRoZXIgSG90UmVsb2FkIGlzIFJVTk5JTkcsIG5vdCB3aGV0aGVyIHRoZSB2YXVsdCBjb25maWcgbGlzdHMgaXQgYXMgZW5hYmxlZC4gQWZ0ZXIgdGhlXG4gICAgICAgKiBgc2V0RW5hYmxlYCBhYm92ZSB0aGUgdHdvIG5vcm1hbGx5IGFncmVlLCBidXQgYSBIb3RSZWxvYWQgdGhhdCBpcyBsaXN0ZWQgYW5kIGZhaWxlZCB0byBsb2FkIHdvdWxkXG4gICAgICAgKiBwYXNzIGFuIGBlbmFibGVkUGx1Z2luc2AgY2hlY2sgd2hpbGUgbGVhdmluZyB0aGUgZGV2IGJ1aWxkIHdpdGhvdXQgYXV0by1yZWZyZXNoLlxuICAgICAgICovXG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oYXBwLnBsdWdpbnMucGx1Z2lucywgSE9UX1JFTE9BRF9QTFVHSU5fSUQpKSB7XG4gICAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbkFuZFNhdmUoSE9UX1JFTE9BRF9QTFVHSU5fSUQpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKHBsdWdpbk5hbWUpO1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgcGx1Z2luTmFtZSB9LFxuICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9KTtcbn1cblxuLyoqXG4gKiBQcm9iZXMgdGhlIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlJ3MgQ0RQIGVuZHBvaW50IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHN0aWxsIHJ1bm5pbmcuXG4gKlxuICogQSBjbG9zZWQgaW5zdGFuY2Ugc3RvcHMgc2VydmluZyBDRFAgYWx0b2dldGhlciwgc28gYW4gdW5yZWFjaGFibGUgZW5kcG9pbnQgXHUyMDE0IG9yIG9uZSBsZWZ0IHdpdGggbm8gcGFnZVxuICogdGFyZ2V0cyB3aGlsZSB0aGUgYXBwIHRlYXJzIGl0c2VsZiBkb3duIFx1MjAxNCBtZWFucyB0aGUgaW5zdGFuY2UgaXMgZ29uZS5cbiAqXG4gKiBAcGFyYW0gY2RwVXJsIC0gVGhlIGJhc2UgQ0RQIFVSTCBvZiB0aGUgb3duZWQgaW5zdGFuY2UsIGUuZy4gYGh0dHA6Ly9sb2NhbGhvc3Q6NTE4ODhgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIGB0cnVlYCB3aGlsZSB0aGUgaW5zdGFuY2UgaXMgc3RpbGwgc2VydmluZyBhIHBhZ2UgdGFyZ2V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBpc0Rldkluc3RhbmNlUnVubmluZyhjZHBVcmw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gV2UgcnVuIHRoaXMgb3V0c2lkZSBvZiBPYnNpZGlhbiwgc28gd2UgZG9uJ3QgaGF2ZSBgcmVxdWVzdFVybCgpYC5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2NkcFVybH0vanNvbmApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2RwVGFyZ2V0W107XG4gICAgcmV0dXJuIHRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQudHlwZSA9PT0gJ3BhZ2UnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogTGF1bmNoZXMgYSBmcmVzaCBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSAoaXNvbGF0ZWQgdXNlci1kYXRhIGRpcikgYW5kIG9wZW5zIHRoZSBnaXZlbiB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlciB0byBvcGVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBsYXVuY2hlZCB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnR9LlxuICovXG5hc3luYyBmdW5jdGlvbiBsYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0cmFuc3BvcnQucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRyYW5zcG9ydC5kaXNwb3NlU3luYz8uKCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0KTtcbiAgd2F0Y2hEZXZJbnN0YW5jZUFuZFN0b3BPbkNsb3NlKHRyYW5zcG9ydCk7XG4gIHJldHVybiB0cmFuc3BvcnQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2Nlc3MtZXhpdCBhbmQgc2lnbmFsIGhhbmRsZXJzIChvbmNlKSB0aGF0IHN5bmNocm9ub3VzbHkgY2xvc2UgdGhlIG93bmVkIE9ic2lkaWFuXG4gKiBpbnN0YW5jZSB3aGVuIHRoZSBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcy5cbiAqXG4gKiBUaGVzZSBoYW5kbGVycyBjb3ZlciBhbiBvcmRlcmx5IHNodXRkb3duLiBBIGBTSUdLSUxMYCAob3IgYSBUYXNrIE1hbmFnZXIgLyBJREUgc3RvcCkgcnVucyBubyBoYW5kbGVyXG4gKiBhdCBhbGwsIGFuZCBubyBvcGVyYXRpbmcgc3lzdGVtIGtpbGxzIHRoZSBpbnN0YW5jZSBqdXN0IGZvciBiZWluZyBvdXIgY2hpbGQgXHUyMDE0IHNvIHRoYXQgY2FzZSBpcyBjYXVnaHRcbiAqIGZyb20gdGhlIG90aGVyIHNpZGUsIGJ5IHRoZSBoYXJuZXNzJ3MgcGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nOiB0aGUgaW5zdGFuY2UncyByZW5kZXJlciBob2xkcyBhIHNvY2tldFxuICogYmFjayB0byB0aGlzIHByb2Nlc3MgYW5kIGRlc3Ryb3lzIGl0cyB3aW5kb3cgd2hlbiB0aGUga2VybmVsIGNsb3NlcyBpdC4gU2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgIGluXG4gKiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSBvd25lZCB0cmFuc3BvcnQgdG8gZGlzcG9zZSBvbiBzaHV0ZG93bi5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gYGV4aXRgIGNvdmVycyBhbnkgYHByb2Nlc3MuZXhpdCgpYCwgYnV0IGEgZGVmYXVsdCBDdHJsK0MgdGVybWluYXRlcyBXSVRIT1VUIGZpcmluZyBgZXhpdGAsIHNvIHRoZSBzaWduYWwgaGFuZGxlcnMgZ3VhcmFudGVlIHRoZSBvd25lZCBPYnNpZGlhbiBpcyBraWxsZWQgb24gc2h1dGRvd24uXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCBkaXNwb3NlRGV2SW5zdGFuY2UpO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTSddIGFzIGNvbnN0KSB7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgZGlzcG9zZURldkluc3RhbmNlKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VEZXZJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VEaXNwb3NlZCA9IHRydWU7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoZXMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYW5kIHN0b3BzIHRoZSBkZXZlbG9wbWVudCBidWlsZCBvbmNlIHRoZSBpbnN0YW5jZSBpc1xuICogY2xvc2VkLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1pcnJvciBpbWFnZSBvZiB7QGxpbmsgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXB9OiB0aGF0IG9uZSBjbG9zZXMgdGhlIGluc3RhbmNlIHdoZW4gdGhlXG4gKiBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcywgdGhpcyBvbmUgdGVybWluYXRlcyB0aGUgcHJvY2VzcyB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgaW5zdGFuY2UsIHNvXG4gKiB0aGUgdHdvIG5ldmVyIG91dGxpdmUgZWFjaCBvdGhlci4gQSBidWlsZCB3YXRjaGluZyBhbiBPYnNpZGlhbiB0aGF0IGlzIG5vIGxvbmdlciBydW5uaW5nIGhhcyBub3RoaW5nXG4gKiBsZWZ0IHRvIGRlcGxveSB0by5cbiAqXG4gKiBPbmx5IGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSBpcyB3YXRjaGVkLiBXaGVuIHRoZSB0cmFuc3BvcnQgYXR0YWNoZXMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuXG4gKiAodGhlIHVzZXIncyBvd24pLCB0aGF0IGluc3RhbmNlIGlzIG5vdCBvdXJzIHRvIGJlIHRpZWQgdG8gYW5kIGNsb3NpbmcgaXQgbGVhdmVzIHRoZSBidWlsZCBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgb3duZWQgdHJhbnNwb3J0IHdob3NlIGluc3RhbmNlIHRvIHdhdGNoLlxuICovXG5mdW5jdGlvbiB3YXRjaERldkluc3RhbmNlQW5kU3RvcE9uQ2xvc2UodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAoISh0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2VuZHBvaW50Lmhvc3R9OiR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWA7XG4gIGludm9rZUFzeW5jU2FmZWx5KHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA9IDA7XG4gICAgd2hpbGUgKGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA8IERFVl9JTlNUQU5DRV9DTE9TRURfUFJPQkVfQ09VTlQpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTIH0pO1xuXG4gICAgICAvLyBUaGUgcHJvY2VzcyBpcyBhbHJlYWR5IHNodXR0aW5nIGRvd24gYW5kIGtpbGxlZCB0aGUgaW5zdGFuY2UgaXRzZWxmOyB0aGUgcHJvYmVzIHdvdWxkIGp1c3QgcmFjZSB0aGUgdGVhcmRvd24uXG4gICAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc2VjdXRpdmVGYWlsZWRQcm9iZUNvdW50ID0gYXdhaXQgaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsKSA/IDAgOiBjb25zZWN1dGl2ZUZhaWxlZFByb2JlQ291bnQgKyAxO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybignVGhlIE9ic2lkaWFuIGluc3RhbmNlIG93bmVkIGJ5IGBucG0gcnVuIGRldmAgd2FzIGNsb3NlZC4gU3RvcHBpbmcgdGhlIGRldmVsb3BtZW50IGJ1aWxkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sYUFBYTtBQUNwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUEwRlAsTUFBTSxjQUEyQjtBQUFBLEVBQy9CLDZCQUE2QjtBQUFBLEVBQzdCLGdDQUFnQztBQUFBLEVBQ2hDLHVCQUF1QjtBQUN6QjtBQUtBLE1BQU0sOENBQThDO0FBT3BELE1BQU0sa0NBQWtDO0FBT2pDLFNBQVMsa0NBQWtDLFFBQXlEO0FBQ3pHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJO0FBQUEsSUFDRjtBQUFBLEVBQ0YsSUFBSTtBQUNKLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLE1BQU0sT0FBYTtBQUNqQixZQUFNLE1BQU0sWUFBWTtBQUN0QixZQUFJLG1CQUFtQjtBQUNyQjtBQUFBLFFBQ0Y7QUFFQSxZQUFJLENBQUMsc0JBQXNCO0FB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
@@ -0,0 +1,20 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * This module provides utilities for managing dependencies during the esbuild process.
6
+ * It includes functions to determine which dependencies should be skipped and which
7
+ * should be bundled, as well as an esbuild plugin for extracting dependencies to bundle.
8
+ */
9
+ /**
10
+ * Determines which dependencies should be bundled by esbuild.
11
+ *
12
+ * @returns A {@link Promise} that resolves to an array of dependency names to bundle.
13
+ */
14
+ export declare function getDependenciesToBundle(): Promise<string[]>;
15
+ /**
16
+ * Retrieves the list of dependencies that should be skipped during the bundling process.
17
+ *
18
+ * @returns A {@link Promise} that resolves to a {@link Set} of dependency names to skip.
19
+ */
20
+ export declare function getDependenciesToSkip(): Promise<Set<string>>;
@@ -0,0 +1,138 @@
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 { readPackageJson } from "@mnaoumov/typescript-dev-toolkit/npm";
51
+ import { RepoPaths } from "@mnaoumov/typescript-dev-toolkit/repo-paths";
52
+ import {
53
+ getFolderName,
54
+ join
55
+ } from "@mnaoumov/typescript-lib/path";
56
+ import { trimStart } from "@mnaoumov/typescript-lib/string";
57
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
58
+ import { context } from "esbuild";
59
+ import {
60
+ builtinModules,
61
+ createRequire
62
+ } from "node:module";
63
+ import {
64
+ banner,
65
+ invokeEsbuild
66
+ } from "./obsidian-plugin-builder.mjs";
67
+ import { preprocessPlugin } from "./preprocess-plugin.mjs";
68
+ const esmRequire = createRequire(import.meta.url);
69
+ async function getDependenciesToBundle() {
70
+ const dependenciesToSkip = await getDependenciesToSkip();
71
+ const dependenciesToBundle = /* @__PURE__ */ new Set();
72
+ const buildOptions = {
73
+ banner: {
74
+ js: banner
75
+ },
76
+ bundle: true,
77
+ entryPoints: [join(RepoPaths.Src, RepoPaths.AnyPath, RepoPaths.AnyTs)],
78
+ format: "cjs",
79
+ logLevel: "info",
80
+ outdir: "nothing-will-be-written-on-disk-so-this-does-not-matter",
81
+ platform: "node",
82
+ plugins: [
83
+ preprocessPlugin(),
84
+ extractDependenciesToBundlePlugin({
85
+ dependenciesToBundle,
86
+ dependenciesToSkip
87
+ })
88
+ ],
89
+ sourcemap: "inline",
90
+ target: "ES2022",
91
+ treeShaking: true,
92
+ write: false
93
+ };
94
+ const buildContext = await context(buildOptions);
95
+ await invokeEsbuild(buildContext, true);
96
+ return [...dependenciesToBundle].sort();
97
+ }
98
+ async function getDependenciesToSkip() {
99
+ const packageJson = await readPackageJson(getFolderName(import.meta.url));
100
+ const dependenciesToSkip = /* @__PURE__ */ new Set([...builtinModules, ...Object.keys(packageJson.dependencies ?? {}).filter((dependency) => canSkipFromBundling(dependency))]);
101
+ return dependenciesToSkip;
102
+ }
103
+ function canSkipFromBundling(moduleName) {
104
+ if (moduleName.startsWith("@types/") || moduleName.startsWith("obsidian") || moduleName === "esbuild") {
105
+ return true;
106
+ }
107
+ try {
108
+ const module = esmRequire(moduleName);
109
+ return !module.default;
110
+ } catch {
111
+ return false;
112
+ }
113
+ }
114
+ function extractDependenciesToBundlePlugin(params) {
115
+ const { dependenciesToBundle, dependenciesToSkip } = params;
116
+ return {
117
+ name: "test",
118
+ setup(build) {
119
+ build.onResolve({ filter: /^[^./]/ }, ($arguments) => {
120
+ if (!$arguments.importer.endsWith(RepoPaths.DtsExtension)) {
121
+ const moduleName = trimStart({
122
+ $string: ensureNonNullable($arguments.path.split("/", 1)[0], "Wrong path"),
123
+ prefix: "node:"
124
+ });
125
+ if (!dependenciesToSkip.has($arguments.path) && !dependenciesToSkip.has(moduleName)) {
126
+ dependenciesToBundle.add($arguments.path);
127
+ }
128
+ }
129
+ return { external: true, path: $arguments.path };
130
+ });
131
+ }
132
+ };
133
+ }
134
+ export {
135
+ getDependenciesToBundle,
136
+ getDependenciesToSkip
137
+ };
138
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9kZXBlbmRlbmN5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBtYW5hZ2luZyBkZXBlbmRlbmNpZXMgZHVyaW5nIHRoZSBlc2J1aWxkIHByb2Nlc3MuXG4gKiBJdCBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHdoaWNoIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgc2tpcHBlZCBhbmQgd2hpY2hcbiAqIHNob3VsZCBiZSBidW5kbGVkLCBhcyB3ZWxsIGFzIGFuIGVzYnVpbGQgcGx1Z2luIGZvciBleHRyYWN0aW5nIGRlcGVuZGVuY2llcyB0byBidW5kbGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIGVzYnVpbGQgcGx1Z2luIHRoYXQgcmVzb2x2ZXMgZGVwZW5kZW5jaWVzIGF0IGJ1aWxkIHRpbWU7IHJlcXVpcmVzIGEgbGl2ZSBlc2J1aWxkIGNvbnRleHQuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRPcHRpb25zLFxuICBQbHVnaW5cbn0gZnJvbSAnZXNidWlsZCc7XG5cbmltcG9ydCB7IHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L25wbSc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZXBvLXBhdGhzJztcbmltcG9ydCB7XG4gIGdldEZvbGRlck5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgdHJpbVN0YXJ0IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBjb250ZXh0IH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQge1xuICBidWlsdGluTW9kdWxlcyxcbiAgY3JlYXRlUmVxdWlyZVxufSBmcm9tICdub2RlOm1vZHVsZSc7XG5cbmltcG9ydCB7XG4gIGJhbm5lcixcbiAgaW52b2tlRXNidWlsZFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZGVyLnRzJztcbmltcG9ydCB7IHByZXByb2Nlc3NQbHVnaW4gfSBmcm9tICcuL3ByZXByb2Nlc3MtcGx1Z2luLnRzJztcblxuY29uc3QgZXNtUmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXh0cmFjdERlcGVuZGVuY2llc1RvQnVuZGxlUGx1Z2lufS5cbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3REZXBlbmRlbmNpZXNUb0J1bmRsZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHNldCB3aGVyZSB0aGUgbmFtZXMgb2YgZGVwZW5kZW5jaWVzIHRvIGJlIGJ1bmRsZWQgd2lsbCBiZSBhZGRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llc1RvQnVuZGxlOiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogQSBzZXQgb2YgZGVwZW5kZW5jeSBuYW1lcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGR1cmluZyBidW5kbGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llc1RvU2tpcDogU2V0PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBNb2R1bGVXaXRoRGVmYXVsdEV4cG9ydCB7XG4gIGRlZmF1bHQ6IHVua25vd247XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIGJ1bmRsZWQgYnkgZXNidWlsZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGRlcGVuZGVuY3kgbmFtZXMgdG8gYnVuZGxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzVG9CdW5kbGUoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb1NraXAgPSBhd2FpdCBnZXREZXBlbmRlbmNpZXNUb1NraXAoKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9CdW5kbGUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCBidWlsZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucyA9IHtcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBiYW5uZXJcbiAgICB9LFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBlbnRyeVBvaW50czogW2pvaW4oUmVwb1BhdGhzLlNyYywgUmVwb1BhdGhzLkFueVBhdGgsIFJlcG9QYXRocy5BbnlUcyldLFxuICAgIGZvcm1hdDogJ2NqcycsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6ICdub3RoaW5nLXdpbGwtYmUtd3JpdHRlbi1vbi1kaXNrLXNvLXRoaXMtZG9lcy1ub3QtbWF0dGVyJyxcbiAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIHByZXByb2Nlc3NQbHVnaW4oKSxcbiAgICAgIGV4dHJhY3REZXBlbmRlbmNpZXNUb0J1bmRsZVBsdWdpbih7XG4gICAgICAgIGRlcGVuZGVuY2llc1RvQnVuZGxlLFxuICAgICAgICBkZXBlbmRlbmNpZXNUb1NraXBcbiAgICAgIH0pXG4gICAgXSxcbiAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgd3JpdGU6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgY29udGV4dChidWlsZE9wdGlvbnMpO1xuICBhd2FpdCBpbnZva2VFc2J1aWxkKGJ1aWxkQ29udGV4dCwgdHJ1ZSk7XG4gIHJldHVybiBbLi4uZGVwZW5kZW5jaWVzVG9CdW5kbGVdLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBidW5kbGluZyBwcm9jZXNzLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgU2V0fSBvZiBkZXBlbmRlbmN5IG5hbWVzIHRvIHNraXAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZXBlbmRlbmNpZXNUb1NraXAoKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihnZXRGb2xkZXJOYW1lKGltcG9ydC5tZXRhLnVybCkpO1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb1NraXAgPSBuZXcgU2V0PHN0cmluZz4oWy4uLmJ1aWx0aW5Nb2R1bGVzLCAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gY2FuU2tpcEZyb21CdW5kbGluZyhkZXBlbmRlbmN5KSldKTtcbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvU2tpcDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBtb2R1bGUgY2FuIGJlIHNraXBwZWQgZnJvbSBidW5kbGluZy5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtb2R1bGUgY2FuIGJlIHNraXBwZWQgZnJvbSBidW5kbGluZy5cbiAqL1xuZnVuY3Rpb24gY2FuU2tpcEZyb21CdW5kbGluZyhtb2R1bGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKG1vZHVsZU5hbWUuc3RhcnRzV2l0aCgnQHR5cGVzLycpIHx8IG1vZHVsZU5hbWUuc3RhcnRzV2l0aCgnb2JzaWRpYW4nKSB8fCAobW9kdWxlTmFtZSA9PT0gJ2VzYnVpbGQnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtb2R1bGUgPSBlc21SZXF1aXJlKG1vZHVsZU5hbWUpIGFzIE1vZHVsZVdpdGhEZWZhdWx0RXhwb3J0O1xuICAgIHJldHVybiAhbW9kdWxlLmRlZmF1bHQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXNidWlsZCBwbHVnaW4gdGhhdCBpZGVudGlmaWVzIHdoaWNoIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgYnVuZGxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBwbHVnaW4uXG4gKiBAcmV0dXJucyBBbiBlc2J1aWxkIGBQbHVnaW5gIG9iamVjdCB0aGF0IGV4dHJhY3RzIGRlcGVuZGVuY2llcyB0byBidW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3REZXBlbmRlbmNpZXNUb0J1bmRsZVBsdWdpbihwYXJhbXM6IEV4dHJhY3REZXBlbmRlbmNpZXNUb0J1bmRsZVBsdWdpblBhcmFtcyk6IFBsdWdpbiB7XG4gIGNvbnN0IHsgZGVwZW5kZW5jaWVzVG9CdW5kbGUsIGRlcGVuZGVuY2llc1RvU2tpcCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd0ZXN0JyxcbiAgICBzZXR1cChidWlsZCk6IHZvaWQge1xuICAgICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvXlteLi9dLyB9LCAoJGFyZ3VtZW50cykgPT4ge1xuICAgICAgICBpZiAoISRhcmd1bWVudHMuaW1wb3J0ZXIuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikpIHtcbiAgICAgICAgICBjb25zdCBtb2R1bGVOYW1lID0gdHJpbVN0YXJ0KHtcbiAgICAgICAgICAgICRzdHJpbmc6IGVuc3VyZU5vbk51bGxhYmxlKCRhcmd1bWVudHMucGF0aC5zcGxpdCgnLycsIDEpWzBdLCAnV3JvbmcgcGF0aCcpLFxuICAgICAgICAgICAgcHJlZml4OiAnbm9kZTonXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXNUb1NraXAuaGFzKCRhcmd1bWVudHMucGF0aCkgJiYgIWRlcGVuZGVuY2llc1RvU2tpcC5oYXMobW9kdWxlTmFtZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1RvQnVuZGxlLmFkZCgkYXJndW1lbnRzLnBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBleHRlcm5hbDogdHJ1ZSwgcGF0aDogJGFyZ3VtZW50cy5wYXRoIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUEsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGVBQWU7QUFDeEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsd0JBQXdCO0FBRWpDLE1BQU0sYUFBYSxjQUFjLFlBQVksR0FBRztBQTBCaEQsZUFBc0IsMEJBQTZDO0FBQ2pFLFFBQU0scUJBQXFCLE1BQU0sc0JBQXNCO0FBQ3ZELFFBQU0sdUJBQXVCLG9CQUFJLElBQVk7QUFFN0MsUUFBTSxlQUE2QjtBQUFBLElBQ2pDLFFBQVE7QUFBQSxNQUNOLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixhQUFhLENBQUMsS0FBSyxVQUFVLEtBQUssVUFBVSxTQUFTLFVBQVUsS0FBSyxDQUFDO0FBQUEsSUFDckUsUUFBUTtBQUFBLElBQ1IsVUFBVTtBQUFBLElBQ1YsUUFBUTtBQUFBLElBQ1IsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLE1BQ1AsaUJBQWlCO0FBQUEsTUFDakIsa0NBQWtDO0FBQUEsUUFDaEM7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0EsV0FBVztBQUFBLElBQ1gsUUFBUTtBQUFBLElBQ1IsYUFBYTtBQUFBLElBQ2IsT0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGVBQWUsTUFBTSxRQUFRLFlBQVk7QUFDL0MsUUFBTSxjQUFjLGNBQWMsSUFBSTtBQUN0QyxTQUFPLENBQUMsR0FBRyxvQkFBb0IsRUFBRSxLQUFLO0FBQ3hDO0FBT0EsZUFBc0Isd0JBQThDO0FBQ2xFLFFBQU0sY0FBYyxNQUFNLGdCQUFnQixjQUFjLFlBQVksR0FBRyxDQUFDO0FBQ3hFLFFBQU0scUJBQXFCLG9CQUFJLElBQVksQ0FBQyxHQUFHLGdCQUFnQixHQUFHLE9BQU8sS0FBSyxZQUFZLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsZUFBZSxvQkFBb0IsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUN0SyxTQUFPO0FBQ1Q7QUFRQSxTQUFTLG9CQUFvQixZQUE2QjtBQUN4RCxNQUFJLFdBQVcsV0FBVyxTQUFTLEtBQUssV0FBVyxXQUFXLFVBQVUsS0FBTSxlQUFlLFdBQVk7QUFDdkcsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0YsVUFBTSxTQUFTLFdBQVcsVUFBVTtBQUNwQyxXQUFPLENBQUMsT0FBTztBQUFBLEVBQ2pCLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBUUEsU0FBUyxrQ0FBa0MsUUFBeUQ7QUFDbEcsUUFBTSxFQUFFLHNCQUFzQixtQkFBbUIsSUFBSTtBQUNyRCxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixNQUFNLE9BQWE7QUFDakIsWUFBTSxVQUFVLEVBQUUsUUFBUSxTQUFTLEdBQUcsQ0FBQyxlQUFlO0FBQ3BELFlBQUksQ0FBQyxXQUFXLFNBQVMsU0FBUyxVQUFVLFlBQVksR0FBRztBQUN6RCxnQkFBTSxhQUFhLFVBQVU7QUFBQSxZQUMzQixTQUFTLGtCQUFrQixXQUFXLEtBQUssTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWTtBQUFBLFlBQ3pFLFFBQVE7QUFBQSxVQUNWLENBQUM7QUFDRCxjQUFJLENBQUMsbUJBQW1CLElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxVQUFVLEdBQUc7QUFDbkYsaUNBQXFCLElBQUksV0FBVyxJQUFJO0FBQUEsVUFDMUM7QUFBQSxRQUNGO0FBQ0EsZUFBTyxFQUFFLFVBQVUsTUFBTSxNQUFNLFdBQVcsS0FBSztBQUFBLE1BQ2pELENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=