@mnaoumov/create-obsidian-plugin 1.0.1 → 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 (490) hide show
  1. package/README.md +38 -7
  2. package/dist/main.js +1068 -333
  3. package/package.json +15 -6
  4. package/src/main.ts +118 -11
  5. package/templates/default/.github/ISSUE_TEMPLATE/config.yml.ejs +4 -0
  6. package/templates/default/.github/workflows/attest-release-assets.yml.ejs +1 -11
  7. package/templates/default/.github/workflows/ci.yml_framework.ejs +19 -0
  8. package/templates/default/.github/workflows/ci.yml_framework@job-permissions_measured-coverage-badge.ejs +3 -0
  9. package/templates/default/.github/workflows/ci.yml_framework@with_measured-coverage-badge.ejs +1 -0
  10. package/templates/default/.github/workflows/{ci.yml.ejs → ci.yml_standalone.ejs} +1 -1
  11. package/templates/default/.github/workflows/release.yml_framework.ejs +19 -0
  12. package/templates/default/.github/workflows/{release.yml.ejs → release.yml_standalone.ejs} +1 -1
  13. package/templates/default/.gitignore_common.ejs +1 -0
  14. package/templates/default/.gitignore_wdio-obsidian.ejs +2 -0
  15. package/templates/default/.nvmrc.ejs +1 -0
  16. package/templates/default/.prettierignore.ejs +1 -0
  17. package/templates/default/.prettierignore@ignores_docs-showcase.ejs +3 -0
  18. package/templates/default/{CONTRIBUTING.md@demo-vault_dev-utils.ejs → CONTRIBUTING.md@demo-vault_framework.ejs} +1 -1
  19. package/templates/default/{README.md@demo-vault_dev-utils.ejs → README.md@demo-vault_framework.ejs} +1 -1
  20. package/templates/default/README.md@preset_docs-showcase.ejs +4 -0
  21. package/templates/default/{README.md@preset_dev-utils.ejs → README.md@preset_framework.ejs} +1 -1
  22. package/templates/default/biome.jsonc_framework.ejs +16 -0
  23. package/templates/default/biome.jsonc_framework@excludes_docs-showcase.ejs +1 -0
  24. package/templates/default/{biome.jsonc.ejs → biome.jsonc_standalone.ejs} +1 -1
  25. package/templates/default/cspell.json.ejs +10 -2
  26. package/templates/default/cspell.json@ignore-paths_docs-showcase.ejs +1 -0
  27. package/templates/default/demo-vault/.gitignore.ejs +4 -4
  28. package/templates/default/demo-vault/00 Start.md.ejs +1 -1
  29. package/templates/default/demo-vault/01 Sample commands.md.ejs +4 -4
  30. package/templates/default/demo-vault/02 Settings.md.ejs +2 -2
  31. package/templates/default/demo-vault/03 WebAssembly.md.ejs +2 -2
  32. package/templates/default/demo-vault/README.md.ejs +1 -1
  33. package/templates/default/demo-vault/_assets/CodeScriptToolkit/demoSetup.ts.ejs +1 -1
  34. package/templates/default/demo-vault/_assets/CodeScriptToolkit/startup.ts.ejs +4 -4
  35. package/templates/default/dprint.json_framework.ejs +10 -0
  36. package/templates/default/dprint.json_framework@excludes_docs-showcase.ejs +2 -0
  37. package/templates/default/dprint.json_standalone.ejs +1 -0
  38. package/templates/default/eslint.config.mts_standalone.ejs +9 -0
  39. package/templates/default/jest.config.ts_framework.ejs +31 -0
  40. package/templates/default/{scripts/rollup.config.ts@lint-out-dir_dev-utils.ejs → jest.config.ts_framework@lint-root-dir_framework.ejs} +1 -1
  41. package/templates/default/jest.config.ts_framework@ts-jest-tsconfig_solid.ejs +8 -0
  42. package/templates/default/{jest.config.ts.ejs → jest.config.ts_standalone.ejs} +0 -1
  43. package/templates/default/package.json@targets_parcel-targets.ejs +31 -0
  44. package/templates/default/package.json@targets_parcel.ejs +2 -33
  45. package/templates/default/parcel-transformer-inline-imports.cjs.ejs +1 -1
  46. package/templates/default/prettier.config.mjs_framework.ejs +3 -0
  47. package/templates/default/scripts/build-clean.ts.ejs +2 -2
  48. package/templates/default/scripts/build-compile-typescript.ts.ejs +14 -0
  49. package/templates/default/scripts/build-compile.ts.ejs +2 -2
  50. package/templates/default/scripts/build-options.ts.ejs +9 -0
  51. package/templates/default/scripts/build-styles.ts.ejs +4 -7
  52. package/templates/default/scripts/build.ts.ejs +2 -2
  53. package/templates/default/scripts/build.ts@bundler_adapter-cli.ejs +11 -0
  54. package/templates/default/scripts/build.ts@bundler_adapter-cli@run_rollup.ejs +1 -0
  55. package/templates/default/scripts/build.ts@bundler_adapter-cli@run_vite.ejs +1 -0
  56. package/templates/default/scripts/build.ts@bundler_adapter-cli@run_webpack.ejs +1 -0
  57. package/templates/default/scripts/build.ts@bundler_cli-bundler.ejs +1 -1
  58. package/templates/default/scripts/build.ts@bundler_cli-bundler@import_tailwind.ejs +0 -1
  59. package/templates/default/scripts/build.ts@bundler_esbuild.ejs +2 -2
  60. package/templates/default/scripts/build.ts@bundler_esbuild@preset_framework.ejs +5 -0
  61. package/templates/default/scripts/build.ts@bundler_parcel-adapter.ejs +5 -0
  62. package/templates/default/scripts/commit.ts_framework.ejs +3 -0
  63. package/templates/default/scripts/commitlint-config.ts_framework.ejs +1 -0
  64. package/templates/default/scripts/demo-vault-global-setup.ts.ejs +7 -4
  65. package/templates/default/scripts/dev.ts.ejs +1 -1
  66. package/templates/default/scripts/dev.ts@bundler_adapter-cli.ejs +6 -0
  67. package/templates/default/scripts/dev.ts@bundler_adapter-cli@run_rollup.ejs +3 -0
  68. package/templates/default/scripts/dev.ts@bundler_adapter-cli@run_vite.ejs +3 -0
  69. package/templates/default/scripts/dev.ts@bundler_adapter-cli@run_webpack.ejs +3 -0
  70. package/templates/default/scripts/dev.ts@bundler_esbuild.ejs +2 -2
  71. package/templates/default/scripts/dev.ts@bundler_esbuild@preset_framework.ejs +5 -0
  72. package/templates/default/scripts/dev.ts@bundler_parcel-adapter.ejs +5 -0
  73. package/templates/default/scripts/eslint-config.ts.ejs +3 -14
  74. package/templates/default/scripts/eslint-config.ts@ignores_docs-showcase.ejs +4 -0
  75. package/templates/default/scripts/find-overexposed-fix.ts.ejs +4 -4
  76. package/templates/default/scripts/find-overexposed.ts.ejs +3 -3
  77. package/templates/default/scripts/format-check.ts@tool_biome-formatter.ejs +3 -8
  78. package/templates/default/scripts/format-check.ts@tool_biome-formatter@preset_framework.ejs +7 -0
  79. package/templates/default/scripts/format-check.ts@tool_biome-formatter@preset_standalone.ejs +8 -0
  80. package/templates/default/scripts/format-check.ts@tool_dprint.ejs +2 -2
  81. package/templates/default/scripts/format-check.ts@tool_dprint@preset_framework.ejs +7 -0
  82. package/templates/default/scripts/format-check.ts@tool_prettier.ejs +3 -8
  83. package/templates/default/scripts/format-check.ts@tool_prettier@preset_framework.ejs +7 -0
  84. package/templates/default/scripts/format-check.ts@tool_prettier@preset_standalone.ejs +8 -0
  85. package/templates/default/scripts/format.ts@tool_biome-formatter.ejs +3 -8
  86. package/templates/default/scripts/format.ts@tool_biome-formatter@preset_framework.ejs +7 -0
  87. package/templates/default/scripts/format.ts@tool_biome-formatter@preset_standalone.ejs +8 -0
  88. package/templates/default/scripts/format.ts@tool_dprint.ejs +2 -2
  89. package/templates/default/scripts/format.ts@tool_dprint@preset_framework.ejs +7 -0
  90. package/templates/default/scripts/format.ts@tool_prettier.ejs +3 -8
  91. package/templates/default/scripts/format.ts@tool_prettier@preset_framework.ejs +7 -0
  92. package/templates/default/scripts/format.ts@tool_prettier@preset_standalone.ejs +8 -0
  93. package/templates/default/scripts/gate.ts.ejs +3 -3
  94. package/templates/default/scripts/lint-fix.ts.ejs +2 -2
  95. package/templates/default/scripts/lint-fix.ts@tool_biome-linter.ejs +3 -8
  96. package/templates/default/scripts/lint-fix.ts@tool_biome-linter@preset_framework.ejs +7 -0
  97. package/templates/default/scripts/lint-fix.ts@tool_biome-linter@preset_standalone.ejs +8 -0
  98. package/templates/default/scripts/lint-fix.ts@tool_eslint.ejs +2 -2
  99. package/templates/default/scripts/lint-fix.ts@tool_eslint@preset_framework.ejs +7 -0
  100. package/templates/default/scripts/lint-md-fix.ts_framework.ejs +7 -0
  101. package/templates/default/scripts/lint-md.ts_framework.ejs +7 -0
  102. package/templates/default/scripts/lint.ts.ejs +2 -2
  103. package/templates/default/scripts/lint.ts@tool_biome-linter.ejs +3 -8
  104. package/templates/default/scripts/lint.ts@tool_biome-linter@preset_framework.ejs +7 -0
  105. package/templates/default/scripts/lint.ts@tool_biome-linter@preset_standalone.ejs +8 -0
  106. package/templates/default/scripts/lint.ts@tool_eslint.ejs +2 -2
  107. package/templates/default/scripts/lint.ts@tool_eslint@preset_framework.ejs +7 -0
  108. package/templates/default/scripts/{markdownlint-cli2-config.ts_dev-utils.ejs → markdownlint-cli2-config.ts_framework.ejs} +4 -4
  109. package/templates/default/scripts/markdownlint-cli2-config.ts_standalone.ejs +0 -3
  110. package/templates/default/scripts/nano-staged-config.ts_toolkit-nano-staged.ejs +3 -0
  111. package/templates/default/scripts/prepare.ts_framework.ejs +3 -0
  112. package/templates/default/scripts/rollup.config.ts_framework.ejs +49 -0
  113. package/templates/default/scripts/rollup.config.ts_framework@plugin_rollup-json.ejs +2 -0
  114. package/templates/default/scripts/rollup.config.ts_framework@plugin_scss.ejs +3 -0
  115. package/templates/default/scripts/{rollup.config.ts.ejs → rollup.config.ts_standalone.ejs} +4 -4
  116. package/templates/default/scripts/rollup.config.ts_standalone@import_rollup-json.ejs +1 -0
  117. package/templates/default/scripts/rollup.config.ts_standalone@import_scss.ejs +1 -0
  118. package/templates/default/scripts/rollup.config.ts_standalone@unwrap_rollup-json.ejs +1 -0
  119. package/templates/default/scripts/rollup.config.ts_standalone@unwrap_scss.ejs +1 -0
  120. package/templates/default/scripts/spellcheck.ts_framework.ejs +7 -0
  121. package/templates/default/scripts/stylesheet-stub.ts.ejs +1 -1
  122. package/templates/default/scripts/test-coverage.ts.ejs +2 -8
  123. package/templates/default/scripts/test-coverage.ts@tool_jest.ejs +5 -0
  124. package/templates/default/scripts/test-coverage.ts@tool_vitest.ejs +8 -0
  125. package/templates/default/scripts/test-e2e.ts@tool_obsidian-test.ejs +2 -8
  126. package/templates/default/scripts/test-e2e.ts@tool_obsidian-test@preset_framework.ejs +4 -0
  127. package/templates/default/scripts/test-e2e.ts@tool_obsidian-test@preset_standalone.ejs +8 -0
  128. package/templates/default/scripts/test-e2e.ts@tool_wdio-obsidian.ejs +2 -8
  129. package/templates/default/scripts/test-e2e.ts@tool_wdio-obsidian@preset_framework.ejs +5 -0
  130. package/templates/default/scripts/test-e2e.ts@tool_wdio-obsidian@preset_standalone.ejs +8 -0
  131. package/templates/default/scripts/test-integration-android.ts.ejs +2 -2
  132. package/templates/default/scripts/test-integration-demo-vault.ts.ejs +2 -2
  133. package/templates/default/scripts/test-integration-desktop-performance.ts.ejs +2 -2
  134. package/templates/default/scripts/test-integration-desktop.ts.ejs +2 -2
  135. package/templates/default/scripts/test-integration-no-app.ts.ejs +2 -2
  136. package/templates/default/scripts/test-integration.ts.ejs +2 -2
  137. package/templates/default/scripts/test-watch.ts_framework@tool_jest.ejs +5 -0
  138. package/templates/default/scripts/test-watch.ts_framework@tool_vitest.ejs +8 -0
  139. package/templates/default/scripts/test.ts_framework@tool_jest.ejs +5 -0
  140. package/templates/default/scripts/test.ts_framework@tool_vitest.ejs +8 -0
  141. package/templates/default/scripts/{version.ts_dev-utils.ejs → version.ts_framework.ejs} +3 -3
  142. package/templates/default/scripts/vite.config.ts_framework.ejs +10 -0
  143. package/templates/default/scripts/{vite.config.ts.ejs → vite.config.ts_standalone.ejs} +5 -8
  144. package/templates/default/scripts/vitest-config.ts.ejs +3 -2
  145. package/templates/default/scripts/vitest-config.ts@edit-context_docs-showcase.ejs +3 -0
  146. package/templates/default/scripts/webpack.config.ts_framework.ejs +19 -0
  147. package/templates/default/scripts/webpack.config.ts_framework@import_scss.ejs +1 -0
  148. package/templates/default/scripts/webpack.config.ts_framework@plugin_scss.ejs +1 -0
  149. package/templates/default/scripts/webpack.config.ts_framework@rule_scss.ejs +4 -0
  150. package/templates/default/scripts/{webpack.config.ts.ejs → webpack.config.ts_standalone.ejs} +4 -4
  151. package/templates/default/src/demo-vault-buttons.demo-vault.integration.test.ts.ejs +2 -2
  152. package/templates/default/src/demo-vault.no-app.integration.test.ts.ejs +3 -3
  153. package/templates/default/src/docs-showcase.desktop.integration.test.ts.ejs +77 -0
  154. package/templates/default/src/editor-extensions/{sample-state-field.ts_dev-utils.ejs → sample-state-field.ts_framework.ejs} +1 -1
  155. package/templates/default/src/main.ts@import_tailwind.ejs +1 -1
  156. package/templates/default/src/main.ts@import_tailwind@preset_framework.ejs +1 -0
  157. package/templates/default/src/main.ts@import_tailwind@preset_standalone.ejs +1 -0
  158. package/templates/default/src/{plugin-settings-component.test.ts_enhanced.ejs → plugin-settings-component.test.ts_all-in-one.ejs} +4 -4
  159. package/templates/default/src/plugin-settings-component.test.ts_demo.ejs +5 -5
  160. package/templates/default/src/{plugin-settings-component.ts_enhanced.ejs → plugin-settings-component.ts_all-in-one.ejs} +3 -3
  161. package/templates/default/src/plugin-settings-component.ts_demo.ejs +7 -7
  162. package/templates/default/src/{plugin-settings-tab.ts_enhanced.ejs → plugin-settings-tab.ts_all-in-one.ejs} +1 -1
  163. package/templates/default/src/plugin-settings-tab.ts_demo.ejs +3 -3
  164. package/templates/default/src/plugin-settings.ts_demo.ejs +2 -2
  165. package/templates/default/src/{plugin.ts_enhanced.ejs → plugin.ts_all-in-one.ejs} +5 -5
  166. package/templates/default/src/plugin.ts_all-in-one@import2_css-modules.ejs +1 -0
  167. package/templates/default/src/plugin.ts_all-in-one@import2_docs-showcase.ejs +1 -0
  168. package/templates/default/src/plugin.ts_all-in-one@onload_css-modules.ejs +1 -0
  169. package/templates/default/src/plugin.ts_all-in-one@onload_docs-showcase.ejs +3 -0
  170. package/templates/default/src/plugin.ts_demo.ejs +16 -16
  171. package/templates/default/src/plugin.ts_demo@import_css-modules.ejs +1 -0
  172. package/templates/default/src/plugin.ts_demo@onload_css-modules.ejs +1 -0
  173. package/templates/default/src/plugin.ts_standalone.ejs +5 -3
  174. package/templates/default/src/plugin.ts_standalone@import_css-modules.ejs +1 -0
  175. package/templates/default/src/plugin.ts_standalone@onload_css-modules.ejs +1 -0
  176. package/templates/default/src/react-components/{sample-react-component.tsx_dev-utils.ejs → sample-react-component.tsx_framework.ejs} +1 -1
  177. package/templates/default/src/styles/css-modules.d.ts.ejs +9 -3
  178. package/templates/default/src/styles/{main.css_dev-utils.ejs → main.css_framework.ejs} +2 -2
  179. package/templates/default/src/styles/main.module.css.ejs +4 -2
  180. package/templates/default/src/styles/{main.scss_dev-utils.ejs → main.scss_framework.ejs} +2 -2
  181. package/templates/default/src/styles/sample-css-module-command.ts.ejs +30 -0
  182. package/templates/default/src/views/{sample-react-view.tsx_dev-utils.ejs → sample-react-view.tsx_framework.ejs} +1 -1
  183. package/templates/default/src/wasm/README.md.ejs +1 -1
  184. package/templates/default/src/wasm/answer.ts_wasm-adapter.ejs +18 -0
  185. package/templates/default/{tsconfig.json_dev-utils.ejs → tsconfig.json_framework.ejs} +2 -2
  186. package/templates/default/tsconfig.json_framework@exclude_docs-showcase.ejs +4 -0
  187. package/templates/default/tsconfig.json_framework@include_wdio-obsidian.ejs +1 -0
  188. package/templates/default/tsconfig.json_framework@types_toolkit-styles.ejs +2 -0
  189. package/templates/default/tsconfig.json_framework@types_wasm.ejs +2 -0
  190. package/templates/default/tsconfig.json_standalone.ejs +1 -1
  191. package/templates/default/vitest.config.ts_standalone.ejs +11 -2
  192. package/templates/default/wdio.conf.mts.ejs +5 -0
  193. package/templates/default/wdio.conf.ts.ejs +4 -4
  194. package/templates/docs-showcase/files/src/docs/README.md +511 -0
  195. package/templates/docs-showcase/files/src/docs/entry.d.ts +8 -0
  196. package/templates/docs-showcase/files/src/docs/entry.js +4 -0
  197. package/templates/docs-showcase/files/src/docs/host.ts +449 -0
  198. package/templates/docs-showcase/files/src/docs/index.ts +699 -0
  199. package/templates/docs-showcase/files/src/docs/plugins/editor/communicating-with-editor-extensions/01-intro.ts +21 -0
  200. package/templates/docs-showcase/files/src/docs/plugins/editor/communicating-with-editor-extensions/03-state-field.ts +32 -0
  201. package/templates/docs-showcase/files/src/docs/plugins/editor/decorations/01-widgets.ts +23 -0
  202. package/templates/docs-showcase/files/src/docs/plugins/editor/decorations/02-widgets.ts +20 -0
  203. package/templates/docs-showcase/files/src/docs/plugins/editor/decorations/04-state-fields.ts +57 -0
  204. package/templates/docs-showcase/files/src/docs/plugins/editor/decorations/05-view-plugins.ts +79 -0
  205. package/templates/docs-showcase/files/src/docs/plugins/editor/editor/01-intro.ts +26 -0
  206. package/templates/docs-showcase/files/src/docs/plugins/editor/editor/03-replace-current-selection.ts +26 -0
  207. package/templates/docs-showcase/files/src/docs/plugins/editor/markdown-post-processing/01-intro.ts +39 -0
  208. package/templates/docs-showcase/files/src/docs/plugins/editor/state-fields/01-defining-state-effects.ts +19 -0
  209. package/templates/docs-showcase/files/src/docs/plugins/editor/state-fields/02-defining-a-state-field.ts +35 -0
  210. package/templates/docs-showcase/files/src/docs/plugins/editor/state-fields/04-dispatching-state-effects.ts +34 -0
  211. package/templates/docs-showcase/files/src/docs/plugins/editor/state-management/01-state-changes.ts +21 -0
  212. package/templates/docs-showcase/files/src/docs/plugins/editor/state-management/02-state-changes.ts +23 -0
  213. package/templates/docs-showcase/files/src/docs/plugins/editor/view-plugins/01-creating-a-view-plugin.ts +36 -0
  214. package/templates/docs-showcase/files/src/docs/plugins/events/01-intro.ts +21 -0
  215. package/templates/docs-showcase/files/src/docs/plugins/getting-started/anatomy-of-a-plugin/01-intro.ts +22 -0
  216. package/templates/docs-showcase/files/src/docs/plugins/getting-started/anatomy-of-a-plugin/02-plugin-lifecycle.ts +22 -0
  217. package/templates/docs-showcase/files/src/docs/plugins/getting-started/build-a-plugin/06-step-5-update-the-source-code.ts +19 -0
  218. package/templates/docs-showcase/files/src/docs/plugins/getting-started/build-a-plugin/07-step-5-update-the-source-code.ts +21 -0
  219. package/templates/docs-showcase/files/src/docs/plugins/getting-started/mobile-development/03-platform-specific-features.ts +25 -0
  220. package/templates/docs-showcase/files/src/docs/plugins/getting-started/use-react-in-your-plugin/03-configure-your-plugin.ts +23 -0
  221. package/templates/docs-showcase/files/src/docs/plugins/guides/build-a-bases-view/01-step-1-sample-plugin-setup.ts +18 -0
  222. package/templates/docs-showcase/files/src/docs/plugins/guides/build-a-bases-view/02-step-2-create-and-register-the-bases-vie.ts +46 -0
  223. package/templates/docs-showcase/files/src/docs/plugins/guides/build-a-bases-view/03-step-3-add-configuration.ts +40 -0
  224. package/templates/docs-showcase/files/src/docs/plugins/guides/defer-views/04-accessing-your-customview-without-reveal.ts +26 -0
  225. package/templates/docs-showcase/files/src/docs/plugins/guides/manage-plugin-lifecycle/01-overview.ts +26 -0
  226. package/templates/docs-showcase/files/src/docs/plugins/guides/manage-plugin-lifecycle/02-overview.ts +30 -0
  227. package/templates/docs-showcase/files/src/docs/plugins/guides/manage-plugin-lifecycle/03-automatic-resource-management-with-compo.ts +26 -0
  228. package/templates/docs-showcase/files/src/docs/plugins/guides/manage-plugin-lifecycle/04-registerevent-eventref.ts +22 -0
  229. package/templates/docs-showcase/files/src/docs/plugins/guides/manage-plugin-lifecycle/05-registerinterval-id.ts +21 -0
  230. package/templates/docs-showcase/files/src/docs/plugins/guides/manage-plugin-lifecycle/06-registerdomevent-el-event-handler.ts +20 -0
  231. package/templates/docs-showcase/files/src/docs/plugins/guides/manage-plugin-lifecycle/08-understanding-the-lifecycle-of-objects.ts +29 -0
  232. package/templates/docs-showcase/files/src/docs/plugins/guides/manage-plugin-lifecycle/14-componentized-modal-example.ts +37 -0
  233. package/templates/docs-showcase/files/src/docs/plugins/guides/optimize-plugin-load-time/01-option-a-check-if-the-layout-is-ready.ts +29 -0
  234. package/templates/docs-showcase/files/src/docs/plugins/guides/optimize-plugin-load-time/02-option-b-register-the-handler-once-the-l.ts +27 -0
  235. package/templates/docs-showcase/files/src/docs/plugins/guides/store-secrets/03-step-3-retrieve-the-secret-value.ts +22 -0
  236. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/01-use-setheading-instead-of-a-h1-h2.ts +20 -0
  237. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/03-clean-up-resources-when-plugin-unloads.ts +23 -0
  238. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/04-avoid-accessing-workspace-activeleaf-dir.ts +24 -0
  239. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/05-avoid-accessing-workspace-activeleaf-dir.ts +22 -0
  240. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/10-avoid-iterating-all-files-to-find-a-file.ts +20 -0
  241. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/11-avoid-iterating-all-files-to-find-a-file.ts +20 -0
  242. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/13-use-normalizepath-to-clean-up-user-defin.ts +18 -0
  243. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/15-no-hardcoded-styling.ts +21 -0
  244. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/16-no-hardcoded-styling.ts +19 -0
  245. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/17-no-hardcoded-styling.ts +14 -0
  246. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/18-prefer-async-await-over-promise.ts +24 -0
  247. package/templates/docs-showcase/files/src/docs/plugins/releasing/plugin-guidelines/19-prefer-async-await-over-promise.ts +27 -0
  248. package/templates/docs-showcase/files/src/docs/plugins/user-interface/commands/01-intro.ts +25 -0
  249. package/templates/docs-showcase/files/src/docs/plugins/user-interface/commands/03-editor-commands.ts +27 -0
  250. package/templates/docs-showcase/files/src/docs/plugins/user-interface/commands/05-hot-keys.ts +25 -0
  251. package/templates/docs-showcase/files/src/docs/plugins/user-interface/context-menus/01-intro.ts +41 -0
  252. package/templates/docs-showcase/files/src/docs/plugins/user-interface/html-elements/02-create-html-elements-using-createel.ts +19 -0
  253. package/templates/docs-showcase/files/src/docs/plugins/user-interface/html-elements/03-create-html-elements-using-createel.ts +21 -0
  254. package/templates/docs-showcase/files/src/docs/plugins/user-interface/html-elements/04-style-your-elements.ts +14 -0
  255. package/templates/docs-showcase/files/src/docs/plugins/user-interface/html-elements/05-style-your-elements.ts +21 -0
  256. package/templates/docs-showcase/files/src/docs/plugins/user-interface/html-elements/06-conditional-styles.ts +19 -0
  257. package/templates/docs-showcase/files/src/docs/plugins/user-interface/icons/01-use-icons.ts +20 -0
  258. package/templates/docs-showcase/files/src/docs/plugins/user-interface/icons/02-use-icons.ts +14 -0
  259. package/templates/docs-showcase/files/src/docs/plugins/user-interface/icons/03-add-your-own-icon.ts +23 -0
  260. package/templates/docs-showcase/files/src/docs/plugins/user-interface/modals/01-intro.ts +20 -0
  261. package/templates/docs-showcase/files/src/docs/plugins/user-interface/modals/02-intro.ts +26 -0
  262. package/templates/docs-showcase/files/src/docs/plugins/user-interface/modals/03-accept-user-input.ts +38 -0
  263. package/templates/docs-showcase/files/src/docs/plugins/user-interface/modals/04-accept-user-input.ts +22 -0
  264. package/templates/docs-showcase/files/src/docs/plugins/user-interface/modals/05-select-from-list-of-suggestions.ts +56 -0
  265. package/templates/docs-showcase/files/src/docs/plugins/user-interface/modals/06-approximate-string-matching-results.ts +28 -0
  266. package/templates/docs-showcase/files/src/docs/plugins/user-interface/modals/07-custom-rendering-of-fuzzy-search-results.ts +41 -0
  267. package/templates/docs-showcase/files/src/docs/plugins/user-interface/ribbon-actions/01-intro.ts +21 -0
  268. package/templates/docs-showcase/files/src/docs/plugins/user-interface/right-to-left/01-use-fallback-values-when-necessary.ts +14 -0
  269. package/templates/docs-showcase/files/src/docs/plugins/user-interface/right-to-left/02-global-selectors.ts +14 -0
  270. package/templates/docs-showcase/files/src/docs/plugins/user-interface/right-to-left/03-icons-are-mirrored-automatically.ts +14 -0
  271. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/09-toggle.ts +20 -0
  272. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/10-text.ts +23 -0
  273. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/11-textarea.ts +23 -0
  274. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/12-number.ts +23 -0
  275. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/13-slider.ts +23 -0
  276. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/14-dropdown.ts +28 -0
  277. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/15-file.ts +27 -0
  278. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/16-folder.ts +23 -0
  279. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/17-color-picker.ts +20 -0
  280. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/18-validating-input.ts +28 -0
  281. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/23-groups.ts +27 -0
  282. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/32-cleanup.ts +30 -0
  283. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/33-no-top-level-heading.ts +27 -0
  284. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/34-headings-only-when-there-are-multiple-se.ts +26 -0
  285. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/36-headings.ts +20 -0
  286. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/38-moment-format.ts +42 -0
  287. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/39-buttons.ts +26 -0
  288. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/40-extra-button.ts +28 -0
  289. package/templates/docs-showcase/files/src/docs/plugins/user-interface/settings/41-progress-bar.ts +23 -0
  290. package/templates/docs-showcase/files/src/docs/plugins/user-interface/status-bar/01-intro.ts +20 -0
  291. package/templates/docs-showcase/files/src/docs/plugins/user-interface/status-bar/02-intro.ts +25 -0
  292. package/templates/docs-showcase/files/src/docs/plugins/user-interface/views/01-intro.ts +39 -0
  293. package/templates/docs-showcase/files/src/docs/plugins/user-interface/workspace/05-inspect-the-workspace.ts +23 -0
  294. package/templates/docs-showcase/files/src/docs/plugins/user-interface/workspace/06-leaf-groups.ts +19 -0
  295. package/templates/docs-showcase/files/src/docs/plugins/vault/02-read-files.ts +37 -0
  296. package/templates/docs-showcase/files/src/docs/plugins/vault/03-modify-files.ts +19 -0
  297. package/templates/docs-showcase/files/src/docs/plugins/vault/04-modify-files.ts +22 -0
  298. package/templates/docs-showcase/files/src/docs/plugins/vault/05-is-it-a-file-or-folder.ts +25 -0
  299. package/templates/docs-showcase/files/src/docs/reference/css-variables/about-styling/01-for-plugins.ts +14 -0
  300. package/templates/docs-showcase/files/src/docs/reference/css-variables/about-styling/02-for-themes-and-snippets.ts +14 -0
  301. package/templates/docs-showcase/files/src/docs/reference/css-variables/publish/site-fonts/01-intro.ts +14 -0
  302. package/templates/docs-showcase/files/src/docs/reference/typescript-api/command/callback/01-example.ts +24 -0
  303. package/templates/docs-showcase/files/src/docs/reference/typescript-api/debounce/01-example.ts +24 -0
  304. package/templates/docs-showcase/files/src/docs/reference/typescript-api/vault/process/01-example.ts +22 -0
  305. package/templates/docs-showcase/files/src/docs/themes/app-themes/build-a-theme/05-step-4-change-the-font.ts +14 -0
  306. package/templates/docs-showcase/files/src/docs/themes/app-themes/build-a-theme/06-step-5-change-the-background-color.ts +14 -0
  307. package/templates/docs-showcase/files/src/docs/themes/app-themes/build-a-theme/07-step-6-change-the-input-hover-border-col.ts +14 -0
  308. package/templates/docs-showcase/files/src/docs/themes/app-themes/build-a-theme/08-step-7-discover-css-variables-in-use.ts +14 -0
  309. package/templates/docs-showcase/files/src/docs/themes/app-themes/embed-fonts-and-images-in-your-theme/02-use-data-urls.ts +14 -0
  310. package/templates/docs-showcase/files/src/docs/themes/app-themes/theme-guidelines/01-use-css-variables.ts +14 -0
  311. package/templates/docs-showcase/files/src/docs/themes/obsidian-publish-themes/best-practices-for-publish-themes/01-small-screens-and-mobile-devices.ts +14 -0
  312. package/templates/docs-showcase/files/src/docs/themes/obsidian-publish-themes/build-a-publish-theme/01-intro.ts +14 -0
  313. package/templates/docs-showcase/files/src/docs/tsconfig.json +25 -0
  314. package/templates/docs-showcase/host/entry.d.ts +8 -0
  315. package/templates/docs-showcase/host/entry.js +4 -0
  316. package/templates/docs-showcase/host/host.ts +449 -0
  317. package/templates/docs-showcase/host/tsconfig.json +25 -0
  318. package/templates/docs-showcase/snippets.json +3566 -0
  319. package/templates/official-sample/README.md +9 -0
  320. package/templates/official-sample/files/.editorconfig.vendored +11 -0
  321. package/templates/official-sample/files/.github/workflows/lint.yml.vendored +27 -0
  322. package/templates/official-sample/files/.github/workflows/release.yml.vendored +50 -0
  323. package/templates/official-sample/files/.gitignore.vendored +22 -0
  324. package/templates/official-sample/files/.npmrc.vendored +1 -0
  325. package/templates/official-sample/files/AGENTS.md.vendored +269 -0
  326. package/templates/official-sample/files/LICENSE.vendored +5 -0
  327. package/templates/official-sample/files/README.md.vendored +92 -0
  328. package/templates/official-sample/files/esbuild.config.mjs.vendored +49 -0
  329. package/templates/official-sample/files/eslint.config.mts.vendored +32 -0
  330. package/templates/official-sample/files/manifest.json.vendored +11 -0
  331. package/templates/official-sample/files/package-lock.json.vendored +5053 -0
  332. package/templates/official-sample/files/package.json.vendored +27 -0
  333. package/templates/official-sample/files/src/main.ts.vendored +114 -0
  334. package/templates/official-sample/files/src/settings.ts.vendored +38 -0
  335. package/templates/official-sample/files/styles.css.vendored +8 -0
  336. package/templates/official-sample/files/tsconfig.json.vendored +19 -0
  337. package/templates/official-sample/files/version-bump.mjs.vendored +17 -0
  338. package/templates/official-sample/files/versions.json.vendored +3 -0
  339. package/upstreams.json +35 -0
  340. package/templates/default/dprint.json_dev-utils.ejs +0 -10
  341. package/templates/default/jest.config.ts@lint-root-dir_dev-utils.ejs +0 -1
  342. package/templates/default/scripts/build.ts@bundler_cli-bundler@lint-build-styles_dev-utils.ejs +0 -1
  343. package/templates/default/scripts/build.ts@bundler_esbuild@dev-utils-pre-build_tailwind.ejs +0 -2
  344. package/templates/default/scripts/build.ts@bundler_esbuild@lint-build-styles_dev-utils.ejs +0 -1
  345. package/templates/default/scripts/build.ts@bundler_esbuild@preset_dev-utils.ejs +0 -7
  346. package/templates/default/scripts/commit.ts_dev-utils.ejs +0 -3
  347. package/templates/default/scripts/dev.ts@bundler_esbuild@dev-utils-pre-build_tailwind.ejs +0 -2
  348. package/templates/default/scripts/dev.ts@bundler_esbuild@lint-build-styles_dev-utils.ejs +0 -1
  349. package/templates/default/scripts/dev.ts@bundler_esbuild@preset_dev-utils.ejs +0 -7
  350. package/templates/default/scripts/esbuild-plugins.ts.ejs +0 -20
  351. package/templates/default/scripts/esbuild-plugins.ts@dev-utils-import_vue.ejs +0 -2
  352. package/templates/default/scripts/esbuild-plugins.ts@dev-utils-plugin_vue.ejs +0 -1
  353. package/templates/default/scripts/esbuild-plugins.ts@dev-utils-plugin_wasm.ejs +0 -13
  354. package/templates/default/scripts/format-check.ts@tool_dprint@preset_dev-utils.ejs +0 -7
  355. package/templates/default/scripts/format.ts@tool_dprint@preset_dev-utils.ejs +0 -7
  356. package/templates/default/scripts/lint-fix.ts@tool_eslint@preset_dev-utils.ejs +0 -7
  357. package/templates/default/scripts/lint-md-fix.ts_dev-utils.ejs +0 -7
  358. package/templates/default/scripts/lint-md.ts_dev-utils.ejs +0 -7
  359. package/templates/default/scripts/lint.ts@tool_eslint@preset_dev-utils.ejs +0 -7
  360. package/templates/default/scripts/prepare.ts_dev-utils.ejs +0 -3
  361. package/templates/default/scripts/spellcheck.ts_dev-utils.ejs +0 -7
  362. package/templates/default/scripts/test-watch.ts_dev-utils@tool_jest.ejs +0 -13
  363. package/templates/default/scripts/test-watch.ts_dev-utils@tool_vitest.ejs +0 -8
  364. package/templates/default/scripts/test.ts_dev-utils@tool_jest.ejs +0 -13
  365. package/templates/default/scripts/test.ts_dev-utils@tool_vitest.ejs +0 -8
  366. package/templates/default/scripts/vite.config.ts@lint-empty-out-dir_dev-utils.ejs +0 -1
  367. package/templates/default/scripts/vite.config.ts@lint-out-dir_dev-utils.ejs +0 -1
  368. package/templates/default/scripts/webpack.config.ts@lint-webpack-default_dev-utils.ejs +0 -1
  369. package/templates/default/src/main.ts@import_css-modules.ejs +0 -1
  370. package/templates/default/src/views/sample-preact-view.tsx_dev-utils.ejs +0 -45
  371. package/templates/default/tsconfig.json_dev-utils@compiler-options_preact.ejs +0 -2
  372. package/templates/default/tsconfig.json_dev-utils@compiler-options_react.ejs +0 -1
  373. package/templates/default/tsconfig.json_dev-utils@compiler-options_solid.ejs +0 -2
  374. /package/templates/default/.github/workflows/{ci.yml@steps_biome-linter.ejs → ci.yml_standalone@steps_biome-linter.ejs} +0 -0
  375. /package/templates/default/.github/workflows/{ci.yml@steps_cspell.ejs → ci.yml_standalone@steps_cspell.ejs} +0 -0
  376. /package/templates/default/.github/workflows/{ci.yml@steps_dprint.ejs → ci.yml_standalone@steps_dprint.ejs} +0 -0
  377. /package/templates/default/.github/workflows/{ci.yml@steps_eslint.ejs → ci.yml_standalone@steps_eslint.ejs} +0 -0
  378. /package/templates/default/.github/workflows/{ci.yml@steps_jest.ejs → ci.yml_standalone@steps_jest.ejs} +0 -0
  379. /package/templates/default/.github/workflows/{ci.yml@steps_markdownlint.ejs → ci.yml_standalone@steps_markdownlint.ejs} +0 -0
  380. /package/templates/default/.github/workflows/{ci.yml@steps_prettier.ejs → ci.yml_standalone@steps_prettier.ejs} +0 -0
  381. /package/templates/default/.github/workflows/{ci.yml@steps_vitest.ejs → ci.yml_standalone@steps_vitest.ejs} +0 -0
  382. /package/templates/default/{.gitignore_tailwind.ejs → .gitignore_tailwind-cli.ejs} +0 -0
  383. /package/templates/default/{CONTRIBUTING.md@scripts_dev-utils.ejs → CONTRIBUTING.md@scripts_framework.ejs} +0 -0
  384. /package/templates/default/e2e/{sample.spec.ts_obsidian-test@lint-no-void-disable_dev-utils.ejs → sample.spec.ts_obsidian-test@lint-no-void-disable_framework.ejs} +0 -0
  385. /package/templates/default/e2e/{sample.spec.ts_obsidian-test@lint-no-void-enable_dev-utils.ejs → sample.spec.ts_obsidian-test@lint-no-void-enable_framework.ejs} +0 -0
  386. /package/templates/default/{eslint.config.mts_dev-utils.ejs → eslint.config.mts_framework.ejs} +0 -0
  387. /package/templates/default/{jest.config.ts@ts-jest-tsconfig_solid.ejs → jest.config.ts_standalone@ts-jest-tsconfig_solid.ejs} +0 -0
  388. /package/templates/default/{prettier.config.mjs.ejs → prettier.config.mjs_standalone.ejs} +0 -0
  389. /package/templates/default/scripts/{commitlint-config.ts.ejs → commitlint-config.ts_standalone.ejs} +0 -0
  390. /package/templates/default/scripts/{nano-staged-config.ts.ejs → nano-staged-config.ts_inline-nano-staged.ejs} +0 -0
  391. /package/templates/default/scripts/{rollup.config.ts@import_rollup-json.ejs → rollup.config.ts_framework@import_rollup-json.ejs} +0 -0
  392. /package/templates/default/scripts/{rollup.config.ts@import_scss.ejs → rollup.config.ts_framework@import_scss.ejs} +0 -0
  393. /package/templates/default/scripts/{rollup.config.ts@unwrap_rollup-json.ejs → rollup.config.ts_framework@unwrap_rollup-json.ejs} +0 -0
  394. /package/templates/default/scripts/{rollup.config.ts@unwrap_scss.ejs → rollup.config.ts_framework@unwrap_scss.ejs} +0 -0
  395. /package/templates/default/scripts/{rollup.config.ts@import_rollup-babel.ejs → rollup.config.ts_standalone@import_rollup-babel.ejs} +0 -0
  396. /package/templates/default/scripts/{rollup.config.ts@import_rollup-postcss.ejs → rollup.config.ts_standalone@import_rollup-postcss.ejs} +0 -0
  397. /package/templates/default/scripts/{rollup.config.ts@import_svelte.ejs → rollup.config.ts_standalone@import_svelte.ejs} +0 -0
  398. /package/templates/default/scripts/{rollup.config.ts@import_vue.ejs → rollup.config.ts_standalone@import_vue.ejs} +0 -0
  399. /package/templates/default/scripts/{rollup.config.ts@import_wasm.ejs → rollup.config.ts_standalone@import_wasm.ejs} +0 -0
  400. /package/templates/default/scripts/{rollup.config.ts@post-plugin_preact.ejs → rollup.config.ts_standalone@post-plugin_preact.ejs} +0 -0
  401. /package/templates/default/scripts/{rollup.config.ts@post-plugin_react.ejs → rollup.config.ts_standalone@post-plugin_react.ejs} +0 -0
  402. /package/templates/default/scripts/{rollup.config.ts@post-plugin_rollup-json.ejs → rollup.config.ts_standalone@post-plugin_rollup-json.ejs} +0 -0
  403. /package/templates/default/scripts/{rollup.config.ts@post-plugin_rollup-postcss.ejs → rollup.config.ts_standalone@post-plugin_rollup-postcss.ejs} +0 -0
  404. /package/templates/default/scripts/{rollup.config.ts@post-plugin_scss.ejs → rollup.config.ts_standalone@post-plugin_scss.ejs} +0 -0
  405. /package/templates/default/scripts/{rollup.config.ts@post-plugin_solid.ejs → rollup.config.ts_standalone@post-plugin_solid.ejs} +0 -0
  406. /package/templates/default/scripts/{rollup.config.ts@post-plugin_wasm.ejs → rollup.config.ts_standalone@post-plugin_wasm.ejs} +0 -0
  407. /package/templates/default/scripts/{rollup.config.ts@pre-plugin_svelte.ejs → rollup.config.ts_standalone@pre-plugin_svelte.ejs} +0 -0
  408. /package/templates/default/scripts/{rollup.config.ts@pre-plugin_vue.ejs → rollup.config.ts_standalone@pre-plugin_vue.ejs} +0 -0
  409. /package/templates/default/scripts/{rollup.config.ts@unwrap_rollup-babel.ejs → rollup.config.ts_standalone@unwrap_rollup-babel.ejs} +0 -0
  410. /package/templates/default/scripts/{rollup.config.ts@unwrap_rollup-postcss.ejs → rollup.config.ts_standalone@unwrap_rollup-postcss.ejs} +0 -0
  411. /package/templates/default/scripts/{rollup.config.ts@unwrap_svelte.ejs → rollup.config.ts_standalone@unwrap_svelte.ejs} +0 -0
  412. /package/templates/default/scripts/{rollup.config.ts@unwrap_vue.ejs → rollup.config.ts_standalone@unwrap_vue.ejs} +0 -0
  413. /package/templates/default/scripts/{rollup.config.ts@unwrap_wasm.ejs → rollup.config.ts_standalone@unwrap_wasm.ejs} +0 -0
  414. /package/templates/default/scripts/{test-watch.ts_dev-utils.ejs → test-watch.ts_framework.ejs} +0 -0
  415. /package/templates/default/scripts/{test.ts_dev-utils.ejs → test.ts_framework.ejs} +0 -0
  416. /package/templates/default/scripts/{vite.config.ts@import_preact.ejs → vite.config.ts_standalone@import_preact.ejs} +0 -0
  417. /package/templates/default/scripts/{vite.config.ts@import_react.ejs → vite.config.ts_standalone@import_react.ejs} +0 -0
  418. /package/templates/default/scripts/{vite.config.ts@import_solid.ejs → vite.config.ts_standalone@import_solid.ejs} +0 -0
  419. /package/templates/default/scripts/{vite.config.ts@import_svelte.ejs → vite.config.ts_standalone@import_svelte.ejs} +0 -0
  420. /package/templates/default/scripts/{vite.config.ts@import_vue.ejs → vite.config.ts_standalone@import_vue.ejs} +0 -0
  421. /package/templates/default/scripts/{vite.config.ts@plugin_preact.ejs → vite.config.ts_standalone@plugin_preact.ejs} +0 -0
  422. /package/templates/default/scripts/{vite.config.ts@plugin_react.ejs → vite.config.ts_standalone@plugin_react.ejs} +0 -0
  423. /package/templates/default/scripts/{vite.config.ts@plugin_solid.ejs → vite.config.ts_standalone@plugin_solid.ejs} +0 -0
  424. /package/templates/default/scripts/{vite.config.ts@plugin_svelte.ejs → vite.config.ts_standalone@plugin_svelte.ejs} +0 -0
  425. /package/templates/default/scripts/{vite.config.ts@plugin_vue.ejs → vite.config.ts_standalone@plugin_vue.ejs} +0 -0
  426. /package/templates/default/scripts/{webpack.config.ts@import_svelte.ejs → webpack.config.ts_standalone@import_svelte.ejs} +0 -0
  427. /package/templates/default/scripts/{webpack.config.ts@import_vue.ejs → webpack.config.ts_standalone@import_vue.ejs} +0 -0
  428. /package/templates/default/scripts/{webpack.config.ts@import_webpack-css-extract.ejs → webpack.config.ts_standalone@import_webpack-css-extract.ejs} +0 -0
  429. /package/templates/default/scripts/{webpack.config.ts@plugin_vue.ejs → webpack.config.ts_standalone@plugin_vue.ejs} +0 -0
  430. /package/templates/default/scripts/{webpack.config.ts@plugin_webpack-css-extract.ejs → webpack.config.ts_standalone@plugin_webpack-css-extract.ejs} +0 -0
  431. /package/templates/default/scripts/{webpack.config.ts@rule_css-modules.ejs → webpack.config.ts_standalone@rule_css-modules.ejs} +0 -0
  432. /package/templates/default/scripts/{webpack.config.ts@rule_css.ejs → webpack.config.ts_standalone@rule_css.ejs} +0 -0
  433. /package/templates/default/scripts/{webpack.config.ts@rule_postcss.ejs → webpack.config.ts_standalone@rule_postcss.ejs} +0 -0
  434. /package/templates/default/scripts/{webpack.config.ts@rule_scss.ejs → webpack.config.ts_standalone@rule_scss.ejs} +0 -0
  435. /package/templates/default/scripts/{webpack.config.ts@rule_solid.ejs → webpack.config.ts_standalone@rule_solid.ejs} +0 -0
  436. /package/templates/default/scripts/{webpack.config.ts@rule_svelte.ejs → webpack.config.ts_standalone@rule_svelte.ejs} +0 -0
  437. /package/templates/default/scripts/{webpack.config.ts@rule_tailwind.ejs → webpack.config.ts_standalone@rule_tailwind.ejs} +0 -0
  438. /package/templates/default/scripts/{webpack.config.ts@rule_vue.ejs → webpack.config.ts_standalone@rule_vue.ejs} +0 -0
  439. /package/templates/default/scripts/{webpack.config.ts@rule_wasm.ejs → webpack.config.ts_standalone@rule_wasm.ejs} +0 -0
  440. /package/templates/default/scripts/{webpack.config.ts@ts-loader-compiler-options_vue.ejs → webpack.config.ts_standalone@ts-loader-compiler-options_vue.ejs} +0 -0
  441. /package/templates/default/scripts/{webpack.config.ts@ts-loader-options_vue.ejs → webpack.config.ts_standalone@ts-loader-options_vue.ejs} +0 -0
  442. /package/templates/default/src/{plugin-settings-component.test.ts_enhanced@test-imports_vitest.ejs → plugin-settings-component.test.ts_all-in-one@test-imports_vitest.ejs} +0 -0
  443. /package/templates/default/src/{plugin-settings.ts_enhanced.ejs → plugin-settings.ts_all-in-one.ejs} +0 -0
  444. /package/templates/default/src/{plugin.ts_enhanced@import2_codemirror.ejs → plugin.ts_all-in-one@import2_codemirror.ejs} +0 -0
  445. /package/templates/default/src/{plugin.ts_enhanced@import2_i18next.ejs → plugin.ts_all-in-one@import2_i18next.ejs} +0 -0
  446. /package/templates/default/src/{plugin.ts_enhanced@import2_lit.ejs → plugin.ts_all-in-one@import2_lit.ejs} +0 -0
  447. /package/templates/default/src/{plugin.ts_enhanced@import2_preact.ejs → plugin.ts_all-in-one@import2_preact.ejs} +0 -0
  448. /package/templates/default/src/{plugin.ts_enhanced@import2_react.ejs → plugin.ts_all-in-one@import2_react.ejs} +0 -0
  449. /package/templates/default/src/{plugin.ts_enhanced@import2_solid.ejs → plugin.ts_all-in-one@import2_solid.ejs} +0 -0
  450. /package/templates/default/src/{plugin.ts_enhanced@import2_svelte.ejs → plugin.ts_all-in-one@import2_svelte.ejs} +0 -0
  451. /package/templates/default/src/{plugin.ts_enhanced@import2_typesafe-i18n.ejs → plugin.ts_all-in-one@import2_typesafe-i18n.ejs} +0 -0
  452. /package/templates/default/src/{plugin.ts_enhanced@import2_vue.ejs → plugin.ts_all-in-one@import2_vue.ejs} +0 -0
  453. /package/templates/default/src/{plugin.ts_enhanced@import2_wasm.ejs → plugin.ts_all-in-one@import2_wasm.ejs} +0 -0
  454. /package/templates/default/src/{plugin.ts_enhanced@method_ui-view.ejs → plugin.ts_all-in-one@method_ui-view.ejs} +0 -0
  455. /package/templates/default/src/{plugin.ts_enhanced@onload_codemirror.ejs → plugin.ts_all-in-one@onload_codemirror.ejs} +0 -0
  456. /package/templates/default/src/{plugin.ts_enhanced@onload_i18next.ejs → plugin.ts_all-in-one@onload_i18next.ejs} +0 -0
  457. /package/templates/default/src/{plugin.ts_enhanced@onload_lit.ejs → plugin.ts_all-in-one@onload_lit.ejs} +0 -0
  458. /package/templates/default/src/{plugin.ts_enhanced@onload_preact.ejs → plugin.ts_all-in-one@onload_preact.ejs} +0 -0
  459. /package/templates/default/src/{plugin.ts_enhanced@onload_react.ejs → plugin.ts_all-in-one@onload_react.ejs} +0 -0
  460. /package/templates/default/src/{plugin.ts_enhanced@onload_solid.ejs → plugin.ts_all-in-one@onload_solid.ejs} +0 -0
  461. /package/templates/default/src/{plugin.ts_enhanced@onload_svelte.ejs → plugin.ts_all-in-one@onload_svelte.ejs} +0 -0
  462. /package/templates/default/src/{plugin.ts_enhanced@onload_typesafe-i18n.ejs → plugin.ts_all-in-one@onload_typesafe-i18n.ejs} +0 -0
  463. /package/templates/default/src/{plugin.ts_enhanced@onload_vue.ejs → plugin.ts_all-in-one@onload_vue.ejs} +0 -0
  464. /package/templates/default/src/{plugin.ts_enhanced@onload_wasm.ejs → plugin.ts_all-in-one@onload_wasm.ejs} +0 -0
  465. /package/templates/default/src/preact-components/{sample-preact-component.tsx_dev-utils.ejs → sample-preact-component.tsx_framework.ejs} +0 -0
  466. /package/templates/default/src/solid-components/{sample-solid-component.tsx_dev-utils.ejs → sample-solid-component.tsx_framework.ejs} +0 -0
  467. /package/templates/default/src/styles/{main.css_dev-utils@content_tailwind.ejs → main.css_framework@content_tailwind.ejs} +0 -0
  468. /package/templates/default/src/views/{sample-lit-view.ts@lint-register-element_dev-utils.ejs → sample-lit-view.ts@lint-register-element_framework.ejs} +0 -0
  469. /package/templates/default/src/views/{sample-preact-view.tsx_standalone.ejs → sample-preact-view.tsx.ejs} +0 -0
  470. /package/templates/default/src/views/{sample-solid-view.tsx_dev-utils.ejs → sample-solid-view.tsx_framework.ejs} +0 -0
  471. /package/templates/default/src/wasm/{answer.ts_esbuild.ejs → answer.ts_wasm-esbuild.ejs} +0 -0
  472. /package/templates/default/src/wasm/{answer.ts_parcel.ejs → answer.ts_wasm-parcel.ejs} +0 -0
  473. /package/templates/default/src/wasm/{answer.ts_rollup.ejs → answer.ts_wasm-rollup.ejs} +0 -0
  474. /package/templates/default/src/wasm/{answer.ts_vite.ejs → answer.ts_wasm-vite.ejs} +0 -0
  475. /package/templates/default/src/wasm/{answer.ts_webpack.ejs → answer.ts_wasm-webpack.ejs} +0 -0
  476. /package/templates/default/src/{wasm.d.ts_esbuild.ejs → wasm.d.ts_wasm-esbuild.ejs} +0 -0
  477. /package/templates/default/src/{wasm.d.ts_parcel.ejs → wasm.d.ts_wasm-parcel.ejs} +0 -0
  478. /package/templates/default/src/{wasm.d.ts_rollup.ejs → wasm.d.ts_wasm-rollup.ejs} +0 -0
  479. /package/templates/default/src/{wasm.d.ts_vite.ejs → wasm.d.ts_wasm-vite.ejs} +0 -0
  480. /package/templates/default/src/{wasm.d.ts_webpack.ejs → wasm.d.ts_wasm-webpack.ejs} +0 -0
  481. /package/templates/default/{tsconfig.json_dev-utils@compiler-options_i18next.ejs → tsconfig.json_framework@compiler-options_i18next.ejs} +0 -0
  482. /package/templates/default/{tsconfig.json_dev-utils@compiler-options_lit.ejs → tsconfig.json_framework@compiler-options_lit.ejs} +0 -0
  483. /package/templates/default/{tsconfig.json_dev-utils@include_has-e2e.ejs → tsconfig.json_framework@include_has-e2e.ejs} +0 -0
  484. /package/templates/default/{tsconfig.json_dev-utils@include_svelte.ejs → tsconfig.json_framework@include_svelte.ejs} +0 -0
  485. /package/templates/default/{tsconfig.json_dev-utils@include_vue.ejs → tsconfig.json_framework@include_vue.ejs} +0 -0
  486. /package/templates/default/{tsconfig.json_dev-utils@types_jest.ejs → tsconfig.json_framework@types_jest.ejs} +0 -0
  487. /package/templates/default/{tsconfig.json_dev-utils@types_svelte.ejs → tsconfig.json_framework@types_svelte.ejs} +0 -0
  488. /package/templates/default/{tsconfig.json_dev-utils@types_wdio-obsidian.ejs → tsconfig.json_framework@types_wdio-obsidian.ejs} +0 -0
  489. /package/templates/default/{tsconfig.json_dev-utils@types_with-unofficial.ejs → tsconfig.json_framework@types_with-unofficial.ejs} +0 -0
  490. /package/templates/default/{vitest.config.ts_dev-utils.ejs → vitest.config.ts_framework.ejs} +0 -0
