@mnaoumov/obsidian-dev-toolkit 0.0.0 → 1.1.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 (293) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -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 +1264 -0
  15. package/dist/demo-vault-helper/manifest.json +9 -0
  16. package/dist/integration-test-plugin/main.js +54167 -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 +322 -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 +240 -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 +213 -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 +179 -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 +362 -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 +234 -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 +171 -0
  31. package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.d.cts +14 -0
  32. package/dist/lib/cjs/bundlers/esbuild.cjs +164 -0
  33. package/dist/lib/cjs/bundlers/esbuild.d.cts +11 -0
  34. package/dist/lib/cjs/bundlers/index.cjs +167 -0
  35. package/dist/lib/cjs/bundlers/index.d.cts +3 -0
  36. package/dist/lib/cjs/demo-vault-app-json.cjs +186 -0
  37. package/dist/lib/cjs/demo-vault-app-json.d.cts +93 -0
  38. package/dist/lib/cjs/demo-vault-buttons.cjs +567 -0
  39. package/dist/lib/cjs/demo-vault-buttons.d.cts +259 -0
  40. package/dist/lib/cjs/demo-vault-coverage.cjs +713 -0
  41. package/dist/lib/cjs/demo-vault-coverage.d.cts +533 -0
  42. package/dist/lib/cjs/demo-vault.cjs +296 -0
  43. package/dist/lib/cjs/demo-vault.d.cts +33 -0
  44. package/dist/lib/cjs/formatters/dprint.cjs +160 -0
  45. package/dist/lib/cjs/formatters/dprint.d.cts +15 -0
  46. package/dist/lib/cjs/formatters/index.cjs +164 -0
  47. package/dist/lib/cjs/formatters/index.d.cts +2 -0
  48. package/dist/lib/cjs/index.cjs +194 -0
  49. package/dist/lib/cjs/index.d.cts +16 -0
  50. package/dist/lib/cjs/integration-test-setup.cjs +129 -0
  51. package/dist/lib/cjs/integration-test-setup.d.cts +33 -0
  52. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +163 -0
  53. package/dist/lib/cjs/integration-test-vitest-global-setup.d.cts +39 -0
  54. package/dist/lib/cjs/jest-setup.cjs +134 -0
  55. package/dist/lib/cjs/jest-setup.d.cts +13 -0
  56. package/dist/lib/cjs/linters/eslint-config.cjs +403 -0
  57. package/dist/lib/cjs/linters/eslint-config.d.cts +25 -0
  58. package/dist/lib/cjs/linters/eslint-rules/index.cjs +200 -0
  59. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +14 -0
  60. package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +255 -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 +218 -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 +215 -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 +216 -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 +316 -0
  69. package/dist/lib/cjs/linters/eslint-rules/manifest-schema.d.cts +45 -0
  70. package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +259 -0
  71. package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.d.cts +10 -0
  72. package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +657 -0
  73. package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.cts +10 -0
  74. package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +247 -0
  75. package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.d.cts +10 -0
  76. package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +181 -0
  77. package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +13 -0
  78. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +263 -0
  79. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.d.cts +30 -0
  80. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +215 -0
  81. package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.d.cts +29 -0
  82. package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +278 -0
  83. package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.d.cts +18 -0
  84. package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +306 -0
  85. package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.d.cts +10 -0
  86. package/dist/lib/cjs/linters/eslint.cjs +160 -0
  87. package/dist/lib/cjs/linters/eslint.d.cts +15 -0
  88. package/dist/lib/cjs/linters/index.cjs +185 -0
  89. package/dist/lib/cjs/linters/index.d.cts +9 -0
  90. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +171 -0
  91. package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +12 -0
  92. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +164 -0
  93. package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
  94. package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +246 -0
  95. package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.d.cts +32 -0
  96. package/dist/lib/cjs/linters/markdownlint.cjs +160 -0
  97. package/dist/lib/cjs/linters/markdownlint.d.cts +15 -0
  98. package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +176 -0
  99. package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.d.cts +40 -0
  100. package/dist/lib/cjs/linters/plugin-names.cjs +249 -0
  101. package/dist/lib/cjs/linters/plugin-names.d.cts +81 -0
  102. package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +216 -0
  103. package/dist/lib/cjs/obsidian-plugin-repo-paths.d.cts +253 -0
  104. package/dist/lib/cjs/setup.cjs +163 -0
  105. package/dist/lib/cjs/setup.d.cts +21 -0
  106. package/dist/lib/cjs/templates.cjs +172 -0
  107. package/dist/lib/cjs/templates.d.cts +13 -0
  108. package/dist/lib/cjs/test-runners/index.cjs +170 -0
  109. package/dist/lib/cjs/test-runners/index.d.cts +4 -0
  110. package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +211 -0
  111. package/dist/lib/cjs/test-runners/integration-test-plugin.d.cts +44 -0
  112. package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +157 -0
  113. package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +27 -0
  114. package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +217 -0
  115. package/dist/lib/cjs/test-runners/stale-build-global-setup.d.cts +86 -0
  116. package/dist/lib/cjs/test-runners/vitest-config.cjs +484 -0
  117. package/dist/lib/cjs/test-runners/vitest-config.d.cts +200 -0
  118. package/dist/lib/cjs/version.cjs +262 -0
  119. package/dist/lib/cjs/version.d.cts +92 -0
  120. package/dist/lib/cjs/vitest-setup.cjs +134 -0
  121. package/dist/lib/cjs/vitest-setup.d.cts +11 -0
  122. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +38 -0
  123. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +218 -0
  124. package/dist/lib/esm/bundlers/esbuild-impl/dependency.d.mts +20 -0
  125. package/dist/lib/esm/bundlers/esbuild-impl/dependency.mjs +130 -0
  126. package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +34 -0
  127. package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +108 -0
  128. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +7 -0
  129. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +56 -0
  130. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +98 -0
  131. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +247 -0
  132. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +30 -0
  133. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +126 -0
  134. package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.d.mts +14 -0
  135. package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.mjs +63 -0
  136. package/dist/lib/esm/bundlers/esbuild.d.mts +11 -0
  137. package/dist/lib/esm/bundlers/esbuild.mjs +58 -0
  138. package/dist/lib/esm/bundlers/index.d.mts +3 -0
  139. package/dist/lib/esm/bundlers/index.mjs +48 -0
  140. package/dist/lib/esm/demo-vault-app-json.d.mts +93 -0
  141. package/dist/lib/esm/demo-vault-app-json.mjs +75 -0
  142. package/dist/lib/esm/demo-vault-buttons.d.mts +259 -0
  143. package/dist/lib/esm/demo-vault-buttons.mjs +452 -0
  144. package/dist/lib/esm/demo-vault-coverage.d.mts +533 -0
  145. package/dist/lib/esm/demo-vault-coverage.mjs +619 -0
  146. package/dist/lib/esm/demo-vault.d.mts +33 -0
  147. package/dist/lib/esm/demo-vault.mjs +197 -0
  148. package/dist/lib/esm/formatters/dprint.d.mts +15 -0
  149. package/dist/lib/esm/formatters/dprint.mjs +52 -0
  150. package/dist/lib/esm/formatters/index.d.mts +2 -0
  151. package/dist/lib/esm/formatters/index.mjs +46 -0
  152. package/dist/lib/esm/index.d.mts +16 -0
  153. package/dist/lib/esm/index.mjs +66 -0
  154. package/dist/lib/esm/integration-test-setup.d.mts +33 -0
  155. package/dist/lib/esm/integration-test-setup.mjs +44 -0
  156. package/dist/lib/esm/integration-test-vitest-global-setup.d.mts +39 -0
  157. package/dist/lib/esm/integration-test-vitest-global-setup.mjs +57 -0
  158. package/dist/lib/esm/jest-setup.d.mts +13 -0
  159. package/dist/lib/esm/jest-setup.mjs +53 -0
  160. package/dist/lib/esm/linters/eslint-config.d.mts +25 -0
  161. package/dist/lib/esm/linters/eslint-config.mjs +290 -0
  162. package/dist/lib/esm/linters/eslint-rules/index.d.mts +14 -0
  163. package/dist/lib/esm/linters/eslint-rules/index.mjs +70 -0
  164. package/dist/lib/esm/linters/eslint-rules/manifest-description.d.mts +54 -0
  165. package/dist/lib/esm/linters/eslint-rules/manifest-description.mjs +146 -0
  166. package/dist/lib/esm/linters/eslint-rules/manifest-helpers.d.mts +141 -0
  167. package/dist/lib/esm/linters/eslint-rules/manifest-helpers.mjs +90 -0
  168. package/dist/lib/esm/linters/eslint-rules/manifest-id.d.mts +32 -0
  169. package/dist/lib/esm/linters/eslint-rules/manifest-id.mjs +109 -0
  170. package/dist/lib/esm/linters/eslint-rules/manifest-name.d.mts +30 -0
  171. package/dist/lib/esm/linters/eslint-rules/manifest-name.mjs +110 -0
  172. package/dist/lib/esm/linters/eslint-rules/manifest-schema.d.mts +45 -0
  173. package/dist/lib/esm/linters/eslint-rules/manifest-schema.mjs +212 -0
  174. package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.d.mts +10 -0
  175. package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.mjs +150 -0
  176. package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.mts +10 -0
  177. package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +551 -0
  178. package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.d.mts +10 -0
  179. package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.mjs +138 -0
  180. package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.d.mts +13 -0
  181. package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +73 -0
  182. package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.d.mts +30 -0
  183. package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.mjs +157 -0
  184. package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.d.mts +29 -0
  185. package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.mjs +108 -0
  186. package/dist/lib/esm/linters/eslint-rules/require-component-suffix.d.mts +18 -0
  187. package/dist/lib/esm/linters/eslint-rules/require-component-suffix.mjs +167 -0
  188. package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.d.mts +10 -0
  189. package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.mjs +197 -0
  190. package/dist/lib/esm/linters/eslint.d.mts +15 -0
  191. package/dist/lib/esm/linters/eslint.mjs +52 -0
  192. package/dist/lib/esm/linters/index.d.mts +9 -0
  193. package/dist/lib/esm/linters/index.mjs +60 -0
  194. package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +12 -0
  195. package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +66 -0
  196. package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
  197. package/dist/lib/esm/linters/markdownlint-rules/index.mjs +46 -0
  198. package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.d.mts +32 -0
  199. package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.mjs +130 -0
  200. package/dist/lib/esm/linters/markdownlint.d.mts +15 -0
  201. package/dist/lib/esm/linters/markdownlint.mjs +52 -0
  202. package/dist/lib/esm/linters/obsidianmd-rule-custom-message.d.mts +40 -0
  203. package/dist/lib/esm/linters/obsidianmd-rule-custom-message.mjs +67 -0
  204. package/dist/lib/esm/linters/plugin-names.d.mts +81 -0
  205. package/dist/lib/esm/linters/plugin-names.mjs +141 -0
  206. package/dist/lib/esm/obsidian-plugin-repo-paths.d.mts +253 -0
  207. package/dist/lib/esm/obsidian-plugin-repo-paths.mjs +108 -0
  208. package/dist/lib/esm/setup.d.mts +21 -0
  209. package/dist/lib/esm/setup.mjs +55 -0
  210. package/dist/lib/esm/templates.d.mts +13 -0
  211. package/dist/lib/esm/templates.mjs +57 -0
  212. package/dist/lib/esm/test-runners/index.d.mts +4 -0
  213. package/dist/lib/esm/test-runners/index.mjs +50 -0
  214. package/dist/lib/esm/test-runners/integration-test-plugin.d.mts +44 -0
  215. package/dist/lib/esm/test-runners/integration-test-plugin.mjs +94 -0
  216. package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +27 -0
  217. package/dist/lib/esm/test-runners/performance-eval-cap.mjs +48 -0
  218. package/dist/lib/esm/test-runners/stale-build-global-setup.d.mts +86 -0
  219. package/dist/lib/esm/test-runners/stale-build-global-setup.mjs +115 -0
  220. package/dist/lib/esm/test-runners/vitest-config.d.mts +200 -0
  221. package/dist/lib/esm/test-runners/vitest-config.mjs +369 -0
  222. package/dist/lib/esm/version.d.mts +92 -0
  223. package/dist/lib/esm/version.mjs +160 -0
  224. package/dist/lib/esm/vitest-setup.d.mts +11 -0
  225. package/dist/lib/esm/vitest-setup.mjs +53 -0
  226. package/dist/templates/.markdownlint-cli2.mjs +4 -0
  227. package/dist/templates/.nano-staged.mjs +4 -0
  228. package/dist/templates/commitlint.config.ts +3 -0
  229. package/dist/templates/dprint.json +26 -0
  230. package/dist/templates/eslint.config.mts +3 -0
  231. package/dist/templates/scripts/build/build-clean.ts +4 -0
  232. package/dist/templates/scripts/build/build-compile-svelte.ts +4 -0
  233. package/dist/templates/scripts/build/build-compile-typescript.ts +4 -0
  234. package/dist/templates/scripts/build/build-compile.ts +4 -0
  235. package/dist/templates/scripts/build/build-templates.ts +4 -0
  236. package/dist/templates/scripts/bundlers/esbuild/build.ts +4 -0
  237. package/dist/templates/scripts/bundlers/esbuild/dev.ts +4 -0
  238. package/dist/templates/scripts/commitlint-config.ts +3 -0
  239. package/dist/templates/scripts/eslint-config.ts +10 -0
  240. package/dist/templates/scripts/formatters/dprint/format-check.ts +8 -0
  241. package/dist/templates/scripts/formatters/dprint/format.ts +8 -0
  242. package/dist/templates/scripts/gate/gate.ts +10 -0
  243. package/dist/templates/scripts/linters/cspell/spellcheck.ts +8 -0
  244. package/dist/templates/scripts/linters/eslint/lint-fix.ts +8 -0
  245. package/dist/templates/scripts/linters/eslint/lint.ts +8 -0
  246. package/dist/templates/scripts/linters/markdownlint/lint-md-fix.ts +8 -0
  247. package/dist/templates/scripts/linters/markdownlint/lint-md.ts +8 -0
  248. package/dist/templates/scripts/linters/over-exposure/find-overexposed-fix.ts +25 -0
  249. package/dist/templates/scripts/linters/over-exposure/find-overexposed.ts +15 -0
  250. package/dist/templates/scripts/markdownlint-cli2-config.ts +3 -0
  251. package/dist/templates/scripts/nano-staged-config.ts +3 -0
  252. package/dist/templates/scripts/test-runners/vitest/test-coverage.ts +4 -0
  253. package/dist/templates/scripts/test-runners/vitest/test-watch.ts +4 -0
  254. package/dist/templates/scripts/test-runners/vitest/test.ts +4 -0
  255. package/dist/templates/scripts/version/version.ts +10 -0
  256. package/dist/templates/scripts/vitest-config.ts +3 -0
  257. package/dist/templates/vitest.config.ts +3 -0
  258. package/formatters/dprint/package.json +6 -0
  259. package/formatters/index/package.json +6 -0
  260. package/formatters/package.json +6 -0
  261. package/linters/eslint/package.json +6 -0
  262. package/linters/eslint-config/package.json +6 -0
  263. package/linters/eslint-rules/index/package.json +6 -0
  264. package/linters/eslint-rules/manifest-description/package.json +6 -0
  265. package/linters/eslint-rules/manifest-helpers/package.json +6 -0
  266. package/linters/eslint-rules/manifest-id/package.json +6 -0
  267. package/linters/eslint-rules/manifest-name/package.json +6 -0
  268. package/linters/eslint-rules/manifest-schema/package.json +6 -0
  269. package/linters/eslint-rules/no-local-obsidian-internals/package.json +6 -0
  270. package/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian/package.json +6 -0
  271. package/linters/eslint-rules/no-untrusted-input-events/package.json +6 -0
  272. package/linters/eslint-rules/obsidian-dev-utils-plugin/package.json +6 -0
  273. package/linters/eslint-rules/package.json +6 -0
  274. package/linters/eslint-rules/plugin-name-as-code/package.json +6 -0
  275. package/linters/eslint-rules/plugin-name-as-code-in-ui/package.json +6 -0
  276. package/linters/eslint-rules/require-component-suffix/package.json +6 -0
  277. package/linters/eslint-rules/require-plugin-api-contract-schemas/package.json +6 -0
  278. package/linters/index/package.json +6 -0
  279. package/linters/markdownlint/package.json +6 -0
  280. package/linters/markdownlint-cli2-config/package.json +6 -0
  281. package/linters/markdownlint-rules/index/package.json +6 -0
  282. package/linters/markdownlint-rules/package.json +6 -0
  283. package/linters/markdownlint-rules/plugin-name-as-code/package.json +6 -0
  284. package/linters/obsidianmd-rule-custom-message/package.json +6 -0
  285. package/linters/package.json +6 -0
  286. package/linters/plugin-names/package.json +6 -0
  287. package/package.json +302 -13
  288. package/test-runners/index/package.json +6 -0
  289. package/test-runners/integration-test-plugin/package.json +6 -0
  290. package/test-runners/package.json +6 -0
  291. package/test-runners/performance-eval-cap/package.json +6 -0
  292. package/test-runners/stale-build-global-setup/package.json +6 -0
  293. package/test-runners/vitest-config/package.json +6 -0
