@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,46 @@
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 initEsm() {
37
+ ensureDisposeSymbols();
38
+ ensureBrowserProcess();
39
+ })();
40
+ })();
41
+
42
+ import * as plugin_name_as_code from "./plugin-name-as-code.mjs";
43
+ export {
44
+ plugin_name_as_code as "plugin-name-as-code"
45
+ };
46
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvbWFya2Rvd25saW50LXJ1bGVzL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ3BsdWdpbi1uYW1lLWFzLWNvZGUnIGZyb20gJy4vcGx1Z2luLW5hbWUtYXMtY29kZS50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLFlBQVlBLHlCQUEyQjsiLAogICJuYW1lcyI6IFsicGx1Z2luLW5hbWUtYXMtY29kZSJdCn0K
@@ -0,0 +1,32 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * markdownlint rule: `plugin-name-as-code`.
6
+ *
7
+ * Reports an Obsidian plugin's display name written as plain text in markdown, and fixes it by wrapping the name in
8
+ * backticks. The names come from `plugin-names.ts`: the shared list, the project's own `manifest.json` `name`, and
9
+ * the rule's `additionalPluginNames` option.
10
+ *
11
+ * Only prose is read: the `data` tokens micromark leaves in paragraphs, lists, tables and emphasis. Everything else is
12
+ * left alone because a code span there would be wrong or would change something:
13
+ *
14
+ * - code spans, fenced and indented code and math are not `data` tokens, so they are never reached;
15
+ * - an HTML block, whose content markdownlint parses again as markdown;
16
+ * - a link or image label and target, a reference definition and an autolink: a code span inside a link label
17
+ * renders inconsistently across GitHub, Obsidian and terminals;
18
+ * - a heading, whose anchor would change;
19
+ * - a block quote, which quotes somebody else's words;
20
+ * - an Obsidian `[[wikilink]]` and an inline `<code>` element, which micromark reads as plain text, and a bare URL.
21
+ *
22
+ * Not attempted: a multi-word name broken across two lines of one paragraph.
23
+ */
24
+ import type { Rule } from 'markdownlint';
25
+ /**
26
+ * The rule's name, as it is spelled in a `markdownlint-cli2` configuration.
27
+ */
28
+ export declare const PLUGIN_NAME_AS_CODE_RULE_NAME = "plugin-name-as-code";
29
+ /**
30
+ * A markdownlint rule requiring a plugin name in markdown to be marked as code.
31
+ */
32
+ export declare const pluginNameAsCodeRule: Rule;
@@ -0,0 +1,130 @@
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 initEsm() {
37
+ ensureDisposeSymbols();
38
+ ensureBrowserProcess();
39
+ })();
40
+ })();
41
+
42
+ import process from "node:process";
43
+ import {
44
+ findPluginNameMatches,
45
+ getPluginNames
46
+ } from "../plugin-names.mjs";
47
+ const PLUGIN_NAME_AS_CODE_RULE_NAME = "plugin-name-as-code";
48
+ const EXCLUDED_TOKEN_TYPES = /* @__PURE__ */ new Set([
49
+ "atxHeading",
50
+ "blockQuote",
51
+ "definition",
52
+ "htmlFlow",
53
+ "image",
54
+ "link",
55
+ "setextHeading"
56
+ ]);
57
+ const UNDEFINED_REFERENCE_TOKEN_TYPE_PREFIX = "undefinedReference";
58
+ const EXCLUDED_LINE_PATTERNS = [
59
+ /\[\[[^\]]*\]\]/g,
60
+ /<code\b[^>]*>[\s\S]*?<\/code>/gi,
61
+ /\b[a-z][\w+.-]*:\/\/\S+/gi
62
+ ];
63
+ const pluginNameAsCodeRule = {
64
+ description: "Plugin name is not marked as code (wrap it in backticks)",
65
+ function: (params, onError) => {
66
+ const options = params.config;
67
+ const pluginNames = getPluginNames({ additionalPluginNames: options.additionalPluginNames, cwd: process.cwd() });
68
+ const proseRangesByLine = /* @__PURE__ */ new Map();
69
+ collectProseRanges(params.parsers.micromark.tokens, proseRangesByLine);
70
+ for (const [index, line] of params.lines.entries()) {
71
+ const lineNumber = index + 1;
72
+ const ranges = proseRangesByLine.get(lineNumber);
73
+ if (!ranges) {
74
+ continue;
75
+ }
76
+ const mergedRanges = mergeRanges(ranges);
77
+ for (const match of findPluginNameMatches(line, pluginNames, EXCLUDED_LINE_PATTERNS)) {
78
+ const column = match.index + 1;
79
+ const isInProse = mergedRanges.some((range) => range.start <= column && column + match.name.length <= range.end);
80
+ if (!isInProse) {
81
+ continue;
82
+ }
83
+ onError({
84
+ detail: `Wrap \`${match.name}\` in backticks`,
85
+ fixInfo: {
86
+ deleteCount: match.name.length,
87
+ editColumn: column,
88
+ insertText: `\`${match.name}\``
89
+ },
90
+ lineNumber,
91
+ range: [column, match.name.length]
92
+ });
93
+ }
94
+ }
95
+ },
96
+ names: [PLUGIN_NAME_AS_CODE_RULE_NAME],
97
+ parser: "micromark",
98
+ tags: ["code"]
99
+ };
100
+ function collectProseRanges(tokens, proseRangesByLine) {
101
+ for (const token of tokens) {
102
+ if (EXCLUDED_TOKEN_TYPES.has(token.type) || token.type.startsWith(UNDEFINED_REFERENCE_TOKEN_TYPE_PREFIX)) {
103
+ continue;
104
+ }
105
+ if (token.type === "data") {
106
+ const ranges = proseRangesByLine.get(token.startLine) ?? [];
107
+ ranges.push({ end: token.endColumn, start: token.startColumn });
108
+ proseRangesByLine.set(token.startLine, ranges);
109
+ continue;
110
+ }
111
+ collectProseRanges(token.children, proseRangesByLine);
112
+ }
113
+ }
114
+ function mergeRanges(ranges) {
115
+ const merged = [];
116
+ for (const range of [...ranges].sort((a, b) => a.start - b.start)) {
117
+ const last = merged.at(-1);
118
+ if (last && range.start <= last.end) {
119
+ merged[merged.length - 1] = { end: Math.max(last.end, range.end), start: last.start };
120
+ } else {
121
+ merged.push(range);
122
+ }
123
+ }
124
+ return merged;
125
+ }
126
+ export {
127
+ PLUGIN_NAME_AS_CODE_RULE_NAME,
128
+ pluginNameAsCodeRule
129
+ };
130
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvbWFya2Rvd25saW50LXJ1bGVzL3BsdWdpbi1uYW1lLWFzLWNvZGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBtYXJrZG93bmxpbnQgcnVsZTogYHBsdWdpbi1uYW1lLWFzLWNvZGVgLlxuICpcbiAqIFJlcG9ydHMgYW4gT2JzaWRpYW4gcGx1Z2luJ3MgZGlzcGxheSBuYW1lIHdyaXR0ZW4gYXMgcGxhaW4gdGV4dCBpbiBtYXJrZG93biwgYW5kIGZpeGVzIGl0IGJ5IHdyYXBwaW5nIHRoZSBuYW1lIGluXG4gKiBiYWNrdGlja3MuIFRoZSBuYW1lcyBjb21lIGZyb20gYHBsdWdpbi1uYW1lcy50c2A6IHRoZSBzaGFyZWQgbGlzdCwgdGhlIHByb2plY3QncyBvd24gYG1hbmlmZXN0Lmpzb25gIGBuYW1lYCwgYW5kXG4gKiB0aGUgcnVsZSdzIGBhZGRpdGlvbmFsUGx1Z2luTmFtZXNgIG9wdGlvbi5cbiAqXG4gKiBPbmx5IHByb3NlIGlzIHJlYWQ6IHRoZSBgZGF0YWAgdG9rZW5zIG1pY3JvbWFyayBsZWF2ZXMgaW4gcGFyYWdyYXBocywgbGlzdHMsIHRhYmxlcyBhbmQgZW1waGFzaXMuIEV2ZXJ5dGhpbmcgZWxzZSBpc1xuICogbGVmdCBhbG9uZSBiZWNhdXNlIGEgY29kZSBzcGFuIHRoZXJlIHdvdWxkIGJlIHdyb25nIG9yIHdvdWxkIGNoYW5nZSBzb21ldGhpbmc6XG4gKlxuICogLSBjb2RlIHNwYW5zLCBmZW5jZWQgYW5kIGluZGVudGVkIGNvZGUgYW5kIG1hdGggYXJlIG5vdCBgZGF0YWAgdG9rZW5zLCBzbyB0aGV5IGFyZSBuZXZlciByZWFjaGVkO1xuICogLSBhbiBIVE1MIGJsb2NrLCB3aG9zZSBjb250ZW50IG1hcmtkb3dubGludCBwYXJzZXMgYWdhaW4gYXMgbWFya2Rvd247XG4gKiAtIGEgbGluayBvciBpbWFnZSBsYWJlbCBhbmQgdGFyZ2V0LCBhIHJlZmVyZW5jZSBkZWZpbml0aW9uIGFuZCBhbiBhdXRvbGluazogYSBjb2RlIHNwYW4gaW5zaWRlIGEgbGluayBsYWJlbFxuICogICByZW5kZXJzIGluY29uc2lzdGVudGx5IGFjcm9zcyBHaXRIdWIsIE9ic2lkaWFuIGFuZCB0ZXJtaW5hbHM7XG4gKiAtIGEgaGVhZGluZywgd2hvc2UgYW5jaG9yIHdvdWxkIGNoYW5nZTtcbiAqIC0gYSBibG9jayBxdW90ZSwgd2hpY2ggcXVvdGVzIHNvbWVib2R5IGVsc2UncyB3b3JkcztcbiAqIC0gYW4gT2JzaWRpYW4gYFtbd2lraWxpbmtdXWAgYW5kIGFuIGlubGluZSBgPGNvZGU+YCBlbGVtZW50LCB3aGljaCBtaWNyb21hcmsgcmVhZHMgYXMgcGxhaW4gdGV4dCwgYW5kIGEgYmFyZSBVUkwuXG4gKlxuICogTm90IGF0dGVtcHRlZDogYSBtdWx0aS13b3JkIG5hbWUgYnJva2VuIGFjcm9zcyB0d28gbGluZXMgb2Ygb25lIHBhcmFncmFwaC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIE1pY3JvbWFya1Rva2VuLFxuICBSdWxlXG59IGZyb20gJ21hcmtkb3dubGludCc7XG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTmFtZVJ1bGVPcHRpb25zIH0gZnJvbSAnLi4vcGx1Z2luLW5hbWVzLnRzJztcblxuaW1wb3J0IHtcbiAgZmluZFBsdWdpbk5hbWVNYXRjaGVzLFxuICBnZXRQbHVnaW5OYW1lc1xufSBmcm9tICcuLi9wbHVnaW4tbmFtZXMudHMnO1xuXG4vKipcbiAqIFRoZSBydWxlJ3MgbmFtZSwgYXMgaXQgaXMgc3BlbGxlZCBpbiBhIGBtYXJrZG93bmxpbnQtY2xpMmAgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9OQU1FX0FTX0NPREVfUlVMRV9OQU1FID0gJ3BsdWdpbi1uYW1lLWFzLWNvZGUnO1xuXG4vKipcbiAqIFRoZSB0b2tlbiB0eXBlcyB3aG9zZSB3aG9sZSBzdWJ0cmVlIGlzIHNraXBwZWQuXG4gKi9cbmNvbnN0IEVYQ0xVREVEX1RPS0VOX1RZUEVTID0gbmV3IFNldChbXG4gICdhdHhIZWFkaW5nJyxcbiAgJ2Jsb2NrUXVvdGUnLFxuICAnZGVmaW5pdGlvbicsXG4gICdodG1sRmxvdycsXG4gICdpbWFnZScsXG4gICdsaW5rJyxcbiAgJ3NldGV4dEhlYWRpbmcnXG5dKTtcblxuLyoqXG4gKiBUaGUgcHJlZml4IG9mIHRoZSB0b2tlbiB0eXBlcyBtYXJrZG93bmxpbnQgYXBwZW5kcyBmb3IgYSBzaG9ydGN1dCwgY29sbGFwc2VkIG9yIGZ1bGwgcmVmZXJlbmNlIHdpdGggbm8gZGVmaW5pdGlvbi5cbiAqIFRoZXkgcmVwZWF0IHRleHQgdGhlIHRyZWUgYWxyZWFkeSBob2xkcywgc28gcmVhZGluZyB0aGVtIHdvdWxkIHJlcG9ydCBhIG5hbWUgdHdpY2UuXG4gKi9cbmNvbnN0IFVOREVGSU5FRF9SRUZFUkVOQ0VfVE9LRU5fVFlQRV9QUkVGSVggPSAndW5kZWZpbmVkUmVmZXJlbmNlJztcblxuLyoqXG4gKiBUaGUgbGluZSBzcGFucyBtaWNyb21hcmsgcmVhZHMgYXMgcGxhaW4gdGV4dCB3aG9zZSBwbHVnaW4gbmFtZXMgYXJlIG5vdCBwcm9zZTogYW4gT2JzaWRpYW4gd2lraWxpbmssIGFuIGlubGluZVxuICogYDxjb2RlPmAgZWxlbWVudCwgYSBVUkwuXG4gKi9cbmNvbnN0IEVYQ0xVREVEX0xJTkVfUEFUVEVSTlM6IHJlYWRvbmx5IFJlZ0V4cFtdID0gW1xuICAvXFxbXFxbW15cXF1dKlxcXVxcXS9nLFxuICAvPGNvZGVcXGJbXj5dKj5bXFxzXFxTXSo/PFxcL2NvZGU+L2dpLFxuICAvXFxiW2Etel1bXFx3Ky4tXSo6XFwvXFwvXFxTKy9naVxuXTtcblxuLyoqXG4gKiBBIGNvbHVtbiByYW5nZSBvZiBvbmUgbGluZSwgMS1iYXNlZCwgZW5kIGV4Y2x1c2l2ZS5cbiAqL1xuaW50ZXJmYWNlIENvbHVtblJhbmdlIHtcbiAgcmVhZG9ubHkgZW5kOiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBtYXJrZG93bmxpbnQgcnVsZSByZXF1aXJpbmcgYSBwbHVnaW4gbmFtZSBpbiBtYXJrZG93biB0byBiZSBtYXJrZWQgYXMgY29kZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHBsdWdpbk5hbWVBc0NvZGVSdWxlOiBSdWxlID0ge1xuICBkZXNjcmlwdGlvbjogJ1BsdWdpbiBuYW1lIGlzIG5vdCBtYXJrZWQgYXMgY29kZSAod3JhcCBpdCBpbiBiYWNrdGlja3MpJyxcbiAgZnVuY3Rpb246IChwYXJhbXMsIG9uRXJyb3IpID0+IHtcbiAgICAvLyBUaGUgbWFya2Rvd25saW50IGVuZ2luZSBoYW5kcyBhbiBlbmFibGVkIHJ1bGUgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBvciBhbiBlbXB0eSBvbmUgd2hlbiB0aGUgcnVsZSBpcyBtZXJlbHkgYHRydWVgLlxuICAgIGNvbnN0IG9wdGlvbnMgPSBwYXJhbXMuY29uZmlnIGFzIFBsdWdpbk5hbWVSdWxlT3B0aW9ucztcbiAgICBjb25zdCBwbHVnaW5OYW1lcyA9IGdldFBsdWdpbk5hbWVzKHsgYWRkaXRpb25hbFBsdWdpbk5hbWVzOiBvcHRpb25zLmFkZGl0aW9uYWxQbHVnaW5OYW1lcywgY3dkOiBwcm9jZXNzLmN3ZCgpIH0pO1xuICAgIGNvbnN0IHByb3NlUmFuZ2VzQnlMaW5lID0gbmV3IE1hcDxudW1iZXIsIENvbHVtblJhbmdlW10+KCk7XG4gICAgY29sbGVjdFByb3NlUmFuZ2VzKHBhcmFtcy5wYXJzZXJzLm1pY3JvbWFyay50b2tlbnMsIHByb3NlUmFuZ2VzQnlMaW5lKTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBwYXJhbXMubGluZXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBsaW5lTnVtYmVyID0gaW5kZXggKyAxO1xuICAgICAgY29uc3QgcmFuZ2VzID0gcHJvc2VSYW5nZXNCeUxpbmUuZ2V0KGxpbmVOdW1iZXIpO1xuICAgICAgaWYgKCFyYW5nZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lcmdlZFJhbmdlcyA9IG1lcmdlUmFuZ2VzKHJhbmdlcyk7XG4gICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGZpbmRQbHVnaW5OYW1lTWF0Y2hlcyhsaW5lLCBwbHVnaW5OYW1lcywgRVhDTFVERURfTElORV9QQVRURVJOUykpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gbWF0Y2guaW5kZXggKyAxO1xuICAgICAgICBjb25zdCBpc0luUHJvc2UgPSBtZXJnZWRSYW5nZXMuc29tZSgocmFuZ2UpID0+IHJhbmdlLnN0YXJ0IDw9IGNvbHVtbiAmJiBjb2x1bW4gKyBtYXRjaC5uYW1lLmxlbmd0aCA8PSByYW5nZS5lbmQpO1xuICAgICAgICBpZiAoIWlzSW5Qcm9zZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgZGV0YWlsOiBgV3JhcCBcXGAke21hdGNoLm5hbWV9XFxgIGluIGJhY2t0aWNrc2AsXG4gICAgICAgICAgZml4SW5mbzoge1xuICAgICAgICAgICAgZGVsZXRlQ291bnQ6IG1hdGNoLm5hbWUubGVuZ3RoLFxuICAgICAgICAgICAgZWRpdENvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgaW5zZXJ0VGV4dDogYFxcYCR7bWF0Y2gubmFtZX1cXGBgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsaW5lTnVtYmVyLFxuICAgICAgICAgIHJhbmdlOiBbY29sdW1uLCBtYXRjaC5uYW1lLmxlbmd0aF1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBuYW1lczogW1BMVUdJTl9OQU1FX0FTX0NPREVfUlVMRV9OQU1FXSxcbiAgcGFyc2VyOiAnbWljcm9tYXJrJyxcbiAgdGFnczogWydjb2RlJ11cbn07XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIGNvbHVtbiByYW5nZXMgb2YgdGhlIHByb3NlIGBkYXRhYCB0b2tlbnMsIGxpbmUgYnkgbGluZSwgc2tpcHBpbmcgdGhlIGV4Y2x1ZGVkIHN1YnRyZWVzLlxuICpcbiAqIEBwYXJhbSB0b2tlbnMgLSBUaGUgdG9rZW5zIHRvIHdhbGsuXG4gKiBAcGFyYW0gcHJvc2VSYW5nZXNCeUxpbmUgLSBUaGUgcmFuZ2VzIGNvbGxlY3RlZCBzbyBmYXIsIGtleWVkIGJ5IGxpbmUgbnVtYmVyLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UHJvc2VSYW5nZXModG9rZW5zOiByZWFkb25seSBNaWNyb21hcmtUb2tlbltdLCBwcm9zZVJhbmdlc0J5TGluZTogTWFwPG51bWJlciwgQ29sdW1uUmFuZ2VbXT4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBpZiAoRVhDTFVERURfVE9LRU5fVFlQRVMuaGFzKHRva2VuLnR5cGUpIHx8IHRva2VuLnR5cGUuc3RhcnRzV2l0aChVTkRFRklORURfUkVGRVJFTkNFX1RPS0VOX1RZUEVfUFJFRklYKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdkYXRhJykge1xuICAgICAgY29uc3QgcmFuZ2VzID0gcHJvc2VSYW5nZXNCeUxpbmUuZ2V0KHRva2VuLnN0YXJ0TGluZSkgPz8gW107XG4gICAgICByYW5nZXMucHVzaCh7IGVuZDogdG9rZW4uZW5kQ29sdW1uLCBzdGFydDogdG9rZW4uc3RhcnRDb2x1bW4gfSk7XG4gICAgICBwcm9zZVJhbmdlc0J5TGluZS5zZXQodG9rZW4uc3RhcnRMaW5lLCByYW5nZXMpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29sbGVjdFByb3NlUmFuZ2VzKHRva2VuLmNoaWxkcmVuLCBwcm9zZVJhbmdlc0J5TGluZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZXMgcmFuZ2VzIHRoYXQgdG91Y2ggb3Igb3ZlcmxhcCwgc28gYSBuYW1lIG1pY3JvbWFyayBzcGxpdHMgYWNyb3NzIGFkamFjZW50IGBkYXRhYCB0b2tlbnMgaXMgc3RpbGwgaW5zaWRlIG9uZS5cbiAqXG4gKiBAcGFyYW0gcmFuZ2VzIC0gVGhlIHJhbmdlcyBvZiBvbmUgbGluZS5cbiAqIEByZXR1cm5zIFRoZSBtZXJnZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiBtZXJnZVJhbmdlcyhyYW5nZXM6IHJlYWRvbmx5IENvbHVtblJhbmdlW10pOiBDb2x1bW5SYW5nZVtdIHtcbiAgY29uc3QgbWVyZ2VkOiBDb2x1bW5SYW5nZVtdID0gW107XG4gIGZvciAoY29uc3QgcmFuZ2Ugb2YgWy4uLnJhbmdlc10uc29ydCgoYSwgYikgPT4gYS5zdGFydCAtIGIuc3RhcnQpKSB7XG4gICAgY29uc3QgbGFzdCA9IG1lcmdlZC5hdCgtMSk7XG4gICAgaWYgKGxhc3QgJiYgcmFuZ2Uuc3RhcnQgPD0gbGFzdC5lbmQpIHtcbiAgICAgIG1lcmdlZFttZXJnZWQubGVuZ3RoIC0gMV0gPSB7IGVuZDogTWF0aC5tYXgobGFzdC5lbmQsIHJhbmdlLmVuZCksIHN0YXJ0OiBsYXN0LnN0YXJ0IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZC5wdXNoKHJhbmdlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJBLE9BQU8sYUFBYTtBQUlwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtBLE1BQU0sZ0NBQWdDO0FBSzdDLE1BQU0sdUJBQXVCLG9CQUFJLElBQUk7QUFBQSxFQUNuQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUFNRCxNQUFNLHdDQUF3QztBQU05QyxNQUFNLHlCQUE0QztBQUFBLEVBQ2hEO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQWFPLE1BQU0sdUJBQTZCO0FBQUEsRUFDeEMsYUFBYTtBQUFBLEVBQ2Is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
@@ -0,0 +1,15 @@
1
+ /// <reference path="../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Lints an Obsidian plugin's markdown: the generic runner from `@mnaoumov/typescript-dev-toolkit`, which copies
6
+ * this package's `.markdownlint-cli2.mjs` template into a project that has no configuration yet.
7
+ */
8
+ import type { LintOptions } from '@mnaoumov/typescript-dev-toolkit/linters/markdownlint';
9
+ /**
10
+ * Lints the project's markdown with `markdownlint-cli2` and `linkinator`.
11
+ *
12
+ * @param options - The {@link LintOptions}.
13
+ */
14
+ export declare function lint(options?: LintOptions): Promise<void>;
15
+ export { type LintOptions } from '@mnaoumov/typescript-dev-toolkit/linters/markdownlint';
@@ -0,0 +1,52 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return "/";
17
+ },
18
+ env: {},
19
+ platform: "android"
20
+ };
21
+ 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 initEsm() {
37
+ ensureDisposeSymbols();
38
+ ensureBrowserProcess();
39
+ })();
40
+ })();
41
+
42
+ import { lint as lintGeneric } from "@mnaoumov/typescript-dev-toolkit/linters/markdownlint";
43
+ import { RepoPaths } from "@mnaoumov/typescript-dev-toolkit/repo-paths";
44
+ import { getTemplateFilePath } from "../templates.mjs";
45
+ import {} from "@mnaoumov/typescript-dev-toolkit/linters/markdownlint";
46
+ async function lint(options) {
47
+ await lintGeneric({ defaultConfigFilePath: getTemplateFilePath(RepoPaths.MarkdownlintCli2ConfigMjs), ...options });
48
+ }
49
+ export {
50
+ lint
51
+ };
52
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvbWFya2Rvd25saW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTGludHMgYW4gT2JzaWRpYW4gcGx1Z2luJ3MgbWFya2Rvd246IHRoZSBnZW5lcmljIHJ1bm5lciBmcm9tIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdGAsIHdoaWNoIGNvcGllc1xuICogdGhpcyBwYWNrYWdlJ3MgYC5tYXJrZG93bmxpbnQtY2xpMi5tanNgIHRlbXBsYXRlIGludG8gYSBwcm9qZWN0IHRoYXQgaGFzIG5vIGNvbmZpZ3VyYXRpb24geWV0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgTGludE9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9saW50ZXJzL21hcmtkb3dubGludCc7XG5cbmltcG9ydCB7IGxpbnQgYXMgbGludEdlbmVyaWMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9saW50ZXJzL21hcmtkb3dubGludCc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZXBvLXBhdGhzJztcblxuaW1wb3J0IHsgZ2V0VGVtcGxhdGVGaWxlUGF0aCB9IGZyb20gJy4uL3RlbXBsYXRlcy50cyc7XG5cbi8qKlxuICogTGludHMgdGhlIHByb2plY3QncyBtYXJrZG93biB3aXRoIGBtYXJrZG93bmxpbnQtY2xpMmAgYW5kIGBsaW5raW5hdG9yYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgTGludE9wdGlvbnN9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChvcHRpb25zPzogTGludE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbGludEdlbmVyaWMoeyBkZWZhdWx0Q29uZmlnRmlsZVBhdGg6IGdldFRlbXBsYXRlRmlsZVBhdGgoUmVwb1BhdGhzLk1hcmtkb3dubGludENsaTJDb25maWdNanMpLCAuLi5vcHRpb25zIH0pO1xufVxuZXhwb3J0IHsgdHlwZSBMaW50T3B0aW9ucyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2xpbnRlcnMvbWFya2Rvd25saW50JztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU0EsU0FBUyxRQUFRLG1CQUFtQjtBQUNwQyxTQUFTLGlCQUFpQjtBQUUxQixTQUFTLDJCQUEyQjtBQVVwQyxlQUFpQztBQUhqQyxlQUFzQixLQUFLLFNBQXNDO0FBQy9ELFFBQU0sWUFBWSxFQUFFLHVCQUF1QixvQkFBb0IsVUFBVSx5QkFBeUIsR0FBRyxHQUFHLFFBQVEsQ0FBQztBQUNuSDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,40 @@
1
+ /// <reference path="../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Keeps `obsidianmd/rule-custom-message` from re-running a builtin rule this library's own config already sets.
6
+ *
7
+ * `eslint-plugin-obsidianmd`'s recommended config turns `no-console` and `no-new-func` off and re-runs each through
8
+ * `obsidianmd/rule-custom-message`, which fetches the builtin rule and reports its findings under its OWN rule id. So
9
+ * the severity a consumer writes on `no-console` is never consulted: `'no-console': 'off'` is inert, and the error
10
+ * that remains names a rule the consumer never configured. This library sets both builtins itself, stricter, so in
11
+ * every consumer the wrapper added nothing but a second report of the same line.
12
+ */
13
+ import type { Linter } from 'eslint';
14
+ /**
15
+ * The rule id of the wrapper that re-reports builtin rules under its own name.
16
+ */
17
+ export declare const RULE_CUSTOM_MESSAGE_RULE_NAME = "obsidianmd/rule-custom-message";
18
+ /**
19
+ * Parameters for {@link stripOwnedRuleCustomMessageEntries}.
20
+ */
21
+ export interface StripOwnedRuleCustomMessageEntriesParams {
22
+ /**
23
+ * The config whose `obsidianmd/rule-custom-message` entry is narrowed.
24
+ */
25
+ readonly config: Linter.Config;
26
+ /**
27
+ * The builtin rule names this library's own config sets, which the wrapper must no longer re-run.
28
+ */
29
+ readonly ownedRuleNames: ReadonlySet<string>;
30
+ }
31
+ /**
32
+ * Removes from a config's `obsidianmd/rule-custom-message` options every wrapped rule named in `ownedRuleNames`.
33
+ *
34
+ * An entry for a rule NOT in the set keeps running through the wrapper, so an entry upstream adds later is not
35
+ * silently dropped. When nothing is left the wrapper is turned `off` rather than run with an empty map.
36
+ *
37
+ * @param params - The parameters.
38
+ * @returns The config, unchanged when it carries no narrowable wrapper entry, otherwise a narrowed copy.
39
+ */
40
+ export declare function stripOwnedRuleCustomMessageEntries(params: StripOwnedRuleCustomMessageEntriesParams): Linter.Config;
@@ -0,0 +1,67 @@
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 initEsm() {
37
+ ensureDisposeSymbols();
38
+ ensureBrowserProcess();
39
+ })();
40
+ })();
41
+
42
+ const RULE_CUSTOM_MESSAGE_RULE_NAME = "obsidianmd/rule-custom-message";
43
+ function stripOwnedRuleCustomMessageEntries(params) {
44
+ const { config, ownedRuleNames } = params;
45
+ const ruleEntry = config.rules?.[RULE_CUSTOM_MESSAGE_RULE_NAME];
46
+ if (!Array.isArray(ruleEntry)) {
47
+ return config;
48
+ }
49
+ const [severity, wrappedRules, ...restOptions] = ruleEntry;
50
+ if (typeof wrappedRules !== "object" || wrappedRules === null) {
51
+ return config;
52
+ }
53
+ const keptEntries = Object.entries(wrappedRules).filter(([ruleName]) => !ownedRuleNames.has(ruleName));
54
+ const narrowedRuleEntry = keptEntries.length === 0 ? "off" : [severity, Object.fromEntries(keptEntries), ...restOptions];
55
+ return {
56
+ ...config,
57
+ rules: {
58
+ ...config.rules,
59
+ [RULE_CUSTOM_MESSAGE_RULE_NAME]: narrowedRuleEntry
60
+ }
61
+ };
62
+ }
63
+ export {
64
+ RULE_CUSTOM_MESSAGE_RULE_NAME,
65
+ stripOwnedRuleCustomMessageEntries
66
+ };
67
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvb2JzaWRpYW5tZC1ydWxlLWN1c3RvbS1tZXNzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogS2VlcHMgYG9ic2lkaWFubWQvcnVsZS1jdXN0b20tbWVzc2FnZWAgZnJvbSByZS1ydW5uaW5nIGEgYnVpbHRpbiBydWxlIHRoaXMgbGlicmFyeSdzIG93biBjb25maWcgYWxyZWFkeSBzZXRzLlxuICpcbiAqIGBlc2xpbnQtcGx1Z2luLW9ic2lkaWFubWRgJ3MgcmVjb21tZW5kZWQgY29uZmlnIHR1cm5zIGBuby1jb25zb2xlYCBhbmQgYG5vLW5ldy1mdW5jYCBvZmYgYW5kIHJlLXJ1bnMgZWFjaCB0aHJvdWdoXG4gKiBgb2JzaWRpYW5tZC9ydWxlLWN1c3RvbS1tZXNzYWdlYCwgd2hpY2ggZmV0Y2hlcyB0aGUgYnVpbHRpbiBydWxlIGFuZCByZXBvcnRzIGl0cyBmaW5kaW5ncyB1bmRlciBpdHMgT1dOIHJ1bGUgaWQuIFNvXG4gKiB0aGUgc2V2ZXJpdHkgYSBjb25zdW1lciB3cml0ZXMgb24gYG5vLWNvbnNvbGVgIGlzIG5ldmVyIGNvbnN1bHRlZDogYCduby1jb25zb2xlJzogJ29mZidgIGlzIGluZXJ0LCBhbmQgdGhlIGVycm9yXG4gKiB0aGF0IHJlbWFpbnMgbmFtZXMgYSBydWxlIHRoZSBjb25zdW1lciBuZXZlciBjb25maWd1cmVkLiBUaGlzIGxpYnJhcnkgc2V0cyBib3RoIGJ1aWx0aW5zIGl0c2VsZiwgc3RyaWN0ZXIsIHNvIGluXG4gKiBldmVyeSBjb25zdW1lciB0aGUgd3JhcHBlciBhZGRlZCBub3RoaW5nIGJ1dCBhIHNlY29uZCByZXBvcnQgb2YgdGhlIHNhbWUgbGluZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExpbnRlciB9IGZyb20gJ2VzbGludCc7XG5cbi8qKlxuICogVGhlIHJ1bGUgaWQgb2YgdGhlIHdyYXBwZXIgdGhhdCByZS1yZXBvcnRzIGJ1aWx0aW4gcnVsZXMgdW5kZXIgaXRzIG93biBuYW1lLlxuICovXG5leHBvcnQgY29uc3QgUlVMRV9DVVNUT01fTUVTU0FHRV9SVUxFX05BTUUgPSAnb2JzaWRpYW5tZC9ydWxlLWN1c3RvbS1tZXNzYWdlJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3RyaXBPd25lZFJ1bGVDdXN0b21NZXNzYWdlRW50cmllc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaXBPd25lZFJ1bGVDdXN0b21NZXNzYWdlRW50cmllc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmlnIHdob3NlIGBvYnNpZGlhbm1kL3J1bGUtY3VzdG9tLW1lc3NhZ2VgIGVudHJ5IGlzIG5hcnJvd2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW50ZXIuQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgYnVpbHRpbiBydWxlIG5hbWVzIHRoaXMgbGlicmFyeSdzIG93biBjb25maWcgc2V0cywgd2hpY2ggdGhlIHdyYXBwZXIgbXVzdCBubyBsb25nZXIgcmUtcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgb3duZWRSdWxlTmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogUmVtb3ZlcyBmcm9tIGEgY29uZmlnJ3MgYG9ic2lkaWFubWQvcnVsZS1jdXN0b20tbWVzc2FnZWAgb3B0aW9ucyBldmVyeSB3cmFwcGVkIHJ1bGUgbmFtZWQgaW4gYG93bmVkUnVsZU5hbWVzYC5cbiAqXG4gKiBBbiBlbnRyeSBmb3IgYSBydWxlIE5PVCBpbiB0aGUgc2V0IGtlZXBzIHJ1bm5pbmcgdGhyb3VnaCB0aGUgd3JhcHBlciwgc28gYW4gZW50cnkgdXBzdHJlYW0gYWRkcyBsYXRlciBpcyBub3RcbiAqIHNpbGVudGx5IGRyb3BwZWQuIFdoZW4gbm90aGluZyBpcyBsZWZ0IHRoZSB3cmFwcGVyIGlzIHR1cm5lZCBgb2ZmYCByYXRoZXIgdGhhbiBydW4gd2l0aCBhbiBlbXB0eSBtYXAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIGNvbmZpZywgdW5jaGFuZ2VkIHdoZW4gaXQgY2FycmllcyBubyBuYXJyb3dhYmxlIHdyYXBwZXIgZW50cnksIG90aGVyd2lzZSBhIG5hcnJvd2VkIGNvcHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcE93bmVkUnVsZUN1c3RvbU1lc3NhZ2VFbnRyaWVzKHBhcmFtczogU3RyaXBPd25lZFJ1bGVDdXN0b21NZXNzYWdlRW50cmllc1BhcmFtcyk6IExpbnRlci5Db25maWcge1xuICBjb25zdCB7IGNvbmZpZywgb3duZWRSdWxlTmFtZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgcnVsZUVudHJ5ID0gY29uZmlnLnJ1bGVzPy5bUlVMRV9DVVNUT01fTUVTU0FHRV9SVUxFX05BTUVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZUVudHJ5KSkge1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBjb25zdCBbc2V2ZXJpdHksIHdyYXBwZWRSdWxlcywgLi4ucmVzdE9wdGlvbnNdID0gcnVsZUVudHJ5IGFzIHVua25vd25bXTtcbiAgaWYgKHR5cGVvZiB3cmFwcGVkUnVsZXMgIT09ICdvYmplY3QnIHx8IHdyYXBwZWRSdWxlcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBjb25zdCBrZXB0RW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHdyYXBwZWRSdWxlcykuZmlsdGVyKChbcnVsZU5hbWVdKSA9PiAhb3duZWRSdWxlTmFtZXMuaGFzKHJ1bGVOYW1lKSk7XG4gIGNvbnN0IG5hcnJvd2VkUnVsZUVudHJ5OiBMaW50ZXIuUnVsZUVudHJ5ID0ga2VwdEVudHJpZXMubGVuZ3RoID09PSAwXG4gICAgPyAnb2ZmJ1xuICAgIDogW3NldmVyaXR5IGFzIExpbnRlci5SdWxlU2V2ZXJpdHksIE9iamVjdC5mcm9tRW50cmllcyhrZXB0RW50cmllcyksIC4uLnJlc3RPcHRpb25zXTtcblxuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZyxcbiAgICBydWxlczoge1xuICAgICAgLi4uY29uZmlnLnJ1bGVzLFxuICAgICAgW1JVTEVfQ1VTVE9NX01FU1NBR0VfUlVMRV9OQU1FXTogbmFycm93ZWRSdWxlRW50cnlcbiAgICB9XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCTyxNQUFNLGdDQUFnQztBQTBCdEMsU0FBUyxtQ0FBbUMsUUFBaUU7QUFDbEgsUUFBTSxFQUFFLFFBQVEsZUFBZSxJQUFJO0FBQ25DLFFBQU0sWUFBWSxPQUFPLFFBQVEsNkJBQTZCO0FBQzlELE1BQUksQ0FBQyxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzdCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxDQUFDLFVBQVUsY0FBYyxHQUFHLFdBQVcsSUFBSTtBQUNqRCxNQUFJLE9BQU8saUJBQWlCLFlBQVksaUJBQWlCLE1BQU07QUFDN0QsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGNBQWMsT0FBTyxRQUFRLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLE1BQU0sQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDO0FBQ3JHLFFBQU0sb0JBQXNDLFlBQVksV0FBVyxJQUMvRCxRQUNBLENBQUMsVUFBaUMsT0FBTyxZQUFZLFdBQVcsR0FBRyxHQUFHLFdBQVc7QUFFckYsU0FBTztBQUFBLElBQ0wsR0FBRztBQUFBLElBQ0gsT0FBTztBQUFBLE1BQ0wsR0FBRyxPQUFPO0FBQUEsTUFDVixDQUFDLDZCQUE2QixHQUFHO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,81 @@
1
+ /// <reference path="../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The plugin names the plugin-name lint rules look for, and the matcher they share.
6
+ *
7
+ * Whenever text mentions an Obsidian plugin by name, the name is marked as code: backticks in markdown and in code
8
+ * comments, a `<code>` element in UI. The ESLint rules `plugin-name-as-code` / `plugin-name-as-code-in-ui` and the
9
+ * markdownlint rule `plugin-name-as-code` all read the one list here, so a name added to it is checked everywhere at
10
+ * once.
11
+ *
12
+ * The list is the display name (`manifest.json` `name`) of every `mnaoumov/obsidian-*` plugin, plus the third-party
13
+ * plugins those repositories mention. A few third-party names (`Linter`, `Projects`, `Copilot`) are left out on
14
+ * purpose: they are ordinary words, so matching them bare reports prose rather than plugin names. A project adds its
15
+ * own `manifest.json` `name` automatically, and can extend the list through each rule's `additionalPluginNames`
16
+ * option.
17
+ */
18
+ /**
19
+ * The display names of the `mnaoumov/obsidian-*` plugins.
20
+ */
21
+ export declare const MNAOUMOV_PLUGIN_NAMES: readonly string[];
22
+ /**
23
+ * The display names of the third-party plugins the `mnaoumov/obsidian-*` repositories mention.
24
+ */
25
+ export declare const THIRD_PARTY_PLUGIN_NAMES: readonly string[];
26
+ /**
27
+ * Params for {@link getPluginNames}.
28
+ */
29
+ export interface GetPluginNamesParams {
30
+ /**
31
+ * Names to check on top of the shared list.
32
+ */
33
+ readonly additionalPluginNames?: readonly string[] | undefined;
34
+ /**
35
+ * The project root, whose `manifest.json` `name` is added to the list when it has one.
36
+ */
37
+ readonly cwd: string;
38
+ }
39
+ /**
40
+ * A plugin name found in a text.
41
+ */
42
+ export interface PluginNameMatch {
43
+ /**
44
+ * The offset of the name in the text.
45
+ */
46
+ readonly index: number;
47
+ /**
48
+ * The name found.
49
+ */
50
+ readonly name: string;
51
+ }
52
+ /**
53
+ * Options of a rule that checks plugin names.
54
+ */
55
+ export interface PluginNameRuleOptions {
56
+ /**
57
+ * Names to check on top of the shared list.
58
+ */
59
+ readonly additionalPluginNames?: readonly string[];
60
+ }
61
+ /**
62
+ * Finds every whole-word occurrence of a plugin name in a text, skipping those inside a range an excluded pattern
63
+ * matches.
64
+ *
65
+ * Matching is case-sensitive, so the lowercase `dataview` of an identifier or a package name is not a plugin name. A
66
+ * longer name wins over a shorter one it contains.
67
+ *
68
+ * @param text - The text to search.
69
+ * @param pluginNames - The names to look for.
70
+ * @param excludedPatterns - Global patterns whose matches hide the names inside them: a code span, a link, a URL.
71
+ * @returns The names found, in text order.
72
+ */
73
+ export declare function findPluginNameMatches(text: string, pluginNames: readonly string[], excludedPatterns?: readonly RegExp[]): PluginNameMatch[];
74
+ /**
75
+ * Builds the list of plugin names a project checks: the shared list, the project's own `manifest.json` `name`, and
76
+ * any names the project adds.
77
+ *
78
+ * @param params - The {@link GetPluginNamesParams}.
79
+ * @returns The names, without duplicates.
80
+ */
81
+ export declare function getPluginNames(params: GetPluginNamesParams): string[];
@@ -0,0 +1,141 @@
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 initEsm() {
37
+ ensureDisposeSymbols();
38
+ ensureBrowserProcess();
39
+ })();
40
+ })();
41
+
42
+ import {
43
+ existsSync,
44
+ readFileSync
45
+ } from "node:fs";
46
+ import { join } from "node:path";
47
+ const MNAOUMOV_PLUGIN_NAMES = [
48
+ "Advanced Debug Mode",
49
+ "Advanced Exclude",
50
+ "Advanced Markdown Export",
51
+ "Advanced Metadata Cache",
52
+ "Advanced Note Composer",
53
+ "Advanced Rename and Delete Handler",
54
+ "Alias Quick Switcher",
55
+ "App Update Notifier",
56
+ "Backlink Cache",
57
+ "Backlink Full Path",
58
+ "Better Markdown Links",
59
+ "CodeScript Toolkit",
60
+ "Consistent Attachments and Links",
61
+ "Custom Attachment Location",
62
+ "Edit Link Alias",
63
+ "Email to Vault",
64
+ "Embed HTML",
65
+ "External Rename Handler",
66
+ "File Bundles",
67
+ "File Explorer Reload",
68
+ "Fix Tab Size",
69
+ "Frontmatter Markdown Links",
70
+ "Insert Multiple Attachments",
71
+ "Link Picker",
72
+ "More Events",
73
+ "Nested Properties",
74
+ "New Note Fixer",
75
+ "Preserve Frontmatter Formatting",
76
+ "Refresh Any View",
77
+ "Root Folder Context Menu",
78
+ "Sample Plugin Extended",
79
+ "Smart Rename"
80
+ ];
81
+ const THIRD_PARTY_PLUGIN_NAMES = [
82
+ "Advanced Tables",
83
+ "Advanced URI",
84
+ "Dataview",
85
+ "Excalidraw",
86
+ "Folder Notes",
87
+ "Hover Editor",
88
+ "Kanban",
89
+ "Make.md",
90
+ "Natural Language Dates",
91
+ "Obsidian Git",
92
+ "Omnisearch",
93
+ "Periodic Notes",
94
+ "QuickAdd",
95
+ "Smart Connections",
96
+ "Style Settings",
97
+ "Templater",
98
+ "Text Generator"
99
+ ];
100
+ const LEADING_BOUNDARY = String.raw`(?<![\w\`./\\-])`;
101
+ const TRAILING_BOUNDARY = String.raw`(?![\w\`-]|[./\\]\w)`;
102
+ function findPluginNameMatches(text, pluginNames, excludedPatterns = []) {
103
+ if (pluginNames.length === 0) {
104
+ return [];
105
+ }
106
+ const excludedRanges = excludedPatterns.flatMap((pattern) => Array.from(text.matchAll(pattern), (match) => [match.index, match.index + match[0].length]));
107
+ const alternatives = [...pluginNames].sort((a, b) => b.length - a.length).map((name) => escapeRegExp(name)).join("|");
108
+ const nameRegExp = new RegExp(`${LEADING_BOUNDARY}(?:${alternatives})${TRAILING_BOUNDARY}`, "g");
109
+ return Array.from(text.matchAll(nameRegExp), (match) => ({ index: match.index, name: match[0] })).filter((match) => excludedRanges.every(([start, end]) => match.index >= end || match.index + match.name.length <= start));
110
+ }
111
+ function getPluginNames(params) {
112
+ const names = /* @__PURE__ */ new Set([...MNAOUMOV_PLUGIN_NAMES, ...THIRD_PARTY_PLUGIN_NAMES, ...params.additionalPluginNames ?? []]);
113
+ const ownName = readManifestName(params.cwd);
114
+ if (ownName) {
115
+ names.add(ownName);
116
+ }
117
+ return [...names];
118
+ }
119
+ function escapeRegExp(text) {
120
+ return text.replaceAll(/[$()*+.?[\\\]^{|}]/g, String.raw`\$&`);
121
+ }
122
+ function readManifestName(cwd) {
123
+ const manifestPath = join(cwd, "manifest.json");
124
+ if (!existsSync(manifestPath)) {
125
+ return null;
126
+ }
127
+ try {
128
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
129
+ const name = manifest?.["name"];
130
+ return typeof name === "string" && name !== "" ? name : null;
131
+ } catch {
132
+ return null;
133
+ }
134
+ }
135
+ export {
136
+ MNAOUMOV_PLUGIN_NAMES,
137
+ THIRD_PARTY_PLUGIN_NAMES,
138
+ findPluginNameMatches,
139
+ getPluginNames
140
+ };
141
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvcGx1Z2luLW5hbWVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBsdWdpbiBuYW1lcyB0aGUgcGx1Z2luLW5hbWUgbGludCBydWxlcyBsb29rIGZvciwgYW5kIHRoZSBtYXRjaGVyIHRoZXkgc2hhcmUuXG4gKlxuICogV2hlbmV2ZXIgdGV4dCBtZW50aW9ucyBhbiBPYnNpZGlhbiBwbHVnaW4gYnkgbmFtZSwgdGhlIG5hbWUgaXMgbWFya2VkIGFzIGNvZGU6IGJhY2t0aWNrcyBpbiBtYXJrZG93biBhbmQgaW4gY29kZVxuICogY29tbWVudHMsIGEgYDxjb2RlPmAgZWxlbWVudCBpbiBVSS4gVGhlIEVTTGludCBydWxlcyBgcGx1Z2luLW5hbWUtYXMtY29kZWAgLyBgcGx1Z2luLW5hbWUtYXMtY29kZS1pbi11aWAgYW5kIHRoZVxuICogbWFya2Rvd25saW50IHJ1bGUgYHBsdWdpbi1uYW1lLWFzLWNvZGVgIGFsbCByZWFkIHRoZSBvbmUgbGlzdCBoZXJlLCBzbyBhIG5hbWUgYWRkZWQgdG8gaXQgaXMgY2hlY2tlZCBldmVyeXdoZXJlIGF0XG4gKiBvbmNlLlxuICpcbiAqIFRoZSBsaXN0IGlzIHRoZSBkaXNwbGF5IG5hbWUgKGBtYW5pZmVzdC5qc29uYCBgbmFtZWApIG9mIGV2ZXJ5IGBtbmFvdW1vdi9vYnNpZGlhbi0qYCBwbHVnaW4sIHBsdXMgdGhlIHRoaXJkLXBhcnR5XG4gKiBwbHVnaW5zIHRob3NlIHJlcG9zaXRvcmllcyBtZW50aW9uLiBBIGZldyB0aGlyZC1wYXJ0eSBuYW1lcyAoYExpbnRlcmAsIGBQcm9qZWN0c2AsIGBDb3BpbG90YCkgYXJlIGxlZnQgb3V0IG9uXG4gKiBwdXJwb3NlOiB0aGV5IGFyZSBvcmRpbmFyeSB3b3Jkcywgc28gbWF0Y2hpbmcgdGhlbSBiYXJlIHJlcG9ydHMgcHJvc2UgcmF0aGVyIHRoYW4gcGx1Z2luIG5hbWVzLiBBIHByb2plY3QgYWRkcyBpdHNcbiAqIG93biBgbWFuaWZlc3QuanNvbmAgYG5hbWVgIGF1dG9tYXRpY2FsbHksIGFuZCBjYW4gZXh0ZW5kIHRoZSBsaXN0IHRocm91Z2ggZWFjaCBydWxlJ3MgYGFkZGl0aW9uYWxQbHVnaW5OYW1lc2BcbiAqIG9wdGlvbi5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBUaGUgZGlzcGxheSBuYW1lcyBvZiB0aGUgYG1uYW91bW92L29ic2lkaWFuLSpgIHBsdWdpbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBNTkFPVU1PVl9QTFVHSU5fTkFNRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnQWR2YW5jZWQgRGVidWcgTW9kZScsXG4gICdBZHZhbmNlZCBFeGNsdWRlJyxcbiAgJ0FkdmFuY2VkIE1hcmtkb3duIEV4cG9ydCcsXG4gICdBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZScsXG4gICdBZHZhbmNlZCBOb3RlIENvbXBvc2VyJyxcbiAgJ0FkdmFuY2VkIFJlbmFtZSBhbmQgRGVsZXRlIEhhbmRsZXInLFxuICAnQWxpYXMgUXVpY2sgU3dpdGNoZXInLFxuICAnQXBwIFVwZGF0ZSBOb3RpZmllcicsXG4gICdCYWNrbGluayBDYWNoZScsXG4gICdCYWNrbGluayBGdWxsIFBhdGgnLFxuICAnQmV0dGVyIE1hcmtkb3duIExpbmtzJyxcbiAgJ0NvZGVTY3JpcHQgVG9vbGtpdCcsXG4gICdDb25zaXN0ZW50IEF0dGFjaG1lbnRzIGFuZCBMaW5rcycsXG4gICdDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbicsXG4gICdFZGl0IExpbmsgQWxpYXMnLFxuICAnRW1haWwgdG8gVmF1bHQnLFxuICAnRW1iZWQgSFRNTCcsXG4gICdFeHRlcm5hbCBSZW5hbWUgSGFuZGxlcicsXG4gICdGaWxlIEJ1bmRsZXMnLFxuICAnRmlsZSBFeHBsb3JlciBSZWxvYWQnLFxuICAnRml4IFRhYiBTaXplJyxcbiAgJ0Zyb250bWF0dGVyIE1hcmtkb3duIExpbmtzJyxcbiAgJ0luc2VydCBNdWx0aXBsZSBBdHRhY2htZW50cycsXG4gICdMaW5rIFBpY2tlcicsXG4gICdNb3JlIEV2ZW50cycsXG4gICdOZXN0ZWQgUHJvcGVydGllcycsXG4gICdOZXcgTm90ZSBGaXhlcicsXG4gICdQcmVzZXJ2ZSBGcm9udG1hdHRlciBGb3JtYXR0aW5nJyxcbiAgJ1JlZnJlc2ggQW55IFZpZXcnLFxuICAnUm9vdCBGb2xkZXIgQ29udGV4dCBNZW51JyxcbiAgJ1NhbXBsZSBQbHVnaW4gRXh0ZW5kZWQnLFxuICAnU21hcnQgUmVuYW1lJ1xuXTtcblxuLyoqXG4gKiBUaGUgZGlzcGxheSBuYW1lcyBvZiB0aGUgdGhpcmQtcGFydHkgcGx1Z2lucyB0aGUgYG1uYW91bW92L29ic2lkaWFuLSpgIHJlcG9zaXRvcmllcyBtZW50aW9uLlxuICovXG5leHBvcnQgY29uc3QgVEhJUkRfUEFSVFlfUExVR0lOX05BTUVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgJ0FkdmFuY2VkIFRhYmxlcycsXG4gICdBZHZhbmNlZCBVUkknLFxuICAnRGF0YXZpZXcnLFxuICAnRXhjYWxpZHJhdycsXG4gICdGb2xkZXIgTm90ZXMnLFxuICAnSG92ZXIgRWRpdG9yJyxcbiAgJ0thbmJhbicsXG4gICdNYWtlLm1kJyxcbiAgJ05hdHVyYWwgTGFuZ3VhZ2UgRGF0ZXMnLFxuICAnT2JzaWRpYW4gR2l0JyxcbiAgJ09tbmlzZWFyY2gnLFxuICAnUGVyaW9kaWMgTm90ZXMnLFxuICAnUXVpY2tBZGQnLFxuICAnU21hcnQgQ29ubmVjdGlvbnMnLFxuICAnU3R5bGUgU2V0dGluZ3MnLFxuICAnVGVtcGxhdGVyJyxcbiAgJ1RleHQgR2VuZXJhdG9yJ1xuXTtcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZXRQbHVnaW5OYW1lc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGx1Z2luTmFtZXNQYXJhbXMge1xuICAvKipcbiAgICogTmFtZXMgdG8gY2hlY2sgb24gdG9wIG9mIHRoZSBzaGFyZWQgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxQbHVnaW5OYW1lcz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvamVjdCByb290LCB3aG9zZSBgbWFuaWZlc3QuanNvbmAgYG5hbWVgIGlzIGFkZGVkIHRvIHRoZSBsaXN0IHdoZW4gaXQgaGFzIG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIG5hbWUgZm91bmQgaW4gYSB0ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5hbWVNYXRjaCB7XG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IG9mIHRoZSBuYW1lIGluIHRoZSB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgZm91bmQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBvZiBhIHJ1bGUgdGhhdCBjaGVja3MgcGx1Z2luIG5hbWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5hbWVSdWxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOYW1lcyB0byBjaGVjayBvbiB0b3Agb2YgdGhlIHNoYXJlZCBsaXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFBsdWdpbk5hbWVzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogQ2hhcmFjdGVycyB0aGF0LCByaWdodCBiZWZvcmUgYSBuYW1lLCBtYWtlIGl0IHBhcnQgb2YgYSBsb25nZXIgdG9rZW46IGEgd29yZCwgYSBjb2RlIHNwYW4sIGEga2ViYWItY2FzZVxuICogaWRlbnRpZmllciwgYSBwYXRoIG9yIGEgbWVtYmVyIGFjY2Vzcy5cbiAqL1xuY29uc3QgTEVBRElOR19CT1VOREFSWSA9IFN0cmluZy5yYXdgKD88IVtcXHdcXGAuL1xcXFwtXSlgO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgdGhhdCwgcmlnaHQgYWZ0ZXIgYSBuYW1lLCBtYWtlIGl0IHBhcnQgb2YgYSBsb25nZXIgdG9rZW4uIEEgYC5gIG9yIGAvYCBpcyBhIGJvdW5kYXJ5IG9ubHkgd2hlbiBhIHdvcmRcbiAqIGZvbGxvd3MgaXQsIHNvIGEgbmFtZSBlbmRpbmcgYSBzZW50ZW5jZSBzdGlsbCBtYXRjaGVzLlxuICovXG5jb25zdCBUUkFJTElOR19CT1VOREFSWSA9IFN0cmluZy5yYXdgKD8hW1xcd1xcYC1dfFsuL1xcXFxdXFx3KWA7XG5cbi8qKlxuICogRmluZHMgZXZlcnkgd2hvbGUtd29yZCBvY2N1cnJlbmNlIG9mIGEgcGx1Z2luIG5hbWUgaW4gYSB0ZXh0LCBza2lwcGluZyB0aG9zZSBpbnNpZGUgYSByYW5nZSBhbiBleGNsdWRlZCBwYXR0ZXJuXG4gKiBtYXRjaGVzLlxuICpcbiAqIE1hdGNoaW5nIGlzIGNhc2Utc2Vuc2l0aXZlLCBzbyB0aGUgbG93ZXJjYXNlIGBkYXRhdmlld2Agb2YgYW4gaWRlbnRpZmllciBvciBhIHBhY2thZ2UgbmFtZSBpcyBub3QgYSBwbHVnaW4gbmFtZS4gQVxuICogbG9uZ2VyIG5hbWUgd2lucyBvdmVyIGEgc2hvcnRlciBvbmUgaXQgY29udGFpbnMuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBzZWFyY2guXG4gKiBAcGFyYW0gcGx1Z2luTmFtZXMgLSBUaGUgbmFtZXMgdG8gbG9vayBmb3IuXG4gKiBAcGFyYW0gZXhjbHVkZWRQYXR0ZXJucyAtIEdsb2JhbCBwYXR0ZXJucyB3aG9zZSBtYXRjaGVzIGhpZGUgdGhlIG5hbWVzIGluc2lkZSB0aGVtOiBhIGNvZGUgc3BhbiwgYSBsaW5rLCBhIFVSTC5cbiAqIEByZXR1cm5zIFRoZSBuYW1lcyBmb3VuZCwgaW4gdGV4dCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQbHVnaW5OYW1lTWF0Y2hlcyh0ZXh0OiBzdHJpbmcsIHBsdWdpbk5hbWVzOiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZWRQYXR0ZXJuczogcmVhZG9ubHkgUmVnRXhwW10gPSBbXSk6IFBsdWdpbk5hbWVNYXRjaFtdIHtcbiAgaWYgKHBsdWdpbk5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGV4Y2x1ZGVkUmFuZ2VzID0gZXhjbHVkZWRQYXR0ZXJucy5mbGF0TWFwKChwYXR0ZXJuKSA9PiBBcnJheS5mcm9tKHRleHQubWF0Y2hBbGwocGF0dGVybiksIChtYXRjaCkgPT4gW21hdGNoLmluZGV4LCBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aF0gYXMgY29uc3QpKTtcbiAgY29uc3QgYWx0ZXJuYXRpdmVzID0gWy4uLnBsdWdpbk5hbWVzXS5zb3J0KChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoKS5tYXAoKG5hbWUpID0+IGVzY2FwZVJlZ0V4cChuYW1lKSkuam9pbignfCcpO1xuICBjb25zdCBuYW1lUmVnRXhwID0gbmV3IFJlZ0V4cChgJHtMRUFESU5HX0JPVU5EQVJZfSg/OiR7YWx0ZXJuYXRpdmVzfSkke1RSQUlMSU5HX0JPVU5EQVJZfWAsICdnJyk7XG5cbiAgcmV0dXJuIEFycmF5LmZyb20odGV4dC5tYXRjaEFsbChuYW1lUmVnRXhwKSwgKG1hdGNoKSA9PiAoeyBpbmRleDogbWF0Y2guaW5kZXgsIG5hbWU6IG1hdGNoWzBdIH0pKVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiBleGNsdWRlZFJhbmdlcy5ldmVyeSgoW3N0YXJ0LCBlbmRdKSA9PiBtYXRjaC5pbmRleCA+PSBlbmQgfHwgbWF0Y2guaW5kZXggKyBtYXRjaC5uYW1lLmxlbmd0aCA8PSBzdGFydCkpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbGlzdCBvZiBwbHVnaW4gbmFtZXMgYSBwcm9qZWN0IGNoZWNrczogdGhlIHNoYXJlZCBsaXN0LCB0aGUgcHJvamVjdCdzIG93biBgbWFuaWZlc3QuanNvbmAgYG5hbWVgLCBhbmRcbiAqIGFueSBuYW1lcyB0aGUgcHJvamVjdCBhZGRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFBsdWdpbk5hbWVzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBuYW1lcywgd2l0aG91dCBkdXBsaWNhdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGx1Z2luTmFtZXMocGFyYW1zOiBHZXRQbHVnaW5OYW1lc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KFsuLi5NTkFPVU1PVl9QTFVHSU5fTkFNRVMsIC4uLlRISVJEX1BBUlRZX1BMVUdJTl9OQU1FUywgLi4ucGFyYW1zLmFkZGl0aW9uYWxQbHVnaW5OYW1lcyA/PyBbXV0pO1xuICBjb25zdCBvd25OYW1lID0gcmVhZE1hbmlmZXN0TmFtZShwYXJhbXMuY3dkKTtcbiAgaWYgKG93bk5hbWUpIHtcbiAgICBuYW1lcy5hZGQob3duTmFtZSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5uYW1lc107XG59XG5cbi8qKlxuICogRXNjYXBlcyBhIHN0cmluZyBmb3IgdXNlIGFzIGEgbGl0ZXJhbCBpbnNpZGUgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBgbmFtZWAgb2YgdGhlIHByb2plY3QncyBgbWFuaWZlc3QuanNvbmAuXG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgbmFtZSwgb3IgYG51bGxgIHdoZW4gdGhlcmUgaXMgbm8gbWFuaWZlc3QsIGl0IGRvZXMgbm90IHBhcnNlLCBvciBpdHMgYG5hbWVgIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlYWRNYW5pZmVzdE5hbWUoY3dkOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihjd2QsICdtYW5pZmVzdC5qc29uJyk7XG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IG1hbmlmZXN0OiB1bmtub3duID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmLTgnKSk7XG4gICAgY29uc3QgbmFtZSA9IChtYW5pZmVzdCBhcyBudWxsIHwgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pPy5bJ25hbWUnXTtcbiAgICByZXR1cm4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIG5hbWUgIT09ICcnID8gbmFtZSA6IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUtkLE1BQU0sd0JBQTJDO0FBQUEsRUFDdEQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFB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