@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,10 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ import type { Rule } from 'eslint';
3
+ /**
4
+ Message ID reported when an integration test drives the UI with a dispatched input event.
5
+ */
6
+ export declare const MESSAGE_ID = "noUntrustedInputEvents";
7
+ /**
8
+ * ESLint rule disallowing untrusted input events in integration tests, where they can silently exercise nothing.
9
+ */
10
+ export declare const noUntrustedInputEvents: Rule.RuleModule;
@@ -0,0 +1,138 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return "/";
17
+ },
18
+ env: {},
19
+ platform: "android"
20
+ };
21
+ 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 { toTSESTreeNode } from "@mnaoumov/typescript-dev-toolkit/linters/eslint-rules/ts-estree-node";
43
+ const MESSAGE_ID = "noUntrustedInputEvents";
44
+ const ADVICE_BY_EVENT_NAME = /* @__PURE__ */ new Map([
45
+ ["DragEvent", "there is no trusted equivalent, because `sendInputEvent` cannot express a drag, so keep the dispatch and disable this rule with the reason"],
46
+ ["KeyboardEvent", "use `pressKey`, focusing the target first, since a trusted key press goes to whatever holds DOM focus"],
47
+ ["MouseEvent", "use `clickElement`, or `clickMouse` when the point to click is not an element centre"],
48
+ ["PointerEvent", "use `clickElement`, or `clickMouse` when the point to click is not an element centre"],
49
+ ["TouchEvent", "there is no trusted equivalent, so keep the dispatch and disable this rule with the reason"],
50
+ ["WheelEvent", "there is no trusted equivalent, so keep the dispatch and disable this rule with the reason"]
51
+ ]);
52
+ const noUntrustedInputEvents = {
53
+ create(context) {
54
+ return {
55
+ "CallExpression"(node) {
56
+ const callNode = toTSESTreeNode(node);
57
+ if (!isDispatchEventCall(callNode)) {
58
+ return;
59
+ }
60
+ const argument = callNode.arguments[0];
61
+ if (!argument) {
62
+ return;
63
+ }
64
+ const eventName = resolveEventName(argument, node, context);
65
+ if (eventName === null) {
66
+ return;
67
+ }
68
+ const advice = ADVICE_BY_EVENT_NAME.get(eventName);
69
+ if (advice === void 0) {
70
+ return;
71
+ }
72
+ context.report({
73
+ data: {
74
+ advice,
75
+ eventName
76
+ },
77
+ messageId: MESSAGE_ID,
78
+ node
79
+ });
80
+ }
81
+ };
82
+ },
83
+ meta: {
84
+ docs: {
85
+ description: "Disallow driving integration tests with dispatched (untrusted) input events"
86
+ },
87
+ messages: {
88
+ [MESSAGE_ID]: "A dispatched {{ eventName }} is untrusted (`isTrusted === false`) and Obsidian may ignore it, so this can exercise nothing while still passing: {{ advice }}."
89
+ },
90
+ schema: [],
91
+ type: "problem"
92
+ }
93
+ };
94
+ function findVariable(scope, name) {
95
+ let currentScope = scope;
96
+ while (currentScope) {
97
+ const variable = currentScope.variables.find((candidate) => candidate.name === name);
98
+ if (variable) {
99
+ return variable;
100
+ }
101
+ currentScope = currentScope.upper;
102
+ }
103
+ return null;
104
+ }
105
+ function isDispatchEventCall(node) {
106
+ const callee = node.callee;
107
+ return callee.type === "MemberExpression" && callee.property.type === "Identifier" && callee.property.name === "dispatchEvent";
108
+ }
109
+ function readConstructorName(node) {
110
+ return node.callee.type === "Identifier" ? node.callee.name : null;
111
+ }
112
+ function resolveEventName(argument, node, context) {
113
+ if (argument.type === "NewExpression") {
114
+ return readConstructorName(argument);
115
+ }
116
+ if (argument.type !== "Identifier") {
117
+ return null;
118
+ }
119
+ const variable = findVariable(context.sourceCode.getScope(node), argument.name);
120
+ if (!variable) {
121
+ return null;
122
+ }
123
+ for (const definition of variable.defs) {
124
+ const definitionNode = toTSESTreeNode(definition.node);
125
+ if (definitionNode.type !== "VariableDeclarator" || !definitionNode.init) {
126
+ continue;
127
+ }
128
+ if (definitionNode.init.type === "NewExpression") {
129
+ return readConstructorName(definitionNode.init);
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ export {
135
+ MESSAGE_ID,
136
+ noUntrustedInputEvents
137
+ };
138
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL25vLXVudHJ1c3RlZC1pbnB1dC1ldmVudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFU0xpbnQgcnVsZTogbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50c1xuICpcbiAqIFJlcG9ydHMgYW4gaW50ZWdyYXRpb24gdGVzdCB0aGF0IGRyaXZlcyB0aGUgVUkgYnkgZGlzcGF0Y2hpbmcgYW4gSU5QVVQgZXZlbnQgXHUyMDE0XG4gKiBgZWwuZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCguLi4pKWAsIGBuZXcgTW91c2VFdmVudCguLi4pYCwgYW5kIGZyaWVuZHMuXG4gKlxuICogU3VjaCBhbiBldmVudCBpcyB1bnRydXN0ZWQgKGBpc1RydXN0ZWQgPT09IGZhbHNlYCksIGFuZCBPYnNpZGlhbiBhbmQgQ29kZU1pcnJvclxuICogcm91dGluZWx5IGdhdGUgb24gZXhhY3RseSB0aGF0OiBPYnNpZGlhbiAxLjEzJ3MgbWFya2Rvd24gdmlld3BvcnQgbWVudSBvcGVucyBmcm9tXG4gKiBhIGxpc3RlbmVyIGd1YXJkZWQgYnkgYGUuaXNUcnVzdGVkYCwgc28gYSBkaXNwYXRjaGVkIGBjb250ZXh0bWVudWAgcmVhY2hlcyBub3RoaW5nLlxuICogVGhlIHRlc3QgdGhlbiBleGVyY2lzZXMgTk9USElORyB3aGlsZSBzdGlsbCBwYXNzaW5nIHdoYXRldmVyIHdlYWtlciBhc3NlcnRpb24gaXRcbiAqIG1ha2VzIFx1MjAxNCBhIGZhbHNlLWNvbmZpZGVuY2UgZmFpbHVyZSwgbm90IGEgZmxha2UuXG4gKlxuICogVGhlIHRydXN0ZWQgYWx0ZXJuYXRpdmVzIFx1MjAxNCBgcHJlc3NLZXlgLCBgY2xpY2tFbGVtZW50YCwgYGNsaWNrTW91c2VgLCBgaG92ZXJFbGVtZW50YCxcbiAqIGB0eXBlSW50b0VkaXRvcmAgXHUyMDE0IGFyZSBzZWVkZWQgaW50byB0aGUgYGV2YWxJbk9ic2lkaWFuYCBjYWxsYmFjaydzIGBsaWJgIGJhZywgYW5kIGFyZVxuICogYWxzbyBpbXBvcnRhYmxlIGZyb20gYG9ic2lkaWFuLWRldi11dGlscy9vYnNpZGlhbi90cnVzdGVkLWlucHV0YCwgd2hpY2ggcGlja3MgdGhlXG4gKiBkZXNrdG9wIG9yIG1vYmlsZSBpbmplY3RvciBpdHNlbGYuIEFsbCBvZiB0aGVtIHdvcmsgb24gQW5kcm9pZCBleGNlcHQgdGhlIGhvdmVyXG4gKiBoZWxwZXJzLCB3aGljaCB0aHJvdyB0aGVyZSBiZWNhdXNlIGA6aG92ZXJgIGhhcyBubyB0b3VjaCBlcXVpdmFsZW50LlxuICpcbiAqIE5PVElGSUNBVElPTiBldmVudHMgYXJlIGRlbGliZXJhdGVseSBOT1QgcmVwb3J0ZWQuIGBuZXcgRXZlbnQoJ2lucHV0JylgIGFmdGVyIHNldHRpbmdcbiAqIGFuIGVsZW1lbnQncyBgLnZhbHVlYCBpcyB0ZWxsaW5nIHRoZSBhcHAgYWJvdXQgYSBjaGFuZ2UgcmF0aGVyIHRoYW4gcHJldGVuZGluZyB0byBiZSBhXG4gKiB1c2VyLCBhbmQgbm90aGluZyBnYXRlcyBpdCBvbiBgaXNUcnVzdGVkYC5cbiAqXG4gKiBOb3QgZXZlcnkgZGlzcGF0Y2ggaXMgd3JvbmcsIHNvIHRoZSBydWxlIGlzIG1lYW50IHRvIGJlIGRpc2FibGVkIFx1MjAxNCB3aXRoIGEgcmVhc29uIFx1MjAxNCBhdFxuICogdGhlIHNpdGVzIHRoYXQgaGF2ZSBvbmU6IGEgZHJhZyBzZXF1ZW5jZSwgd2hpY2ggYHNlbmRJbnB1dEV2ZW50YCBjYW5ub3QgZXhwcmVzcyBhdCBhbGw7XG4gKiB0aGUgbW9iaWxlIGFybSBvZiBhIGhvdmVyIGdlc3R1cmUsIHdoaWNoIGhhcyBubyB0b3VjaCBlcXVpdmFsZW50OyBhbmQgYSBsaXN0ZW5lciB0aGF0XG4gKiBpcyB0aGUgcGx1Z2luJ3Mgb3duIGFuZCBjaGVja3Mgbm90aGluZyBidXQgdGhlIGtleS4gYHJlcXVpcmUtZGVzY3JpcHRpb25gXG4gKiBtYWtlcyB0aGF0IHJlYXNvbiBtYW5kYXRvcnksIHdoaWNoIGlzIHRoZSBwb2ludDogdGhlIHJ1bGUgdHVybnMgYW4gaW52aXNpYmxlIGFzc3VtcHRpb25cbiAqIGludG8gYSB3cml0dGVuIG9uZS5cbiAqL1xuaW1wb3J0IHR5cGUgeyBUU0VTVHJlZSB9IGZyb20gJ0B0eXBlc2NyaXB0LWVzbGludC91dGlscyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJ1bGUsXG4gIFNjb3BlXG59IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IHRvVFNFU1RyZWVOb2RlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvbGludGVycy9lc2xpbnQtcnVsZXMvdHMtZXN0cmVlLW5vZGUnO1xuXG4vKipcbk1lc3NhZ2UgSUQgcmVwb3J0ZWQgd2hlbiBhbiBpbnRlZ3JhdGlvbiB0ZXN0IGRyaXZlcyB0aGUgVUkgd2l0aCBhIGRpc3BhdGNoZWQgaW5wdXQgZXZlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBNRVNTQUdFX0lEID0gJ25vVW50cnVzdGVkSW5wdXRFdmVudHMnO1xuXG4vKipcbiAqIFdoYXQgdG8gZG8gaW5zdGVhZCwgcGVyIGV2ZW50IGNvbnN0cnVjdG9yLiBBbiBldmVudCBhYnNlbnQgZnJvbSB0aGlzIG1hcCBpcyBhXG4gKiBub3RpZmljYXRpb24gcmF0aGVyIHRoYW4gc2ltdWxhdGVkIGlucHV0LCBhbmQgaXMgbGVmdCBhbG9uZS5cbiAqL1xuY29uc3QgQURWSUNFX0JZX0VWRU5UX05BTUUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihbXG4gIFsnRHJhZ0V2ZW50JywgJ3RoZXJlIGlzIG5vIHRydXN0ZWQgZXF1aXZhbGVudCwgYmVjYXVzZSBgc2VuZElucHV0RXZlbnRgIGNhbm5vdCBleHByZXNzIGEgZHJhZywgc28ga2VlcCB0aGUgZGlzcGF0Y2ggYW5kIGRpc2FibGUgdGhpcyBydWxlIHdpdGggdGhlIHJlYXNvbiddLFxuICBbJ0tleWJvYXJkRXZlbnQnLCAndXNlIGBwcmVzc0tleWAsIGZvY3VzaW5nIHRoZSB0YXJnZXQgZmlyc3QsIHNpbmNlIGEgdHJ1c3RlZCBrZXkgcHJlc3MgZ29lcyB0byB3aGF0ZXZlciBob2xkcyBET00gZm9jdXMnXSxcbiAgWydNb3VzZUV2ZW50JywgJ3VzZSBgY2xpY2tFbGVtZW50YCwgb3IgYGNsaWNrTW91c2VgIHdoZW4gdGhlIHBvaW50IHRvIGNsaWNrIGlzIG5vdCBhbiBlbGVtZW50IGNlbnRyZSddLFxuICBbJ1BvaW50ZXJFdmVudCcsICd1c2UgYGNsaWNrRWxlbWVudGAsIG9yIGBjbGlja01vdXNlYCB3aGVuIHRoZSBwb2ludCB0byBjbGljayBpcyBub3QgYW4gZWxlbWVudCBjZW50cmUnXSxcbiAgWydUb3VjaEV2ZW50JywgJ3RoZXJlIGlzIG5vIHRydXN0ZWQgZXF1aXZhbGVudCwgc28ga2VlcCB0aGUgZGlzcGF0Y2ggYW5kIGRpc2FibGUgdGhpcyBydWxlIHdpdGggdGhlIHJlYXNvbiddLFxuICBbJ1doZWVsRXZlbnQnLCAndGhlcmUgaXMgbm8gdHJ1c3RlZCBlcXVpdmFsZW50LCBzbyBrZWVwIHRoZSBkaXNwYXRjaCBhbmQgZGlzYWJsZSB0aGlzIHJ1bGUgd2l0aCB0aGUgcmVhc29uJ11cbl0pO1xuXG4vKipcbiAqIEVTTGludCBydWxlIGRpc2FsbG93aW5nIHVudHJ1c3RlZCBpbnB1dCBldmVudHMgaW4gaW50ZWdyYXRpb24gdGVzdHMsIHdoZXJlIHRoZXkgY2FuIHNpbGVudGx5IGV4ZXJjaXNlIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBub1VudHJ1c3RlZElucHV0RXZlbnRzOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdDYWxsRXhwcmVzc2lvbicobm9kZTogUnVsZS5Ob2RlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNhbGxOb2RlID0gdG9UU0VTVHJlZU5vZGUobm9kZSkgYXMgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb247XG5cbiAgICAgICAgaWYgKCFpc0Rpc3BhdGNoRXZlbnRDYWxsKGNhbGxOb2RlKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3VtZW50ID0gY2FsbE5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoIWFyZ3VtZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gcmVzb2x2ZUV2ZW50TmFtZShhcmd1bWVudCwgbm9kZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChldmVudE5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZHZpY2UgPSBBRFZJQ0VfQllfRVZFTlRfTkFNRS5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKGFkdmljZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGFkdmljZSxcbiAgICAgICAgICAgIGV2ZW50TmFtZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZUlkOiBNRVNTQUdFX0lELFxuICAgICAgICAgIG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGlzYWxsb3cgZHJpdmluZyBpbnRlZ3JhdGlvbiB0ZXN0cyB3aXRoIGRpc3BhdGNoZWQgKHVudHJ1c3RlZCkgaW5wdXQgZXZlbnRzJ1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEXTogJ0EgZGlzcGF0Y2hlZCB7eyBldmVudE5hbWUgfX0gaXMgdW50cnVzdGVkIChgaXNUcnVzdGVkID09PSBmYWxzZWApIGFuZCBPYnNpZGlhbiBtYXkgaWdub3JlIGl0LCBzbyB0aGlzIGNhbiBleGVyY2lzZSBub3RoaW5nIHdoaWxlIHN0aWxsIHBhc3Npbmc6IHt7IGFkdmljZSB9fS4nXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICAgIHR5cGU6ICdwcm9ibGVtJ1xuICB9XG59O1xuXG4vKipcbiAqIEZpbmRzIGEgdmFyaWFibGUgYnkgbmFtZSwgd2Fsa2luZyBvdXR3YXJkcyBmcm9tIHRoZSBnaXZlbiBzY29wZS5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgdG8gc3RhcnQgZnJvbS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHZhcmlhYmxlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSB2YXJpYWJsZSwgb3IgYG51bGxgIHdoZW4gbm90aGluZyBpbiBzY29wZSBkZWNsYXJlcyB0aGF0IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGZpbmRWYXJpYWJsZShzY29wZTogU2NvcGUuU2NvcGUsIG5hbWU6IHN0cmluZyk6IG51bGwgfCBTY29wZS5WYXJpYWJsZSB7XG4gIGxldCBjdXJyZW50U2NvcGU6IG51bGwgfCBTY29wZS5TY29wZSA9IHNjb3BlO1xuXG4gIHdoaWxlIChjdXJyZW50U2NvcGUpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IGN1cnJlbnRTY29wZS52YXJpYWJsZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gbmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgfVxuICAgIGN1cnJlbnRTY29wZSA9IGN1cnJlbnRTY29wZS51cHBlcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgY2FsbCBleHByZXNzaW9uIGlzIGEgYC5kaXNwYXRjaEV2ZW50KC4uLilgIGNhbGwuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgY2FsbCBleHByZXNzaW9uIG5vZGUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNhbGwgaXMgYDxzb21ldGhpbmc+LmRpc3BhdGNoRXZlbnQoLi4uKWAuXG4gKi9cbmZ1bmN0aW9uIGlzRGlzcGF0Y2hFdmVudENhbGwobm9kZTogVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgY29uc3QgY2FsbGVlID0gbm9kZS5jYWxsZWU7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIGNhbGxlZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgJiYgY2FsbGVlLnByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJiBjYWxsZWUucHJvcGVydHkubmFtZSA9PT0gJ2Rpc3BhdGNoRXZlbnQnO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBpZGVudGlmaWVyIGEgYG5ldyAuLi4oKWAgZXhwcmVzc2lvbiBjb25zdHJ1Y3RzLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGBOZXdFeHByZXNzaW9uYCBub2RlLlxuICogQHJldHVybnMgVGhlIGNvbnN0cnVjdG9yJ3MgbmFtZSwgb3IgYG51bGxgIHdoZW4gdGhlIGNhbGxlZSBpcyBub3QgYSBiYXJlIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDb25zdHJ1Y3Rvck5hbWUobm9kZTogVFNFU1RyZWUuTmV3RXhwcmVzc2lvbik6IG51bGwgfCBzdHJpbmcge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS5jYWxsZWUudHlwZSA9PT0gJ0lkZW50aWZpZXInID8gbm9kZS5jYWxsZWUubmFtZSA6IG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgb2YgdGhlIGV2ZW50IGJlaW5nIGRpc3BhdGNoZWQuXG4gKlxuICogSGFuZGxlcyB0aGUgYXJndW1lbnQgd3JpdHRlbiBpbmxpbmUgKGBkaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KC4uLikpYCkgYW5kIHRoZVxuICogYXJndW1lbnQgaGVsZCBpbiBhIHZhcmlhYmxlIChgY29uc3QgZSA9IG5ldyBEcmFnRXZlbnQoLi4uKTsgZWwuZGlzcGF0Y2hFdmVudChlKWApLFxuICogd2hpY2ggaXMgaG93IGEgc2VxdWVuY2Ugc2hhcmluZyBvbmUgYERhdGFUcmFuc2ZlcmAgaXMgdXN1YWxseSB3cml0dGVuLlxuICpcbiAqIEBwYXJhbSBhcmd1bWVudCAtIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYGRpc3BhdGNoRXZlbnRgIGNhbGwuXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBjYWxsIG5vZGUsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZW5jbG9zaW5nIHNjb3BlLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGNvbnN0cnVjdG9yIG5hbWUsIG9yIGBudWxsYCB3aGVuIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRXZlbnROYW1lKGFyZ3VtZW50OiBUU0VTVHJlZS5Ob2RlLCBub2RlOiBSdWxlLk5vZGUsIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBudWxsIHwgc3RyaW5nIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgaWYgKGFyZ3VtZW50LnR5cGUgPT09ICdOZXdFeHByZXNzaW9uJykge1xuICAgIHJldHVybiByZWFkQ29uc3RydWN0b3JOYW1lKGFyZ3VtZW50KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIGlmIChhcmd1bWVudC50eXBlICE9PSAnSWRlbnRpZmllcicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhcmlhYmxlID0gZmluZFZhcmlhYmxlKGNvbnRleHQuc291cmNlQ29kZS5nZXRTY29wZShub2RlKSwgYXJndW1lbnQubmFtZSk7XG4gIGlmICghdmFyaWFibGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiB2YXJpYWJsZS5kZWZzKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbk5vZGUgPSB0b1RTRVNUcmVlTm9kZShkZWZpbml0aW9uLm5vZGUpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gICAgaWYgKGRlZmluaXRpb25Ob2RlLnR5cGUgIT09ICdWYXJpYWJsZURlY2xhcmF0b3InIHx8ICFkZWZpbml0aW9uTm9kZS5pbml0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICAgIGlmIChkZWZpbml0aW9uTm9kZS5pbml0LnR5cGUgPT09ICdOZXdFeHByZXNzaW9uJykge1xuICAgICAgcmV0dXJuIHJlYWRDb25zdHJ1Y3Rvck5hbWUoZGVmaW5pdGlvbk5vZGUuaW5pdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFDQSxTQUFTLHNCQUFzQjtBQUt4QixNQUFNLGFBQWE7QUFNMUIsTUFBTSx1QkFBdUIsb0JBQUksSUFBb0I7QUFBQSxFQUNuRCxDQUFDLGFBQWEsNElBQTRJO0FBQUEsRUFDMUosQ0FBQyxpQkFBaUIsdUdBQXVHO0FBQUEsRUFDekgsQ0FBQyxjQUFjLHNGQUFzRjtBQUFBLEVBQ3JHLENBQUMsZ0JBQWdCLHNGQUFzRjtBQUFBLEVBQ3ZHLENBQUMsY0FBYyw0RkFBNEY7QUFBQSxFQUMzRyxDQUFDLGNBQWMsNEZBQTRGO0FBQzdHLENBQUM7QUFLTSxNQUFNLHlCQUEwQztBQUFBLEVBQ3JELE9BQU8sU0FBUztBQUNkLFdBQU87QUFBQSxNQUNMLGlCQUFpQixNQUF1QjtBQUN0QyxjQUFNLFdBQVcsZUFBZSxJQUFJO0FBRXBDLFlBQUksQ0FBQyxvQkFBb0IsUUFBUSxHQUFHO0FBQ2xDO0FBQUEsUUFDRjtBQUVBLGNBQU0sV0FBVyxTQUFTLFVBQVUsQ0FBQztBQUNyQyxZQUFJLENBQUMsVUFBVTtBQUNiO0FBQUEsUUFDRjtBQUVBLGNBQU0sWUFBWSxpQkFBaUIsVUFBVSxNQUFNLE9BQU87QUFDMUQsWUFBSSxjQUFjLE1BQU07QUFDdEI7QUFBQSxRQUNGO0FBRUEsY0FBTSxTQUFTLHFCQUFxQixJQUFJLFNBQVM7QUFDakQsWUFBSSxXQUFXLFFBQVc7QUFDeEI7QUFBQSxRQUNGO0FBRUEsZ0JBQVEsT0FBTztBQUFBLFVBQ2IsTUFBTTtBQUFBLFlBQ0o7QUFBQSxZQUNBO0FBQUEsVUFDRjtBQUFBLFVBQ0EsV0FBVztBQUFBLFVBQ1g7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixDQUFDLFVBQVUsR0FBRztBQUFBLElBQ2hCO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxJQUNULE1BQU07QUFBQSxFQUNSO0FBQ0Y7QUFTQSxTQUFTLGFBQWEsT0FBb0IsTUFBcUM7QUFDN0UsTUFBSSxlQUFtQztBQUV2QyxTQUFPLGNBQWM7QUFDbkIsVUFBTSxXQUFXLGFBQWEsVUFBVSxLQUFLLENBQUMsY0FBYyxVQUFVLFNBQVMsSUFBSTtBQUNuRixRQUFJLFVBQVU7QUFDWixhQUFPO0FBQUEsSUFDVDtBQUNBLG1CQUFlLGFBQWE7QUFBQSxFQUM5QjtBQUVBLFNBQU87QUFDVDtBQVFBLFNBQVMsb0JBQW9CLE1BQXdDO0FBQ25FLFFBQU0sU0FBUyxLQUFLO0FBR3BCLFNBQU8sT0FBTyxTQUFTLHNCQUFzQixPQUFPLFNBQVMsU0FBUyxnQkFBZ0IsT0FBTyxTQUFTLFNBQVM7QUFDakg7QUFRQSxTQUFTLG9CQUFvQixNQUE2QztBQUV4RSxTQUFPLEtBQUssT0FBTyxTQUFTLGVBQWUsS0FBSyxPQUFPLE9BQU87QUFDaEU7QUFjQSxTQUFTLGlCQUFpQixVQUF5QixNQUFpQixTQUEwQztBQUU1RyxNQUFJLFNBQVMsU0FBUyxpQkFBaUI7QUFDckMsV0FBTyxvQkFBb0IsUUFBUTtBQUFBLEVBQ3JDO0FBR0EsTUFBSSxTQUFTLFNBQVMsY0FBYztBQUNsQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sV0FBVyxhQUFhLFFBQVEsV0FBVyxTQUFTLElBQUksR0FBRyxTQUFTLElBQUk7QUFDOUUsTUFBSSxDQUFDLFVBQVU7QUFDYixXQUFPO0FBQUEsRUFDVDtBQUVBLGFBQVcsY0FBYyxTQUFTLE1BQU07QUFDdEMsVUFBTSxpQkFBaUIsZUFBZSxXQUFXLElBQUk7QUFFckQsUUFBSSxlQUFlLFNBQVMsd0JBQXdCLENBQUMsZUFBZSxNQUFNO0FBQ3hFO0FBQUEsSUFDRjtBQUdBLFFBQUksZUFBZSxLQUFLLFNBQVMsaUJBQWlCO0FBQ2hELGFBQU8sb0JBQW9CLGVBQWUsSUFBSTtBQUFBLElBQ2hEO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,13 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * ESLint plugin for Obsidian development utilities.
6
+ */
7
+ import type { ESLint } from 'eslint';
8
+ /**
9
+ * ESLint plugin bundling every `obsidian-dev-utils` custom rule, registered under the `obsidian-dev-utils` namespace:
10
+ * the generic rules of `@mnaoumov/typescript-dev-toolkit` and the Obsidian ones. It is ONE plugin carrying both,
11
+ * because ESLint refuses two different plugins under one namespace.
12
+ */
13
+ export declare const obsidianDevUtilsPlugin: ESLint.Plugin;
@@ -0,0 +1,73 @@
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 { genericInHouseEslintRules } from "@mnaoumov/typescript-dev-toolkit/linters/eslint-rules/in-house-plugin";
43
+ import { manifestDescription } from "./manifest-description.mjs";
44
+ import { manifestId } from "./manifest-id.mjs";
45
+ import { manifestName } from "./manifest-name.mjs";
46
+ import { manifestSchema } from "./manifest-schema.mjs";
47
+ import { noLocalObsidianInternals } from "./no-local-obsidian-internals.mjs";
48
+ import { noOverCapWaitInEvalInObsidian } from "./no-over-cap-wait-in-eval-in-obsidian.mjs";
49
+ import { noUntrustedInputEvents } from "./no-untrusted-input-events.mjs";
50
+ import { pluginNameAsCodeInUi } from "./plugin-name-as-code-in-ui.mjs";
51
+ import { pluginNameAsCode } from "./plugin-name-as-code.mjs";
52
+ import { requireComponentSuffix } from "./require-component-suffix.mjs";
53
+ import { requirePluginApiContractSchemas } from "./require-plugin-api-contract-schemas.mjs";
54
+ const obsidianDevUtilsPlugin = {
55
+ rules: {
56
+ ...genericInHouseEslintRules,
57
+ "manifest-description": manifestDescription,
58
+ "manifest-id": manifestId,
59
+ "manifest-name": manifestName,
60
+ "manifest-schema": manifestSchema,
61
+ "no-local-obsidian-internals": noLocalObsidianInternals,
62
+ "no-over-cap-wait-in-eval-in-obsidian": noOverCapWaitInEvalInObsidian,
63
+ "no-untrusted-input-events": noUntrustedInputEvents,
64
+ "plugin-name-as-code": pluginNameAsCode,
65
+ "plugin-name-as-code-in-ui": pluginNameAsCodeInUi,
66
+ "require-component-suffix": requireComponentSuffix,
67
+ "require-plugin-api-contract-schemas": requirePluginApiContractSchemas
68
+ }
69
+ };
70
+ export {
71
+ obsidianDevUtilsPlugin
72
+ };
73
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL29ic2lkaWFuLWRldi11dGlscy1wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFU0xpbnQgcGx1Z2luIGZvciBPYnNpZGlhbiBkZXZlbG9wbWVudCB1dGlsaXRpZXMuXG4gKi9cbmltcG9ydCB0eXBlIHsgRVNMaW50IH0gZnJvbSAnZXNsaW50JztcblxuaW1wb3J0IHsgZ2VuZXJpY0luSG91c2VFc2xpbnRSdWxlcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2xpbnRlcnMvZXNsaW50LXJ1bGVzL2luLWhvdXNlLXBsdWdpbic7XG5cbmltcG9ydCB7IG1hbmlmZXN0RGVzY3JpcHRpb24gfSBmcm9tICcuL21hbmlmZXN0LWRlc2NyaXB0aW9uLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0SWQgfSBmcm9tICcuL21hbmlmZXN0LWlkLnRzJztcbmltcG9ydCB7IG1hbmlmZXN0TmFtZSB9IGZyb20gJy4vbWFuaWZlc3QtbmFtZS50cyc7XG5pbXBvcnQgeyBtYW5pZmVzdFNjaGVtYSB9IGZyb20gJy4vbWFuaWZlc3Qtc2NoZW1hLnRzJztcbmltcG9ydCB7IG5vTG9jYWxPYnNpZGlhbkludGVybmFscyB9IGZyb20gJy4vbm8tbG9jYWwtb2JzaWRpYW4taW50ZXJuYWxzLnRzJztcbmltcG9ydCB7IG5vT3ZlckNhcFdhaXRJbkV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9uby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4udHMnO1xuaW1wb3J0IHsgbm9VbnRydXN0ZWRJbnB1dEV2ZW50cyB9IGZyb20gJy4vbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cy50cyc7XG5pbXBvcnQgeyBwbHVnaW5OYW1lQXNDb2RlSW5VaSB9IGZyb20gJy4vcGx1Z2luLW5hbWUtYXMtY29kZS1pbi11aS50cyc7XG5pbXBvcnQgeyBwbHVnaW5OYW1lQXNDb2RlIH0gZnJvbSAnLi9wbHVnaW4tbmFtZS1hcy1jb2RlLnRzJztcbmltcG9ydCB7IHJlcXVpcmVDb21wb25lbnRTdWZmaXggfSBmcm9tICcuL3JlcXVpcmUtY29tcG9uZW50LXN1ZmZpeC50cyc7XG5pbXBvcnQgeyByZXF1aXJlUGx1Z2luQXBpQ29udHJhY3RTY2hlbWFzIH0gZnJvbSAnLi9yZXF1aXJlLXBsdWdpbi1hcGktY29udHJhY3Qtc2NoZW1hcy50cyc7XG5cbi8qKlxuICogRVNMaW50IHBsdWdpbiBidW5kbGluZyBldmVyeSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjdXN0b20gcnVsZSwgcmVnaXN0ZXJlZCB1bmRlciB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2AgbmFtZXNwYWNlOlxuICogdGhlIGdlbmVyaWMgcnVsZXMgb2YgYEBtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0YCBhbmQgdGhlIE9ic2lkaWFuIG9uZXMuIEl0IGlzIE9ORSBwbHVnaW4gY2FycnlpbmcgYm90aCxcbiAqIGJlY2F1c2UgRVNMaW50IHJlZnVzZXMgdHdvIGRpZmZlcmVudCBwbHVnaW5zIHVuZGVyIG9uZSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNpZGlhbkRldlV0aWxzUGx1Z2luOiBFU0xpbnQuUGx1Z2luID0ge1xuICBydWxlczoge1xuICAgIC4uLmdlbmVyaWNJbkhvdXNlRXNsaW50UnVsZXMsXG4gICAgJ21hbmlmZXN0LWRlc2NyaXB0aW9uJzogbWFuaWZlc3REZXNjcmlwdGlvbixcbiAgICAnbWFuaWZlc3QtaWQnOiBtYW5pZmVzdElkLFxuICAgICdtYW5pZmVzdC1uYW1lJzogbWFuaWZlc3ROYW1lLFxuICAgICdtYW5pZmVzdC1zY2hlbWEnOiBtYW5pZmVzdFNjaGVtYSxcbiAgICAnbm8tbG9jYWwtb2JzaWRpYW4taW50ZXJuYWxzJzogbm9Mb2NhbE9ic2lkaWFuSW50ZXJuYWxzLFxuICAgICduby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4nOiBub092ZXJDYXBXYWl0SW5FdmFsSW5PYnNpZGlhbixcbiAgICAnbm8tdW50cnVzdGVkLWlucHV0LWV2ZW50cyc6IG5vVW50cnVzdGVkSW5wdXRFdmVudHMsXG4gICAgJ3BsdWdpbi1uYW1lLWFzLWNvZGUnOiBwbHVnaW5OYW1lQXNDb2RlLFxuICAgICdwbHVnaW4tbmFtZS1hcy1jb2RlLWluLXVpJzogcGx1Z2luTmFtZUFzQ29kZUluVWksXG4gICAgJ3JlcXVpcmUtY29tcG9uZW50LXN1ZmZpeCc6IHJlcXVpcmVDb21wb25lbnRTdWZmaXgsXG4gICAgJ3JlcXVpcmUtcGx1Z2luLWFwaS1jb250cmFjdC1zY2hlbWFzJzogcmVxdWlyZVBsdWdpbkFwaUNvbnRyYWN0U2NoZW1hc1xuICB9XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQSxTQUFTLGlDQUFpQztBQUUxQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLHFDQUFxQztBQUM5QyxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLDRCQUE0QjtBQUNyQyxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLHVDQUF1QztBQU96QyxNQUFNLHlCQUF3QztBQUFBLEVBQ25ELE9BQU87QUFBQSxJQUNMLEdBQUc7QUFBQSxJQUNILHdCQUF3QjtBQUFBLElBQ3hCLGVBQWU7QUFBQSxJQUNmLGlCQUFpQjtBQUFBLElBQ2pCLG1CQUFtQjtBQUFBLElBQ25CLCtCQUErQjtBQUFBLElBQy9CLHdDQUF3QztBQUFBLElBQ3hDLDZCQUE2QjtBQUFBLElBQzdCLHVCQUF1QjtBQUFBLElBQ3ZCLDZCQUE2QjtBQUFBLElBQzdCLDRCQUE0QjtBQUFBLElBQzVCLHVDQUF1QztBQUFBLEVBQ3pDO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,30 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * ESLint rule: plugin-name-as-code-in-ui
6
+ *
7
+ * Reports an Obsidian plugin's display name inside a string that is shown in UI as plain text. In UI the name is
8
+ * built as a `<code>` element instead: `appendCodeBlock()` into a `DocumentFragment`, or `createFragmentWithCodeBlocks()`
9
+ * with `asCodeBlock()`, from `@mnaoumov/obsidian-lib`'s `html-element.ts`, and the fragment is what is passed on.
10
+ *
11
+ * Detection is best effort, by call shape, without type information. A string literal or template literal (or a
12
+ * `+` concatenation or `? :` branch made of them) is read when it is:
13
+ *
14
+ * - the first argument of `new Notice(...)`;
15
+ * - the first argument of `setName`, `setDesc`, `setText`, `appendText` or `setTitle` called on anything;
16
+ * - the `text` property of an options object passed to `createEl`, `createDiv` or `createSpan`.
17
+ *
18
+ * There is no autofix: splitting a string around the name and building a fragment is a rewrite of the call, and
19
+ * often of a translation key, which needs judgement. A command name, a ribbon tooltip and a window title cannot hold
20
+ * markup, so the calls that set them (`addCommand`, `addRibbonIcon`, `document.title`) are not read at all.
21
+ */
22
+ import type { Rule } from 'eslint';
23
+ /**
24
+ * Message ID reported for a plugin name inside a UI string.
25
+ */
26
+ export declare const MESSAGE_ID = "pluginNameAsCodeInUi";
27
+ /**
28
+ * ESLint rule requiring a plugin name shown in UI to be built as a `<code>` element.
29
+ */
30
+ export declare const pluginNameAsCodeInUi: Rule.RuleModule;
@@ -0,0 +1,157 @@
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
+ findPluginNameMatches,
44
+ getPluginNames
45
+ } from "../plugin-names.mjs";
46
+ import { PLUGIN_NAME_RULE_SCHEMA } from "./plugin-name-as-code.mjs";
47
+ const MESSAGE_ID = "pluginNameAsCodeInUi";
48
+ const UI_TEXT_METHOD_NAMES = /* @__PURE__ */ new Set(["appendText", "setDesc", "setName", "setText", "setTitle"]);
49
+ const ELEMENT_FACTORY_NAMES = /* @__PURE__ */ new Set(["createDiv", "createEl", "createSpan"]);
50
+ const pluginNameAsCodeInUi = {
51
+ create(context) {
52
+ const options = context.options[0];
53
+ const pluginNames = getPluginNames({ additionalPluginNames: options?.additionalPluginNames, cwd: context.cwd });
54
+ return {
55
+ CallExpression(node) {
56
+ const calleeName = getCalleeName(node);
57
+ if (calleeName === null) {
58
+ return;
59
+ }
60
+ if (UI_TEXT_METHOD_NAMES.has(calleeName) && node.callee.type === "MemberExpression") {
61
+ inspectArgument(node.arguments[0]);
62
+ return;
63
+ }
64
+ if (!ELEMENT_FACTORY_NAMES.has(calleeName)) {
65
+ return;
66
+ }
67
+ for (const argument of node.arguments) {
68
+ if (argument.type !== "ObjectExpression") {
69
+ continue;
70
+ }
71
+ for (const property of argument.properties) {
72
+ if (property.type === "Property" && !property.computed && getKeyName(property.key) === "text") {
73
+ inspectExpression(property.value);
74
+ }
75
+ }
76
+ }
77
+ },
78
+ NewExpression(node) {
79
+ if (node.callee.type === "Identifier" && node.callee.name === "Notice") {
80
+ inspectArgument(node.arguments[0]);
81
+ }
82
+ }
83
+ };
84
+ function inspectArgument(argument) {
85
+ if (argument && argument.type !== "SpreadElement") {
86
+ inspectExpression(argument);
87
+ }
88
+ }
89
+ function inspectExpression(node) {
90
+ switch (node.type) {
91
+ case "BinaryExpression": {
92
+ if (node.operator === "+") {
93
+ inspectExpression(node.left);
94
+ inspectExpression(node.right);
95
+ }
96
+ break;
97
+ }
98
+ case "ConditionalExpression": {
99
+ inspectExpression(node.consequent);
100
+ inspectExpression(node.alternate);
101
+ break;
102
+ }
103
+ case "Literal": {
104
+ if (typeof node.value === "string") {
105
+ reportText(node, node.value);
106
+ }
107
+ break;
108
+ }
109
+ case "TemplateLiteral": {
110
+ for (const templateElement of node.quasis) {
111
+ reportText(templateElement, templateElement.value.raw);
112
+ }
113
+ break;
114
+ }
115
+ default: {
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ function reportText(node, text) {
121
+ for (const match of findPluginNameMatches(text, pluginNames)) {
122
+ context.report({
123
+ data: { name: match.name },
124
+ messageId: MESSAGE_ID,
125
+ node
126
+ });
127
+ }
128
+ }
129
+ },
130
+ meta: {
131
+ docs: {
132
+ description: "Require a plugin name shown in UI to be built as a `<code>` element"
133
+ },
134
+ messages: {
135
+ [MESSAGE_ID]: "The plugin name `{{ name }}` is shown in UI as plain text. Build it as a `<code>` element instead: `appendCodeBlock()` into a `DocumentFragment`, or `createFragmentWithCodeBlocks()` with `asCodeBlock()`, from `@mnaoumov/obsidian-lib`'s `html-element.ts`."
136
+ },
137
+ schema: PLUGIN_NAME_RULE_SCHEMA,
138
+ type: "suggestion"
139
+ }
140
+ };
141
+ function getCalleeName(node) {
142
+ if (node.callee.type === "Identifier") {
143
+ return node.callee.name;
144
+ }
145
+ return node.callee.type === "MemberExpression" && !node.callee.computed && node.callee.property.type === "Identifier" ? node.callee.property.name : null;
146
+ }
147
+ function getKeyName(key) {
148
+ if (key.type === "Identifier") {
149
+ return key.name;
150
+ }
151
+ return key.type === "Literal" && typeof key.value === "string" ? key.value : null;
152
+ }
153
+ export {
154
+ MESSAGE_ID,
155
+ pluginNameAsCodeInUi
156
+ };
157
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL3BsdWdpbi1uYW1lLWFzLWNvZGUtaW4tdWkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFU0xpbnQgcnVsZTogcGx1Z2luLW5hbWUtYXMtY29kZS1pbi11aVxuICpcbiAqIFJlcG9ydHMgYW4gT2JzaWRpYW4gcGx1Z2luJ3MgZGlzcGxheSBuYW1lIGluc2lkZSBhIHN0cmluZyB0aGF0IGlzIHNob3duIGluIFVJIGFzIHBsYWluIHRleHQuIEluIFVJIHRoZSBuYW1lIGlzXG4gKiBidWlsdCBhcyBhIGA8Y29kZT5gIGVsZW1lbnQgaW5zdGVhZDogYGFwcGVuZENvZGVCbG9jaygpYCBpbnRvIGEgYERvY3VtZW50RnJhZ21lbnRgLCBvciBgY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2NrcygpYFxuICogd2l0aCBgYXNDb2RlQmxvY2soKWAsIGZyb20gYEBtbmFvdW1vdi9vYnNpZGlhbi1saWJgJ3MgYGh0bWwtZWxlbWVudC50c2AsIGFuZCB0aGUgZnJhZ21lbnQgaXMgd2hhdCBpcyBwYXNzZWQgb24uXG4gKlxuICogRGV0ZWN0aW9uIGlzIGJlc3QgZWZmb3J0LCBieSBjYWxsIHNoYXBlLCB3aXRob3V0IHR5cGUgaW5mb3JtYXRpb24uIEEgc3RyaW5nIGxpdGVyYWwgb3IgdGVtcGxhdGUgbGl0ZXJhbCAob3IgYVxuICogYCtgIGNvbmNhdGVuYXRpb24gb3IgYD8gOmAgYnJhbmNoIG1hZGUgb2YgdGhlbSkgaXMgcmVhZCB3aGVuIGl0IGlzOlxuICpcbiAqIC0gdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGBuZXcgTm90aWNlKC4uLilgO1xuICogLSB0aGUgZmlyc3QgYXJndW1lbnQgb2YgYHNldE5hbWVgLCBgc2V0RGVzY2AsIGBzZXRUZXh0YCwgYGFwcGVuZFRleHRgIG9yIGBzZXRUaXRsZWAgY2FsbGVkIG9uIGFueXRoaW5nO1xuICogLSB0aGUgYHRleHRgIHByb3BlcnR5IG9mIGFuIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byBgY3JlYXRlRWxgLCBgY3JlYXRlRGl2YCBvciBgY3JlYXRlU3BhbmAuXG4gKlxuICogVGhlcmUgaXMgbm8gYXV0b2ZpeDogc3BsaXR0aW5nIGEgc3RyaW5nIGFyb3VuZCB0aGUgbmFtZSBhbmQgYnVpbGRpbmcgYSBmcmFnbWVudCBpcyBhIHJld3JpdGUgb2YgdGhlIGNhbGwsIGFuZFxuICogb2Z0ZW4gb2YgYSB0cmFuc2xhdGlvbiBrZXksIHdoaWNoIG5lZWRzIGp1ZGdlbWVudC4gQSBjb21tYW5kIG5hbWUsIGEgcmliYm9uIHRvb2x0aXAgYW5kIGEgd2luZG93IHRpdGxlIGNhbm5vdCBob2xkXG4gKiBtYXJrdXAsIHNvIHRoZSBjYWxscyB0aGF0IHNldCB0aGVtIChgYWRkQ29tbWFuZGAsIGBhZGRSaWJib25JY29uYCwgYGRvY3VtZW50LnRpdGxlYCkgYXJlIG5vdCByZWFkIGF0IGFsbC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tICdlc2xpbnQnO1xuaW1wb3J0IHR5cGUge1xuICBDYWxsRXhwcmVzc2lvbixcbiAgRXhwcmVzc2lvbixcbiAgTmV3RXhwcmVzc2lvbixcbiAgTm9kZSxcbiAgU3ByZWFkRWxlbWVudFxufSBmcm9tICdlc3RyZWUnO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5hbWVSdWxlT3B0aW9ucyB9IGZyb20gJy4uL3BsdWdpbi1uYW1lcy50cyc7XG5cbmltcG9ydCB7XG4gIGZpbmRQbHVnaW5OYW1lTWF0Y2hlcyxcbiAgZ2V0UGx1Z2luTmFtZXNcbn0gZnJvbSAnLi4vcGx1Z2luLW5hbWVzLnRzJztcbmltcG9ydCB7IFBMVUdJTl9OQU1FX1JVTEVfU0NIRU1BIH0gZnJvbSAnLi9wbHVnaW4tbmFtZS1hcy1jb2RlLnRzJztcblxuLyoqXG4gKiBNZXNzYWdlIElEIHJlcG9ydGVkIGZvciBhIHBsdWdpbiBuYW1lIGluc2lkZSBhIFVJIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSUQgPSAncGx1Z2luTmFtZUFzQ29kZUluVWknO1xuXG4vKipcbiAqIFRoZSBtZXRob2RzIHdob3NlIGZpcnN0IGFyZ3VtZW50IGlzIHNob3duIGluIFVJIGFuZCBtYXkgYmUgYSBgRG9jdW1lbnRGcmFnbWVudGAuXG4gKi9cbmNvbnN0IFVJX1RFWFRfTUVUSE9EX05BTUVTID0gbmV3IFNldChbJ2FwcGVuZFRleHQnLCAnc2V0RGVzYycsICdzZXROYW1lJywgJ3NldFRleHQnLCAnc2V0VGl0bGUnXSk7XG5cbi8qKlxuICogVGhlIGVsZW1lbnQgZmFjdG9yaWVzIHdob3NlIG9wdGlvbnMgb2JqZWN0IGNhcnJpZXMgVUkgdGV4dCBpbiBgdGV4dGAuXG4gKi9cbmNvbnN0IEVMRU1FTlRfRkFDVE9SWV9OQU1FUyA9IG5ldyBTZXQoWydjcmVhdGVEaXYnLCAnY3JlYXRlRWwnLCAnY3JlYXRlU3BhbiddKTtcblxuLyoqXG4gKiBFU0xpbnQgcnVsZSByZXF1aXJpbmcgYSBwbHVnaW4gbmFtZSBzaG93biBpbiBVSSB0byBiZSBidWlsdCBhcyBhIGA8Y29kZT5gIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBwbHVnaW5OYW1lQXNDb2RlSW5VaTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gYXMgUGx1Z2luTmFtZVJ1bGVPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBsdWdpbk5hbWVzID0gZ2V0UGx1Z2luTmFtZXMoeyBhZGRpdGlvbmFsUGx1Z2luTmFtZXM6IG9wdGlvbnM/LmFkZGl0aW9uYWxQbHVnaW5OYW1lcywgY3dkOiBjb250ZXh0LmN3ZCB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBDYWxsRXhwcmVzc2lvbihub2RlOiBDYWxsRXhwcmVzc2lvbik6IHZvaWQge1xuICAgICAgICBjb25zdCBjYWxsZWVOYW1lID0gZ2V0Q2FsbGVlTmFtZShub2RlKTtcbiAgICAgICAgaWYgKGNhbGxlZU5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVUlfVEVYVF9NRVRIT0RfTkFNRVMuaGFzKGNhbGxlZU5hbWUpICYmIG5vZGUuY2FsbGVlLnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgICAgICAgIGluc3BlY3RBcmd1bWVudChub2RlLmFyZ3VtZW50c1swXSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFFTEVNRU5UX0ZBQ1RPUllfTkFNRVMuaGFzKGNhbGxlZU5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBub2RlLmFyZ3VtZW50cykge1xuICAgICAgICAgIGlmIChhcmd1bWVudC50eXBlICE9PSAnT2JqZWN0RXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGFyZ3VtZW50LnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS50eXBlID09PSAnUHJvcGVydHknICYmICFwcm9wZXJ0eS5jb21wdXRlZCAmJiBnZXRLZXlOYW1lKHByb3BlcnR5LmtleSkgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICBpbnNwZWN0RXhwcmVzc2lvbihwcm9wZXJ0eS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgTmV3RXhwcmVzc2lvbihub2RlOiBOZXdFeHByZXNzaW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlLmNhbGxlZS50eXBlID09PSAnSWRlbnRpZmllcicgJiYgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ05vdGljZScpIHtcbiAgICAgICAgICBpbnNwZWN0QXJndW1lbnQobm9kZS5hcmd1bWVudHNbMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGluc3BlY3RBcmd1bWVudChhcmd1bWVudDogRXhwcmVzc2lvbiB8IFNwcmVhZEVsZW1lbnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgIGlmIChhcmd1bWVudCAmJiBhcmd1bWVudC50eXBlICE9PSAnU3ByZWFkRWxlbWVudCcpIHtcbiAgICAgICAgaW5zcGVjdEV4cHJlc3Npb24oYXJndW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3BlY3RFeHByZXNzaW9uKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0JpbmFyeUV4cHJlc3Npb24nOiB7XG4gICAgICAgICAgaWYgKG5vZGUub3BlcmF0b3IgPT09ICcrJykge1xuICAgICAgICAgICAgaW5zcGVjdEV4cHJlc3Npb24obm9kZS5sZWZ0KTtcbiAgICAgICAgICAgIGluc3BlY3RFeHByZXNzaW9uKG5vZGUucmlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDb25kaXRpb25hbEV4cHJlc3Npb24nOiB7XG4gICAgICAgICAgaW5zcGVjdEV4cHJlc3Npb24obm9kZS5jb25zZXF1ZW50KTtcbiAgICAgICAgICBpbnNwZWN0RXhwcmVzc2lvbihub2RlLmFsdGVybmF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTGl0ZXJhbCc6IHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5vZGUudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXBvcnRUZXh0KG5vZGUsIG5vZGUudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdUZW1wbGF0ZUxpdGVyYWwnOiB7XG4gICAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgb2Ygbm9kZS5xdWFzaXMpIHtcbiAgICAgICAgICAgIHJlcG9ydFRleHQodGVtcGxhdGVFbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQudmFsdWUucmF3KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVwb3J0VGV4dChub2RlOiBOb2RlLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZmluZFBsdWdpbk5hbWVNYXRjaGVzKHRleHQsIHBsdWdpbk5hbWVzKSkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgZGF0YTogeyBuYW1lOiBtYXRjaC5uYW1lIH0sXG4gICAgICAgICAgbWVzc2FnZUlkOiBNRVNTQUdFX0lELFxuICAgICAgICAgIG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246ICdSZXF1aXJlIGEgcGx1Z2luIG5hbWUgc2hvd24gaW4gVUkgdG8gYmUgYnVpbHQgYXMgYSBgPGNvZGU+YCBlbGVtZW50J1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEXTogJ1RoZSBwbHVnaW4gbmFtZSBge3sgbmFtZSB9fWAgaXMgc2hvd24gaW4gVUkgYXMgcGxhaW4gdGV4dC4gQnVpbGQgaXQgYXMgYSBgPGNvZGU+YCBlbGVtZW50IGluc3RlYWQ6IGBhcHBlbmRDb2RlQmxvY2soKWAgaW50byBhIGBEb2N1bWVudEZyYWdtZW50YCwgb3IgYGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3MoKWAgd2l0aCBgYXNDb2RlQmxvY2soKWAsIGZyb20gYEBtbmFvdW1vdi9vYnNpZGlhbi1saWJgXFwncyBgaHRtbC1lbGVtZW50LnRzYC4nXG4gICAgfSxcbiAgICBzY2hlbWE6IFBMVUdJTl9OQU1FX1JVTEVfU0NIRU1BLFxuICAgIHR5cGU6ICdzdWdnZXN0aW9uJ1xuICB9XG59O1xuXG4vKipcbiAqIFJlYWRzIHRoZSBuYW1lIGEgY2FsbCBpcyBtYWRlIGJ5OiB0aGUgZnVuY3Rpb24ncyBuYW1lLCBvciB0aGUgbWV0aG9kJ3MgZm9yIGEgbWVtYmVyIGNhbGwuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgY2FsbC5cbiAqIEByZXR1cm5zIFRoZSBuYW1lLCBvciBgbnVsbGAgZm9yIGEgY29tcHV0ZWQgb3Igb3RoZXJ3aXNlIHVubmFtZWQgY2FsbGVlLlxuICovXG5mdW5jdGlvbiBnZXRDYWxsZWVOYW1lKG5vZGU6IENhbGxFeHByZXNzaW9uKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChub2RlLmNhbGxlZS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICByZXR1cm4gbm9kZS5jYWxsZWUubmFtZTtcbiAgfVxuXG4gIHJldHVybiBub2RlLmNhbGxlZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgJiYgIW5vZGUuY2FsbGVlLmNvbXB1dGVkICYmIG5vZGUuY2FsbGVlLnByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgID8gbm9kZS5jYWxsZWUucHJvcGVydHkubmFtZVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgbmFtZSBvZiBhbiBvYmplY3QgcHJvcGVydHkga2V5IHdyaXR0ZW4gYXMgYW4gaWRlbnRpZmllciBvciBhIHN0cmluZyBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5LlxuICogQHJldHVybnMgVGhlIG5hbWUsIG9yIGBudWxsYCBmb3IgYW55IG90aGVyIGtleS5cbiAqL1xuZnVuY3Rpb24gZ2V0S2V5TmFtZShrZXk6IE5vZGUpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKGtleS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICByZXR1cm4ga2V5Lm5hbWU7XG4gIH1cblxuICByZXR1cm4ga2V5LnR5cGUgPT09ICdMaXRlcmFsJyAmJiB0eXBlb2Yga2V5LnZhbHVlID09PSAnc3RyaW5nJyA/IGtleS52YWx1ZSA6IG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdDQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsK0JBQStCO0FBS2pDLE1BQU0sYUFBYTtBQUsxQixNQUFNLHVCQUF1QixvQkFBSSxJQUFJLENBQUMsY0FBYyxXQUFXLFdBQVcsV0FBVyxVQUFVLENBQUM7QUFLaEcsTUFBTSx3QkFBd0Isb0JBQUksSUFBSSxDQUFDLGFBQWEsWUFBWSxZQUFZLENBQUM7QUFLdEUsTUFBTSx1QkFBd0M7QUFBQSxFQUNuRCxPQUFPLFNBQVM7QUFDZCxVQUFNLFVBQVUsUUFBUSxRQUFRLENBQUM7QUFDakMsVUFBTSxjQUFjLGVBQWUsRUFBRSx1QkFBdUIsU0FBUyx1QkFBdUIsS0FBSyxRQUFRLElBQUksQ0FBQztBQUU5RyxXQUFPO0FBQUEsTUFDTCxlQUFlLE1BQTRCO0FBQ3pDLGNBQU0sYUFBYSxjQUFjLElBQUk7QUFDckMsWUFBSSxlQUFlLE1BQU07QUFDdkI7QUFBQSxRQUNGO0FBRUEsWUFBSSxxQkFBcUIsSUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLFNBQVMsb0JBQW9CO0FBQ25GLDBCQUFnQixLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQ2pDO0FBQUEsUUFDRjtBQUVBLFlBQUksQ0FBQyxzQkFBc0IsSUFBSSxVQUFVLEdBQUc7QUFDMUM7QUFBQSxRQUNGO0FBRUEsbUJBQVcsWUFBWSxLQUFLLFdBQVc7QUFDckMsY0FBSSxTQUFTLFNBQVMsb0JBQW9CO0FBQ3hDO0FBQUEsVUFDRjtBQUNBLHFCQUFXLFlBQVksU0FBUyxZQUFZO0FBQzFDLGdCQUFJLFNBQVMsU0FBUyxjQUFjLENBQUMsU0FBUyxZQUFZLFdBQVcsU0FBUyxHQUFHLE1BQU0sUUFBUTtBQUM3RixnQ0FBa0IsU0FBUyxLQUFLO0FBQUEsWUFDbEM7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLGNBQWMsTUFBMkI7QUFDdkMsWUFBSSxLQUFLLE9BQU8sU0FBUyxnQkFBZ0IsS0FBSyxPQUFPLFNBQVMsVUFBVTtBQUN0RSwwQkFBZ0IsS0FBSyxVQUFVLENBQUMsQ0FBQztBQUFBLFFBQ25DO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxhQUFTLGdCQUFnQixVQUF3RDtBQUMvRSxVQUFJLFlBQVksU0FBUyxTQUFTLGlCQUFpQjtBQUNqRCwwQkFBa0IsUUFBUTtBQUFBLE1BQzVCO0FBQUEsSUFDRjtBQUVBLGFBQVMsa0JBQWtCLE1BQWtCO0FBQzNDLGNBQVEsS0FBSyxNQUFNO0FBQUEsUUFDakIsS0FBSyxvQkFBb0I7QUFDdkIsY0FBSSxLQUFLLGFBQWEsS0FBSztBQUN6Qiw4QkFBa0IsS0FBSyxJQUFJO0FBQzNCLDhCQUFrQixLQUFLLEtBQUs7QUFBQSxVQUM5QjtBQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyx5QkFBeUI7QUFDNUIsNEJBQWtCLEtBQUssVUFBVTtBQUNqQyw0QkFBa0IsS0FBSyxTQUFTO0FBQ2hDO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSyxXQUFXO0FBQ2QsY0FBSSxPQUFPLEtBQUssVUFBVSxVQUFVO0FBQ2xDLHVCQUFXLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDN0I7QUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEtBQUssbUJBQW1CO0FBQ3RCLHFCQUFXLG1CQUFtQixLQUFLLFFBQVE7QUFDekMsdUJBQVcsaUJBQWlCLGdCQUFnQixNQUFNLEdBQUc7QUFBQSxVQUN2RDtBQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0EsU0FBUztBQUNQO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsYUFBUyxXQUFXLE1BQVksTUFBb0I7QUFDbEQsaUJBQVcsU0FBUyxzQkFBc0IsTUFBTSxXQUFXLEdBQUc7QUFDNUQsZ0JBQVEsT0FBTztBQUFBLFVBQ2IsTUFBTSxFQUFFLE1BQU0sTUFBTSxLQUFLO0FBQUEsVUFDekIsV0FBVztBQUFBLFVBQ1g7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixDQUFDLFVBQVUsR0FBRztBQUFBLElBQ2hCO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixNQUFNO0FBQUEsRUFDUjtBQUNGO0FBUUEsU0FBUyxjQUFjLE1BQXFDO0FBQzFELE1BQUksS0FBSyxPQUFPLFNBQVMsY0FBYztBQUNyQyxXQUFPLEtBQUssT0FBTztBQUFBLEVBQ3JCO0FBRUEsU0FBTyxLQUFLLE9BQU8sU0FBUyxzQkFBc0IsQ0FBQyxLQUFLLE9BQU8sWUFBWSxLQUFLLE9BQU8sU0FBUyxTQUFTLGVBQ3JHLEtBQUssT0FBTyxTQUFTLE9BQ3JCO0FBQ047QUFRQSxTQUFTLFdBQVcsS0FBMEI7QUFDNUMsTUFBSSxJQUFJLFNBQVMsY0FBYztBQUM3QixXQUFPLElBQUk7QUFBQSxFQUNiO0FBRUEsU0FBTyxJQUFJLFNBQVMsYUFBYSxPQUFPLElBQUksVUFBVSxXQUFXLElBQUksUUFBUTtBQUMvRTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,29 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * ESLint rule: plugin-name-as-code
6
+ *
7
+ * Reports an Obsidian plugin's display name written as plain text in a code comment, and autofixes it by wrapping
8
+ * the name in backticks. TSDoc renders a name in backticks as code, so a doc comment reads the same as the README.
9
+ *
10
+ * Every comment is read: `//`, `/* *\/` and JSDoc / TSDoc. A name already inside a code span, an inline `@link` tag
11
+ * (whose target is an identifier) or a URL is left alone. The names come from `plugin-names.ts`: the shared list,
12
+ * the project's own `manifest.json` `name`, and the rule's `additionalPluginNames` option.
13
+ *
14
+ * Not attempted: a multi-word name broken across two comment lines, which a reader cannot tell from two unrelated
15
+ * words without understanding the prose.
16
+ */
17
+ import type { Rule } from 'eslint';
18
+ /**
19
+ * Message ID reported for a plugin name written as plain text in a comment.
20
+ */
21
+ export declare const MESSAGE_ID = "pluginNameAsCode";
22
+ /**
23
+ * The JSON schema of the options the plugin-name rules take.
24
+ */
25
+ export declare const PLUGIN_NAME_RULE_SCHEMA: Rule.RuleMetaData['schema'];
26
+ /**
27
+ * ESLint rule requiring a plugin name in a comment to be marked as code.
28
+ */
29
+ export declare const pluginNameAsCode: Rule.RuleModule;
@@ -0,0 +1,108 @@
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
+ findPluginNameMatches,
44
+ getPluginNames
45
+ } from "../plugin-names.mjs";
46
+ const MESSAGE_ID = "pluginNameAsCode";
47
+ const EXCLUDED_COMMENT_PATTERNS = [
48
+ /(?<ticks>`+)[\s\S]*?\k<ticks>/g,
49
+ /\{@link\w*[^}]*\}/g,
50
+ /\b[a-z][\w+.-]*:\/\/\S+/gi
51
+ ];
52
+ const COMMENT_OPENING_LENGTH = 2;
53
+ const PLUGIN_NAME_RULE_SCHEMA = [
54
+ {
55
+ additionalProperties: false,
56
+ properties: {
57
+ additionalPluginNames: {
58
+ items: { type: "string" },
59
+ type: "array"
60
+ }
61
+ },
62
+ type: "object"
63
+ }
64
+ ];
65
+ const pluginNameAsCode = {
66
+ create(context) {
67
+ const options = context.options[0];
68
+ const pluginNames = getPluginNames({ additionalPluginNames: options?.additionalPluginNames, cwd: context.cwd });
69
+ const sourceCode = context.sourceCode;
70
+ return {
71
+ Program() {
72
+ for (const comment of sourceCode.getAllComments()) {
73
+ const [valueStart] = sourceCode.getRange(comment);
74
+ for (const match of findPluginNameMatches(comment.value, pluginNames, EXCLUDED_COMMENT_PATTERNS)) {
75
+ const start = valueStart + COMMENT_OPENING_LENGTH + match.index;
76
+ const end = start + match.name.length;
77
+ context.report({
78
+ data: { name: match.name },
79
+ fix: (fixer) => fixer.replaceTextRange([start, end], `\`${match.name}\``),
80
+ loc: {
81
+ end: sourceCode.getLocFromIndex(end),
82
+ start: sourceCode.getLocFromIndex(start)
83
+ },
84
+ messageId: MESSAGE_ID
85
+ });
86
+ }
87
+ }
88
+ }
89
+ };
90
+ },
91
+ meta: {
92
+ docs: {
93
+ description: "Require a plugin name in a comment to be marked as code with backticks"
94
+ },
95
+ fixable: "code",
96
+ messages: {
97
+ [MESSAGE_ID]: "Mark the plugin name `{{ name }}` as code: wrap it in backticks."
98
+ },
99
+ schema: PLUGIN_NAME_RULE_SCHEMA,
100
+ type: "suggestion"
101
+ }
102
+ };
103
+ export {
104
+ MESSAGE_ID,
105
+ PLUGIN_NAME_RULE_SCHEMA,
106
+ pluginNameAsCode
107
+ };
108
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LXJ1bGVzL3BsdWdpbi1uYW1lLWFzLWNvZGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFU0xpbnQgcnVsZTogcGx1Z2luLW5hbWUtYXMtY29kZVxuICpcbiAqIFJlcG9ydHMgYW4gT2JzaWRpYW4gcGx1Z2luJ3MgZGlzcGxheSBuYW1lIHdyaXR0ZW4gYXMgcGxhaW4gdGV4dCBpbiBhIGNvZGUgY29tbWVudCwgYW5kIGF1dG9maXhlcyBpdCBieSB3cmFwcGluZ1xuICogdGhlIG5hbWUgaW4gYmFja3RpY2tzLiBUU0RvYyByZW5kZXJzIGEgbmFtZSBpbiBiYWNrdGlja3MgYXMgY29kZSwgc28gYSBkb2MgY29tbWVudCByZWFkcyB0aGUgc2FtZSBhcyB0aGUgUkVBRE1FLlxuICpcbiAqIEV2ZXJ5IGNvbW1lbnQgaXMgcmVhZDogYC8vYCwgYC8qICpcXC9gIGFuZCBKU0RvYyAvIFRTRG9jLiBBIG5hbWUgYWxyZWFkeSBpbnNpZGUgYSBjb2RlIHNwYW4sIGFuIGlubGluZSBgQGxpbmtgIHRhZ1xuICogKHdob3NlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyKSBvciBhIFVSTCBpcyBsZWZ0IGFsb25lLiBUaGUgbmFtZXMgY29tZSBmcm9tIGBwbHVnaW4tbmFtZXMudHNgOiB0aGUgc2hhcmVkIGxpc3QsXG4gKiB0aGUgcHJvamVjdCdzIG93biBgbWFuaWZlc3QuanNvbmAgYG5hbWVgLCBhbmQgdGhlIHJ1bGUncyBgYWRkaXRpb25hbFBsdWdpbk5hbWVzYCBvcHRpb24uXG4gKlxuICogTm90IGF0dGVtcHRlZDogYSBtdWx0aS13b3JkIG5hbWUgYnJva2VuIGFjcm9zcyB0d28gY29tbWVudCBsaW5lcywgd2hpY2ggYSByZWFkZXIgY2Fubm90IHRlbGwgZnJvbSB0d28gdW5yZWxhdGVkXG4gKiB3b3JkcyB3aXRob3V0IHVuZGVyc3RhbmRpbmcgdGhlIHByb3NlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTmFtZVJ1bGVPcHRpb25zIH0gZnJvbSAnLi4vcGx1Z2luLW5hbWVzLnRzJztcblxuaW1wb3J0IHtcbiAgZmluZFBsdWdpbk5hbWVNYXRjaGVzLFxuICBnZXRQbHVnaW5OYW1lc1xufSBmcm9tICcuLi9wbHVnaW4tbmFtZXMudHMnO1xuXG4vKipcbiAqIE1lc3NhZ2UgSUQgcmVwb3J0ZWQgZm9yIGEgcGx1Z2luIG5hbWUgd3JpdHRlbiBhcyBwbGFpbiB0ZXh0IGluIGEgY29tbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSUQgPSAncGx1Z2luTmFtZUFzQ29kZSc7XG5cbi8qKlxuICogVGhlIGNvbW1lbnQgc3BhbnMgd2hvc2UgcGx1Z2luIG5hbWVzIGFyZSBhbHJlYWR5IG1hcmtlZCBvciBhcmUgbm90IHByb3NlOiBhIGNvZGUgc3BhbiwgYW4gaW5saW5lIGBAbGlua2AgdGFnLCBhIFVSTC5cbiAqL1xuY29uc3QgRVhDTFVERURfQ09NTUVOVF9QQVRURVJOUzogcmVhZG9ubHkgUmVnRXhwW10gPSBbXG4gIC8oPzx0aWNrcz5gKylbXFxzXFxTXSo/XFxrPHRpY2tzPi9nLFxuICAvXFx7QGxpbmtcXHcqW159XSpcXH0vZyxcbiAgL1xcYlthLXpdW1xcdysuLV0qOlxcL1xcL1xcUysvZ2lcbl07XG5cbi8qKlxuICogVGhlIGxlbmd0aCBvZiB0aGUgb3BlbmluZyBkZWxpbWl0ZXIgb2YgYSBgLy9gIG9yIGAvKmAgY29tbWVudCwgd2hpY2ggYGNvbW1lbnQudmFsdWVgIGxlYXZlcyBvdXQuXG4gKi9cbmNvbnN0IENPTU1FTlRfT1BFTklOR19MRU5HVEggPSAyO1xuXG4vKipcbiAqIFRoZSBKU09OIHNjaGVtYSBvZiB0aGUgb3B0aW9ucyB0aGUgcGx1Z2luLW5hbWUgcnVsZXMgdGFrZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9OQU1FX1JVTEVfU0NIRU1BOiBSdWxlLlJ1bGVNZXRhRGF0YVsnc2NoZW1hJ10gPSBbXG4gIHtcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgYWRkaXRpb25hbFBsdWdpbk5hbWVzOiB7XG4gICAgICAgIGl0ZW1zOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHR5cGU6ICdhcnJheSdcbiAgICAgIH1cbiAgICB9LFxuICAgIHR5cGU6ICdvYmplY3QnXG4gIH1cbl07XG5cbi8qKlxuICogRVNMaW50IHJ1bGUgcmVxdWlyaW5nIGEgcGx1Z2luIG5hbWUgaW4gYSBjb21tZW50IHRvIGJlIG1hcmtlZCBhcyBjb2RlLlxuICovXG5leHBvcnQgY29uc3QgcGx1Z2luTmFtZUFzQ29kZTogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gYXMgUGx1Z2luTmFtZVJ1bGVPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBsdWdpbk5hbWVzID0gZ2V0UGx1Z2luTmFtZXMoeyBhZGRpdGlvbmFsUGx1Z2luTmFtZXM6IG9wdGlvbnM/LmFkZGl0aW9uYWxQbHVnaW5OYW1lcywgY3dkOiBjb250ZXh0LmN3ZCB9KTtcbiAgICBjb25zdCBzb3VyY2VDb2RlID0gY29udGV4dC5zb3VyY2VDb2RlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIFByb2dyYW0oKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBzb3VyY2VDb2RlLmdldEFsbENvbW1lbnRzKCkpIHtcbiAgICAgICAgICBjb25zdCBbdmFsdWVTdGFydF0gPSBzb3VyY2VDb2RlLmdldFJhbmdlKGNvbW1lbnQpO1xuICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZmluZFBsdWdpbk5hbWVNYXRjaGVzKGNvbW1lbnQudmFsdWUsIHBsdWdpbk5hbWVzLCBFWENMVURFRF9DT01NRU5UX1BBVFRFUk5TKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB2YWx1ZVN0YXJ0ICsgQ09NTUVOVF9PUEVOSU5HX0xFTkdUSCArIG1hdGNoLmluZGV4O1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBtYXRjaC5uYW1lLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgZGF0YTogeyBuYW1lOiBtYXRjaC5uYW1lIH0sXG4gICAgICAgICAgICAgIGZpeDogKGZpeGVyKSA9PiBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKFtzdGFydCwgZW5kXSwgYFxcYCR7bWF0Y2gubmFtZX1cXGBgKSxcbiAgICAgICAgICAgICAgbG9jOiB7XG4gICAgICAgICAgICAgICAgZW5kOiBzb3VyY2VDb2RlLmdldExvY0Zyb21JbmRleChlbmQpLFxuICAgICAgICAgICAgICAgIHN0YXJ0OiBzb3VyY2VDb2RlLmdldExvY0Zyb21JbmRleChzdGFydClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZUlkOiBNRVNTQUdFX0lEXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246ICdSZXF1aXJlIGEgcGx1Z2luIG5hbWUgaW4gYSBjb21tZW50IHRvIGJlIG1hcmtlZCBhcyBjb2RlIHdpdGggYmFja3RpY2tzJ1xuICAgIH0sXG4gICAgZml4YWJsZTogJ2NvZGUnLFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbTUVTU0FHRV9JRF06ICdNYXJrIHRoZSBwbHVnaW4gbmFtZSBge3sgbmFtZSB9fWAgYXMgY29kZTogd3JhcCBpdCBpbiBiYWNrdGlja3MuJ1xuICAgIH0sXG4gICAgc2NoZW1hOiBQTFVHSU5fTkFNRV9SVUxFX1NDSEVNQSxcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbidcbiAgfVxufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS0EsTUFBTSxhQUFhO0FBSzFCLE1BQU0sNEJBQStDO0FBQUEsRUFDbkQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBS0EsTUFBTSx5QkFBeUI7QUFLeEIsTUFBTSwwQkFBdUQ7QUFBQSxFQUNsRTtBQUFBLElBQ0Usc0JBQXNCO0FBQUEsSUFDdEIsWUFBWTtBQUFBLE1BQ1YsdUJBQXVCO0FBQUEsUUFDckIsT0FBTyxFQUFFLE1BQU0sU0FBUztBQUFBLFFBQ3hCLE1BQU07QUFBQSxNQUNSO0FBQUEsSUFDRjtBQUFBLElBQ0EsTUFBTTtBQUFBLEVBQ1I7QUFDRjtBQUtPLE1BQU0sbUJBQW9DO0FBQUEsRUFDL0MsT0FBTyxTQUFTO0FBQ2QsVUFBTSxVQUFVLFFBQVEsUUFBUSxDQUFDO0FBQ2pDLFVBQU0sY0FBYyxlQUFlLEVBQUUsdUJBQXVCLFNBQVMsdUJBQXVCLEtBQUssUUFBUSxJQUFJLENBQUM7QUFDOUcsVUFBTSxhQUFhLFFBQVE7QUFFM0IsV0FBTztBQUFBLE1BQ0wsVUFBZ0I7QUFDZCxtQkFBVyxXQUFXLFdBQVcsZUFBZSxHQUFHO0FBQ2pELGdCQUFNLENBQUMsVUFBVSxJQUFJLFdBQVcsU0FBUyxPQUFPO0FBQ2hELHFCQUFXLFNBQVMsc0JBQXNCLFFBQVEsT0FBTyxhQUFhLHlCQUF5QixHQUFHO0FBQ2hHLGtCQUFNLFFBQVEsYUFBYSx5QkFBeUIsTUFBTTtBQUMxRCxrQkFBTSxNQUFNLFFBQVEsTUFBTSxLQUFLO0FBQy9CLG9CQUFRLE9BQU87QUFBQSxjQUNiLE1BQU0sRUFBRSxNQUFNLE1BQU0sS0FBSztBQUFBLGNBQ3pCLEtBQUssQ0FBQyxVQUFVLE1BQU0saUJBQWlCLENBQUMsT0FBTyxHQUFHLEdBQUcsS0FBSyxNQUFNLElBQUksSUFBSTtBQUFBLGNBQ3hFLEtBQUs7QUFBQSxnQkFDSCxLQUFLLFdBQVcsZ0JBQWdCLEdBQUc7QUFBQSxnQkFDbkMsT0FBTyxXQUFXLGdCQUFnQixLQUFLO0FBQUEsY0FDekM7QUFBQSxjQUNBLFdBQVc7QUFBQSxZQUNiLENBQUM7QUFBQSxVQUNIO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxNQUNSLENBQUMsVUFBVSxHQUFHO0FBQUEsSUFDaEI7QUFBQSxJQUNBLFFBQVE7QUFBQSxJQUNSLE1BQU07QUFBQSxFQUNSO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,18 @@
1
+ /// <reference path="../../index.d.mts" />
2
+ import type { Rule } from 'eslint';
3
+ /**
4
+ Message ID reported when a class extends `Component` but its name does not end with `Component`.
5
+ */
6
+ export declare const MESSAGE_ID_MISSING_SUFFIX = "requireComponentSuffix";
7
+ /**
8
+ Message ID reported when an abstract class extends `Component` but its name does not end with `ComponentBase`.
9
+ */
10
+ export declare const MESSAGE_ID_ABSTRACT_NEEDS_BASE = "abstractNeedsComponentBase";
11
+ /**
12
+ Message ID reported when a class name ends with `ComponentBase` but the class is not abstract.
13
+ */
14
+ export declare const MESSAGE_ID_BASE_NOT_ABSTRACT = "componentBaseNotAbstract";
15
+ /**
16
+ * ESLint rule requiring classes that extend `Component` to be named with a `Component` suffix, and abstract ones with a `ComponentBase` suffix.
17
+ */
18
+ export declare const requireComponentSuffix: Rule.RuleModule;