@@ -0,0 +1,8 @@
1
+ import type { Plugin } from 'obsidian';
2
+
3
+ /**
4
+ * Registers one command per code snippet of the Obsidian developer docs.
5
+ *
6
+ * @param plugin - The plugin to register the commands on.
7
+ */
8
+ export function registerDocsShowcase(plugin: Plugin): void;
@@ -0,0 +1,4 @@
1
+ // The one module the plugin's own code imports from this folder. It is JavaScript, with `entry.d.ts` beside it,
2
+ // so that the project's `tsconfig.json` sees only that declaration: the snippets are upstream's code and are
3
+ // type-checked by `tsconfig.json` in this folder instead, under the official sample plugin's compiler options.
4
+ export { registerDocsShowcase } from './index.ts';
@@ -0,0 +1,449 @@
1
+ // The host every docs snippet runs in. Each snippet module next to this file holds one code block from
2
+ // https://docs.obsidian.md (obsidianmd/obsidian-developer-docs) verbatim, plus a `run(context)` function that
3
+ // create-obsidian-plugin generated around it. `run` is what the snippet's command calls, and `context` is this
4
+ // file's `DocsContext`: everything a snippet needs that the docs leave to the reader, such as a plugin to
5
+ // register things on, a note to work with, an editor, or an element to draw into.
6
+
7
+ import type { Extension } from '@codemirror/state';
8
+ import type { EditorView } from '@codemirror/view';
9
+ import type {
10
+ App,
11
+ Editor,
12
+ PluginManifest,
13
+ SettingDefinitionItem,
14
+ View,
15
+ WorkspaceLeaf
16
+ } from 'obsidian';
17
+
18
+ import {
19
+ Component,
20
+ FuzzySuggestModal,
21
+ MarkdownView,
22
+ Modal,
23
+ Notice,
24
+ Plugin,
25
+ PluginSettingTab,
26
+ TFile
27
+ } from 'obsidian';
28
+
29
+ /** One docs snippet, as `index.ts` registers it. */
30
+ export interface DocsEntry {
31
+ /** Unique within the showcase, and the suffix of the command id. */
32
+ id: string;
33
+ /** Loads the snippet's module. The module is evaluated only when its command first runs. */
34
+ load(): Promise<{ run(context: DocsContext): Promise<void> }>;
35
+ /** The command name: the docs page, the heading the snippet sits under, and its position. */
36
+ name: string;
37
+ /** The docs page the snippet comes from. */
38
+ source: string;
39
+ }
40
+
41
+ /** The plugin the docs' snippets assume: `ExamplePlugin`, with a `settings` object and `saveSettings()`. */
42
+ export interface DocsPlugin extends Plugin {
43
+ // The docs never declare one settings shape, and each snippet reads its own keys.
44
+ settings: Record<string, any>;
45
+ saveSettings(): Promise<void>;
46
+ }
47
+
48
+ /**
49
+ * What `this` is when a snippet's statements use it. Most snippets are written as the body of a plugin method
50
+ * (`this.app`, `this.addCommand`), and the settings ones as the body of a settings tab method (`this.plugin`,
51
+ * `this.update()`), so the value is a plugin that answers both.
52
+ */
53
+ export interface DocsThis extends DocsPlugin {
54
+ plugin: DocsPlugin;
55
+ update(): void;
56
+ }
57
+
58
+ /** What a snippet's host supplies. See the comment at the top of this file. */
59
+ export interface DocsContext {
60
+ readonly app: App;
61
+ /** The showcase plugin itself. */
62
+ readonly plugin: Plugin;
63
+ addChildComponent(component: Component): void;
64
+ getContainerEl(): HTMLElement;
65
+ getEditor(): Promise<Editor>;
66
+ getEditorView(): Promise<EditorView>;
67
+ getFile(): Promise<TFile>;
68
+ getLeaf(): WorkspaceLeaf;
69
+ getMarkdownView(): Promise<MarkdownView>;
70
+ openModal(modal: Modal): void;
71
+ openView(createView: (leaf: WorkspaceLeaf) => View): Promise<void>;
72
+ report(message: string): void;
73
+ showResult(value: unknown, label?: string): Promise<void>;
74
+ showSettingDefinitions(items: SettingDefinitionItem[]): Promise<void>;
75
+ showSettingTab(createTab: (app: App, plugin: DocsPlugin) => PluginSettingTab): Promise<void>;
76
+ thisValue(): DocsThis;
77
+ toggleChildPlugin(pluginClass: new (...args: any[]) => Plugin): Promise<void>;
78
+ toggleCss(css: string): Promise<void>;
79
+ toggleEditorExtension(extension: Extension): void;
80
+ }
81
+
82
+ const SCRATCH_FOLDER = 'Docs showcase';
83
+ const SCRATCH_NOTE = `${SCRATCH_FOLDER}/Scratch note.md`;
84
+ // Content the snippets have something to act on: a `:)` for the emoji ones, list items for the decorations.
85
+ const SCRATCH_NOTE_CONTENT = '# Scratch note\n\nThe docs showcase runs snippets against this note. Hello :) world.\n\n- one\n- two\n- three\n';
86
+ const RESULT_PREVIEW_LENGTH = 300;
87
+
88
+ /**
89
+ * Registers one command per docs snippet on the showcase plugin.
90
+ *
91
+ * @param plugin - The showcase plugin.
92
+ * @param entries - The snippets, as `index.ts` lists them.
93
+ */
94
+ export function registerDocsEntries(plugin: Plugin, entries: readonly DocsEntry[]): void {
95
+ const editorExtensions: Extension[] = [];
96
+ plugin.registerEditorExtension(editorExtensions);
97
+ const children = new Map<string, Component>();
98
+
99
+ for (const entry of entries) {
100
+ plugin.addCommand({
101
+ callback: async () => {
102
+ const context = new HostContext(plugin, entry, editorExtensions, children);
103
+ try {
104
+ const module = await entry.load();
105
+ await module.run(context);
106
+ } catch (error) {
107
+ console.error(`Docs snippet "${entry.name}" (${entry.source}) threw`, error);
108
+ showDocsNotice(entry, `${entry.name} threw: ${error instanceof Error ? error.message : String(error)}. The developer console has the details.`);
109
+ // Rethrown so that whatever runs the command can tell it failed: the integration suite awaits it.
110
+ throw error;
111
+ }
112
+ },
113
+ id: `docs-${entry.id}`,
114
+ name: `Docs: ${entry.name}`
115
+ });
116
+ }
117
+
118
+ // The one way to reach a snippet's page without running it, which for many of them changes the vault.
119
+ plugin.addCommand({
120
+ callback: () => {
121
+ new DocsPageSuggestModal(plugin.app, entries).open();
122
+ },
123
+ id: 'open-docs-page',
124
+ name: 'Docs showcase: Open the docs page of a snippet'
125
+ });
126
+ }
127
+
128
+ /**
129
+ * A link to the docs page a snippet comes from, at the heading it sits under. Obsidian opens it in the browser.
130
+ *
131
+ * @param entry - The snippet.
132
+ * @returns The link.
133
+ */
134
+ function createDocsLink(entry: DocsEntry): HTMLAnchorElement {
135
+ return createEl('a', {
136
+ attr: { target: '_blank' },
137
+ cls: 'external-link',
138
+ href: entry.source,
139
+ text: 'Open docs page'
140
+ });
141
+ }
142
+
143
+ /**
144
+ * Shows a Notice about a snippet, with the link to its docs page under the message. Every Notice the showcase shows
145
+ * goes through here, so that whatever a command shows leads back to the page its code came from.
146
+ *
147
+ * @param entry - The snippet.
148
+ * @param message - The message.
149
+ */
150
+ function showDocsNotice(entry: DocsEntry, message: string): void {
151
+ new Notice(createFragment((fragment) => {
152
+ fragment.appendText(message);
153
+ fragment.createEl('br');
154
+ fragment.append(createDocsLink(entry));
155
+ }));
156
+ }
157
+
158
+ /**
159
+ * A plugin with no files of its own, which the snippets load and register things on: each snippet's commands,
160
+ * ribbon icons, events and settings tab land on one of these, and running the snippet's command again unloads it
161
+ * and everything it registered.
162
+ */
163
+ class DocsHostPlugin extends Plugin implements DocsThis {
164
+ public plugin: DocsPlugin = this;
165
+ public settings: Record<string, any> = {};
166
+ private data: unknown = null;
167
+
168
+ public constructor(app: App, manifest: PluginManifest, private readonly entry: DocsEntry) {
169
+ super(app, manifest);
170
+ }
171
+
172
+ public override async loadData(): Promise<any> {
173
+ return this.data;
174
+ }
175
+
176
+ public override async saveData(data: unknown): Promise<void> {
177
+ this.data = data;
178
+ }
179
+
180
+ public async saveSettings(): Promise<void> {
181
+ await this.saveData(this.settings);
182
+ }
183
+
184
+ public update(): void {
185
+ showDocsNotice(this.entry, `${this.entry.name}: the snippet asked its settings tab to update.`);
186
+ }
187
+ }
188
+
189
+ class HostContext implements DocsContext {
190
+ public readonly app: App;
191
+ private containerEl: HTMLElement | null = null;
192
+
193
+ public constructor(
194
+ public readonly plugin: Plugin,
195
+ private readonly entry: DocsEntry,
196
+ private readonly editorExtensions: Extension[],
197
+ private readonly children: Map<string, Component>
198
+ ) {
199
+ this.app = plugin.app;
200
+ }
201
+
202
+ public addChildComponent(component: Component): void {
203
+ this.replaceChild(new DocsHostPlugin(this.app, this.childManifest(), this.entry)).addChild(component);
204
+ showDocsNotice(this.entry, `${this.entry.name}: loaded its component. Run the command again to unload it.`);
205
+ }
206
+
207
+ public getContainerEl(): HTMLElement {
208
+ if (!this.containerEl) {
209
+ const modal = new Modal(this.app);
210
+ modal.setTitle(this.entry.name);
211
+ modal.titleEl.createDiv({ cls: 'setting-item-description' }).append(createDocsLink(this.entry));
212
+ modal.open();
213
+ this.containerEl = modal.contentEl;
214
+ }
215
+ return this.containerEl;
216
+ }
217
+
218
+ public async getEditor(): Promise<Editor> {
219
+ return (await this.getMarkdownView()).editor;
220
+ }
221
+
222
+ public async getEditorView(): Promise<EditorView> {
223
+ // The docs' own way to reach CodeMirror: https://docs.obsidian.md/Plugins/Editor/Communicating+with+editor+extensions
224
+ return ((await this.getMarkdownView()).editor as unknown as { cm: EditorView }).cm;
225
+ }
226
+
227
+ public async getFile(): Promise<TFile> {
228
+ const existing = this.app.vault.getFileByPath(SCRATCH_NOTE);
229
+ if (existing) {
230
+ return existing;
231
+ }
232
+ if (!this.app.vault.getFolderByPath(SCRATCH_FOLDER)) {
233
+ await this.app.vault.createFolder(SCRATCH_FOLDER);
234
+ }
235
+ return await this.app.vault.create(SCRATCH_NOTE, SCRATCH_NOTE_CONTENT);
236
+ }
237
+
238
+ public getLeaf(): WorkspaceLeaf {
239
+ return this.app.workspace.getMostRecentLeaf() ?? this.app.workspace.getLeaf(false);
240
+ }
241
+
242
+ public async getMarkdownView(): Promise<MarkdownView> {
243
+ const file = await this.getFile();
244
+ let leaf = this.app.workspace.getLeavesOfType('markdown').find((candidate) => candidate.view instanceof MarkdownView && candidate.view.file === file);
245
+ if (!leaf) {
246
+ leaf = this.app.workspace.getLeaf('tab');
247
+ await leaf.openFile(file, { state: { mode: 'source' } });
248
+ }
249
+ await this.app.workspace.revealLeaf(leaf);
250
+ if (!(leaf.view instanceof MarkdownView)) {
251
+ throw new Error(`${SCRATCH_NOTE} did not open in a Markdown view.`);
252
+ }
253
+ return leaf.view;
254
+ }
255
+
256
+ public openModal(modal: Modal): void {
257
+ modal.open();
258
+ // The modal is the snippet's own, so the link goes in a Notice rather than into it.
259
+ showDocsNotice(this.entry, `${this.entry.name}: opened the snippet's modal.`);
260
+ }
261
+
262
+ public async openView(createView: (leaf: WorkspaceLeaf) => View): Promise<void> {
263
+ const leaf = this.app.workspace.getLeaf('tab');
264
+ await leaf.open(createView(leaf));
265
+ // The view is the snippet's own, so the link goes in a Notice rather than into it.
266
+ showDocsNotice(this.entry, `${this.entry.name}: opened the snippet's view.`);
267
+ }
268
+
269
+ public report(message: string): void {
270
+ console.log(`${this.entry.name}: ${message}`);
271
+ showDocsNotice(this.entry, `${this.entry.name}: ${message}`);
272
+ }
273
+
274
+ public async showResult(value: unknown, label?: string): Promise<void> {
275
+ const resolved = await value;
276
+ const prefix = label ? `${this.entry.name}: ${label}` : this.entry.name;
277
+ if (resolved === undefined) {
278
+ showDocsNotice(this.entry, `${prefix} ran. Anything it logged is in the developer console.`);
279
+ return;
280
+ }
281
+ console.log(prefix, resolved);
282
+ showDocsNotice(this.entry, `${prefix} returned ${preview(resolved)}`);
283
+ }
284
+
285
+ public async showSettingDefinitions(items: SettingDefinitionItem[]): Promise<void> {
286
+ await this.showSettingTab((app, plugin) => new DefinitionsSettingTab(app, plugin, items));
287
+ }
288
+
289
+ public async showSettingTab(createTab: (app: App, plugin: DocsPlugin) => PluginSettingTab): Promise<void> {
290
+ const child = this.replaceChild(new DocsHostPlugin(this.app, this.childManifest(), this.entry));
291
+ child.addSettingTab(withDocsLink(createTab(this.app, child), this.entry));
292
+ showDocsNotice(this.entry, `${this.entry.name}: added a settings tab named "${child.manifest.name}". Open Settings to see it.`);
293
+ }
294
+
295
+ public thisValue(): DocsThis {
296
+ return this.replaceChild(new DocsHostPlugin(this.app, this.childManifest(), this.entry));
297
+ }
298
+
299
+ public async toggleChildPlugin(pluginClass: new (...args: any[]) => Plugin): Promise<void> {
300
+ if (this.children.has(this.entry.id)) {
301
+ this.removeChild();
302
+ showDocsNotice(this.entry, `${this.entry.name}: unloaded the example plugin and everything it registered.`);
303
+ return;
304
+ }
305
+
306
+ // In-memory data, so an example that saves its settings does not overwrite the showcase's own.
307
+ const HostedPlugin = class extends pluginClass {
308
+ private hostedData: unknown = null;
309
+
310
+ public override async loadData(): Promise<any> {
311
+ return this.hostedData;
312
+ }
313
+
314
+ public override async saveData(data: unknown): Promise<void> {
315
+ this.hostedData = data;
316
+ }
317
+ };
318
+ this.replaceChild(new HostedPlugin(this.app, this.childManifest()));
319
+ showDocsNotice(this.entry, `${this.entry.name}: loaded the example plugin. What it registers is live until you run this command again.`);
320
+ }
321
+
322
+ public async toggleCss(css: string): Promise<void> {
323
+ const id = `docs-showcase-${this.entry.id}`;
324
+ const existing = activeDocument.getElementById(id);
325
+ if (existing) {
326
+ existing.remove();
327
+ showDocsNotice(this.entry, `${this.entry.name}: removed the stylesheet.`);
328
+ return;
329
+ }
330
+ const style = activeDocument.head.createEl('style', { attr: { id }, text: css });
331
+ this.plugin.register(() => style.remove());
332
+ showDocsNotice(this.entry, `${this.entry.name}: applied the stylesheet. Run the command again to remove it.`);
333
+ }
334
+
335
+ public toggleEditorExtension(extension: Extension): void {
336
+ const index = this.editorExtensions.indexOf(extension);
337
+ if (index === -1) {
338
+ this.editorExtensions.push(extension);
339
+ showDocsNotice(this.entry, `${this.entry.name}: enabled the editor extension. Run the command again to disable it.`);
340
+ } else {
341
+ this.editorExtensions.splice(index, 1);
342
+ showDocsNotice(this.entry, `${this.entry.name}: disabled the editor extension.`);
343
+ }
344
+ this.app.workspace.updateOptions();
345
+ }
346
+
347
+ private childManifest(): PluginManifest {
348
+ return {
349
+ ...this.plugin.manifest,
350
+ id: `${this.plugin.manifest.id}-docs-${this.entry.id}`,
351
+ name: `Docs: ${this.entry.name}`
352
+ };
353
+ }
354
+
355
+ private removeChild(): void {
356
+ const previous = this.children.get(this.entry.id);
357
+ if (previous) {
358
+ this.plugin.removeChild(previous);
359
+ this.children.delete(this.entry.id);
360
+ }
361
+ }
362
+
363
+ private replaceChild<T extends Component>(child: T): T {
364
+ this.removeChild();
365
+ this.children.set(this.entry.id, child);
366
+ return this.plugin.addChild(child);
367
+ }
368
+ }
369
+
370
+ class DefinitionsSettingTab extends PluginSettingTab {
371
+ public constructor(app: App, plugin: Plugin, private readonly items: SettingDefinitionItem[]) {
372
+ super(app, plugin);
373
+ }
374
+
375
+ public override getSettingDefinitions(): SettingDefinitionItem[] {
376
+ return this.items;
377
+ }
378
+ }
379
+
380
+ /** Lists every snippet and opens the docs page of the chosen one. */
381
+ class DocsPageSuggestModal extends FuzzySuggestModal<DocsEntry> {
382
+ public constructor(app: App, private readonly entries: readonly DocsEntry[]) {
383
+ super(app);
384
+ this.setPlaceholder('Pick a snippet to open its docs page');
385
+ }
386
+
387
+ public override getItems(): DocsEntry[] {
388
+ return [...this.entries];
389
+ }
390
+
391
+ public override getItemText(entry: DocsEntry): string {
392
+ return entry.name;
393
+ }
394
+
395
+ public override onChooseItem(entry: DocsEntry): void {
396
+ window.open(entry.source);
397
+ }
398
+ }
399
+
400
+ /**
401
+ * Puts a first row linking the snippet's docs page at the top of its settings tab. The tab is the snippet's own, so
402
+ * this wraps its two ways of rendering rather than subclassing it: Obsidian renders the definitions when
403
+ * `getSettingDefinitions()` returns any, and calls `display()` only when it returns none.
404
+ *
405
+ * @param tab - The tab the snippet created.
406
+ * @param entry - The snippet.
407
+ * @returns The same tab.
408
+ */
409
+ function withDocsLink(tab: PluginSettingTab, entry: DocsEntry): PluginSettingTab {
410
+ const getSettingDefinitions = tab.getSettingDefinitions.bind(tab);
411
+ tab.getSettingDefinitions = (): SettingDefinitionItem[] => {
412
+ const items = getSettingDefinitions();
413
+ if (items.length === 0) {
414
+ return items;
415
+ }
416
+ return [
417
+ {
418
+ name: 'Docs page',
419
+ render: (setting): void => {
420
+ setting.setDesc(createFragment((fragment) => fragment.append(createDocsLink(entry))));
421
+ },
422
+ searchable: false
423
+ },
424
+ ...items
425
+ ];
426
+ };
427
+ const display = tab.display.bind(tab);
428
+ tab.display = (): void => {
429
+ display();
430
+ tab.containerEl.prepend(createDiv({ cls: 'setting-item-description' }, (div) => div.append(createDocsLink(entry))));
431
+ };
432
+ return tab;
433
+ }
434
+
435
+ function preview(value: unknown): string {
436
+ let text: string;
437
+ if (typeof value === 'string') {
438
+ text = JSON.stringify(value);
439
+ } else if (value instanceof TFile) {
440
+ text = value.path;
441
+ } else {
442
+ try {
443
+ text = JSON.stringify(value) ?? String(value);
444
+ } catch {
445
+ text = String(value);
446
+ }
447
+ }
448
+ return text.length > RESULT_PREVIEW_LENGTH ? `${text.slice(0, RESULT_PREVIEW_LENGTH)}...` : text;
449
+ }