@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,34 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * This module defines an esbuild plugin that fixes source maps generated during development.
6
+ * It adjusts the paths in the source maps to be compatible with Obsidian's internal URL scheme.
7
+ * A plugin is only active during development builds.
8
+ */
9
+ import type { Plugin } from 'esbuild';
10
+ /**
11
+ * Parameters for {@link fixSourceMapsPlugin}.
12
+ */
13
+ export interface FixSourceMapsPluginParams {
14
+ /**
15
+ * The paths to the output files containing the source maps.
16
+ */
17
+ readonly distPaths: string[];
18
+ /**
19
+ * A boolean indicating whether the build is a production build. The plugin only runs in non-production builds.
20
+ */
21
+ readonly isProductionBuild: boolean;
22
+ /**
23
+ * The name of the Obsidian plugin, used to construct the Obsidian-specific URLs.
24
+ */
25
+ readonly pluginName: string;
26
+ }
27
+ /**
28
+ * Creates an esbuild plugin that fixes source maps by adjusting the paths to be compatible
29
+ * with Obsidian's internal URL scheme.
30
+ *
31
+ * @param params - The parameters for the function.
32
+ * @returns An esbuild `Plugin` object that fixes source maps.
33
+ */
34
+ export declare function fixSourceMapsPlugin(params: FixSourceMapsPluginParams): Plugin;
@@ -0,0 +1,116 @@
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 { toPosixPath } from "@mnaoumov/typescript-lib/path";
51
+ import { replaceAll } from "@mnaoumov/typescript-lib/string";
52
+ import { existsSync } from "node:fs";
53
+ import {
54
+ readFile,
55
+ writeFile
56
+ } from "node:fs/promises";
57
+ function fixSourceMapsPlugin(params) {
58
+ const {
59
+ distPaths,
60
+ isProductionBuild,
61
+ pluginName
62
+ } = params;
63
+ return {
64
+ name: "fix-source-maps",
65
+ setup(build) {
66
+ build.onEnd(async () => {
67
+ if (isProductionBuild) {
68
+ return;
69
+ }
70
+ for (const distPath of distPaths) {
71
+ if (!existsSync(distPath)) {
72
+ continue;
73
+ }
74
+ const content = await readFile(distPath, "utf-8");
75
+ const newContent = replaceAll({
76
+ $string: content,
77
+ replacer: ({ capturedGroupArguments: [prefix = "", sourceMapBase64 = "", suffix = ""] }) => `${prefix + fixSourceMap({
78
+ pluginName,
79
+ sourceMapBase64
80
+ }) + suffix.trim()}
81
+ /* nosourcemap */`,
82
+ searchValue: /(?<Prefix>\n(?:\/\/|\/\*)# sourceMappingURL=data:application\/json;base64,)(?<SourceMapBase64>.+?)(?<Suffix>$|\n| \*\/)(?:.|\n)*/g
83
+ });
84
+ if (content !== newContent) {
85
+ await writeFile(distPath, newContent);
86
+ }
87
+ }
88
+ });
89
+ }
90
+ };
91
+ }
92
+ function convertPathToObsidianUrl(params) {
93
+ const { path, pluginName } = params;
94
+ const convertedPath = replaceAll({
95
+ $string: toPosixPath(path),
96
+ replacer: "",
97
+ searchValue: /^(?:\.\.\/)+/g
98
+ });
99
+ return `app://obsidian.md/plugin:${pluginName}/${convertedPath}`;
100
+ }
101
+ function fixSourceMap(params) {
102
+ const { pluginName, sourceMapBase64 } = params;
103
+ const sourceMapJson = Buffer.from(sourceMapBase64, "base64").toString("utf-8");
104
+ const sourceMap = JSON.parse(sourceMapJson);
105
+ sourceMap.sources = (sourceMap.sources ?? []).map(
106
+ (path) => convertPathToObsidianUrl({
107
+ path,
108
+ pluginName
109
+ })
110
+ );
111
+ return Buffer.from(JSON.stringify(sourceMap)).toString("base64");
112
+ }
113
+ export {
114
+ fixSourceMapsPlugin
115
+ };
116
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtc291cmNlLW1hcHMtcGx1Z2luLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhbiBlc2J1aWxkIHBsdWdpbiB0aGF0IGZpeGVzIHNvdXJjZSBtYXBzIGdlbmVyYXRlZCBkdXJpbmcgZGV2ZWxvcG1lbnQuXG4gKiBJdCBhZGp1c3RzIHRoZSBwYXRocyBpbiB0aGUgc291cmNlIG1hcHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE9ic2lkaWFuJ3MgaW50ZXJuYWwgVVJMIHNjaGVtZS5cbiAqIEEgcGx1Z2luIGlzIG9ubHkgYWN0aXZlIGR1cmluZyBkZXZlbG9wbWVudCBidWlsZHMuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIGVzYnVpbGQgcGx1Z2luIHRoYXQgcmV3cml0ZXMgc291cmNlIG1hcHMgZm9yIE9ic2lkaWFuIFVSTCBzY2hlbWU7IHJlcXVpcmVzIGEgbGl2ZSBlc2J1aWxkIGNvbnRleHQuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnZXNidWlsZCc7XG5cbmltcG9ydCB7IHRvUG9zaXhQYXRoIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZml4U291cmNlTWFwc1BsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRml4U291cmNlTWFwc1BsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aHMgdG8gdGhlIG91dHB1dCBmaWxlcyBjb250YWluaW5nIHRoZSBzb3VyY2UgbWFwcy5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3RQYXRoczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGJ1aWxkIGlzIGEgcHJvZHVjdGlvbiBidWlsZC4gVGhlIHBsdWdpbiBvbmx5IHJ1bnMgaW4gbm9uLXByb2R1Y3Rpb24gYnVpbGRzLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBPYnNpZGlhbiBwbHVnaW4sIHVzZWQgdG8gY29uc3RydWN0IHRoZSBPYnNpZGlhbi1zcGVjaWZpYyBVUkxzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb252ZXJ0UGF0aFRvT2JzaWRpYW5Vcmx9LlxuICovXG5pbnRlcmZhY2UgQ29udmVydFBhdGhUb09ic2lkaWFuVXJsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBmaWxlIHBhdGguXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBPYnNpZGlhbiBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpeFNvdXJjZU1hcH0uXG4gKi9cbmludGVyZmFjZSBGaXhTb3VyY2VNYXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIE9ic2lkaWFuIHBsdWdpbiwgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIE9ic2lkaWFuLXNwZWNpZmljIFVSTHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlNjQtZW5jb2RlZCBzb3VyY2UgbWFwIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VNYXBCYXNlNjQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNvdXJjZU1hcCB7XG4gIHNvdXJjZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXNidWlsZCBwbHVnaW4gdGhhdCBmaXhlcyBzb3VyY2UgbWFwcyBieSBhZGp1c3RpbmcgdGhlIHBhdGhzIHRvIGJlIGNvbXBhdGlibGVcbiAqIHdpdGggT2JzaWRpYW4ncyBpbnRlcm5hbCBVUkwgc2NoZW1lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQW4gZXNidWlsZCBgUGx1Z2luYCBvYmplY3QgdGhhdCBmaXhlcyBzb3VyY2UgbWFwcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpeFNvdXJjZU1hcHNQbHVnaW4ocGFyYW1zOiBGaXhTb3VyY2VNYXBzUGx1Z2luUGFyYW1zKTogUGx1Z2luIHtcbiAgY29uc3Qge1xuICAgIGRpc3RQYXRocyxcbiAgICBpc1Byb2R1Y3Rpb25CdWlsZCxcbiAgICBwbHVnaW5OYW1lXG4gIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2ZpeC1zb3VyY2UtbWFwcycsXG4gICAgc2V0dXAoYnVpbGQpOiB2b2lkIHtcbiAgICAgIGJ1aWxkLm9uRW5kKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGlzUHJvZHVjdGlvbkJ1aWxkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBkaXN0UGF0aCBvZiBkaXN0UGF0aHMpIHtcbiAgICAgICAgICBpZiAoIWV4aXN0c1N5bmMoZGlzdFBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZGlzdFBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAgICAgICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgICAgICAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3VtZW50czogW3ByZWZpeCA9ICcnLCBzb3VyY2VNYXBCYXNlNjQgPSAnJywgc3VmZml4ID0gJyddIH0pID0+XG4gICAgICAgICAgICAgIGAke1xuICAgICAgICAgICAgICAgIHByZWZpeCArIGZpeFNvdXJjZU1hcCh7XG4gICAgICAgICAgICAgICAgICBwbHVnaW5OYW1lLFxuICAgICAgICAgICAgICAgICAgc291cmNlTWFwQmFzZTY0XG4gICAgICAgICAgICAgICAgfSkgKyBzdWZmaXgudHJpbSgpXG4gICAgICAgICAgICAgIH1cXG4vKiBub3NvdXJjZW1hcCAqL2AsXG4gICAgICAgICAgICBzZWFyY2hWYWx1ZTogLyg/PFByZWZpeD5cXG4oPzpcXC9cXC98XFwvXFwqKSMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uXFwvanNvbjtiYXNlNjQsKSg/PFNvdXJjZU1hcEJhc2U2ND4uKz8pKD88U3VmZml4PiR8XFxufCBcXCpcXC8pKD86LnxcXG4pKi9nXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGRpc3RQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGdpdmVuIGZpbGUgcGF0aCB0byBhbiBPYnNpZGlhbi1zcGVjaWZpYyBVUkwuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29udmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgcGF0aCBhcyBhbiBPYnNpZGlhbi1zcGVjaWZpYyBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQYXRoVG9PYnNpZGlhblVybChwYXJhbXM6IENvbnZlcnRQYXRoVG9PYnNpZGlhblVybFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgcGF0aCwgcGx1Z2luTmFtZSB9ID0gcGFyYW1zO1xuICBjb25zdCBjb252ZXJ0ZWRQYXRoID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogdG9Qb3NpeFBhdGgocGF0aCksXG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAvXig/OlxcLlxcLlxcLykrL2dcbiAgfSk7XG4gIHJldHVybiBgYXBwOi8vb2JzaWRpYW4ubWQvcGx1Z2luOiR7cGx1Z2luTmFtZX0vJHtjb252ZXJ0ZWRQYXRofWA7XG59XG5cbi8qKlxuICogQWRqdXN0cyB0aGUgcGF0aHMgaW4gdGhlIGJhc2U2NC1lbmNvZGVkIHNvdXJjZSBtYXAgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE9ic2lkaWFuJ3MgVVJMIHNjaGVtZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGFkanVzdGluZyB0aGUgc291cmNlIG1hcC5cbiAqIEByZXR1cm5zIEEgYmFzZTY0LWVuY29kZWQgc3RyaW5nIHdpdGggdGhlIGFkanVzdGVkIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIGZpeFNvdXJjZU1hcChwYXJhbXM6IEZpeFNvdXJjZU1hcFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgcGx1Z2luTmFtZSwgc291cmNlTWFwQmFzZTY0IH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNvdXJjZU1hcEpzb24gPSBCdWZmZXIuZnJvbShzb3VyY2VNYXBCYXNlNjQsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgY29uc3Qgc291cmNlTWFwID0gSlNPTi5wYXJzZShzb3VyY2VNYXBKc29uKSBhcyBQYXJ0aWFsPFNvdXJjZU1hcD47XG4gIHNvdXJjZU1hcC5zb3VyY2VzID0gKHNvdXJjZU1hcC5zb3VyY2VzID8/IFtdKS5tYXAoKHBhdGgpID0+XG4gICAgY29udmVydFBhdGhUb09ic2lkaWFuVXJsKHtcbiAgICAgIHBhdGgsXG4gICAgICBwbHVnaW5OYW1lXG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQStEQSxTQUFTLG9CQUFvQixRQUEyQztBQUM3RSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sTUFBTSxPQUFhO0FBQ2pCLFlBQU0sTUFBTSxZQUFZO0FBQ3RCLFlBQUksbUJBQW1CO0FBQ3JCO0FBQUEsUUFDRjtBQUVBLG1CQUFXLFlBQVksV0FBVztBQUNoQyxjQUFJLENBQUMsV0FBVyxRQUFRLEdBQUc7QUFDekI7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sVUFBVSxNQUFNLFNBQVMsVUFBVSxPQUFPO0FBQ2hELGdCQUFNLGFBQWEsV0FBVztBQUFBLFlBQzVCLFNBQVM7QUFBQSxZQUNULFVBQVUsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLFNBQVMsSUFBSSxrQkFBa0IsSUFBSSxTQUFTLEVBQUUsRUFBRSxNQUNwRixHQUNFLFNBQVMsYUFBYTtBQUFBLGNBQ3BCO0FBQUEsY0FDQTtBQUFBLFlBQ0YsQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUNuQjtBQUFBO0FBQUEsWUFDRixhQUFhO0FBQUEsVUFDZixDQUFDO0FBRUQsY0FBSSxZQUFZLFlBQVk7QUFDMUIsa0JBQU0sVUFBVSxVQUFVLFVBQVU7QUFBQSxVQUN0QztBQUFBLFFBQ0Y7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNGO0FBUUEsU0FBUyx5QkFBeUIsUUFBZ0Q7QUFDaEYsUUFBTSxFQUFFLE1BQU0sV0FBVyxJQUFJO0FBQzdCLFFBQU0sZ0JBQWdCLFdBQVc7QUFBQSxJQUMvQixTQUFTLFlBQVksSUFBSTtBQUFBLElBQ3pCLFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDRCxTQUFPLDRCQUE0QixVQUFVLElBQUksYUFBYTtBQUNoRTtBQVFBLFNBQVMsYUFBYSxRQUFvQztBQUN4RCxRQUFNLEVBQUUsWUFBWSxnQkFBZ0IsSUFBSTtBQUN4QyxRQUFNLGdCQUFnQixPQUFPLEtBQUssaUJBQWlCLFFBQVEsRUFBRSxTQUFTLE9BQU87QUFDN0UsUUFBTSxZQUFZLEtBQUssTUFBTSxhQUFhO0FBQzFDLFlBQVUsV0FBVyxVQUFVLFdBQVcsQ0FBQyxHQUFHO0FBQUEsSUFBSSxDQUFDLFNBQ2pELHlCQUF5QjtBQUFBLE1BQ3ZCO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFDQSxTQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsU0FBUyxDQUFDLEVBQUUsU0FBUyxRQUFRO0FBQ2pFOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,7 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ export * as 'copy-to-obsidian-plugins-folder-plugin' from './copy-to-obsidian-plugins-folder-plugin.mjs';
3
+ export * as 'dependency' from './dependency.mjs';
4
+ export * as 'fix-source-maps-plugin' from './fix-source-maps-plugin.mjs';
5
+ export * as 'obsidian-plugin-builder' from './obsidian-plugin-builder.mjs';
6
+ export * as 'preprocess-plugin' from './preprocess-plugin.mjs';
7
+ export * as 'rename-css-plugin' from './rename-css-plugin.mjs';
@@ -0,0 +1,64 @@
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 copy_to_obsidian_plugins_folder_plugin from "./copy-to-obsidian-plugins-folder-plugin.mjs";
51
+ import * as dependency from "./dependency.mjs";
52
+ import * as fix_source_maps_plugin from "./fix-source-maps-plugin.mjs";
53
+ import * as obsidian_plugin_builder from "./obsidian-plugin-builder.mjs";
54
+ import * as preprocess_plugin from "./preprocess-plugin.mjs";
55
+ import * as rename_css_plugin from "./rename-css-plugin.mjs";
56
+ export {
57
+ copy_to_obsidian_plugins_folder_plugin as "copy-to-obsidian-plugins-folder-plugin",
58
+ dependency,
59
+ fix_source_maps_plugin as "fix-source-maps-plugin",
60
+ obsidian_plugin_builder as "obsidian-plugin-builder",
61
+ preprocess_plugin as "preprocess-plugin",
62
+ rename_css_plugin as "rename-css-plugin"
63
+ };
64
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdjb3B5LXRvLW9ic2lkaWFuLXBsdWdpbnMtZm9sZGVyLXBsdWdpbicgZnJvbSAnLi9jb3B5LXRvLW9ic2lkaWFuLXBsdWdpbnMtZm9sZGVyLXBsdWdpbi50cyc7XG5leHBvcnQgKiBhcyAnZGVwZW5kZW5jeScgZnJvbSAnLi9kZXBlbmRlbmN5LnRzJztcbmV4cG9ydCAqIGFzICdmaXgtc291cmNlLW1hcHMtcGx1Z2luJyBmcm9tICcuL2ZpeC1zb3VyY2UtbWFwcy1wbHVnaW4udHMnO1xuZXhwb3J0ICogYXMgJ29ic2lkaWFuLXBsdWdpbi1idWlsZGVyJyBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZGVyLnRzJztcbmV4cG9ydCAqIGFzICdwcmVwcm9jZXNzLXBsdWdpbicgZnJvbSAnLi9wcmVwcm9jZXNzLXBsdWdpbi50cyc7XG5leHBvcnQgKiBhcyAncmVuYW1lLWNzcy1wbHVnaW4nIGZyb20gJy4vcmVuYW1lLWNzcy1wbHVnaW4udHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLFlBQVlBLDRDQUE4QztBQUMxRCxZQUFZLGdCQUFrQjtBQUM5QixZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLHVCQUF5QjtBQUNyQyxZQUFZQyx1QkFBeUI7IiwKICAibmFtZXMiOiBbImNvcHktdG8tb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItcGx1Z2luIiwgImZpeC1zb3VyY2UtbWFwcy1wbHVnaW4iLCAib2JzaWRpYW4tcGx1Z2luLWJ1aWxkZXIiLCAicHJlcHJvY2Vzcy1wbHVnaW4iLCAicmVuYW1lLWNzcy1wbHVnaW4iXQp9Cg==
@@ -0,0 +1,98 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * This module provides functionality to build and bundle an Obsidian plugin using esbuild.
6
+ * It includes functions to handle the build process based on different build modes (development or production),
7
+ * and it sets up various esbuild plugins to preprocess, lint, fix source maps, and copy files to the Obsidian plugins folder.
8
+ */
9
+ import type { BuildContext, BuildOptions as EsbuildOptions, Plugin } from 'esbuild';
10
+ import { CliTaskResult } from '@mnaoumov/typescript-dev-toolkit/cli-utils';
11
+ /**
12
+ * Enumeration representing the build modes.
13
+ */
14
+ export declare enum BuildMode {
15
+ /**
16
+ Development mode for building the plugin
17
+ */
18
+ Development = 0,
19
+ /**
20
+ Production mode for building the plugin
21
+ */
22
+ Production = 1
23
+ }
24
+ /**
25
+ * Banner text to be included at the top of the generated files.
26
+ */
27
+ export declare const banner = "/*\nTHIS IS A GENERATED/BUNDLED FILE BY ESBUILD\nif you want to view the source, please visit the github repository of this plugin\n*/\n";
28
+ /**
29
+ * Options for {@link buildObsidianPlugin}.
30
+ */
31
+ export interface BuildObsidianPluginParams {
32
+ /**
33
+ * Custom esbuild plugins to be used during the build process.
34
+ */
35
+ readonly customEsbuildPlugins?: Plugin[];
36
+ /**
37
+ * Customizes the `esbuild` options.
38
+ */
39
+ readonly customizeEsbuildOptions?: (options: EsbuildOptions) => void;
40
+ /**
41
+ * A build mode, either `Development` or `Production`
42
+ */
43
+ readonly mode: BuildMode;
44
+ /**
45
+ * A folder for Obsidian configuration. Defaults to the `OBSIDIAN_CONFIG_FOLDER` environment variable.
46
+ */
47
+ readonly obsidianConfigFolder?: string;
48
+ }
49
+ /**
50
+ * Build parameters without the mode field, for use with {@link build} and {@link dev}.
51
+ */
52
+ export interface BuildOptions {
53
+ /**
54
+ * Custom esbuild plugins to be used during the build process.
55
+ */
56
+ readonly customEsbuildPlugins?: Plugin[];
57
+ /**
58
+ * Customizes the `esbuild` options.
59
+ */
60
+ readonly customizeEsbuildOptions?: (options: EsbuildOptions) => void;
61
+ /**
62
+ * A folder for Obsidian configuration. Defaults to the `OBSIDIAN_CONFIG_FOLDER` environment variable.
63
+ */
64
+ readonly obsidianConfigFolder?: string;
65
+ }
66
+ /**
67
+ * Builds the Obsidian plugin in production mode using esbuild.
68
+ *
69
+ * @param options - Optional build parameters (mode is set to Production automatically).
70
+ * @returns A {@link Promise} that resolves when the build is complete.
71
+ */
72
+ export declare function build(options?: BuildOptions): Promise<void>;
73
+ /**
74
+ * Builds the Obsidian plugin based on the specified mode and configuration folder.
75
+ *
76
+ * @param params - The parameters for building the plugin.
77
+ * @returns A {@link Promise} that resolves to a {@link CliTaskResult} indicating the success or failure of the build.
78
+ */
79
+ export declare function buildObsidianPlugin(params: BuildObsidianPluginParams): Promise<CliTaskResult>;
80
+ /**
81
+ * Builds the Obsidian plugin in development mode using esbuild with watch.
82
+ *
83
+ * In addition to esbuild's own source-graph watch, the development build also watches the plugin's
84
+ * `node_modules` folder and restarts the whole build (including the type-check) when it changes, so a
85
+ * dependency reinstall or rebuild is picked up.
86
+ *
87
+ * @param options - Optional build parameters (mode is set to Development automatically).
88
+ * @returns A {@link Promise} that resolves to a {@link CliTaskResult} indicating the build result.
89
+ */
90
+ export declare function dev(options?: BuildOptions): Promise<CliTaskResult>;
91
+ /**
92
+ * Invokes the build process with the provided build context.
93
+ *
94
+ * @param buildContext - The build context generated by esbuild.
95
+ * @param isProductionBuild - A boolean indicating whether the build is a production build.
96
+ * @returns A {@link Promise} that resolves to a {@link CliTaskResult} indicating the success or failure of the build.
97
+ */
98
+ export declare function invokeEsbuild(buildContext: BuildContext, isProductionBuild: boolean): Promise<CliTaskResult>;
@@ -0,0 +1,255 @@
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 { customEsbuildOptionsPlugin } from "@mnaoumov/typescript-dev-toolkit/bundlers/esbuild-impl/custom-esbuild-options-plugin";
51
+ import { fixEsmPlugin } from "@mnaoumov/typescript-dev-toolkit/bundlers/esbuild-impl/fix-esm-plugin";
52
+ import { svelteWrapperPlugin } from "@mnaoumov/typescript-dev-toolkit/bundlers/esbuild-impl/svelte-wrapper-plugin";
53
+ import { CliTaskResult } from "@mnaoumov/typescript-dev-toolkit/cli-utils";
54
+ import { readPackageJson } from "@mnaoumov/typescript-dev-toolkit/npm";
55
+ import { npmRun } from "@mnaoumov/typescript-dev-toolkit/npm-run";
56
+ import { resolvePathFromRoot } from "@mnaoumov/typescript-dev-toolkit/root";
57
+ import { invokeAsyncSafely } from "@mnaoumov/typescript-lib/async";
58
+ import { extractDefaultExportInterop } from "@mnaoumov/typescript-lib/object-utils";
59
+ import { join } from "@mnaoumov/typescript-lib/path";
60
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
61
+ import { context } from "esbuild";
62
+ import sassPlugin_ from "esbuild-sass-plugin";
63
+ import {
64
+ existsSync,
65
+ watch
66
+ } from "node:fs";
67
+ import {
68
+ cp,
69
+ mkdir,
70
+ rm,
71
+ writeFile
72
+ } from "node:fs/promises";
73
+ import { builtinModules } from "node:module";
74
+ import process, { loadEnvFile } from "node:process";
75
+ import { ObsidianPluginRepoPaths } from "../../obsidian-plugin-repo-paths.mjs";
76
+ import { copyToObsidianPluginsFolderPlugin } from "./copy-to-obsidian-plugins-folder-plugin.mjs";
77
+ import { fixSourceMapsPlugin } from "./fix-source-maps-plugin.mjs";
78
+ import { preprocessPlugin } from "./preprocess-plugin.mjs";
79
+ import { renameCssPlugin } from "./rename-css-plugin.mjs";
80
+ const sassPlugin = extractDefaultExportInterop(sassPlugin_);
81
+ const NODE_MODULES_RESTART_DEBOUNCE_IN_MILLISECONDS = 1e3;
82
+ var BuildMode = /* @__PURE__ */ ((BuildMode2) => {
83
+ BuildMode2[BuildMode2["Development"] = 0] = "Development";
84
+ BuildMode2[BuildMode2["Production"] = 1] = "Production";
85
+ return BuildMode2;
86
+ })(BuildMode || {});
87
+ const banner = `/*
88
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
89
+ if you want to view the source, please visit the github repository of this plugin
90
+ */
91
+ `;
92
+ async function build(options) {
93
+ const result = await buildObsidianPlugin({ ...options, mode: 1 /* Production */ });
94
+ result.throwOnFailure();
95
+ }
96
+ async function buildObsidianPlugin(params) {
97
+ await npmRun("build:compile");
98
+ const envPath = resolvePathFromRoot({ path: ".env" });
99
+ if (envPath && existsSync(envPath)) {
100
+ loadEnvFile(envPath);
101
+ }
102
+ const obsidianPluginBuilderEnv = process.env;
103
+ const obsidianConfigFolder = params.obsidianConfigFolder ?? obsidianPluginBuilderEnv.OBSIDIAN_CONFIG_FOLDER ?? "";
104
+ const isProductionBuild = params.mode === 1 /* Production */;
105
+ const distFolder = ensureNonNullable(
106
+ resolvePathFromRoot({ path: isProductionBuild ? ObsidianPluginRepoPaths.DistBuild : ObsidianPluginRepoPaths.DistDev }),
107
+ "Could not determine the dist folder"
108
+ );
109
+ if (existsSync(distFolder)) {
110
+ await rm(distFolder, { recursive: true });
111
+ }
112
+ await mkdir(distFolder, { recursive: true });
113
+ const distFileNames = [
114
+ ObsidianPluginRepoPaths.ManifestJson
115
+ ];
116
+ if (!isProductionBuild) {
117
+ await writeFile(join(distFolder, ObsidianPluginRepoPaths.HotReload), "", "utf-8");
118
+ }
119
+ for (const fileName of distFileNames) {
120
+ const localFile = ensureNonNullable(resolvePathFromRoot({ path: fileName }), `Could not determine the local file for ${fileName}`);
121
+ const distFile = join(distFolder, fileName);
122
+ if (existsSync(localFile)) {
123
+ await cp(localFile, distFile);
124
+ }
125
+ }
126
+ const distPath = join(distFolder, ObsidianPluginRepoPaths.MainJs);
127
+ const cssPath = join(distFolder, ObsidianPluginRepoPaths.StylesCss);
128
+ const packageJson = await readPackageJson();
129
+ const pluginName = packageJson.name ?? "(unknown)";
130
+ const buildOptions = {
131
+ banner: {
132
+ js: banner
133
+ },
134
+ bundle: true,
135
+ /*
136
+ * `conditions`, `mainFields` and `platform` are one decision, read together.
137
+ *
138
+ * The bundle is ONE `main.js` loaded both in Electron on desktop and in a bare WebView on a phone, so a
139
+ * dependency must resolve to its browser build. esbuild ADDS a condition of its own for `platform: 'node'`
140
+ * (`node`) and for `platform: 'browser'` (`browser`), and a `conditions` list cannot take one away. With
141
+ * `platform: 'node'` the effective set was `{ browser, node, import/require, default }`, so a package whose
142
+ * `exports` map lists `node` before `browser` shipped its Node build to phones — `fflate`'s `esm/index.mjs`
143
+ * opens with `createRequire` from `module`, which threw at load on mobile.
144
+ *
145
+ * `platform: 'neutral'` adds no platform condition, leaving exactly `browser` from the list below. It is
146
+ * chosen over `platform: 'browser'` because that one also changes what this bundle has always relied on:
147
+ * it defines `process.env.NODE_ENV` and applies a package's `browser` field remapping (which can stub a
148
+ * Node builtin to an empty object, breaking a dependency's desktop-only path). `mainFields` restates the
149
+ * `node` platform's default, because `neutral` has none of its own. Node builtins are marked external by name
150
+ * below — `node:*` included, since only `platform: 'node'` marks that prefix external by itself.
151
+ *
152
+ * Measured over 31 plugins built on this library, 2026-09-23, against `platform: 'node'`: the only modules
153
+ * that change are `vfile`, `unist-util-visit-parents` and `yaml` (each now takes its browser build instead
154
+ * of one importing `node:process` / `node:path` / `node:url`) and `esm-env`'s Node flag, which now reads
155
+ * false. Everything else in every bundle is identical up to identifier renaming.
156
+ */
157
+ conditions: ["browser"],
158
+ entryPoints: [
159
+ ensureNonNullable(
160
+ resolvePathFromRoot({ path: join(ObsidianPluginRepoPaths.Src, ObsidianPluginRepoPaths.MainTs) }),
161
+ "Could not determine the entry point for the plugin"
162
+ )
163
+ ],
164
+ external: [
165
+ "obsidian",
166
+ "electron",
167
+ "@codemirror/autocomplete",
168
+ "@codemirror/collab",
169
+ "@codemirror/commands",
170
+ "@codemirror/language",
171
+ "@codemirror/lint",
172
+ "@codemirror/search",
173
+ "@codemirror/state",
174
+ "@codemirror/view",
175
+ "@lezer/common",
176
+ "@lezer/highlight",
177
+ "@lezer/lr",
178
+ "esbuild",
179
+ "eslint",
180
+ ...builtinModules,
181
+ "node:*"
182
+ ],
183
+ format: "cjs",
184
+ keepNames: true,
185
+ logLevel: "info",
186
+ mainFields: ["main", "module"],
187
+ minify: isProductionBuild,
188
+ outfile: distPath,
189
+ platform: "neutral",
190
+ plugins: [
191
+ customEsbuildOptionsPlugin(params.customizeEsbuildOptions?.bind(params)),
192
+ svelteWrapperPlugin(isProductionBuild),
193
+ sassPlugin({
194
+ sourceMap: !isProductionBuild
195
+ }),
196
+ renameCssPlugin(distFolder),
197
+ preprocessPlugin(),
198
+ fixEsmPlugin(),
199
+ fixSourceMapsPlugin({ distPaths: [distPath, cssPath], isProductionBuild, pluginName }),
200
+ ...params.customEsbuildPlugins ?? [],
201
+ copyToObsidianPluginsFolderPlugin({ distFolder, isProductionBuild, obsidianConfigFolder, pluginName })
202
+ ],
203
+ sourcemap: !isProductionBuild && "inline",
204
+ target: "ES2022",
205
+ treeShaking: true
206
+ };
207
+ const buildContext = await context(buildOptions);
208
+ const result = await invokeEsbuild(buildContext, isProductionBuild);
209
+ if (!isProductionBuild) {
210
+ watchNodeModulesAndRestart(params, buildContext);
211
+ }
212
+ return result;
213
+ }
214
+ async function dev(options) {
215
+ return await buildObsidianPlugin({ ...options, mode: 0 /* Development */ });
216
+ }
217
+ async function invokeEsbuild(buildContext, isProductionBuild) {
218
+ if (isProductionBuild) {
219
+ const result = await buildContext.rebuild();
220
+ const isSuccess = result.errors.length === 0 && result.warnings.length === 0;
221
+ return CliTaskResult.Success(isSuccess);
222
+ }
223
+ await buildContext.watch();
224
+ return CliTaskResult.DoNotExit();
225
+ }
226
+ function watchNodeModulesAndRestart(params, buildContext) {
227
+ const nodeModulesPath = resolvePathFromRoot({ path: ObsidianPluginRepoPaths.NodeModules });
228
+ if (!nodeModulesPath || !existsSync(nodeModulesPath)) {
229
+ return;
230
+ }
231
+ let restartTimeout;
232
+ const watcher = watch(nodeModulesPath, { recursive: true }, () => {
233
+ if (restartTimeout) {
234
+ clearTimeout(restartTimeout);
235
+ }
236
+ restartTimeout = setTimeout(() => {
237
+ invokeAsyncSafely(restart);
238
+ }, NODE_MODULES_RESTART_DEBOUNCE_IN_MILLISECONDS);
239
+ });
240
+ async function restart() {
241
+ console.warn("Detected changes in node_modules. Restarting the build...");
242
+ watcher.close();
243
+ await buildContext.dispose();
244
+ await buildObsidianPlugin(params);
245
+ }
246
+ }
247
+ export {
248
+ BuildMode,
249
+ banner,
250
+ build,
251
+ buildObsidianPlugin,
252
+ dev,
253
+ invokeEsbuild
254
+ };
255
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9vYnNpZGlhbi1wbHVnaW4tYnVpbGRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gYnVpbGQgYW5kIGJ1bmRsZSBhbiBPYnNpZGlhbiBwbHVnaW4gdXNpbmcgZXNidWlsZC5cbiAqIEl0IGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIGJ1aWxkIHByb2Nlc3MgYmFzZWQgb24gZGlmZmVyZW50IGJ1aWxkIG1vZGVzIChkZXZlbG9wbWVudCBvciBwcm9kdWN0aW9uKSxcbiAqIGFuZCBpdCBzZXRzIHVwIHZhcmlvdXMgZXNidWlsZCBwbHVnaW5zIHRvIHByZXByb2Nlc3MsIGxpbnQsIGZpeCBzb3VyY2UgbWFwcywgYW5kIGNvcHkgZmlsZXMgdG8gdGhlIE9ic2lkaWFuIHBsdWdpbnMgZm9sZGVyLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBlc2J1aWxkLWJhc2VkIGJ1aWxkIHBpcGVsaW5lIHdpdGggc2Fzcy9zdmVsdGUgcGx1Z2lucyBhbmQgZmlsZSB3YXRjaGVyczsgcmVxdWlyZXMgYSBsaXZlIGVzYnVpbGQgY29udGV4dC4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZENvbnRleHQsXG4gIEJ1aWxkT3B0aW9ucyBhcyBFc2J1aWxkT3B0aW9ucyxcbiAgUGx1Z2luXG59IGZyb20gJ2VzYnVpbGQnO1xuXG5pbXBvcnQgeyBjdXN0b21Fc2J1aWxkT3B0aW9uc1BsdWdpbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jdXN0b20tZXNidWlsZC1vcHRpb25zLXBsdWdpbic7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9idW5kbGVycy9lc2J1aWxkLWltcGwvZml4LWVzbS1wbHVnaW4nO1xuaW1wb3J0IHsgc3ZlbHRlV3JhcHBlclBsdWdpbiB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9zdmVsdGUtd3JhcHBlci1wbHVnaW4nO1xuaW1wb3J0IHsgQ2xpVGFza1Jlc3VsdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2NsaS11dGlscyc7XG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb24gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9ucG0nO1xuaW1wb3J0IHsgbnBtUnVuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvbnBtLXJ1bic7XG5pbXBvcnQgeyByZXNvbHZlUGF0aEZyb21Sb290IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvcm9vdCc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBleHRyYWN0RGVmYXVsdEV4cG9ydEludGVyb3AgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBjb250ZXh0IH0gZnJvbSAnZXNidWlsZCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0LXgvbm8tcmVuYW1lLWRlZmF1bHQgLS0gV2UgbmVlZCBhIHRlbXAgdmFyaWFibGUgdG8gYXBwbHkgYGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcCgpYCBmaXggYmVsb3cuXG5pbXBvcnQgc2Fzc1BsdWdpbl8gZnJvbSAnZXNidWlsZC1zYXNzLXBsdWdpbic7XG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICB3YXRjaFxufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIGNwLFxuICBta2RpcixcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGJ1aWx0aW5Nb2R1bGVzIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHByb2Nlc3MsIHsgbG9hZEVudkZpbGUgfSBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uLy4uL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGNvcHlUb09ic2lkaWFuUGx1Z2luc0ZvbGRlclBsdWdpbiB9IGZyb20gJy4vY29weS10by1vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1wbHVnaW4udHMnO1xuaW1wb3J0IHsgZml4U291cmNlTWFwc1BsdWdpbiB9IGZyb20gJy4vZml4LXNvdXJjZS1tYXBzLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9wcmVwcm9jZXNzLXBsdWdpbi50cyc7XG5pbXBvcnQgeyByZW5hbWVDc3NQbHVnaW4gfSBmcm9tICcuL3JlbmFtZS1jc3MtcGx1Z2luLnRzJztcblxuY29uc3Qgc2Fzc1BsdWdpbiA9IGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcChzYXNzUGx1Z2luXyk7XG5cbi8qKlxuICogRGVib3VuY2Ugd2luZG93IGZvciByZXN0YXJ0aW5nIGEgZGV2ZWxvcG1lbnQgYnVpbGQgYWZ0ZXIgYG5vZGVfbW9kdWxlc2AgY2hhbmdlcy4gQSByZWluc3RhbGwgb3IgYVxuICogZGVwZW5kZW5jeSByZWJ1aWxkIHRvdWNoZXMgbWFueSBmaWxlcyBpbiBxdWljayBzdWNjZXNzaW9uLCBzbyB3ZSB3YWl0IGZvciB0aGUgY2h1cm4gdG8gc2V0dGxlXG4gKiBiZWZvcmUgcmVzdGFydGluZyBvbmNlLlxuICovXG5jb25zdCBOT0RFX01PRFVMRVNfUkVTVEFSVF9ERUJPVU5DRV9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIHJlcHJlc2VudGluZyB0aGUgYnVpbGQgbW9kZXMuXG4gKi9cbmV4cG9ydCBlbnVtIEJ1aWxkTW9kZSB7XG4gIC8qKlxuICBEZXZlbG9wbWVudCBtb2RlIGZvciBidWlsZGluZyB0aGUgcGx1Z2luXG4gICAqL1xuICBEZXZlbG9wbWVudCxcbiAgLyoqXG4gIFByb2R1Y3Rpb24gbW9kZSBmb3IgYnVpbGRpbmcgdGhlIHBsdWdpblxuICAgKi9cbiAgUHJvZHVjdGlvblxufVxuXG4vKipcbiAqIEJhbm5lciB0ZXh0IHRvIGJlIGluY2x1ZGVkIGF0IHRoZSB0b3Agb2YgdGhlIGdlbmVyYXRlZCBmaWxlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJhbm5lciA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRPYnNpZGlhblBsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPYnNpZGlhblBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBDdXN0b20gZXNidWlsZCBwbHVnaW5zIHRvIGJlIHVzZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRXNidWlsZFBsdWdpbnM/OiBQbHVnaW5bXTtcblxuICAvKipcbiAgICogQ3VzdG9taXplcyB0aGUgYGVzYnVpbGRgIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21pemVFc2J1aWxkT3B0aW9ucz86IChvcHRpb25zOiBFc2J1aWxkT3B0aW9ucykgPT4gdm9pZDtcblxuICAvKipcbiAgICogQSBidWlsZCBtb2RlLCBlaXRoZXIgYERldmVsb3BtZW50YCBvciBgUHJvZHVjdGlvbmBcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU6IEJ1aWxkTW9kZTtcblxuICAvKipcbiAgICogQSBmb2xkZXIgZm9yIE9ic2lkaWFuIGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIHRoZSBgT0JTSURJQU5fQ09ORklHX0ZPTERFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBCdWlsZCBwYXJhbWV0ZXJzIHdpdGhvdXQgdGhlIG1vZGUgZmllbGQsIGZvciB1c2Ugd2l0aCB7QGxpbmsgYnVpbGR9IGFuZCB7QGxpbmsgZGV2fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICAvKipcbiAgICogQ3VzdG9tIGVzYnVpbGQgcGx1Z2lucyB0byBiZSB1c2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbUVzYnVpbGRQbHVnaW5zPzogUGx1Z2luW107XG5cbiAgLyoqXG4gICAqIEN1c3RvbWl6ZXMgdGhlIGBlc2J1aWxkYCBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9taXplRXNidWlsZE9wdGlvbnM/OiAob3B0aW9uczogRXNidWlsZE9wdGlvbnMpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgZm9sZGVyIGZvciBPYnNpZGlhbiBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byB0aGUgYE9CU0lESUFOX0NPTkZJR19GT0xERVJgIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGb2xkZXI/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBPYnNpZGlhblBsdWdpbkJ1aWxkZXJFbnYge1xuICBPQlNJRElBTl9DT05GSUdfRk9MREVSOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gcHJvZHVjdGlvbiBtb2RlIHVzaW5nIGVzYnVpbGQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBidWlsZCBwYXJhbWV0ZXJzIChtb2RlIGlzIHNldCB0byBQcm9kdWN0aW9uIGF1dG9tYXRpY2FsbHkpLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidWlsZCBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKG9wdGlvbnM/OiBCdWlsZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRPYnNpZGlhblBsdWdpbih7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uIH0pO1xuICByZXN1bHQudGhyb3dPbkZhaWx1cmUoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIG1vZGUgYW5kIGNvbmZpZ3VyYXRpb24gZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgYnVpbGRpbmcgdGhlIHBsdWdpbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkT2JzaWRpYW5QbHVnaW4ocGFyYW1zOiBCdWlsZE9ic2lkaWFuUGx1Z2luUGFyYW1zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIGF3YWl0IG5wbVJ1bignYnVpbGQ6Y29tcGlsZScpO1xuICBjb25zdCBlbnZQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdCh7IHBhdGg6ICcuZW52JyB9KTtcbiAgaWYgKGVudlBhdGggJiYgZXhpc3RzU3luYyhlbnZQYXRoKSkge1xuICAgIGxvYWRFbnZGaWxlKGVudlBhdGgpO1xuICB9XG4gIGNvbnN0IG9ic2lkaWFuUGx1Z2luQnVpbGRlckVudiA9IHByb2Nlc3MuZW52IGFzIFBhcnRpYWw8T2JzaWRpYW5QbHVnaW5CdWlsZGVyRW52PjtcblxuICBjb25zdCBvYnNpZGlhbkNvbmZpZ0ZvbGRlciA9IHBhcmFtcy5vYnNpZGlhbkNvbmZpZ0ZvbGRlciA/PyBvYnNpZGlhblBsdWdpbkJ1aWxkZXJFbnYuT0JTSURJQU5fQ09ORklHX0ZPTERFUiA/PyAnJztcbiAgY29uc3QgaXNQcm9kdWN0aW9uQnVpbGQgPSBwYXJhbXMubW9kZSA9PT0gQnVpbGRNb2RlLlByb2R1Y3Rpb247XG5cbiAgY29uc3QgZGlzdEZvbGRlciA9IGVuc3VyZU5vbk51bGxhYmxlKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3QoeyBwYXRoOiBpc1Byb2R1Y3Rpb25CdWlsZCA/IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCA6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3REZXYgfSksXG4gICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGRpc3QgZm9sZGVyJ1xuICApO1xuXG4gIGlmIChleGlzdHNTeW5jKGRpc3RGb2xkZXIpKSB7XG4gICAgYXdhaXQgcm0oZGlzdEZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cbiAgYXdhaXQgbWtkaXIoZGlzdEZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgZGlzdEZpbGVOYW1lcyA9IFtcbiAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb25cbiAgXTtcbiAgaWYgKCFpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKGRpc3RGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkhvdFJlbG9hZCksICcnLCAndXRmLTgnKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZGlzdEZpbGVOYW1lcykge1xuICAgIGNvbnN0IGxvY2FsRmlsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHJlc29sdmVQYXRoRnJvbVJvb3QoeyBwYXRoOiBmaWxlTmFtZSB9KSwgYENvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGxvY2FsIGZpbGUgZm9yICR7ZmlsZU5hbWV9YCk7XG4gICAgY29uc3QgZGlzdEZpbGUgPSBqb2luKGRpc3RGb2xkZXIsIGZpbGVOYW1lKTtcblxuICAgIGlmIChleGlzdHNTeW5jKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGNwKGxvY2FsRmlsZSwgZGlzdEZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRpc3RQYXRoID0gam9pbihkaXN0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYWluSnMpO1xuICBjb25zdCBjc3NQYXRoID0gam9pbihkaXN0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3MpO1xuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IHBsdWdpbk5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lID8/ICcodW5rbm93biknO1xuXG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogRXNidWlsZE9wdGlvbnMgPSB7XG4gICAgYmFubmVyOiB7XG4gICAgICBqczogYmFubmVyXG4gICAgfSxcbiAgICBidW5kbGU6IHRydWUsXG4gICAgLypcbiAgICAgKiBgY29uZGl0aW9uc2AsIGBtYWluRmllbGRzYCBhbmQgYHBsYXRmb3JtYCBhcmUgb25lIGRlY2lzaW9uLCByZWFkIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogVGhlIGJ1bmRsZSBpcyBPTkUgYG1haW4uanNgIGxvYWRlZCBib3RoIGluIEVsZWN0cm9uIG9uIGRlc2t0b3AgYW5kIGluIGEgYmFyZSBXZWJWaWV3IG9uIGEgcGhvbmUsIHNvIGFcbiAgICAgKiBkZXBlbmRlbmN5IG11c3QgcmVzb2x2ZSB0byBpdHMgYnJvd3NlciBidWlsZC4gZXNidWlsZCBBRERTIGEgY29uZGl0aW9uIG9mIGl0cyBvd24gZm9yIGBwbGF0Zm9ybTogJ25vZGUnYFxuICAgICAqIChgbm9kZWApIGFuZCBmb3IgYHBsYXRmb3JtOiAnYnJvd3NlcidgIChgYnJvd3NlcmApLCBhbmQgYSBgY29uZGl0aW9uc2AgbGlzdCBjYW5ub3QgdGFrZSBvbmUgYXdheS4gV2l0aFxuICAgICAqIGBwbGF0Zm9ybTogJ25vZGUnYCB0aGUgZWZmZWN0aXZlIHNldCB3YXMgYHsgYnJvd3Nlciwgbm9kZSwgaW1wb3J0L3JlcXVpcmUsIGRlZmF1bHQgfWAsIHNvIGEgcGFja2FnZSB3aG9zZVxuICAgICAqIGBleHBvcnRzYCBtYXAgbGlzdHMgYG5vZGVgIGJlZm9yZSBgYnJvd3NlcmAgc2hpcHBlZCBpdHMgTm9kZSBidWlsZCB0byBwaG9uZXMgXHUyMDE0IGBmZmxhdGVgJ3MgYGVzbS9pbmRleC5tanNgXG4gICAgICogb3BlbnMgd2l0aCBgY3JlYXRlUmVxdWlyZWAgZnJvbSBgbW9kdWxlYCwgd2hpY2ggdGhyZXcgYXQgbG9hZCBvbiBtb2JpbGUuXG4gICAgICpcbiAgICAgKiBgcGxhdGZvcm06ICduZXV0cmFsJ2AgYWRkcyBubyBwbGF0Zm9ybSBjb25kaXRpb24sIGxlYXZpbmcgZXhhY3RseSBgYnJvd3NlcmAgZnJvbSB0aGUgbGlzdCBiZWxvdy4gSXQgaXNcbiAgICAgKiBjaG9zZW4gb3ZlciBgcGxhdGZvcm06ICdicm93c2VyJ2AgYmVjYXVzZSB0aGF0IG9uZSBhbHNvIGNoYW5nZXMgd2hhdCB0aGlzIGJ1bmRsZSBoYXMgYWx3YXlzIHJlbGllZCBvbjpcbiAgICAgKiBpdCBkZWZpbmVzIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgYW5kIGFwcGxpZXMgYSBwYWNrYWdlJ3MgYGJyb3dzZXJgIGZpZWxkIHJlbWFwcGluZyAod2hpY2ggY2FuIHN0dWIgYVxuICAgICAqIE5vZGUgYnVpbHRpbiB0byBhbiBlbXB0eSBvYmplY3QsIGJyZWFraW5nIGEgZGVwZW5kZW5jeSdzIGRlc2t0b3Atb25seSBwYXRoKS4gYG1haW5GaWVsZHNgIHJlc3RhdGVzIHRoZVxuICAgICAqIGBub2RlYCBwbGF0Zm9ybSdzIGRlZmF1bHQsIGJlY2F1c2UgYG5ldXRyYWxgIGhhcyBub25lIG9mIGl0cyBvd24uIE5vZGUgYnVpbHRpbnMgYXJlIG1hcmtlZCBleHRlcm5hbCBieSBuYW1lXG4gICAgICogYmVsb3cgXHUyMDE0IGBub2RlOipgIGluY2x1ZGVkLCBzaW5jZSBvbmx5IGBwbGF0Zm9ybTogJ25vZGUnYCBtYXJrcyB0aGF0IHByZWZpeCBleHRlcm5hbCBieSBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBNZWFzdXJlZCBvdmVyIDMxIHBsdWdpbnMgYnVpbHQgb24gdGhpcyBsaWJyYXJ5LCAyMDI2LTA5LTIzLCBhZ2FpbnN0IGBwbGF0Zm9ybTogJ25vZGUnYDogdGhlIG9ubHkgbW9kdWxlc1xuICAgICAqIHRoYXQgY2hhbmdlIGFyZSBgdmZpbGVgLCBgdW5pc3QtdXRpbC12aXNpdC1wYXJlbnRzYCBhbmQgYHlhbWxgIChlYWNoIG5vdyB0YWtlcyBpdHMgYnJvd3NlciBidWlsZCBpbnN0ZWFkXG4gICAgICogb2Ygb25lIGltcG9ydGluZyBgbm9kZTpwcm9jZXNzYCAvIGBub2RlOnBhdGhgIC8gYG5vZGU6dXJsYCkgYW5kIGBlc20tZW52YCdzIE5vZGUgZmxhZywgd2hpY2ggbm93IHJlYWRzXG4gICAgICogZmFsc2UuIEV2ZXJ5dGhpbmcgZWxzZSBpbiBldmVyeSBidW5kbGUgaXMgaWRlbnRpY2FsIHVwIHRvIGlkZW50aWZpZXIgcmVuYW1pbmcuXG4gICAgICovXG4gICAgY29uZGl0aW9uczogWydicm93c2VyJ10sXG4gICAgZW50cnlQb2ludHM6IFtcbiAgICAgIGVuc3VyZU5vbk51bGxhYmxlKFxuICAgICAgICByZXNvbHZlUGF0aEZyb21Sb290KHsgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TcmMsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1haW5UcykgfSksXG4gICAgICAgICdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpbidcbiAgICAgIClcbiAgICBdLFxuICAgIGV4dGVybmFsOiBbXG4gICAgICAnb2JzaWRpYW4nLFxuICAgICAgJ2VsZWN0cm9uJyxcbiAgICAgICdAY29kZW1pcnJvci9hdXRvY29tcGxldGUnLFxuICAgICAgJ0Bjb2RlbWlycm9yL2NvbGxhYicsXG4gICAgICAnQGNvZGVtaXJyb3IvY29tbWFuZHMnLFxuICAgICAgJ0Bjb2RlbWlycm9yL2xhbmd1YWdlJyxcbiAgICAgICdAY29kZW1pcnJvci9saW50JyxcbiAgICAgICdAY29kZW1pcnJvci9zZWFyY2gnLFxuICAgICAgJ0Bjb2RlbWlycm9yL3N0YXRlJyxcbiAgICAgICdAY29kZW1pcnJvci92aWV3JyxcbiAgICAgICdAbGV6ZXIvY29tbW9uJyxcbiAgICAgICdAbGV6ZXIvaGlnaGxpZ2h0JyxcbiAgICAgICdAbGV6ZXIvbHInLFxuICAgICAgJ2VzYnVpbGQnLFxuICAgICAgJ2VzbGludCcsXG4gICAgICAuLi5idWlsdGluTW9kdWxlcyxcbiAgICAgICdub2RlOionXG4gICAgXSxcbiAgICBmb3JtYXQ6ICdjanMnLFxuICAgIGtlZXBOYW1lczogdHJ1ZSxcbiAgICBsb2dMZXZlbDogJ2luZm8nLFxuICAgIG1haW5GaWVsZHM6IFsnbWFpbicsICdtb2R1bGUnXSxcbiAgICBtaW5pZnk6IGlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgIG91dGZpbGU6IGRpc3RQYXRoLFxuICAgIHBsYXRmb3JtOiAnbmV1dHJhbCcsXG4gICAgcGx1Z2luczogW1xuICAgICAgY3VzdG9tRXNidWlsZE9wdGlvbnNQbHVnaW4ocGFyYW1zLmN1c3RvbWl6ZUVzYnVpbGRPcHRpb25zPy5iaW5kKHBhcmFtcykpLFxuICAgICAgc3ZlbHRlV3JhcHBlclBsdWdpbihpc1Byb2R1Y3Rpb25CdWlsZCksXG4gICAgICBzYXNzUGx1Z2luKHtcbiAgICAgICAgc291cmNlTWFwOiAhaXNQcm9kdWN0aW9uQnVpbGRcbiAgICAgIH0pLFxuICAgICAgcmVuYW1lQ3NzUGx1Z2luKGRpc3RGb2xkZXIpLFxuICAgICAgcHJlcHJvY2Vzc1BsdWdpbigpLFxuICAgICAgZml4RXNtUGx1Z2luKCksXG4gICAgICBmaXhTb3VyY2VNYXBzUGx1Z2luKHsgZGlzdFBhdGhzOiBbZGlzdFBhdGgsIGNzc1BhdGhdLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcGx1Z2luTmFtZSB9KSxcbiAgICAgIC4uLnBhcmFtcy5jdXN0b21Fc2J1aWxkUGx1Z2lucyA/PyBbXSxcbiAgICAgIGNvcHlUb09ic2lkaWFuUGx1Z2luc0ZvbGRlclBsdWdpbih7IGRpc3RGb2xkZXIsIGlzUHJvZHVjdGlvbkJ1aWxkLCBvYnNpZGlhbkNvbmZpZ0ZvbGRlciwgcGx1Z2luTmFtZSB9KVxuICAgIF0sXG4gICAgc291cmNlbWFwOiAhaXNQcm9kdWN0aW9uQnVpbGQgJiYgJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZVxuICB9O1xuXG4gIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGNvbnRleHQoYnVpbGRPcHRpb25zKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW52b2tlRXNidWlsZChidWlsZENvbnRleHQsIGlzUHJvZHVjdGlvbkJ1aWxkKTtcbiAgaWYgKCFpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIHdhdGNoTm9kZU1vZHVsZXNBbmRSZXN0YXJ0KHBhcmFtcywgYnVpbGRDb250ZXh0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIGluIGRldmVsb3BtZW50IG1vZGUgdXNpbmcgZXNidWlsZCB3aXRoIHdhdGNoLlxuICpcbiAqIEluIGFkZGl0aW9uIHRvIGVzYnVpbGQncyBvd24gc291cmNlLWdyYXBoIHdhdGNoLCB0aGUgZGV2ZWxvcG1lbnQgYnVpbGQgYWxzbyB3YXRjaGVzIHRoZSBwbHVnaW4nc1xuICogYG5vZGVfbW9kdWxlc2AgZm9sZGVyIGFuZCByZXN0YXJ0cyB0aGUgd2hvbGUgYnVpbGQgKGluY2x1ZGluZyB0aGUgdHlwZS1jaGVjaykgd2hlbiBpdCBjaGFuZ2VzLCBzbyBhXG4gKiBkZXBlbmRlbmN5IHJlaW5zdGFsbCBvciByZWJ1aWxkIGlzIHBpY2tlZCB1cC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIHBhcmFtZXRlcnMgKG1vZGUgaXMgc2V0IHRvIERldmVsb3BtZW50IGF1dG9tYXRpY2FsbHkpLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBDbGlUYXNrUmVzdWx0fSBpbmRpY2F0aW5nIHRoZSBidWlsZCByZXN1bHQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBCdWlsZE9wdGlvbnMgd2l0aCBidWlsZCgpLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldihvcHRpb25zPzogQnVpbGRPcHRpb25zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luKHsgLi4ub3B0aW9ucywgbW9kZTogQnVpbGRNb2RlLkRldmVsb3BtZW50IH0pO1xufVxuXG4vKipcbiAqIEludm9rZXMgdGhlIGJ1aWxkIHByb2Nlc3Mgd2l0aCB0aGUgcHJvdmlkZWQgYnVpbGQgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gYnVpbGRDb250ZXh0IC0gVGhlIGJ1aWxkIGNvbnRleHQgZ2VuZXJhdGVkIGJ5IGVzYnVpbGQuXG4gKiBAcGFyYW0gaXNQcm9kdWN0aW9uQnVpbGQgLSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBidWlsZCBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgYnVpbGQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZva2VFc2J1aWxkKGJ1aWxkQ29udGV4dDogQnVpbGRDb250ZXh0LCBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbik6IFByb21pc2U8Q2xpVGFza1Jlc3VsdD4ge1xuICBpZiAoaXNQcm9kdWN0aW9uQnVpbGQpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZENvbnRleHQucmVidWlsZCgpO1xuICAgIGNvbnN0IGlzU3VjY2VzcyA9IHJlc3VsdC5lcnJvcnMubGVuZ3RoID09PSAwICYmIHJlc3VsdC53YXJuaW5ncy5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIENsaVRhc2tSZXN1bHQuU3VjY2Vzcyhpc1N1Y2Nlc3MpO1xuICB9XG4gIGF3YWl0IGJ1aWxkQ29udGV4dC53YXRjaCgpO1xuICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5Eb05vdEV4aXQoKTtcbn1cblxuLyoqXG4gKiBXYXRjaGVzIHRoZSBwbHVnaW4ncyBgbm9kZV9tb2R1bGVzYCBmb2xkZXIgYW5kIHJlc3RhcnRzIHRoZSBkZXZlbG9wbWVudCBidWlsZCB3aGVuIGl0IGNoYW5nZXMuXG4gKlxuICogVGhlIGVzYnVpbGQgd2F0Y2hlciBvbmx5IHRyYWNrcyBmaWxlcyBpbiBpdHMgYnVpbGQgZ3JhcGggYW5kIG9ubHkgZXZlciByZS1idW5kbGVzIFx1MjAxNCBpdCBuZXZlclxuICogcmUtcnVucyB0aGUgYGJ1aWxkOmNvbXBpbGVgIHR5cGUtY2hlY2ssIGFuZCBpdCBpZ25vcmVzIGBub2RlX21vZHVsZXNgIGNoYW5nZXMgb3V0c2lkZSB0aGUgZ3JhcGhcbiAqIChhIHJlaW5zdGFsbCwgb3IgYSBkZXBlbmRlbmN5IGZpbGUgbm90IGN1cnJlbnRseSBpbXBvcnRlZCkuIE9uIGFueSAoZGVib3VuY2VkKSBjaGFuZ2UgYW55d2hlcmUgaW5cbiAqIHRoZSBgbm9kZV9tb2R1bGVzYCB0cmVlLCB0aGUgY3VycmVudCBidWlsZCBjb250ZXh0IGlzIGRpc3Bvc2VkIGFuZCB0aGUgd2hvbGUgZGV2ZWxvcG1lbnQgYnVpbGQgaXNcbiAqIHJlc3RhcnRlZCwgcmUtcnVubmluZyB0aGUgZnVsbCBwaXBlbGluZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdGhlIGJ1aWxkIHdhcyBzdGFydGVkIHdpdGgsIHVzZWQgdG8gcmVzdGFydCBpdC5cbiAqIEBwYXJhbSBidWlsZENvbnRleHQgLSBUaGUgZXNidWlsZCBjb250ZXh0IHRvIGRpc3Bvc2UgYmVmb3JlIHJlc3RhcnRpbmcuXG4gKi9cbmZ1bmN0aW9uIHdhdGNoTm9kZU1vZHVsZXNBbmRSZXN0YXJ0KHBhcmFtczogQnVpbGRPYnNpZGlhblBsdWdpblBhcmFtcywgYnVpbGRDb250ZXh0OiBCdWlsZENvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdCh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk5vZGVNb2R1bGVzIH0pO1xuICBpZiAoIW5vZGVNb2R1bGVzUGF0aCB8fCAhZXhpc3RzU3luYyhub2RlTW9kdWxlc1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHJlc3RhcnRUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSwgKCkgPT4ge1xuICAgIGlmIChyZXN0YXJ0VGltZW91dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvcHJlZmVyLXdpbmRvdy10aW1lcnMgLS0gTm9kZSBidWlsZC10b29sIGNvbnRleHQ7IGB3aW5kb3dgIGlzIG5vdCBhdmFpbGFibGUuXG4gICAgICBjbGVhclRpbWVvdXQocmVzdGFydFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9wcmVmZXItd2luZG93LXRpbWVycyAtLSBOb2RlIGJ1aWxkLXRvb2wgY29udGV4dDsgYHdpbmRvd2AgaXMgbm90IGF2YWlsYWJsZS5cbiAgICByZXN0YXJ0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkocmVzdGFydCk7XG4gICAgfSwgTk9ERV9NT0RVTEVTX1JFU1RBUlRfREVCT1VOQ0VfSU5fTUlMTElTRUNPTkRTKTtcbiAgfSk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RldGVjdGVkIGNoYW5nZXMgaW4gbm9kZV9tb2R1bGVzLiBSZXN0YXJ0aW5nIHRoZSBidWlsZC4uLicpO1xuICAgIHdhdGNoZXIuY2xvc2UoKTtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICAgIGF3YWl0IGJ1aWxkT2JzaWRpYW5QbHVnaW4ocGFyYW1zKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxTQUFTLGtDQUFrQztBQUMzQyxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGNBQWM7QUFDdkIsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxZQUFZO0FBQ3JCLFNBQVMs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