@@ -0,0 +1,8 @@
1
+ {
2
+ "author": "mnaoumov",
3
+ "description": "Test harness plugin that exposes obsidian-dev-utils API for integration testing.",
4
+ "id": "obsidian-dev-utils-integration-test",
5
+ "minAppVersion": "1.11.0",
6
+ "name": "Integration Test Harness",
7
+ "version": "0.0.0"
8
+ }
@@ -0,0 +1,322 @@
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
+ const existingProcess = globalThis.process;
22
+ if (!existingProcess) {
23
+ globalThis.process = browserProcess;
24
+ return;
25
+ }
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+ const existingProcessRecord = existingProcess;
30
+ for (const [key, value] of Object.entries(browserProcess)) {
31
+ existingProcessRecord[key] ??= value;
32
+ }
33
+ existingProcessRecord["browser"] = true;
34
+ }
35
+
36
+ function keepName($unknown) {
37
+ return $unknown;
38
+ }
39
+
40
+ (function initCjs() {
41
+ const globalThisRecord = globalThis;
42
+ ensureDisposeSymbols();
43
+ globalThisRecord["__name"] ??= keepName;
44
+ globalThisRecord["__extractDefault"] ??= extractDefault;
45
+ ensureBrowserProcess();
46
+ function extractDefault(module) {
47
+ return module && module.__esModule && "default" in module ? module.default : module;
48
+ }
49
+ })();
50
+ })();
51
+ (function patchObsidianRequire() {
52
+ const originalRequire = require;
53
+ if (!originalRequire || originalRequire.__isPatched) {
54
+ return;
55
+ }
56
+
57
+ require = Object.assign(
58
+ (id) => requirePatched(id),
59
+ originalRequire,
60
+ {
61
+ __isPatched: true
62
+ }
63
+ );
64
+
65
+ function extractDefault(module) {
66
+ return module && module.__esModule && 'default' in module ? module.default : module;
67
+ }
68
+
69
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
70
+ '@codemirror/autocomplete',
71
+ '@codemirror/collab',
72
+ '@codemirror/commands',
73
+ '@codemirror/language',
74
+ '@codemirror/lint',
75
+ '@codemirror/search',
76
+ '@codemirror/state',
77
+ '@codemirror/text',
78
+ '@codemirror/view',
79
+ '@lezer/common',
80
+ '@lezer/highlight',
81
+ '@lezer/lr',
82
+ 'obsidian']
83
+ );
84
+
85
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
86
+ '@codemirror/closebrackets',
87
+ '@codemirror/comment',
88
+ '@codemirror/fold',
89
+ '@codemirror/gutter',
90
+ '@codemirror/highlight',
91
+ '@codemirror/history',
92
+ '@codemirror/matchbrackets',
93
+ '@codemirror/panel',
94
+ '@codemirror/rangeset',
95
+ '@codemirror/rectangular-selection',
96
+ '@codemirror/stream-parser',
97
+ '@codemirror/tooltip']
98
+ );
99
+
100
+ function requirePatched(id) {
101
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
102
+ return originalRequire?.(id);
103
+ }
104
+
105
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
106
+ if (globalThis.app.isMobile) {
107
+ if (id === 'process' || id === 'node:process') {
108
+ // eslint-disable-next-line no-console -- Valid usage.
109
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
110
+
111
+ return process;
112
+ }
113
+ } else {
114
+ const module = originalRequire?.(id);
115
+ if (module) {
116
+ return extractDefault(module);
117
+ }
118
+ }
119
+
120
+ // eslint-disable-next-line no-console -- Valid usage.
121
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
122
+ return {};
123
+ }
124
+ })();
125
+
126
+ "use strict";
127
+ var __create = Object.create;
128
+ var __defProp = Object.defineProperty;
129
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
130
+ var __getOwnPropNames = Object.getOwnPropertyNames;
131
+ var __getProtoOf = Object.getPrototypeOf;
132
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
133
+ var __export = (target, all) => {
134
+ for (var name in all)
135
+ __defProp(target, name, { get: all[name], enumerable: true });
136
+ };
137
+ var __copyProps = (to, from, except, desc) => {
138
+ if (from && typeof from === "object" || typeof from === "function") {
139
+ for (let key of __getOwnPropNames(from))
140
+ if (!__hasOwnProp.call(to, key) && key !== except)
141
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
142
+ }
143
+ return to;
144
+ };
145
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
146
+ // If the importer is in node compatibility mode or this is not an ESM
147
+ // file that has been converted to a CommonJS file using a Babel-
148
+ // compatible transform (i.e. "__esModule" has not been set), then set
149
+ // "default" to the CommonJS "module.exports" for node compatibility.
150
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
151
+ mod
152
+ ));
153
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
154
+ var copy_to_obsidian_plugins_folder_plugin_exports = {};
155
+ __export(copy_to_obsidian_plugins_folder_plugin_exports, {
156
+ copyToObsidianPluginsFolderPlugin: () => copyToObsidianPluginsFolderPlugin
157
+ });
158
+ module.exports = __toCommonJS(copy_to_obsidian_plugins_folder_plugin_exports);
159
+ var import_async = require('@mnaoumov/typescript-lib/async');
160
+ var import_debug = require('@mnaoumov/typescript-lib/debug');
161
+ var import_path = require('@mnaoumov/typescript-lib/path');
162
+ var import_promises = require('node:fs/promises');
163
+ var import_node_process = __toESM(__extractDefault(require('node:process')), 1);
164
+ var import_obsidian_integration_testing = require('obsidian-integration-testing');
165
+ const moduleState = {
166
+ devInstanceTransportPromise: void 0,
167
+ isDevInstanceCleanupRegistered: false,
168
+ isDevInstanceDisposed: false
169
+ };
170
+ const DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS = 2e3;
171
+ const DEV_INSTANCE_CLOSED_PROBE_COUNT = 3;
172
+ function copyToObsidianPluginsFolderPlugin(params) {
173
+ const {
174
+ distFolder,
175
+ isProductionBuild,
176
+ pluginName
177
+ } = params;
178
+ let {
179
+ obsidianConfigFolder
180
+ } = params;
181
+ return {
182
+ name: "copy-to-obsidian-plugins-folder",
183
+ setup(build) {
184
+ build.onEnd(async () => {
185
+ if (isProductionBuild) {
186
+ return;
187
+ }
188
+ if (!obsidianConfigFolder) {
189
+ (0, import_debug.getLibDebugger)("copyToObsidianPluginsFolderPlugin")(
190
+ "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."
191
+ );
192
+ return;
193
+ }
194
+ obsidianConfigFolder = (0, import_path.toPosixPath)(obsidianConfigFolder);
195
+ const pluginFolder = (0, import_path.join)(obsidianConfigFolder, "plugins", pluginName);
196
+ await (0, import_promises.mkdir)(pluginFolder, { recursive: true });
197
+ await (0, import_promises.cp)(distFolder, pluginFolder, { recursive: true });
198
+ await installAndEnableHotReload({
199
+ obsidianConfigFolder,
200
+ pluginName
201
+ });
202
+ });
203
+ }
204
+ };
205
+ }
206
+ async function getOrLaunchDevInstance(vaultPath) {
207
+ moduleState.devInstanceTransportPromise ??= launchDevInstance(vaultPath);
208
+ try {
209
+ return await moduleState.devInstanceTransportPromise;
210
+ } catch (error) {
211
+ moduleState.devInstanceTransportPromise = void 0;
212
+ throw error;
213
+ }
214
+ }
215
+ async function installAndEnableHotReload(params) {
216
+ const {
217
+ obsidianConfigFolder,
218
+ pluginName
219
+ } = params;
220
+ const vaultPath = (0, import_path.dirname)(obsidianConfigFolder);
221
+ const transport = await getOrLaunchDevInstance(vaultPath);
222
+ await (0, import_obsidian_integration_testing.evalInObsidian)({
223
+ // eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
224
+ async callback({ app, obsidianModule, pluginName: pluginName2 }) {
225
+ const HOT_RELOAD_PLUGIN_ID = "hot-reload";
226
+ const COMMUNITY_PLUGINS_REGISTRY_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";
227
+ const { requestUrl } = obsidianModule;
228
+ await app.plugins.setEnable(true);
229
+ if (!Object.hasOwn(app.plugins.manifests, HOT_RELOAD_PLUGIN_ID)) {
230
+ const registryResponse = await requestUrl(COMMUNITY_PLUGINS_REGISTRY_URL);
231
+ const registryEntries = registryResponse.json;
232
+ const entry = registryEntries.find((candidate) => candidate.id === HOT_RELOAD_PLUGIN_ID);
233
+ if (!entry) {
234
+ throw new Error(`Plugin '${HOT_RELOAD_PLUGIN_ID}' was not found in the Obsidian community plugins registry.`);
235
+ }
236
+ const latestReleaseResponse = await requestUrl(`https://api.github.com/repos/${entry.repo}/releases/latest`);
237
+ const latestRelease = latestReleaseResponse.json;
238
+ const version = latestRelease.tag_name;
239
+ const manifestResponse = await requestUrl(`https://github.com/${entry.repo}/releases/download/${version}/manifest.json`);
240
+ const manifest = manifestResponse.json;
241
+ await app.plugins.installPlugin(entry.repo, version, manifest);
242
+ }
243
+ if (!Object.hasOwn(app.plugins.plugins, HOT_RELOAD_PLUGIN_ID)) {
244
+ await app.plugins.enablePluginAndSave(HOT_RELOAD_PLUGIN_ID);
245
+ }
246
+ await app.plugins.enablePluginAndSave(pluginName2);
247
+ },
248
+ input: { pluginName },
249
+ shouldSkipPreflightChecks: true,
250
+ transport,
251
+ vaultPath
252
+ });
253
+ }
254
+ async function isDevInstanceRunning(cdpUrl) {
255
+ try {
256
+ const response = await fetch(`${cdpUrl}/json`);
257
+ const targets = await response.json();
258
+ return targets.some((target) => target.type === "page");
259
+ } catch {
260
+ return false;
261
+ }
262
+ }
263
+ async function launchDevInstance(vaultPath) {
264
+ const transport = await (0, import_obsidian_integration_testing.createTransportFromOptions)();
265
+ try {
266
+ await transport.registerVault(vaultPath);
267
+ } catch (error) {
268
+ transport.disposeSync?.();
269
+ throw error;
270
+ }
271
+ registerDevInstanceCleanup(transport);
272
+ watchDevInstanceAndStopOnClose(transport);
273
+ return transport;
274
+ }
275
+ function registerDevInstanceCleanup(transport) {
276
+ if (moduleState.isDevInstanceCleanupRegistered) {
277
+ return;
278
+ }
279
+ moduleState.isDevInstanceCleanupRegistered = true;
280
+ import_node_process.default.on("exit", disposeDevInstance);
281
+ for (const signal of ["SIGHUP", "SIGINT", "SIGTERM"]) {
282
+ import_node_process.default.once(signal, () => {
283
+ disposeDevInstance();
284
+ import_node_process.default.exit();
285
+ });
286
+ }
287
+ function disposeDevInstance() {
288
+ if (moduleState.isDevInstanceDisposed) {
289
+ return;
290
+ }
291
+ moduleState.isDevInstanceDisposed = true;
292
+ transport.disposeSync?.();
293
+ }
294
+ }
295
+ function watchDevInstanceAndStopOnClose(transport) {
296
+ if (!(transport instanceof import_obsidian_integration_testing.DesktopCdpTransport)) {
297
+ return;
298
+ }
299
+ const endpoint = transport.getOwnedInstanceEndpoint();
300
+ if (!endpoint) {
301
+ return;
302
+ }
303
+ const cdpUrl = `http://${endpoint.host}:${String(endpoint.port)}`;
304
+ (0, import_async.invokeAsyncSafely)(stopWhenDevInstanceCloses);
305
+ async function stopWhenDevInstanceCloses() {
306
+ let consecutiveFailedProbeCount = 0;
307
+ while (consecutiveFailedProbeCount < DEV_INSTANCE_CLOSED_PROBE_COUNT) {
308
+ await (0, import_async.sleep)({ milliseconds: DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS });
309
+ if (moduleState.isDevInstanceDisposed) {
310
+ return;
311
+ }
312
+ consecutiveFailedProbeCount = await isDevInstanceRunning(cdpUrl) ? 0 : consecutiveFailedProbeCount + 1;
313
+ }
314
+ console.warn("The Obsidian instance owned by `npm run dev` was closed. Stopping the development build.");
315
+ import_node_process.default.exit();
316
+ }
317
+ }
318
+ // Annotate the CommonJS export names for ESM import in node:
319
+ 0 && (module.exports = {
320
+ copyToObsidianPluginsFolderPlugin
321
+ });
322
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jb3B5LXRvLW9ic2lkaWFuLXBsdWdpbnMtZm9sZGVyLXBsdWdpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZXNidWlsZCBwbHVnaW4gdGhhdCBhdXRvbWF0aWNhbGx5IGNvcGllcyB0aGUgYnVpbGQgb3V0cHV0XG4gKiB0byB0aGUgT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIgZHVyaW5nIGRldmVsb3BtZW50LiBUaGlzIHBsdWdpbiBoZWxwcyBzdHJlYW1saW5lXG4gKiB0aGUgZGV2ZWxvcG1lbnQgd29ya2Zsb3cgYnkgZW5zdXJpbmcgdGhhdCB0aGUgbGF0ZXN0IGJ1aWxkIGlzIGFsd2F5cyBhdmFpbGFibGVcbiAqIGluIHRoZSBjb3JyZWN0IE9ic2lkaWFuIGZvbGRlciBmb3IgdGVzdGluZyBhbmQgdXNlLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBlc2J1aWxkIHBsdWdpbiB0aGF0IGNvcGllcyBidWlsZCBvdXRwdXQgdG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXI7IHJlcXVpcmVzIGEgbGl2ZSBlc2J1aWxkIGNvbnRleHQuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuXG5pbXBvcnQge1xuICBpbnZva2VBc3luY1NhZmVseSxcbiAgc2xlZXBcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7XG4gIGRpcm5hbWUsXG4gIGpvaW4sXG4gIHRvUG9zaXhQYXRoXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIGNwLFxuICBta2RpclxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyxcbiAgRGVza3RvcENkcFRyYW5zcG9ydCxcbiAgZXZhbEluT2JzaWRpYW5cbn0gZnJvbSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcHlUb09ic2lkaWFuUGx1Z2luc0ZvbGRlclBsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2hlcmUgdGhlIGJ1aWx0IGZpbGVzIGFyZSBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBidWlsZCBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi4gSWYgbm90IHByb3ZpZGVkLCB0aGUgcGx1Z2luIHdpbGwgbm90IGNvcHkgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYSBDRFAgdGFyZ2V0IGRlc2NyaXB0b3IgcmVhZCBmcm9tIHRoZSBvd25lZCBpbnN0YW5jZSdzIGAvanNvbmAgZW5kcG9pbnQuXG4gKi9cbmludGVyZmFjZSBDZHBUYXJnZXQge1xuICAvKipcbiAgICogVGhlIGtpbmQgb2YgdGhlIHRhcmdldCwgZS5nLiBgcGFnZWAuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgZW50cnkgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeSAoYGNvbW11bml0eS1wbHVnaW5zLmpzb25gKS5cbiAqL1xuaW50ZXJmYWNlIENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnkge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgb3duZXIvbmFtZWAgR2l0SHViIHJlcG9zaXRvcnkgdGhlIHBsdWdpbiBpcyBwdWJsaXNoZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgR2l0SHViIHJlbGVhc2Ugd2UgcmVhZC5cbiAqL1xuaW50ZXJmYWNlIEdpdEh1YlJlbGVhc2Uge1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgdGFnLCBhIGJhcmUgdmVyc2lvbiBzdWNoIGFzIGAxLjIuM2AuXG4gICAqL1xuICByZWFkb25seSB0YWdfbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuQ29uZmlnRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBidWlsdCBPYnNpZGlhbiBwbHVnaW4gdG8gZW5hYmxlIG9uY2UgSG90UmVsb2FkIGlzIGluIHBsYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vLyBUaGUgYG5wbSBydW4gZGV2YC1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZTogbGF1bmNoZWQgb24gdGhlIGZpcnN0IHJlYnVpbGQgYW5kIHJldXNlZCBhY3Jvc3MgcmVidWlsZHMuXG4vLyBJdHMgbGlmZXRpbWUgaXMgdGllZCB0byB0aGUgYG5wbSBydW4gZGV2YCBwcm9jZXNzIGluIEJPVEggZGlyZWN0aW9ucy5cbi8vIFRoZSBpbnN0YW5jZSBpcyBjbG9zZWQgd2hlbiB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzIChzZWUgYHJlZ2lzdGVyRGV2SW5zdGFuY2VDbGVhbnVwYCkuXG4vLyBUaGUgcHJvY2VzcyBzdG9wcyB3aGVuIHRoZSBpbnN0YW5jZSBpcyBjbG9zZWQgKHNlZSBgd2F0Y2hEZXZJbnN0YW5jZUFuZFN0b3BPbkNsb3NlYCkuXG4vKipcbk1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlLCBoZWxkIGluIG9uZSBvYmplY3Qgc28gZWFjaCBtdXRhdGlvbiBuYW1lcyBpdCBleHBsaWNpdGx5LlxuICovXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICBkZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHwgdW5kZWZpbmVkO1xuICBpc0Rldkluc3RhbmNlQ2xlYW51cFJlZ2lzdGVyZWQ6IGJvb2xlYW47XG4gIGlzRGV2SW5zdGFuY2VEaXNwb3NlZDogYm9vbGVhbjtcbn1cblxuY29uc3QgbW9kdWxlU3RhdGU6IE1vZHVsZVN0YXRlID0ge1xuICBkZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U6IHVuZGVmaW5lZCxcbiAgaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkOiBmYWxzZSxcbiAgaXNEZXZJbnN0YW5jZURpc3Bvc2VkOiBmYWxzZVxufTtcblxuLyoqXG4gKiBIb3cgb2Z0ZW4gdGhlIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGlzIHByb2JlZCB0byBkZXRlY3QgdGhhdCBpdCB3YXMgY2xvc2VkLlxuICovXG5jb25zdCBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcblxuLyoqXG4gKiBIb3cgbWFueSBjb25zZWN1dGl2ZSBmYWlsZWQgcHJvYmVzIGFyZSB0b2xlcmF0ZWQgYmVmb3JlIHRoZSBvd25lZCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGNsb3NlZC4gQVxuICogc2luZ2xlIGZhaWx1cmUgY2FuIGJlIGEgdHJhbnNpZW50IGhpY2N1cCAoYSBidXN5IHJlbmRlcmVyLCBhIG1vbWVudGFyaWx5IHJlZnVzZWQgY29ubmVjdGlvbiksIHNvIHRoZVxuICogZGV2ZWxvcG1lbnQgYnVpbGQgaXMgb25seSBzdG9wcGVkIG9uY2UgdGhlIGVuZHBvaW50IHN0YXlzIHVucmVhY2hhYmxlLlxuICovXG5jb25zdCBERVZfSU5TVEFOQ0VfQ0xPU0VEX1BST0JFX0NPVU5UID0gMztcbi8qKlxuICogQ3JlYXRlcyBhbiBlc2J1aWxkIHBsdWdpbiB0aGF0IGNvcGllcyB0aGUgYnVpbGQgb3V0cHV0IHRvIHRoZSBPYnNpZGlhbiBwbHVnaW5zIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEFuIGVzYnVpbGQgYFBsdWdpbmAgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luKHBhcmFtczogQ29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luUGFyYW1zKTogUGx1Z2luIHtcbiAgY29uc3Qge1xuICAgIGRpc3RGb2xkZXIsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuICBsZXQge1xuICAgIG9ic2lkaWFuQ29uZmlnRm9sZGVyXG4gIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2NvcHktdG8tb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXInLFxuICAgIHNldHVwKGJ1aWxkKTogdm9pZCB7XG4gICAgICBidWlsZC5vbkVuZChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2JzaWRpYW5Db25maWdGb2xkZXIpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignY29weVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGx1Z2luJykoXG4gICAgICAgICAgICAnTm8gT2JzaWRpYW4gY29uZmlnIGZvbGRlciBjb25maWd1cmVkLiBgT0JTSURJQU5fQ09ORklHX0ZPTERFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCBpbiBzeXN0ZW0gb3IgaW4gYC5lbnZgIGZpbGUuIFRoZSBjb21waWxlZCBwbHVnaW4gd2lsbCBub3QgYmUgY29waWVkIGludG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIuJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzaWRpYW5Db25maWdGb2xkZXIgPSB0b1Bvc2l4UGF0aChvYnNpZGlhbkNvbmZpZ0ZvbGRlcik7XG5cbiAgICAgICAgY29uc3QgcGx1Z2luRm9sZGVyID0gam9pbihvYnNpZGlhbkNvbmZpZ0ZvbGRlciwgJ3BsdWdpbnMnLCBwbHVnaW5OYW1lKTtcbiAgICAgICAgYXdhaXQgbWtkaXIocGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgY3AoZGlzdEZvbGRlciwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHtcbiAgICAgICAgICBvYnNpZGlhbkNvbmZpZ0ZvbGRlcixcbiAgICAgICAgICBwbHVnaW5OYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiB2YXVsdCwgbGF1bmNoaW5nIGl0IG9uIGZpcnN0IHVzZSBhbmRcbiAqIHJldXNpbmcgaXQgb24gc3Vic2VxdWVudCByZWJ1aWxkcy5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlciB0byBvcGVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBvd25lZCB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnR9LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPckxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2UgPz89IGxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG1vZHVsZVN0YXRlLmRldkluc3RhbmNlVHJhbnNwb3J0UHJvbWlzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBDbGVhciB0aGUgY2FjaGUgc28gYSBsYXRlciByZWJ1aWxkIHJldHJpZXMgdGhlIGxhdW5jaC5cbiAgICBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgSG90UmVsb2FkIHBsdWdpbiBmcm9tIHRoZSBvZmZpY2lhbCBjb21tdW5pdHkgc3RvcmUgKGlmIG5vdCBhbHJlYWR5IGluc3RhbGxlZCksIGxvYWRzIGl0XG4gKiAoaWYgbm90IGFscmVhZHkgcnVubmluZyksIGFuZCBlbmFibGVzIHRoZSBmcmVzaGx5LWJ1aWx0IHBsdWdpbiBcdTIwMTQgYWxsIHRocm91Z2ggdGhlIGBucG0gcnVuIGRldmAtb3duZWRcbiAqIE9ic2lkaWFuIGluc3RhbmNlLCBzbyBIb3RSZWxvYWQgdGhlbiBhdXRvLXJlZnJlc2hlcyB0aGUgZGVwbG95ZWQgcGx1Z2luIG9uIGV2ZXJ5IHJlYnVpbGQuXG4gKlxuICogVGhlIGluc3RhbGwgZ29lcyB0aHJvdWdoIE9ic2lkaWFuJ3Mgb3duIGBpbnN0YWxsUGx1Z2luYCAodGhlIGNvbW11bml0eS1zdG9yZSBtZWNoYW5pc20pLCBhbmQgZXZlcnkgc3RlcFxuICogcnVucyBhZ2FpbnN0IHRoZSBvd25lZCBpbnN0YW5jZSBvdmVyIENEUDsgYW55IGZhaWx1cmUgc3VyZmFjZXMgKHRoZSBkZXYgYnVpbGQgcmVwb3J0cyBpdCkgcmF0aGVyIHRoYW5cbiAqIGJlaW5nIHNpbGVudGx5IHN3YWxsb3dlZC5cbiAqXG4gKiBUaGUgZmlyc3Qgc3RlcCBpcyBsZWF2aW5nIHJlc3RyaWN0ZWQgbW9kZSBmb3IgcmVhbCwgd2hpY2ggdGhlIG93bmVkIGluc3RhbmNlIGhhcyBvbmx5IGZha2VkIHNvIGZhciBcdTIwMTRcbiAqIHdpdGhvdXQgaXQgXCJlbmFibGVkXCIgYW5kIFwibG9hZGVkXCIgY29tZSBhcGFydCBhbmQgbm9uZSBvZiB0aGUgdmF1bHQncyBwbHVnaW5zLCBIb3RSZWxvYWQgaW5jbHVkZWQsIGFyZVxuICogcnVubmluZy4gU2VlIHRoZSBjb21tZW50IG9uIHRoZSBgc2V0RW5hYmxlYCBjYWxsLlxuICpcbiAqIFRoZSBpbnN0YWxsLWlmLW1pc3NpbmcgLyBlbmFibGUtaWYtZGlzYWJsZWQgbG9naWMgYmVsb3cgaW50ZW50aW9uYWxseSBtaXJyb3JzIHRoZSBwdWJsaWNcbiAqIGBpbnN0YWxsQ29tbXVuaXR5UGx1Z2luYCAvIGBlbmFibGVDb21tdW5pdHlQbHVnaW5gIGhlbHBlcnMgaW4gYHNyYy9vYnNpZGlhbi9jb21tdW5pdHktcGx1Z2lucy50c2AuIEl0XG4gKiBjYW5ub3QgaW1wb3J0IGFuZCBjYWxsIHRoZW06IHRoZSBgZm5gIGlzIHNlcmlhbGl6ZWQgKGB0b1N0cmluZygpYCkgYW5kIGV4ZWN1dGVkIGluIHRoZSByZW5kZXJlciwgYW5kXG4gKiB0aGlzIGJ1aWxkLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGlzIGJhcmUgXHUyMDE0IGl0IGhhcyBubyBkZXYtdXRpbHMgYGxpYmAgcHJvdmlkZXIgd2lyZWQgKHRoYXQgcmVzb2x2ZXIgaXNcbiAqIHJlZ2lzdGVyZWQgb25seSBpbiB0aGUgaW50ZWdyYXRpb24tdGVzdCBzZXR1cCwgd2hvc2UgZml4dHVyZSBwdWJsaXNoZXMgdGhlIG1lcmdlZCBzdXJmYWNlIG9uIGB3aW5kb3dgKSxcbiAqIHNvIHRoZSBjbG9zdXJlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIGxpYnJhcnkgc3VyZmFjZSBhbmQgbXVzdCBpbmxpbmUgdGhlIGVxdWl2YWxlbnQgc3RlcHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgSW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZFBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgSG90UmVsb2FkIGFuZCB0aGUgYnVpbHQgcGx1Z2luIGFyZSBpbnN0YWxsZWQgYW5kIGVuYWJsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWQocGFyYW1zOiBJbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBvYnNpZGlhbkNvbmZpZ0ZvbGRlcixcbiAgICBwbHVnaW5OYW1lXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHZhdWx0UGF0aCA9IGRpcm5hbWUob2JzaWRpYW5Db25maWdGb2xkZXIpO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBnZXRPckxhdW5jaERldkluc3RhbmNlKHZhdWx0UGF0aCk7XG4gIGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIE5vIGFjdHVhbCBzaGFkb3dpbmcgYXMgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGV4dGVybmFsbHkuXG4gICAgYXN5bmMgY2FsbGJhY2soeyBhcHAsIG9ic2lkaWFuTW9kdWxlLCBwbHVnaW5OYW1lIH0pIHtcbiAgICAgIGNvbnN0IEhPVF9SRUxPQURfUExVR0lOX0lEID0gJ2hvdC1yZWxvYWQnO1xuICAgICAgY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMID0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG4gICAgICBjb25zdCB7IHJlcXVlc3RVcmwgfSA9IG9ic2lkaWFuTW9kdWxlO1xuXG4gICAgICAvKlxuICAgICAgICogR2VudWluZWx5IGxlYXZlIHJlc3RyaWN0ZWQgbW9kZSBiZWZvcmUgdG91Y2hpbmcgYW55dGhpbmcgZWxzZS4gVGhlIG93bmVkIGluc3RhbmNlIGJvb3RzIHdpdGggYVxuICAgICAgICogZnJlc2ggdXNlci1kYXRhIGRpciwgc28gT2JzaWRpYW4gc3RhcnRzIHJlc3RyaWN0ZWQgYW5kIGBQbHVnaW5zLmluaXRpYWxpemUoKWAgcmV0dXJucyBiZWZvcmVcbiAgICAgICAqIGxvYWRpbmcgYSBzaW5nbGUgcGx1Z2luLiBUaGUgaGFybmVzcyB0aGVuIGNsb3NlcyB0aGUgdHJ1c3QgbW9kYWwgYW5kIHdyaXRlcyB0aGVcbiAgICAgICAqIGBlbmFibGUtcGx1Z2luLTxhcHBJZD5gIGxvY2FsU3RvcmFnZSBmbGFnIGRpcmVjdGx5IFx1MjAxNCBkZWxpYmVyYXRlbHksIHRvIGF2b2lkIGEgc3luY2hyb25vdXMgbG9hZCBcdTIwMTRcbiAgICAgICAqIHdoaWNoIGxlYXZlcyBgaXNFbmFibGVkKClgIHJlcG9ydGluZyBgdHJ1ZWAgb3ZlciBhIHZhdWx0IHdoZXJlIG5vdGhpbmcgaXMgYWN0dWFsbHkgcnVubmluZy4gRXZlcnlcbiAgICAgICAqIGBlbmFibGVkUGx1Z2luc2AgcmVhZGluZyBiZWxvdyAoYW5kIGluIHRoZSBtaXJyb3JlZCBgY29tbXVuaXR5LXBsdWdpbnMudHNgIGhlbHBlcnMpIHdvdWxkIGJlXG4gICAgICAgKiBhbnN3ZXJpbmcgYWJvdXQgdGhlIHZhdWx0J3MgY29uZmlnIGZpbGUgcmF0aGVyIHRoYW4gdGhpcyBpbnN0YW5jZS5cbiAgICAgICAqXG4gICAgICAgKiBgc2V0RW5hYmxlKHRydWUpYCBpcyB3aGF0IE9ic2lkaWFuJ3Mgb3duIFwiRXhpdCByZXN0cmljdGVkIG1vZGVcIiBidXR0b24gY2FsbHM6IGl0IHJlLWFzc2VydHMgdGhlXG4gICAgICAgKiBmbGFnIGFuZCBsb2FkcyBldmVyeXRoaW5nIGluIGBlbmFibGVkUGx1Z2luc2AuIFVuY29uZGl0aW9uYWwgb24gcHVycG9zZSBcdTIwMTQgdGhlIGZsYWcgaXMgYWxyZWFkeVxuICAgICAgICogYHRydWVgLCBzbyBhbiBgaXNFbmFibGVkKClgIGd1YXJkIHdvdWxkIHNraXAgdGhlIGxvYWQgdGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQuIElkZW1wb3RlbnQgYW5kXG4gICAgICAgKiBlZmZlY3RpdmVseSBmcmVlIG9uY2Ugd2FybSAoYGxvYWRQbHVnaW5gIHJldHVybnMgdGhlIGxpdmUgaW5zdGFuY2UpLCBzbyByZS1ydW5uaW5nIGl0IG9uIGV2ZXJ5XG4gICAgICAgKiByZWJ1aWxkIGNvc3RzIG5vdGhpbmcuXG4gICAgICAgKi9cbiAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcblxuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLm1hbmlmZXN0cywgSE9UX1JFTE9BRF9QTFVHSU5fSUQpKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5UmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5RW50cmllcyA9IHJlZ2lzdHJ5UmVzcG9uc2UuanNvbiBhcyBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W107XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gcmVnaXN0cnlFbnRyaWVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09PSBIT1RfUkVMT0FEX1BMVUdJTl9JRCk7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiAnJHtIT1RfUkVMT0FEX1BMVUdJTl9JRH0nIHdhcyBub3QgZm91bmQgaW4gdGhlIE9ic2lkaWFuIGNvbW11bml0eSBwbHVnaW5zIHJlZ2lzdHJ5LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGF0ZXN0UmVsZWFzZVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke2VudHJ5LnJlcG99L3JlbGVhc2VzL2xhdGVzdGApO1xuICAgICAgICBjb25zdCBsYXRlc3RSZWxlYXNlID0gbGF0ZXN0UmVsZWFzZVJlc3BvbnNlLmpzb24gYXMgR2l0SHViUmVsZWFzZTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGxhdGVzdFJlbGVhc2UudGFnX25hbWU7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0UmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKGBodHRwczovL2dpdGh1Yi5jb20vJHtlbnRyeS5yZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259L21hbmlmZXN0Lmpzb25gKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBtYW5pZmVzdFJlc3BvbnNlLmpzb24gYXMgUGx1Z2luTWFuaWZlc3Q7XG4gICAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLmluc3RhbGxQbHVnaW4oZW50cnkucmVwbywgdmVyc2lvbiwgbWFuaWZlc3QpO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICogQXNrIHdoZXRoZXIgSG90UmVsb2FkIGlzIFJVTk5JTkcsIG5vdCB3aGV0aGVyIHRoZSB2YXVsdCBjb25maWcgbGlzdHMgaXQgYXMgZW5hYmxlZC4gQWZ0ZXIgdGhlXG4gICAgICAgKiBgc2V0RW5hYmxlYCBhYm92ZSB0aGUgdHdvIG5vcm1hbGx5IGFncmVlLCBidXQgYSBIb3RSZWxvYWQgdGhhdCBpcyBsaXN0ZWQgYW5kIGZhaWxlZCB0byBsb2FkIHdvdWxkXG4gICAgICAgKiBwYXNzIGFuIGBlbmFibGVkUGx1Z2luc2AgY2hlY2sgd2hpbGUgbGVhdmluZyB0aGUgZGV2IGJ1aWxkIHdpdGhvdXQgYXV0by1yZWZyZXNoLlxuICAgICAgICovXG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oYXBwLnBsdWdpbnMucGx1Z2lucywgSE9UX1JFTE9BRF9QTFVHSU5fSUQpKSB7XG4gICAgICAgIGF3YWl0IGFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbkFuZFNhdmUoSE9UX1JFTE9BRF9QTFVHSU5fSUQpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKHBsdWdpbk5hbWUpO1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgcGx1Z2luTmFtZSB9LFxuICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9KTtcbn1cblxuLyoqXG4gKiBQcm9iZXMgdGhlIG93bmVkIE9ic2lkaWFuIGluc3RhbmNlJ3MgQ0RQIGVuZHBvaW50IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHN0aWxsIHJ1bm5pbmcuXG4gKlxuICogQSBjbG9zZWQgaW5zdGFuY2Ugc3RvcHMgc2VydmluZyBDRFAgYWx0b2dldGhlciwgc28gYW4gdW5yZWFjaGFibGUgZW5kcG9pbnQgXHUyMDE0IG9yIG9uZSBsZWZ0IHdpdGggbm8gcGFnZVxuICogdGFyZ2V0cyB3aGlsZSB0aGUgYXBwIHRlYXJzIGl0c2VsZiBkb3duIFx1MjAxNCBtZWFucyB0aGUgaW5zdGFuY2UgaXMgZ29uZS5cbiAqXG4gKiBAcGFyYW0gY2RwVXJsIC0gVGhlIGJhc2UgQ0RQIFVSTCBvZiB0aGUgb3duZWQgaW5zdGFuY2UsIGUuZy4gYGh0dHA6Ly9sb2NhbGhvc3Q6NTE4ODhgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIGB0cnVlYCB3aGlsZSB0aGUgaW5zdGFuY2UgaXMgc3RpbGwgc2VydmluZyBhIHBhZ2UgdGFyZ2V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBpc0Rldkluc3RhbmNlUnVubmluZyhjZHBVcmw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gV2UgcnVuIHRoaXMgb3V0c2lkZSBvZiBPYnNpZGlhbiwgc28gd2UgZG9uJ3QgaGF2ZSBgcmVxdWVzdFVybCgpYC5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2NkcFVybH0vanNvbmApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2RwVGFyZ2V0W107XG4gICAgcmV0dXJuIHRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQudHlwZSA9PT0gJ3BhZ2UnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogTGF1bmNoZXMgYSBmcmVzaCBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSAoaXNvbGF0ZWQgdXNlci1kYXRhIGRpcikgYW5kIG9wZW5zIHRoZSBnaXZlbiB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlciB0byBvcGVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBsYXVuY2hlZCB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnR9LlxuICovXG5hc3luYyBmdW5jdGlvbiBsYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0cmFuc3BvcnQucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRyYW5zcG9ydC5kaXNwb3NlU3luYz8uKCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0KTtcbiAgd2F0Y2hEZXZJbnN0YW5jZUFuZFN0b3BPbkNsb3NlKHRyYW5zcG9ydCk7XG4gIHJldHVybiB0cmFuc3BvcnQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2Nlc3MtZXhpdCBhbmQgc2lnbmFsIGhhbmRsZXJzIChvbmNlKSB0aGF0IHN5bmNocm9ub3VzbHkgY2xvc2UgdGhlIG93bmVkIE9ic2lkaWFuXG4gKiBpbnN0YW5jZSB3aGVuIHRoZSBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcy5cbiAqXG4gKiBUaGVzZSBoYW5kbGVycyBjb3ZlciBhbiBvcmRlcmx5IHNodXRkb3duLiBBIGBTSUdLSUxMYCAob3IgYSBUYXNrIE1hbmFnZXIgLyBJREUgc3RvcCkgcnVucyBubyBoYW5kbGVyXG4gKiBhdCBhbGwsIGFuZCBubyBvcGVyYXRpbmcgc3lzdGVtIGtpbGxzIHRoZSBpbnN0YW5jZSBqdXN0IGZvciBiZWluZyBvdXIgY2hpbGQgXHUyMDE0IHNvIHRoYXQgY2FzZSBpcyBjYXVnaHRcbiAqIGZyb20gdGhlIG90aGVyIHNpZGUsIGJ5IHRoZSBoYXJuZXNzJ3MgcGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nOiB0aGUgaW5zdGFuY2UncyByZW5kZXJlciBob2xkcyBhIHNvY2tldFxuICogYmFjayB0byB0aGlzIHByb2Nlc3MgYW5kIGRlc3Ryb3lzIGl0cyB3aW5kb3cgd2hlbiB0aGUga2VybmVsIGNsb3NlcyBpdC4gU2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgIGluXG4gKiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSBvd25lZCB0cmFuc3BvcnQgdG8gZGlzcG9zZSBvbiBzaHV0ZG93bi5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gYGV4aXRgIGNvdmVycyBhbnkgYHByb2Nlc3MuZXhpdCgpYCwgYnV0IGEgZGVmYXVsdCBDdHJsK0MgdGVybWluYXRlcyBXSVRIT1VUIGZpcmluZyBgZXhpdGAsIHNvIHRoZSBzaWduYWwgaGFuZGxlcnMgZ3VhcmFudGVlIHRoZSBvd25lZCBPYnNpZGlhbiBpcyBraWxsZWQgb24gc2h1dGRvd24uXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCBkaXNwb3NlRGV2SW5zdGFuY2UpO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTSddIGFzIGNvbnN0KSB7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgZGlzcG9zZURldkluc3RhbmNlKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VEZXZJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VEaXNwb3NlZCA9IHRydWU7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoZXMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYW5kIHN0b3BzIHRoZSBkZXZlbG9wbWVudCBidWlsZCBvbmNlIHRoZSBpbnN0YW5jZSBpc1xuICogY2xvc2VkLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1pcnJvciBpbWFnZSBvZiB7QGxpbmsgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXB9OiB0aGF0IG9uZSBjbG9zZXMgdGhlIGluc3RhbmNlIHdoZW4gdGhlXG4gKiBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcywgdGhpcyBvbmUgdGVybWluYXRlcyB0aGUgcHJvY2VzcyB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgaW5zdGFuY2UsIHNvXG4gKiB0aGUgdHdvIG5ldmVyIG91dGxpdmUgZWFjaCBvdGhlci4gQSBidWlsZCB3YXRjaGluZyBhbiBPYnNpZGlhbiB0aGF0IGlzIG5vIGxvbmdlciBydW5uaW5nIGhhcyBub3RoaW5nXG4gKiBsZWZ0IHRvIGRlcGxveSB0by5cbiAqXG4gKiBPbmx5IGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSBpcyB3YXRjaGVkLiBXaGVuIHRoZSB0cmFuc3BvcnQgYXR0YWNoZXMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuXG4gKiAodGhlIHVzZXIncyBvd24pLCB0aGF0IGluc3RhbmNlIGlzIG5vdCBvdXJzIHRvIGJlIHRpZWQgdG8gYW5kIGNsb3NpbmcgaXQgbGVhdmVzIHRoZSBidWlsZCBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgb3duZWQgdHJhbnNwb3J0IHdob3NlIGluc3RhbmNlIHRvIHdhdGNoLlxuICovXG5mdW5jdGlvbiB3YXRjaERldkluc3RhbmNlQW5kU3RvcE9uQ2xvc2UodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAoISh0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2VuZHBvaW50Lmhvc3R9OiR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWA7XG4gIGludm9rZUFzeW5jU2FmZWx5KHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA9IDA7XG4gICAgd2hpbGUgKGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA8IERFVl9JTlNUQU5DRV9DTE9TRURfUFJPQkVfQ09VTlQpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTIH0pO1xuXG4gICAgICAvLyBUaGUgcHJvY2VzcyBpcyBhbHJlYWR5IHNodXR0aW5nIGRvd24gYW5kIGtpbGxlZCB0aGUgaW5zdGFuY2UgaXRzZWxmOyB0aGUgcHJvYmVzIHdvdWxkIGp1c3QgcmFjZSB0aGUgdGVhcmRvd24uXG4gICAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc2VjdXRpdmVGYWlsZWRQcm9iZUNvdW50ID0gYXdhaXQgaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsKSA/IDAgOiBjb25zZWN1dGl2ZUZhaWxlZFByb2JlQ291bnQgKyAxO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybignVGhlIE9ic2lkaWFuIGluc3RhbmNlIG93bmVkIGJ5IGBucG0gcnVuIGRldmAgd2FzIGNsb3NlZC4gU3RvcHBpbmcgdGhlIGRldmVsb3BtZW50IGJ1aWxkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsbUJBR087QUFDUCxtQkFBK0I7QUFDL0Isa0JBSU87QUFDUCxzQkFHTztBQUNQLDBCQUFvQjtBQUNwQiwwQ0FJTztBQTBGUCxNQUFNLGNBQTJCO0FBQUEsRUFDL0IsNkJBQTZCO0FBQUEsRUFDN0IsZ0NBQWdDO0FBQUEsRUFDaEMsdUJBQXVCO0FBQ3pCO0FBS0EsTUFBTSw4Q0FBOEM7QUFPcEQsTUFBTSxrQ0FBa0M7QUFPakMsU0FBUyxrQ0FBa0MsUUFBeUQ7QUFDekcsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLE1BQUk7QUFBQSxJQUNGO0FBQUEsRUFDRixJQUFJO0FBQ0osU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sTUFBTSxPQUFhO0FBQ2pCLFlBQU0sTUFBTSxZQUFZO0FBQ3RCLFlBQUksbUJBQW1CO0FBQ3JCO0FBQUEsUUFDRjtBQUVBLFlBQUksQ0FBQyxzQkFB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
@@ -0,0 +1,38 @@
1
+ /// <reference path="../../index.d.cts" />
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' with { 'resolution-mode': 'import' };
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;