@mnaoumov/create-obsidian-plugin 1.1.0 → 1.2.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 (427) hide show
  1. package/README.md +8 -1
  2. package/dist/main.js +897 -801
  3. package/package.json +4 -2
  4. package/src/main.ts +15 -14
  5. package/templates/default/{CONTRIBUTING.md.ejs → (contributing)/CONTRIBUTING.md.ejs} +1 -0
  6. package/templates/default/(contributing)/CONTRIBUTING.md@filing_bug-and-feature.ejs +6 -0
  7. package/templates/default/{cspell.json.ejs → (lint)/cspell.json.ejs} +1 -0
  8. package/templates/default/(readme)/README.md.ejs +38 -0
  9. package/templates/default/(readme)/README.md@preset_framework.ejs +6 -0
  10. package/templates/default/(readme)/README.md@support_bug-and-feature.ejs +11 -0
  11. package/templates/default/(readme)/README.md@support_bug-and-feature@bug-report_has-bug-report-command.ejs +2 -0
  12. package/templates/default/.github/ISSUE_TEMPLATE/bug_report.yml.ejs +62 -24
  13. package/templates/default/scripts/{markdownlint-cli2-config.ts_standalone.ejs → (lint)/(markdown)/markdownlint-cli2-config.ts_standalone.ejs} +3 -3
  14. package/templates/default/scripts/{vitest-config.ts@post-config_solid.ejs → (test)/vitest-config.ts@post-config_solid.ejs} +6 -8
  15. package/templates/default/scripts/version.ts_standalone.ejs +4 -4
  16. package/templates/default/src/{plugin.ts_all-in-one.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one.ejs} +2 -0
  17. package/templates/default/src/(plugin)/(all-in-one)/plugin.ts_all-in-one@bug-report-handler_has-bug-report-command.ejs +7 -0
  18. package/templates/default/src/(plugin)/(all-in-one)/plugin.ts_all-in-one@bug-report-import_has-bug-report-command.ejs +1 -0
  19. package/templates/default/src/{plugin.ts_demo.ejs → (plugin)/(demo)/plugin.ts_demo.ejs} +2 -0
  20. package/templates/default/src/(plugin)/(demo)/plugin.ts_demo@bug-report-handler_has-bug-report-command.ejs +7 -0
  21. package/templates/default/src/(plugin)/(demo)/plugin.ts_demo@bug-report-import_has-bug-report-command.ejs +1 -0
  22. package/templates/default/src/{plugin-settings-component.ts_demo.ejs → (settings)/plugin-settings-component.ts_demo.ejs} +2 -0
  23. package/templates/default/src/{plugin-settings-tab.ts_demo.ejs → (settings)/plugin-settings-tab.ts_demo.ejs} +2 -2
  24. package/templates/default/src/lit-elements/sample-lit-element.ts.ejs +1 -1
  25. package/templates/default/src/modals/sample-suggest-modal.ts.ejs +2 -2
  26. package/templates/default/src/plugin.test.ts_jest.ejs +3 -0
  27. package/templates/default/src/plugin.test.ts_jest@bug-report-import_has-bug-report-command.ejs +4 -0
  28. package/templates/default/src/plugin.test.ts_jest@bug-report-test_has-bug-report-command.ejs +16 -0
  29. package/templates/default/src/plugin.test.ts_jest@bug-report-type-import_has-bug-report-command.ejs +2 -0
  30. package/templates/default/src/plugin.test.ts_vitest.ejs +3 -0
  31. package/templates/default/src/plugin.test.ts_vitest@bug-report-import_has-bug-report-command.ejs +4 -0
  32. package/templates/default/src/plugin.test.ts_vitest@bug-report-test_has-bug-report-command.ejs +16 -0
  33. package/templates/default/src/plugin.test.ts_vitest@bug-report-type-import_has-bug-report-command.ejs +2 -0
  34. package/templates/default/src/preact-components/sample-preact-component.tsx_framework.ejs +1 -1
  35. package/templates/default/src/preact-components/sample-preact-component.tsx_standalone.ejs +1 -1
  36. package/templates/default/src/react-components/sample-react-component.tsx_framework.ejs +1 -1
  37. package/templates/default/src/react-components/sample-react-component.tsx_standalone.ejs +1 -1
  38. package/templates/default/src/solid-components/sample-solid-component.tsx_framework.ejs +1 -1
  39. package/templates/default/src/solid-components/sample-solid-component.tsx_standalone.ejs +1 -1
  40. package/templates/default/src/styles/main.css_framework.ejs +1 -1
  41. package/templates/default/src/styles/main.scss_framework.ejs +1 -1
  42. package/templates/default/src/svelte-components/sample-svelte-component.d.ts.ejs +2 -2
  43. package/templates/default/src/views/sample-view.ts.ejs +2 -1
  44. package/templates/docs-showcase/files/src/docs/host.ts +2 -2
  45. package/templates/docs-showcase/host/host.ts +2 -2
  46. package/templates/default/README.md.ejs +0 -28
  47. package/templates/default/README.md@preset_framework.ejs +0 -12
  48. package/templates/default/demo-vault/Materials/01 Sample commands/Scratch note.md.ejs +0 -5
  49. /package/templates/default/{.parcelrc.ejs → (bundlers)/.parcelrc.ejs} +0 -0
  50. /package/templates/default/{.parcelrc@transformers_svelte.ejs → (bundlers)/.parcelrc@transformers_svelte.ejs} +0 -0
  51. /package/templates/default/{babel.config.json.ejs → (bundlers)/babel.config.json.ejs} +0 -0
  52. /package/templates/default/{babel.config.mjs.ejs → (bundlers)/babel.config.mjs.ejs} +0 -0
  53. /package/templates/default/{parcel-namer-obsidian.cjs.ejs → (bundlers)/parcel-namer-obsidian.cjs.ejs} +0 -0
  54. /package/templates/default/{parcel-resolver-obsidian.cjs.ejs → (bundlers)/parcel-resolver-obsidian.cjs.ejs} +0 -0
  55. /package/templates/default/{parcel-transformer-inline-imports.cjs.ejs → (bundlers)/parcel-transformer-inline-imports.cjs.ejs} +0 -0
  56. /package/templates/default/{parcel-transformer-svelte.cjs.ejs → (bundlers)/parcel-transformer-svelte.cjs.ejs} +0 -0
  57. /package/templates/default/{postcss.config.cjs.ejs → (bundlers)/postcss.config.cjs.ejs} +0 -0
  58. /package/templates/default/{rollup.config.mjs.ejs → (bundlers)/rollup.config.mjs.ejs} +0 -0
  59. /package/templates/default/{vite.config.ts.ejs → (bundlers)/vite.config.ts.ejs} +0 -0
  60. /package/templates/default/{webpack.config.ts.ejs → (bundlers)/webpack.config.ts.ejs} +0 -0
  61. /package/templates/default/{CONTRIBUTING.md@demo-vault_framework.ejs → (contributing)/CONTRIBUTING.md@demo-vault_framework.ejs} +0 -0
  62. /package/templates/default/{CONTRIBUTING.md@scripts_biome-formatter.ejs → (contributing)/CONTRIBUTING.md@scripts_biome-formatter.ejs} +0 -0
  63. /package/templates/default/{CONTRIBUTING.md@scripts_biome-linter.ejs → (contributing)/CONTRIBUTING.md@scripts_biome-linter.ejs} +0 -0
  64. /package/templates/default/{CONTRIBUTING.md@scripts_conventional-commits.ejs → (contributing)/CONTRIBUTING.md@scripts_conventional-commits.ejs} +0 -0
  65. /package/templates/default/{CONTRIBUTING.md@scripts_cspell.ejs → (contributing)/CONTRIBUTING.md@scripts_cspell.ejs} +0 -0
  66. /package/templates/default/{CONTRIBUTING.md@scripts_dprint.ejs → (contributing)/CONTRIBUTING.md@scripts_dprint.ejs} +0 -0
  67. /package/templates/default/{CONTRIBUTING.md@scripts_eslint.ejs → (contributing)/CONTRIBUTING.md@scripts_eslint.ejs} +0 -0
  68. /package/templates/default/{CONTRIBUTING.md@scripts_framework.ejs → (contributing)/CONTRIBUTING.md@scripts_framework.ejs} +0 -0
  69. /package/templates/default/{CONTRIBUTING.md@scripts_jest.ejs → (contributing)/CONTRIBUTING.md@scripts_jest.ejs} +0 -0
  70. /package/templates/default/{CONTRIBUTING.md@scripts_markdownlint.ejs → (contributing)/CONTRIBUTING.md@scripts_markdownlint.ejs} +0 -0
  71. /package/templates/default/{CONTRIBUTING.md@scripts_prettier.ejs → (contributing)/CONTRIBUTING.md@scripts_prettier.ejs} +0 -0
  72. /package/templates/default/{CONTRIBUTING.md@scripts_vitest.ejs → (contributing)/CONTRIBUTING.md@scripts_vitest.ejs} +0 -0
  73. /package/templates/default/{.prettierignore.ejs → (format)/.prettierignore.ejs} +0 -0
  74. /package/templates/default/{.prettierignore@ignores_docs-showcase.ejs → (format)/.prettierignore@ignores_docs-showcase.ejs} +0 -0
  75. /package/templates/default/{biome.jsonc_framework.ejs → (format)/biome.jsonc_framework.ejs} +0 -0
  76. /package/templates/default/{biome.jsonc_framework@excludes_docs-showcase.ejs → (format)/biome.jsonc_framework@excludes_docs-showcase.ejs} +0 -0
  77. /package/templates/default/{biome.jsonc_standalone.ejs → (format)/biome.jsonc_standalone.ejs} +0 -0
  78. /package/templates/default/{dprint.json_framework.ejs → (format)/dprint.json_framework.ejs} +0 -0
  79. /package/templates/default/{dprint.json_framework@excludes_docs-showcase.ejs → (format)/dprint.json_framework@excludes_docs-showcase.ejs} +0 -0
  80. /package/templates/default/{dprint.json_standalone.ejs → (format)/dprint.json_standalone.ejs} +0 -0
  81. /package/templates/default/{prettier.config.mjs_framework.ejs → (format)/prettier.config.mjs_framework.ejs} +0 -0
  82. /package/templates/default/{prettier.config.mjs_standalone.ejs → (format)/prettier.config.mjs_standalone.ejs} +0 -0
  83. /package/templates/default/{.depcheckrc.json.ejs → (lint)/.depcheckrc.json.ejs} +0 -0
  84. /package/templates/default/{.markdownlint-cli2.mjs.ejs → (lint)/.markdownlint-cli2.mjs.ejs} +0 -0
  85. /package/templates/default/{cspell.json@ignore-paths_docs-showcase.ejs → (lint)/cspell.json@ignore-paths_docs-showcase.ejs} +0 -0
  86. /package/templates/default/{eslint.config.mts_framework.ejs → (lint)/eslint.config.mts_framework.ejs} +0 -0
  87. /package/templates/default/{eslint.config.mts_standalone.ejs → (lint)/eslint.config.mts_standalone.ejs} +0 -0
  88. /package/templates/default/{eslint.config.mts_standalone@extra-files_has-e2e.ejs → (lint)/eslint.config.mts_standalone@extra-files_has-e2e.ejs} +0 -0
  89. /package/templates/default/{linkinator.config.json.ejs → (lint)/linkinator.config.json.ejs} +0 -0
  90. /package/templates/default/{.npmrc.ejs → (package)/.npmrc.ejs} +0 -0
  91. /package/templates/default/{package.json.ejs → (package)/package.json.ejs} +0 -0
  92. /package/templates/default/{package.json@targets_parcel-targets.ejs → (package)/package.json@targets_parcel-targets.ejs} +0 -0
  93. /package/templates/default/{package.json@targets_parcel.ejs → (package)/package.json@targets_parcel.ejs} +0 -0
  94. /package/templates/default/{pinned-versions.json.ejs → (package)/pinned-versions.json.ejs} +0 -0
  95. /package/templates/default/{pnpm-workspace.yaml.ejs → (package)/pnpm-workspace.yaml.ejs} +0 -0
  96. /package/templates/default/{README.md@demo-vault_framework.ejs → (readme)/README.md@demo-vault_framework.ejs} +0 -0
  97. /package/templates/default/{README.md@preset_docs-showcase.ejs → (readme)/README.md@preset_docs-showcase.ejs} +0 -0
  98. /package/templates/default/{README.md@support_has-funding.ejs → (readme)/README.md@support_has-funding.ejs} +0 -0
  99. /package/templates/default/{jest.config.ts_framework.ejs → (test)/jest.config.ts_framework.ejs} +0 -0
  100. /package/templates/default/{jest.config.ts_framework@lint-root-dir_framework.ejs → (test)/jest.config.ts_framework@lint-root-dir_framework.ejs} +0 -0
  101. /package/templates/default/{jest.config.ts_framework@ts-jest-tsconfig_solid.ejs → (test)/jest.config.ts_framework@ts-jest-tsconfig_solid.ejs} +0 -0
  102. /package/templates/default/{jest.config.ts_standalone.ejs → (test)/jest.config.ts_standalone.ejs} +0 -0
  103. /package/templates/default/{jest.config.ts_standalone@ts-jest-tsconfig_solid.ejs → (test)/jest.config.ts_standalone@ts-jest-tsconfig_solid.ejs} +0 -0
  104. /package/templates/default/{vitest.config.ts_framework.ejs → (test)/vitest.config.ts_framework.ejs} +0 -0
  105. /package/templates/default/{vitest.config.ts_standalone.ejs → (test)/vitest.config.ts_standalone.ejs} +0 -0
  106. /package/templates/default/{vitest.config.ts_standalone@jsx_solid.ejs → (test)/vitest.config.ts_standalone@jsx_solid.ejs} +0 -0
  107. /package/templates/default/{wdio.conf.mts.ejs → (test)/wdio.conf.mts.ejs} +0 -0
  108. /package/templates/default/{wdio.conf.ts.ejs → (test)/wdio.conf.ts.ejs} +0 -0
  109. /package/templates/default/{tsconfig.json_framework.ejs → (tsconfig)/(framework)/tsconfig.json_framework.ejs} +0 -0
  110. /package/templates/default/{tsconfig.json_framework@compiler-options_i18next.ejs → (tsconfig)/(framework)/tsconfig.json_framework@compiler-options_i18next.ejs} +0 -0
  111. /package/templates/default/{tsconfig.json_framework@compiler-options_lit.ejs → (tsconfig)/(framework)/tsconfig.json_framework@compiler-options_lit.ejs} +0 -0
  112. /package/templates/default/{tsconfig.json_framework@exclude_docs-showcase.ejs → (tsconfig)/(framework)/tsconfig.json_framework@exclude_docs-showcase.ejs} +0 -0
  113. /package/templates/default/{tsconfig.json_framework@include_has-e2e.ejs → (tsconfig)/(framework)/tsconfig.json_framework@include_has-e2e.ejs} +0 -0
  114. /package/templates/default/{tsconfig.json_framework@include_svelte.ejs → (tsconfig)/(framework)/tsconfig.json_framework@include_svelte.ejs} +0 -0
  115. /package/templates/default/{tsconfig.json_framework@include_vue.ejs → (tsconfig)/(framework)/tsconfig.json_framework@include_vue.ejs} +0 -0
  116. /package/templates/default/{tsconfig.json_framework@include_wdio-obsidian.ejs → (tsconfig)/(framework)/tsconfig.json_framework@include_wdio-obsidian.ejs} +0 -0
  117. /package/templates/default/{tsconfig.json_framework@types_jest.ejs → (tsconfig)/(framework)/tsconfig.json_framework@types_jest.ejs} +0 -0
  118. /package/templates/default/{tsconfig.json_framework@types_svelte.ejs → (tsconfig)/(framework)/tsconfig.json_framework@types_svelte.ejs} +0 -0
  119. /package/templates/default/{tsconfig.json_framework@types_toolkit-styles.ejs → (tsconfig)/(framework)/tsconfig.json_framework@types_toolkit-styles.ejs} +0 -0
  120. /package/templates/default/{tsconfig.json_framework@types_wasm.ejs → (tsconfig)/(framework)/tsconfig.json_framework@types_wasm.ejs} +0 -0
  121. /package/templates/default/{tsconfig.json_framework@types_wdio-obsidian.ejs → (tsconfig)/(framework)/tsconfig.json_framework@types_wdio-obsidian.ejs} +0 -0
  122. /package/templates/default/{tsconfig.json_framework@types_with-unofficial.ejs → (tsconfig)/(framework)/tsconfig.json_framework@types_with-unofficial.ejs} +0 -0
  123. /package/templates/default/{tsconfig.json_standalone.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone.ejs} +0 -0
  124. /package/templates/default/{tsconfig.json_standalone@compiler-options_i18next.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@compiler-options_i18next.ejs} +0 -0
  125. /package/templates/default/{tsconfig.json_standalone@compiler-options_lit.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@compiler-options_lit.ejs} +0 -0
  126. /package/templates/default/{tsconfig.json_standalone@compiler-options_preact.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@compiler-options_preact.ejs} +0 -0
  127. /package/templates/default/{tsconfig.json_standalone@compiler-options_react.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@compiler-options_react.ejs} +0 -0
  128. /package/templates/default/{tsconfig.json_standalone@compiler-options_solid.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@compiler-options_solid.ejs} +0 -0
  129. /package/templates/default/{tsconfig.json_standalone@include-extra_preact.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@include-extra_preact.ejs} +0 -0
  130. /package/templates/default/{tsconfig.json_standalone@include-extra_react.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@include-extra_react.ejs} +0 -0
  131. /package/templates/default/{tsconfig.json_standalone@include-extra_solid.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@include-extra_solid.ejs} +0 -0
  132. /package/templates/default/{tsconfig.json_standalone@include_has-e2e.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@include_has-e2e.ejs} +0 -0
  133. /package/templates/default/{tsconfig.json_standalone@include_svelte.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@include_svelte.ejs} +0 -0
  134. /package/templates/default/{tsconfig.json_standalone@include_vue.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@include_vue.ejs} +0 -0
  135. /package/templates/default/{tsconfig.json_standalone@types_jest.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@types_jest.ejs} +0 -0
  136. /package/templates/default/{tsconfig.json_standalone@types_svelte.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@types_svelte.ejs} +0 -0
  137. /package/templates/default/{tsconfig.json_standalone@types_wdio-obsidian.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@types_wdio-obsidian.ejs} +0 -0
  138. /package/templates/default/{tsconfig.json_standalone@types_with-unofficial.ejs → (tsconfig)/(standalone)/tsconfig.json_standalone@types_with-unofficial.ejs} +0 -0
  139. /package/templates/default/scripts/{build.ts@bundler_cli-bundler.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler.ejs} +0 -0
  140. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@compile_svelte.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@compile_svelte.ejs} +0 -0
  141. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@fs-import_hot-reload-plugin.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@fs-import_hot-reload-plugin.ejs} +0 -0
  142. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@hot-reload_hot-reload-plugin.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@hot-reload_hot-reload-plugin.ejs} +0 -0
  143. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@import_tailwind.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@import_tailwind.ejs} +0 -0
  144. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@reload_obsidian-cli.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@reload_obsidian-cli.ejs} +0 -0
  145. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@run_parcel.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@run_parcel.ejs} +0 -0
  146. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@run_rollup.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@run_rollup.ejs} +0 -0
  147. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@run_vite.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@run_vite.ejs} +0 -0
  148. /package/templates/default/scripts/{build.ts@bundler_cli-bundler@run_webpack.ejs → (build)/(cli-bundler)/build.ts@bundler_cli-bundler@run_webpack.ejs} +0 -0
  149. /package/templates/default/scripts/{dev.ts.ejs → (build)/(dev)/dev.ts.ejs} +0 -0
  150. /package/templates/default/scripts/{dev.ts@bundler_adapter-cli.ejs → (build)/(dev)/dev.ts@bundler_adapter-cli.ejs} +0 -0
  151. /package/templates/default/scripts/{dev.ts@bundler_adapter-cli@run_rollup.ejs → (build)/(dev)/dev.ts@bundler_adapter-cli@run_rollup.ejs} +0 -0
  152. /package/templates/default/scripts/{dev.ts@bundler_adapter-cli@run_vite.ejs → (build)/(dev)/dev.ts@bundler_adapter-cli@run_vite.ejs} +0 -0
  153. /package/templates/default/scripts/{dev.ts@bundler_adapter-cli@run_webpack.ejs → (build)/(dev)/dev.ts@bundler_adapter-cli@run_webpack.ejs} +0 -0
  154. /package/templates/default/scripts/{dev.ts@bundler_cli-bundler.ejs → (build)/(dev)/dev.ts@bundler_cli-bundler.ejs} +0 -0
  155. /package/templates/default/scripts/{dev.ts@bundler_esbuild.ejs → (build)/(dev)/dev.ts@bundler_esbuild.ejs} +0 -0
  156. /package/templates/default/scripts/{dev.ts@bundler_esbuild@preset_framework.ejs → (build)/(dev)/dev.ts@bundler_esbuild@preset_framework.ejs} +0 -0
  157. /package/templates/default/scripts/{dev.ts@bundler_esbuild@preset_standalone.ejs → (build)/(dev)/dev.ts@bundler_esbuild@preset_standalone.ejs} +0 -0
  158. /package/templates/default/scripts/{dev.ts@bundler_parcel-adapter.ejs → (build)/(dev)/dev.ts@bundler_parcel-adapter.ejs} +0 -0
  159. /package/templates/default/scripts/{build.ts@bundler_esbuild.ejs → (build)/(esbuild)/build.ts@bundler_esbuild.ejs} +0 -0
  160. /package/templates/default/scripts/{build.ts@bundler_esbuild@compile_svelte.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@compile_svelte.ejs} +0 -0
  161. /package/templates/default/scripts/{build.ts@bundler_esbuild@fs-import_hot-reload-plugin.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@fs-import_hot-reload-plugin.ejs} +0 -0
  162. /package/templates/default/scripts/{build.ts@bundler_esbuild@hot-reload_hot-reload-plugin.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@hot-reload_hot-reload-plugin.ejs} +0 -0
  163. /package/templates/default/scripts/{build.ts@bundler_esbuild@import_postcss.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@import_postcss.ejs} +0 -0
  164. /package/templates/default/scripts/{build.ts@bundler_esbuild@import_scss.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@import_scss.ejs} +0 -0
  165. /package/templates/default/scripts/{build.ts@bundler_esbuild@import_solid.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@import_solid.ejs} +0 -0
  166. /package/templates/default/scripts/{build.ts@bundler_esbuild@import_svelte.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@import_svelte.ejs} +0 -0
  167. /package/templates/default/scripts/{build.ts@bundler_esbuild@import_tailwind.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@import_tailwind.ejs} +0 -0
  168. /package/templates/default/scripts/{build.ts@bundler_esbuild@import_vue.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@import_vue.ejs} +0 -0
  169. /package/templates/default/scripts/{build.ts@bundler_esbuild@options_preact.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@options_preact.ejs} +0 -0
  170. /package/templates/default/scripts/{build.ts@bundler_esbuild@options_react.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@options_react.ejs} +0 -0
  171. /package/templates/default/scripts/{build.ts@bundler_esbuild@options_wasm.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@options_wasm.ejs} +0 -0
  172. /package/templates/default/scripts/{build.ts@bundler_esbuild@plugin_postcss.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@plugin_postcss.ejs} +0 -0
  173. /package/templates/default/scripts/{build.ts@bundler_esbuild@plugin_scss.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@plugin_scss.ejs} +0 -0
  174. /package/templates/default/scripts/{build.ts@bundler_esbuild@plugin_solid.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@plugin_solid.ejs} +0 -0
  175. /package/templates/default/scripts/{build.ts@bundler_esbuild@plugin_svelte.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@plugin_svelte.ejs} +0 -0
  176. /package/templates/default/scripts/{build.ts@bundler_esbuild@plugin_vue.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@plugin_vue.ejs} +0 -0
  177. /package/templates/default/scripts/{build.ts@bundler_esbuild@preset_framework.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@preset_framework.ejs} +0 -0
  178. /package/templates/default/scripts/{build.ts@bundler_esbuild@preset_standalone.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@preset_standalone.ejs} +0 -0
  179. /package/templates/default/scripts/{build.ts@bundler_esbuild@reload_obsidian-cli.ejs → (build)/(esbuild)/build.ts@bundler_esbuild@reload_obsidian-cli.ejs} +0 -0
  180. /package/templates/default/scripts/{build-clean.ts.ejs → (build)/build-clean.ts.ejs} +0 -0
  181. /package/templates/default/scripts/{build-compile-typescript.ts.ejs → (build)/build-compile-typescript.ts.ejs} +0 -0
  182. /package/templates/default/scripts/{build-compile.ts.ejs → (build)/build-compile.ts.ejs} +0 -0
  183. /package/templates/default/scripts/{build-options.ts.ejs → (build)/build-options.ts.ejs} +0 -0
  184. /package/templates/default/scripts/{build-styles.ts.ejs → (build)/build-styles.ts.ejs} +0 -0
  185. /package/templates/default/scripts/{build.ts.ejs → (build)/build.ts.ejs} +0 -0
  186. /package/templates/default/scripts/{build.ts@bundler_adapter-cli.ejs → (build)/build.ts@bundler_adapter-cli.ejs} +0 -0
  187. /package/templates/default/scripts/{build.ts@bundler_adapter-cli@run_rollup.ejs → (build)/build.ts@bundler_adapter-cli@run_rollup.ejs} +0 -0
  188. /package/templates/default/scripts/{build.ts@bundler_adapter-cli@run_vite.ejs → (build)/build.ts@bundler_adapter-cli@run_vite.ejs} +0 -0
  189. /package/templates/default/scripts/{build.ts@bundler_adapter-cli@run_webpack.ejs → (build)/build.ts@bundler_adapter-cli@run_webpack.ejs} +0 -0
  190. /package/templates/default/scripts/{build.ts@bundler_parcel-adapter.ejs → (build)/build.ts@bundler_parcel-adapter.ejs} +0 -0
  191. /package/templates/default/scripts/{format-check.ts.ejs → (format)/format-check.ts.ejs} +0 -0
  192. /package/templates/default/scripts/{format-check.ts@tool_biome-formatter.ejs → (format)/format-check.ts@tool_biome-formatter.ejs} +0 -0
  193. /package/templates/default/scripts/{format-check.ts@tool_biome-formatter@preset_framework.ejs → (format)/format-check.ts@tool_biome-formatter@preset_framework.ejs} +0 -0
  194. /package/templates/default/scripts/{format-check.ts@tool_biome-formatter@preset_standalone.ejs → (format)/format-check.ts@tool_biome-formatter@preset_standalone.ejs} +0 -0
  195. /package/templates/default/scripts/{format-check.ts@tool_dprint.ejs → (format)/format-check.ts@tool_dprint.ejs} +0 -0
  196. /package/templates/default/scripts/{format-check.ts@tool_dprint@preset_framework.ejs → (format)/format-check.ts@tool_dprint@preset_framework.ejs} +0 -0
  197. /package/templates/default/scripts/{format-check.ts@tool_dprint@preset_standalone.ejs → (format)/format-check.ts@tool_dprint@preset_standalone.ejs} +0 -0
  198. /package/templates/default/scripts/{format-check.ts@tool_prettier.ejs → (format)/format-check.ts@tool_prettier.ejs} +0 -0
  199. /package/templates/default/scripts/{format-check.ts@tool_prettier@preset_framework.ejs → (format)/format-check.ts@tool_prettier@preset_framework.ejs} +0 -0
  200. /package/templates/default/scripts/{format-check.ts@tool_prettier@preset_standalone.ejs → (format)/format-check.ts@tool_prettier@preset_standalone.ejs} +0 -0
  201. /package/templates/default/scripts/{format.ts.ejs → (format)/format.ts.ejs} +0 -0
  202. /package/templates/default/scripts/{format.ts@tool_biome-formatter.ejs → (format)/format.ts@tool_biome-formatter.ejs} +0 -0
  203. /package/templates/default/scripts/{format.ts@tool_biome-formatter@preset_framework.ejs → (format)/format.ts@tool_biome-formatter@preset_framework.ejs} +0 -0
  204. /package/templates/default/scripts/{format.ts@tool_biome-formatter@preset_standalone.ejs → (format)/format.ts@tool_biome-formatter@preset_standalone.ejs} +0 -0
  205. /package/templates/default/scripts/{format.ts@tool_dprint.ejs → (format)/format.ts@tool_dprint.ejs} +0 -0
  206. /package/templates/default/scripts/{format.ts@tool_dprint@preset_framework.ejs → (format)/format.ts@tool_dprint@preset_framework.ejs} +0 -0
  207. /package/templates/default/scripts/{format.ts@tool_dprint@preset_standalone.ejs → (format)/format.ts@tool_dprint@preset_standalone.ejs} +0 -0
  208. /package/templates/default/scripts/{format.ts@tool_prettier.ejs → (format)/format.ts@tool_prettier.ejs} +0 -0
  209. /package/templates/default/scripts/{format.ts@tool_prettier@preset_framework.ejs → (format)/format.ts@tool_prettier@preset_framework.ejs} +0 -0
  210. /package/templates/default/scripts/{format.ts@tool_prettier@preset_standalone.ejs → (format)/format.ts@tool_prettier@preset_standalone.ejs} +0 -0
  211. /package/templates/default/scripts/{prettier.config.ts.ejs → (format)/prettier.config.ts.ejs} +0 -0
  212. /package/templates/default/scripts/{lint-md-fix.ts_framework.ejs → (lint)/(markdown)/lint-md-fix.ts_framework.ejs} +0 -0
  213. /package/templates/default/scripts/{lint-md-fix.ts_standalone.ejs → (lint)/(markdown)/lint-md-fix.ts_standalone.ejs} +0 -0
  214. /package/templates/default/scripts/{lint-md.ts_framework.ejs → (lint)/(markdown)/lint-md.ts_framework.ejs} +0 -0
  215. /package/templates/default/scripts/{lint-md.ts_standalone.ejs → (lint)/(markdown)/lint-md.ts_standalone.ejs} +0 -0
  216. /package/templates/default/scripts/{markdownlint-cli2-config.ts_framework.ejs → (lint)/(markdown)/markdownlint-cli2-config.ts_framework.ejs} +0 -0
  217. /package/templates/default/scripts/{eslint-config.ts.ejs → (lint)/eslint-config.ts.ejs} +0 -0
  218. /package/templates/default/scripts/{eslint-config.ts@extra-files_has-e2e.ejs → (lint)/eslint-config.ts@extra-files_has-e2e.ejs} +0 -0
  219. /package/templates/default/scripts/{eslint-config.ts@ignores_docs-showcase.ejs → (lint)/eslint-config.ts@ignores_docs-showcase.ejs} +0 -0
  220. /package/templates/default/scripts/{find-overexposed-fix.ts.ejs → (lint)/find-overexposed-fix.ts.ejs} +0 -0
  221. /package/templates/default/scripts/{find-overexposed.ts.ejs → (lint)/find-overexposed.ts.ejs} +0 -0
  222. /package/templates/default/scripts/{lint-fix.ts.ejs → (lint)/lint-fix.ts.ejs} +0 -0
  223. /package/templates/default/scripts/{lint-fix.ts@tool_biome-linter.ejs → (lint)/lint-fix.ts@tool_biome-linter.ejs} +0 -0
  224. /package/templates/default/scripts/{lint-fix.ts@tool_biome-linter@preset_framework.ejs → (lint)/lint-fix.ts@tool_biome-linter@preset_framework.ejs} +0 -0
  225. /package/templates/default/scripts/{lint-fix.ts@tool_biome-linter@preset_standalone.ejs → (lint)/lint-fix.ts@tool_biome-linter@preset_standalone.ejs} +0 -0
  226. /package/templates/default/scripts/{lint-fix.ts@tool_eslint.ejs → (lint)/lint-fix.ts@tool_eslint.ejs} +0 -0
  227. /package/templates/default/scripts/{lint-fix.ts@tool_eslint@preset_framework.ejs → (lint)/lint-fix.ts@tool_eslint@preset_framework.ejs} +0 -0
  228. /package/templates/default/scripts/{lint-fix.ts@tool_eslint@preset_standalone.ejs → (lint)/lint-fix.ts@tool_eslint@preset_standalone.ejs} +0 -0
  229. /package/templates/default/scripts/{lint.ts.ejs → (lint)/lint.ts.ejs} +0 -0
  230. /package/templates/default/scripts/{lint.ts@tool_biome-linter.ejs → (lint)/lint.ts@tool_biome-linter.ejs} +0 -0
  231. /package/templates/default/scripts/{lint.ts@tool_biome-linter@preset_framework.ejs → (lint)/lint.ts@tool_biome-linter@preset_framework.ejs} +0 -0
  232. /package/templates/default/scripts/{lint.ts@tool_biome-linter@preset_standalone.ejs → (lint)/lint.ts@tool_biome-linter@preset_standalone.ejs} +0 -0
  233. /package/templates/default/scripts/{lint.ts@tool_eslint.ejs → (lint)/lint.ts@tool_eslint.ejs} +0 -0
  234. /package/templates/default/scripts/{lint.ts@tool_eslint@preset_framework.ejs → (lint)/lint.ts@tool_eslint@preset_framework.ejs} +0 -0
  235. /package/templates/default/scripts/{lint.ts@tool_eslint@preset_standalone.ejs → (lint)/lint.ts@tool_eslint@preset_standalone.ejs} +0 -0
  236. /package/templates/default/scripts/{rollup.config.ts_standalone.ejs → (rollup)/(standalone)/rollup.config.ts_standalone.ejs} +0 -0
  237. /package/templates/default/scripts/{rollup.config.ts_standalone@import_rollup-babel.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@import_rollup-babel.ejs} +0 -0
  238. /package/templates/default/scripts/{rollup.config.ts_standalone@import_rollup-json.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@import_rollup-json.ejs} +0 -0
  239. /package/templates/default/scripts/{rollup.config.ts_standalone@import_rollup-postcss.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@import_rollup-postcss.ejs} +0 -0
  240. /package/templates/default/scripts/{rollup.config.ts_standalone@import_scss.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@import_scss.ejs} +0 -0
  241. /package/templates/default/scripts/{rollup.config.ts_standalone@import_svelte.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@import_svelte.ejs} +0 -0
  242. /package/templates/default/scripts/{rollup.config.ts_standalone@import_vue.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@import_vue.ejs} +0 -0
  243. /package/templates/default/scripts/{rollup.config.ts_standalone@import_wasm.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@import_wasm.ejs} +0 -0
  244. /package/templates/default/scripts/{rollup.config.ts_standalone@post-plugin_preact.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@post-plugin_preact.ejs} +0 -0
  245. /package/templates/default/scripts/{rollup.config.ts_standalone@post-plugin_react.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@post-plugin_react.ejs} +0 -0
  246. /package/templates/default/scripts/{rollup.config.ts_standalone@post-plugin_rollup-json.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@post-plugin_rollup-json.ejs} +0 -0
  247. /package/templates/default/scripts/{rollup.config.ts_standalone@post-plugin_rollup-postcss.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@post-plugin_rollup-postcss.ejs} +0 -0
  248. /package/templates/default/scripts/{rollup.config.ts_standalone@post-plugin_scss.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@post-plugin_scss.ejs} +0 -0
  249. /package/templates/default/scripts/{rollup.config.ts_standalone@post-plugin_solid.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@post-plugin_solid.ejs} +0 -0
  250. /package/templates/default/scripts/{rollup.config.ts_standalone@post-plugin_wasm.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@post-plugin_wasm.ejs} +0 -0
  251. /package/templates/default/scripts/{rollup.config.ts_standalone@pre-plugin_svelte.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@pre-plugin_svelte.ejs} +0 -0
  252. /package/templates/default/scripts/{rollup.config.ts_standalone@pre-plugin_vue.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@pre-plugin_vue.ejs} +0 -0
  253. /package/templates/default/scripts/{rollup.config.ts_standalone@unwrap_rollup-babel.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@unwrap_rollup-babel.ejs} +0 -0
  254. /package/templates/default/scripts/{rollup.config.ts_standalone@unwrap_rollup-json.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@unwrap_rollup-json.ejs} +0 -0
  255. /package/templates/default/scripts/{rollup.config.ts_standalone@unwrap_rollup-postcss.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@unwrap_rollup-postcss.ejs} +0 -0
  256. /package/templates/default/scripts/{rollup.config.ts_standalone@unwrap_scss.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@unwrap_scss.ejs} +0 -0
  257. /package/templates/default/scripts/{rollup.config.ts_standalone@unwrap_svelte.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@unwrap_svelte.ejs} +0 -0
  258. /package/templates/default/scripts/{rollup.config.ts_standalone@unwrap_vue.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@unwrap_vue.ejs} +0 -0
  259. /package/templates/default/scripts/{rollup.config.ts_standalone@unwrap_wasm.ejs → (rollup)/(standalone)/rollup.config.ts_standalone@unwrap_wasm.ejs} +0 -0
  260. /package/templates/default/scripts/{babel.config.ts_rollup.ejs → (rollup)/babel.config.ts_rollup.ejs} +0 -0
  261. /package/templates/default/scripts/{babel.config.ts_rollup@babel-plugin_preact.ejs → (rollup)/babel.config.ts_rollup@babel-plugin_preact.ejs} +0 -0
  262. /package/templates/default/scripts/{babel.config.ts_rollup@babel-preset_react.ejs → (rollup)/babel.config.ts_rollup@babel-preset_react.ejs} +0 -0
  263. /package/templates/default/scripts/{babel.config.ts_rollup@babel-preset_solid.ejs → (rollup)/babel.config.ts_rollup@babel-preset_solid.ejs} +0 -0
  264. /package/templates/default/scripts/{rollup.config.ts_framework.ejs → (rollup)/rollup.config.ts_framework.ejs} +0 -0
  265. /package/templates/default/scripts/{rollup.config.ts_framework@import_rollup-json.ejs → (rollup)/rollup.config.ts_framework@import_rollup-json.ejs} +0 -0
  266. /package/templates/default/scripts/{rollup.config.ts_framework@import_scss.ejs → (rollup)/rollup.config.ts_framework@import_scss.ejs} +0 -0
  267. /package/templates/default/scripts/{rollup.config.ts_framework@plugin_rollup-json.ejs → (rollup)/rollup.config.ts_framework@plugin_rollup-json.ejs} +0 -0
  268. /package/templates/default/scripts/{rollup.config.ts_framework@plugin_scss.ejs → (rollup)/rollup.config.ts_framework@plugin_scss.ejs} +0 -0
  269. /package/templates/default/scripts/{rollup.config.ts_framework@unwrap_rollup-json.ejs → (rollup)/rollup.config.ts_framework@unwrap_rollup-json.ejs} +0 -0
  270. /package/templates/default/scripts/{rollup.config.ts_framework@unwrap_scss.ejs → (rollup)/rollup.config.ts_framework@unwrap_scss.ejs} +0 -0
  271. /package/templates/default/scripts/{test-e2e.ts.ejs → (test)/(e2e)/test-e2e.ts.ejs} +0 -0
  272. /package/templates/default/scripts/{test-e2e.ts@tool_obsidian-test.ejs → (test)/(e2e)/test-e2e.ts@tool_obsidian-test.ejs} +0 -0
  273. /package/templates/default/scripts/{test-e2e.ts@tool_obsidian-test@preset_framework.ejs → (test)/(e2e)/test-e2e.ts@tool_obsidian-test@preset_framework.ejs} +0 -0
  274. /package/templates/default/scripts/{test-e2e.ts@tool_obsidian-test@preset_standalone.ejs → (test)/(e2e)/test-e2e.ts@tool_obsidian-test@preset_standalone.ejs} +0 -0
  275. /package/templates/default/scripts/{test-e2e.ts@tool_wdio-obsidian.ejs → (test)/(e2e)/test-e2e.ts@tool_wdio-obsidian.ejs} +0 -0
  276. /package/templates/default/scripts/{test-e2e.ts@tool_wdio-obsidian@preset_framework.ejs → (test)/(e2e)/test-e2e.ts@tool_wdio-obsidian@preset_framework.ejs} +0 -0
  277. /package/templates/default/scripts/{test-e2e.ts@tool_wdio-obsidian@preset_standalone.ejs → (test)/(e2e)/test-e2e.ts@tool_wdio-obsidian@preset_standalone.ejs} +0 -0
  278. /package/templates/default/scripts/{demo-vault-global-setup.ts.ejs → (test)/(integration)/demo-vault-global-setup.ts.ejs} +0 -0
  279. /package/templates/default/scripts/{test-integration-android.ts.ejs → (test)/(integration)/test-integration-android.ts.ejs} +0 -0
  280. /package/templates/default/scripts/{test-integration-demo-vault.ts.ejs → (test)/(integration)/test-integration-demo-vault.ts.ejs} +0 -0
  281. /package/templates/default/scripts/{test-integration-desktop-performance.ts.ejs → (test)/(integration)/test-integration-desktop-performance.ts.ejs} +0 -0
  282. /package/templates/default/scripts/{test-integration-desktop.ts.ejs → (test)/(integration)/test-integration-desktop.ts.ejs} +0 -0
  283. /package/templates/default/scripts/{test-integration-no-app.ts.ejs → (test)/(integration)/test-integration-no-app.ts.ejs} +0 -0
  284. /package/templates/default/scripts/{test-integration.ts.ejs → (test)/(integration)/test-integration.ts.ejs} +0 -0
  285. /package/templates/default/scripts/{framework-component-stub.ts.ejs → (test)/framework-component-stub.ts.ejs} +0 -0
  286. /package/templates/default/scripts/{stylesheet-stub.ts.ejs → (test)/stylesheet-stub.ts.ejs} +0 -0
  287. /package/templates/default/scripts/{test-coverage.ts.ejs → (test)/test-coverage.ts.ejs} +0 -0
  288. /package/templates/default/scripts/{test-coverage.ts@tool_jest.ejs → (test)/test-coverage.ts@tool_jest.ejs} +0 -0
  289. /package/templates/default/scripts/{test-coverage.ts@tool_vitest.ejs → (test)/test-coverage.ts@tool_vitest.ejs} +0 -0
  290. /package/templates/default/scripts/{test-watch.ts_framework.ejs → (test)/test-watch.ts_framework.ejs} +0 -0
  291. /package/templates/default/scripts/{test-watch.ts_framework@tool_jest.ejs → (test)/test-watch.ts_framework@tool_jest.ejs} +0 -0
  292. /package/templates/default/scripts/{test-watch.ts_framework@tool_vitest.ejs → (test)/test-watch.ts_framework@tool_vitest.ejs} +0 -0
  293. /package/templates/default/scripts/{test-watch.ts_standalone.ejs → (test)/test-watch.ts_standalone.ejs} +0 -0
  294. /package/templates/default/scripts/{test-watch.ts_standalone@tool_jest.ejs → (test)/test-watch.ts_standalone@tool_jest.ejs} +0 -0
  295. /package/templates/default/scripts/{test-watch.ts_standalone@tool_vitest.ejs → (test)/test-watch.ts_standalone@tool_vitest.ejs} +0 -0
  296. /package/templates/default/scripts/{test.ts_framework.ejs → (test)/test.ts_framework.ejs} +0 -0
  297. /package/templates/default/scripts/{test.ts_framework@tool_jest.ejs → (test)/test.ts_framework@tool_jest.ejs} +0 -0
  298. /package/templates/default/scripts/{test.ts_framework@tool_vitest.ejs → (test)/test.ts_framework@tool_vitest.ejs} +0 -0
  299. /package/templates/default/scripts/{test.ts_standalone.ejs → (test)/test.ts_standalone.ejs} +0 -0
  300. /package/templates/default/scripts/{test.ts_standalone@tool_jest.ejs → (test)/test.ts_standalone@tool_jest.ejs} +0 -0
  301. /package/templates/default/scripts/{test.ts_standalone@tool_vitest.ejs → (test)/test.ts_standalone@tool_vitest.ejs} +0 -0
  302. /package/templates/default/scripts/{vitest-config.ts.ejs → (test)/vitest-config.ts.ejs} +0 -0
  303. /package/templates/default/scripts/{vitest-config.ts@edit-context_docs-showcase.ejs → (test)/vitest-config.ts@edit-context_docs-showcase.ejs} +0 -0
  304. /package/templates/default/scripts/{wasm-module-stub.ts.ejs → (test)/wasm-module-stub.ts.ejs} +0 -0
  305. /package/templates/default/scripts/{vite.config.ts_framework.ejs → (vite)/vite.config.ts_framework.ejs} +0 -0
  306. /package/templates/default/scripts/{vite.config.ts_standalone.ejs → (vite)/vite.config.ts_standalone.ejs} +0 -0
  307. /package/templates/default/scripts/{vite.config.ts_standalone@import_preact.ejs → (vite)/vite.config.ts_standalone@import_preact.ejs} +0 -0
  308. /package/templates/default/scripts/{vite.config.ts_standalone@import_react.ejs → (vite)/vite.config.ts_standalone@import_react.ejs} +0 -0
  309. /package/templates/default/scripts/{vite.config.ts_standalone@import_solid.ejs → (vite)/vite.config.ts_standalone@import_solid.ejs} +0 -0
  310. /package/templates/default/scripts/{vite.config.ts_standalone@import_svelte.ejs → (vite)/vite.config.ts_standalone@import_svelte.ejs} +0 -0
  311. /package/templates/default/scripts/{vite.config.ts_standalone@import_vue.ejs → (vite)/vite.config.ts_standalone@import_vue.ejs} +0 -0
  312. /package/templates/default/scripts/{vite.config.ts_standalone@plugin_preact.ejs → (vite)/vite.config.ts_standalone@plugin_preact.ejs} +0 -0
  313. /package/templates/default/scripts/{vite.config.ts_standalone@plugin_react.ejs → (vite)/vite.config.ts_standalone@plugin_react.ejs} +0 -0
  314. /package/templates/default/scripts/{vite.config.ts_standalone@plugin_solid.ejs → (vite)/vite.config.ts_standalone@plugin_solid.ejs} +0 -0
  315. /package/templates/default/scripts/{vite.config.ts_standalone@plugin_svelte.ejs → (vite)/vite.config.ts_standalone@plugin_svelte.ejs} +0 -0
  316. /package/templates/default/scripts/{vite.config.ts_standalone@plugin_vue.ejs → (vite)/vite.config.ts_standalone@plugin_vue.ejs} +0 -0
  317. /package/templates/default/scripts/{webpack.config.ts_framework.ejs → (webpack)/webpack.config.ts_framework.ejs} +0 -0
  318. /package/templates/default/scripts/{webpack.config.ts_framework@import_scss.ejs → (webpack)/webpack.config.ts_framework@import_scss.ejs} +0 -0
  319. /package/templates/default/scripts/{webpack.config.ts_framework@plugin_scss.ejs → (webpack)/webpack.config.ts_framework@plugin_scss.ejs} +0 -0
  320. /package/templates/default/scripts/{webpack.config.ts_framework@rule_scss.ejs → (webpack)/webpack.config.ts_framework@rule_scss.ejs} +0 -0
  321. /package/templates/default/scripts/{webpack.config.ts_standalone.ejs → (webpack)/webpack.config.ts_standalone.ejs} +0 -0
  322. /package/templates/default/scripts/{webpack.config.ts_standalone@import_svelte.ejs → (webpack)/webpack.config.ts_standalone@import_svelte.ejs} +0 -0
  323. /package/templates/default/scripts/{webpack.config.ts_standalone@import_vue.ejs → (webpack)/webpack.config.ts_standalone@import_vue.ejs} +0 -0
  324. /package/templates/default/scripts/{webpack.config.ts_standalone@import_webpack-css-extract.ejs → (webpack)/webpack.config.ts_standalone@import_webpack-css-extract.ejs} +0 -0
  325. /package/templates/default/scripts/{webpack.config.ts_standalone@plugin_vue.ejs → (webpack)/webpack.config.ts_standalone@plugin_vue.ejs} +0 -0
  326. /package/templates/default/scripts/{webpack.config.ts_standalone@plugin_webpack-css-extract.ejs → (webpack)/webpack.config.ts_standalone@plugin_webpack-css-extract.ejs} +0 -0
  327. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_css-modules.ejs → (webpack)/webpack.config.ts_standalone@rule_css-modules.ejs} +0 -0
  328. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_css.ejs → (webpack)/webpack.config.ts_standalone@rule_css.ejs} +0 -0
  329. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_postcss.ejs → (webpack)/webpack.config.ts_standalone@rule_postcss.ejs} +0 -0
  330. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_scss.ejs → (webpack)/webpack.config.ts_standalone@rule_scss.ejs} +0 -0
  331. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_solid.ejs → (webpack)/webpack.config.ts_standalone@rule_solid.ejs} +0 -0
  332. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_svelte.ejs → (webpack)/webpack.config.ts_standalone@rule_svelte.ejs} +0 -0
  333. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_tailwind.ejs → (webpack)/webpack.config.ts_standalone@rule_tailwind.ejs} +0 -0
  334. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_vue.ejs → (webpack)/webpack.config.ts_standalone@rule_vue.ejs} +0 -0
  335. /package/templates/default/scripts/{webpack.config.ts_standalone@rule_wasm.ejs → (webpack)/webpack.config.ts_standalone@rule_wasm.ejs} +0 -0
  336. /package/templates/default/scripts/{webpack.config.ts_standalone@ts-loader-compiler-options_vue.ejs → (webpack)/webpack.config.ts_standalone@ts-loader-compiler-options_vue.ejs} +0 -0
  337. /package/templates/default/scripts/{webpack.config.ts_standalone@ts-loader-options_vue.ejs → (webpack)/webpack.config.ts_standalone@ts-loader-options_vue.ejs} +0 -0
  338. /package/templates/default/src/{main.test.ts.ejs → (main)/main.test.ts.ejs} +0 -0
  339. /package/templates/default/src/{main.test.ts@test-imports_vitest.ejs → (main)/main.test.ts@test-imports_vitest.ejs} +0 -0
  340. /package/templates/default/src/{main.ts.ejs → (main)/main.ts.ejs} +0 -0
  341. /package/templates/default/src/{main.ts@import_css.ejs → (main)/main.ts@import_css.ejs} +0 -0
  342. /package/templates/default/src/{main.ts@import_postcss.ejs → (main)/main.ts@import_postcss.ejs} +0 -0
  343. /package/templates/default/src/{main.ts@import_scss.ejs → (main)/main.ts@import_scss.ejs} +0 -0
  344. /package/templates/default/src/{main.ts@import_tailwind.ejs → (main)/main.ts@import_tailwind.ejs} +0 -0
  345. /package/templates/default/src/{main.ts@import_tailwind@preset_framework.ejs → (main)/main.ts@import_tailwind@preset_framework.ejs} +0 -0
  346. /package/templates/default/src/{main.ts@import_tailwind@preset_standalone.ejs → (main)/main.ts@import_tailwind@preset_standalone.ejs} +0 -0
  347. /package/templates/default/src/{plugin.ts_all-in-one@import2_codemirror.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_codemirror.ejs} +0 -0
  348. /package/templates/default/src/{plugin.ts_all-in-one@import2_css-modules.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_css-modules.ejs} +0 -0
  349. /package/templates/default/src/{plugin.ts_all-in-one@import2_docs-showcase.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_docs-showcase.ejs} +0 -0
  350. /package/templates/default/src/{plugin.ts_all-in-one@import2_i18next.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_i18next.ejs} +0 -0
  351. /package/templates/default/src/{plugin.ts_all-in-one@import2_lit.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_lit.ejs} +0 -0
  352. /package/templates/default/src/{plugin.ts_all-in-one@import2_preact.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_preact.ejs} +0 -0
  353. /package/templates/default/src/{plugin.ts_all-in-one@import2_react.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_react.ejs} +0 -0
  354. /package/templates/default/src/{plugin.ts_all-in-one@import2_solid.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_solid.ejs} +0 -0
  355. /package/templates/default/src/{plugin.ts_all-in-one@import2_svelte.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_svelte.ejs} +0 -0
  356. /package/templates/default/src/{plugin.ts_all-in-one@import2_typesafe-i18n.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_typesafe-i18n.ejs} +0 -0
  357. /package/templates/default/src/{plugin.ts_all-in-one@import2_vue.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_vue.ejs} +0 -0
  358. /package/templates/default/src/{plugin.ts_all-in-one@import2_wasm.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@import2_wasm.ejs} +0 -0
  359. /package/templates/default/src/{plugin.ts_all-in-one@method_ui-view.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@method_ui-view.ejs} +0 -0
  360. /package/templates/default/src/{plugin.ts_all-in-one@onload_codemirror.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_codemirror.ejs} +0 -0
  361. /package/templates/default/src/{plugin.ts_all-in-one@onload_css-modules.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_css-modules.ejs} +0 -0
  362. /package/templates/default/src/{plugin.ts_all-in-one@onload_docs-showcase.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_docs-showcase.ejs} +0 -0
  363. /package/templates/default/src/{plugin.ts_all-in-one@onload_i18next.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_i18next.ejs} +0 -0
  364. /package/templates/default/src/{plugin.ts_all-in-one@onload_lit.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_lit.ejs} +0 -0
  365. /package/templates/default/src/{plugin.ts_all-in-one@onload_preact.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_preact.ejs} +0 -0
  366. /package/templates/default/src/{plugin.ts_all-in-one@onload_react.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_react.ejs} +0 -0
  367. /package/templates/default/src/{plugin.ts_all-in-one@onload_solid.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_solid.ejs} +0 -0
  368. /package/templates/default/src/{plugin.ts_all-in-one@onload_svelte.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_svelte.ejs} +0 -0
  369. /package/templates/default/src/{plugin.ts_all-in-one@onload_typesafe-i18n.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_typesafe-i18n.ejs} +0 -0
  370. /package/templates/default/src/{plugin.ts_all-in-one@onload_vue.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_vue.ejs} +0 -0
  371. /package/templates/default/src/{plugin.ts_all-in-one@onload_wasm.ejs → (plugin)/(all-in-one)/plugin.ts_all-in-one@onload_wasm.ejs} +0 -0
  372. /package/templates/default/src/{plugin.ts_demo@import_css-modules.ejs → (plugin)/(demo)/plugin.ts_demo@import_css-modules.ejs} +0 -0
  373. /package/templates/default/src/{plugin.ts_demo@import_i18next.ejs → (plugin)/(demo)/plugin.ts_demo@import_i18next.ejs} +0 -0
  374. /package/templates/default/src/{plugin.ts_demo@import_lit.ejs → (plugin)/(demo)/plugin.ts_demo@import_lit.ejs} +0 -0
  375. /package/templates/default/src/{plugin.ts_demo@import_preact.ejs → (plugin)/(demo)/plugin.ts_demo@import_preact.ejs} +0 -0
  376. /package/templates/default/src/{plugin.ts_demo@import_react.ejs → (plugin)/(demo)/plugin.ts_demo@import_react.ejs} +0 -0
  377. /package/templates/default/src/{plugin.ts_demo@import_solid.ejs → (plugin)/(demo)/plugin.ts_demo@import_solid.ejs} +0 -0
  378. /package/templates/default/src/{plugin.ts_demo@import_svelte.ejs → (plugin)/(demo)/plugin.ts_demo@import_svelte.ejs} +0 -0
  379. /package/templates/default/src/{plugin.ts_demo@import_typesafe-i18n.ejs → (plugin)/(demo)/plugin.ts_demo@import_typesafe-i18n.ejs} +0 -0
  380. /package/templates/default/src/{plugin.ts_demo@import_vue.ejs → (plugin)/(demo)/plugin.ts_demo@import_vue.ejs} +0 -0
  381. /package/templates/default/src/{plugin.ts_demo@import_wasm.ejs → (plugin)/(demo)/plugin.ts_demo@import_wasm.ejs} +0 -0
  382. /package/templates/default/src/{plugin.ts_demo@method_ui-view.ejs → (plugin)/(demo)/plugin.ts_demo@method_ui-view.ejs} +0 -0
  383. /package/templates/default/src/{plugin.ts_demo@onload_css-modules.ejs → (plugin)/(demo)/plugin.ts_demo@onload_css-modules.ejs} +0 -0
  384. /package/templates/default/src/{plugin.ts_demo@onload_i18next.ejs → (plugin)/(demo)/plugin.ts_demo@onload_i18next.ejs} +0 -0
  385. /package/templates/default/src/{plugin.ts_demo@onload_lit.ejs → (plugin)/(demo)/plugin.ts_demo@onload_lit.ejs} +0 -0
  386. /package/templates/default/src/{plugin.ts_demo@onload_preact.ejs → (plugin)/(demo)/plugin.ts_demo@onload_preact.ejs} +0 -0
  387. /package/templates/default/src/{plugin.ts_demo@onload_react.ejs → (plugin)/(demo)/plugin.ts_demo@onload_react.ejs} +0 -0
  388. /package/templates/default/src/{plugin.ts_demo@onload_solid.ejs → (plugin)/(demo)/plugin.ts_demo@onload_solid.ejs} +0 -0
  389. /package/templates/default/src/{plugin.ts_demo@onload_svelte.ejs → (plugin)/(demo)/plugin.ts_demo@onload_svelte.ejs} +0 -0
  390. /package/templates/default/src/{plugin.ts_demo@onload_typesafe-i18n.ejs → (plugin)/(demo)/plugin.ts_demo@onload_typesafe-i18n.ejs} +0 -0
  391. /package/templates/default/src/{plugin.ts_demo@onload_vue.ejs → (plugin)/(demo)/plugin.ts_demo@onload_vue.ejs} +0 -0
  392. /package/templates/default/src/{plugin.ts_demo@onload_wasm.ejs → (plugin)/(demo)/plugin.ts_demo@onload_wasm.ejs} +0 -0
  393. /package/templates/default/src/{plugin.ts_standalone.ejs → (plugin)/(standalone)/plugin.ts_standalone.ejs} +0 -0
  394. /package/templates/default/src/{plugin.ts_standalone@import_codemirror.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_codemirror.ejs} +0 -0
  395. /package/templates/default/src/{plugin.ts_standalone@import_css-modules.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_css-modules.ejs} +0 -0
  396. /package/templates/default/src/{plugin.ts_standalone@import_i18next.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_i18next.ejs} +0 -0
  397. /package/templates/default/src/{plugin.ts_standalone@import_lit.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_lit.ejs} +0 -0
  398. /package/templates/default/src/{plugin.ts_standalone@import_preact.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_preact.ejs} +0 -0
  399. /package/templates/default/src/{plugin.ts_standalone@import_react.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_react.ejs} +0 -0
  400. /package/templates/default/src/{plugin.ts_standalone@import_solid.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_solid.ejs} +0 -0
  401. /package/templates/default/src/{plugin.ts_standalone@import_svelte.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_svelte.ejs} +0 -0
  402. /package/templates/default/src/{plugin.ts_standalone@import_typesafe-i18n.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_typesafe-i18n.ejs} +0 -0
  403. /package/templates/default/src/{plugin.ts_standalone@import_vue.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_vue.ejs} +0 -0
  404. /package/templates/default/src/{plugin.ts_standalone@import_wasm.ejs → (plugin)/(standalone)/plugin.ts_standalone@import_wasm.ejs} +0 -0
  405. /package/templates/default/src/{plugin.ts_standalone@method_ui-view.ejs → (plugin)/(standalone)/plugin.ts_standalone@method_ui-view.ejs} +0 -0
  406. /package/templates/default/src/{plugin.ts_standalone@onload_codemirror.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_codemirror.ejs} +0 -0
  407. /package/templates/default/src/{plugin.ts_standalone@onload_css-modules.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_css-modules.ejs} +0 -0
  408. /package/templates/default/src/{plugin.ts_standalone@onload_i18next.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_i18next.ejs} +0 -0
  409. /package/templates/default/src/{plugin.ts_standalone@onload_lit.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_lit.ejs} +0 -0
  410. /package/templates/default/src/{plugin.ts_standalone@onload_preact.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_preact.ejs} +0 -0
  411. /package/templates/default/src/{plugin.ts_standalone@onload_react.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_react.ejs} +0 -0
  412. /package/templates/default/src/{plugin.ts_standalone@onload_solid.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_solid.ejs} +0 -0
  413. /package/templates/default/src/{plugin.ts_standalone@onload_svelte.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_svelte.ejs} +0 -0
  414. /package/templates/default/src/{plugin.ts_standalone@onload_typesafe-i18n.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_typesafe-i18n.ejs} +0 -0
  415. /package/templates/default/src/{plugin.ts_standalone@onload_vue.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_vue.ejs} +0 -0
  416. /package/templates/default/src/{plugin.ts_standalone@onload_wasm.ejs → (plugin)/(standalone)/plugin.ts_standalone@onload_wasm.ejs} +0 -0
  417. /package/templates/default/src/{plugin-settings-component.test.ts_all-in-one.ejs → (settings)/plugin-settings-component.test.ts_all-in-one.ejs} +0 -0
  418. /package/templates/default/src/{plugin-settings-component.test.ts_all-in-one@test-imports_vitest.ejs → (settings)/plugin-settings-component.test.ts_all-in-one@test-imports_vitest.ejs} +0 -0
  419. /package/templates/default/src/{plugin-settings-component.test.ts_demo.ejs → (settings)/plugin-settings-component.test.ts_demo.ejs} +0 -0
  420. /package/templates/default/src/{plugin-settings-component.test.ts_demo@test-imports_vitest.ejs → (settings)/plugin-settings-component.test.ts_demo@test-imports_vitest.ejs} +0 -0
  421. /package/templates/default/src/{plugin-settings-component.ts_all-in-one.ejs → (settings)/plugin-settings-component.ts_all-in-one.ejs} +0 -0
  422. /package/templates/default/src/{plugin-settings-tab.ts_all-in-one.ejs → (settings)/plugin-settings-tab.ts_all-in-one.ejs} +0 -0
  423. /package/templates/default/src/{plugin-settings.test.ts_demo.ejs → (settings)/plugin-settings.test.ts_demo.ejs} +0 -0
  424. /package/templates/default/src/{plugin-settings.test.ts_demo@test-imports_vitest.ejs → (settings)/plugin-settings.test.ts_demo@test-imports_vitest.ejs} +0 -0
  425. /package/templates/default/src/{plugin-settings.ts_all-in-one.ejs → (settings)/plugin-settings.ts_all-in-one.ejs} +0 -0
  426. /package/templates/default/src/{plugin-settings.ts_demo.ejs → (settings)/plugin-settings.ts_demo.ejs} +0 -0
  427. /package/templates/default/src/{settings.ts.ejs → (settings)/settings.ts.ejs} +0 -0
package/dist/main.js CHANGED
@@ -20,18 +20,12 @@ import {
20
20
  writeFileSync as writeFileSync2
21
21
  } from "node:fs";
22
22
  import {
23
- join as join8,
23
+ join as join9,
24
24
  resolve as resolvePath
25
25
  } from "node:path";
26
26
  import { compare } from "semver";
27
27
 
28
- // src/cli-args.ts
29
- import {
30
- existsSync,
31
- readFileSync
32
- } from "node:fs";
33
-
34
- // src/clack-select.ts
28
+ // src/prompts/clack-select.ts
35
29
  import {
36
30
  SelectPrompt,
37
31
  settings
@@ -41,11 +35,11 @@ import {
41
35
  S_BAR_END,
42
36
  S_RADIO_ACTIVE,
43
37
  S_RADIO_INACTIVE,
44
- symbol
38
+ symbol as $symbol
45
39
  } from "@clack/prompts";
46
40
  import { styleText } from "node:util";
47
41
 
48
- // src/clack-utils.ts
42
+ // src/prompts/clack-utils.ts
49
43
  import {
50
44
  cancel,
51
45
  isCancel
@@ -80,14 +74,14 @@ function throwGoBackOnCancel(value) {
80
74
  return value;
81
75
  }
82
76
 
83
- // src/clack-select.ts
77
+ // src/prompts/clack-select.ts
84
78
  async function select(opts) {
85
79
  const selectOpts = {
86
80
  options: opts.options,
87
81
  render() {
88
82
  const withGuide = settings.withGuide;
89
83
  const header = `${withGuide ? `${styleText("gray", S_BAR)}
90
- ` : ""}${symbol(this.state)} ${opts.message}
84
+ ` : ""}${$symbol(this.state)} ${opts.message}
91
85
  `;
92
86
  const selected = this.options[this.cursor];
93
87
  switch (this.state) {
@@ -160,13 +154,444 @@ async function promptFeature(params) {
160
154
  });
161
155
  return result;
162
156
  }
163
- function resolveFeature(options, value) {
164
- const option = options.find((o) => o.settingValue === value);
165
- if (!option) {
166
- throw new Error(`Unknown feature value: ${value}`);
157
+ function resolveFeature(options, value) {
158
+ const option = options.find((o) => o.settingValue === value);
159
+ if (!option) {
160
+ throw new Error(`Unknown feature value: ${value}`);
161
+ }
162
+ return option;
163
+ }
164
+
165
+ // src/features/preset/official-sample.ts
166
+ var OFFICIAL_SAMPLE_PRESET = "official-sample";
167
+ var OFFICIAL_SAMPLE_ANSWER_KEYS = [
168
+ "authorGitHubName",
169
+ "authorName",
170
+ "defaultBranch",
171
+ "fundingPlatform",
172
+ "fundingUrl",
173
+ "fundingUsername",
174
+ "pluginDescription",
175
+ "pluginId",
176
+ "pluginName",
177
+ "preset"
178
+ ];
179
+ var OfficialSample = class extends FeatureOption {
180
+ constructor() {
181
+ super({
182
+ promptHint: "Exactly obsidianmd/obsidian-sample-plugin, with your plugin's id, name, author and description filled in",
183
+ promptLabel: "Official sample plugin",
184
+ settingValue: OFFICIAL_SAMPLE_PRESET
185
+ });
186
+ }
187
+ };
188
+ function isOfficialSamplePreset(preset) {
189
+ return preset === OFFICIAL_SAMPLE_PRESET;
190
+ }
191
+
192
+ // src/answers/cli-args.ts
193
+ import {
194
+ existsSync,
195
+ readFileSync
196
+ } from "node:fs";
197
+
198
+ // src/directory/directory-constraints.ts
199
+ var CORE_FEATURE_NAMES = [
200
+ "Audio recorder",
201
+ "Backlinks",
202
+ "Bases",
203
+ "Bookmarks",
204
+ "Canvas",
205
+ "Command palette",
206
+ "Daily notes",
207
+ "File recovery",
208
+ "Files",
209
+ "Footnotes",
210
+ "Format converter",
211
+ "Graph view",
212
+ "Live Preview",
213
+ "Note composer",
214
+ "Outgoing links",
215
+ "Outline",
216
+ "Page preview",
217
+ "Properties view",
218
+ "Publish",
219
+ "Quick Switcher",
220
+ "Random note",
221
+ "Reading view",
222
+ "Search",
223
+ "Slash commands",
224
+ "Slides",
225
+ "Source mode",
226
+ "Sync",
227
+ "Tags view",
228
+ "Templates",
229
+ "Unique note creator",
230
+ "Web viewer",
231
+ "Word count",
232
+ "Workspaces"
233
+ ];
234
+ var MAX_DESCRIPTION_LENGTH = 250;
235
+ var MIN_DESCRIPTION_LENGTH = 10;
236
+ var ALLOWED_ID_CHARACTERS = /^[a-z0-9-]+$/;
237
+ var ALLOWED_NAME_CHARACTERS = /^[A-Za-z0-9 \-+()]+$/;
238
+ var EMOJI = /\p{Extended_Pictographic}/u;
239
+ var OBSIDIAN_WORD = /\bobsidian\b/i;
240
+ var OBSIDIAN_NAME_VARIANTS = /obsi|sidian/i;
241
+ var SELF_REFERENCE_PATTERNS = [
242
+ /\bthis plugin\b/i,
243
+ /\bthis is a plugin\b/i,
244
+ /\ba plugin (?:that|which)\b/i,
245
+ /^the plugin\b/i,
246
+ /^plugin\b/i
247
+ ];
248
+ function findUnlistableManifestAnswers(answers) {
249
+ const checked = [
250
+ { key: "pluginId", message: validatePluginId(answers.pluginId), value: answers.pluginId },
251
+ { key: "pluginName", message: validatePluginName(answers.pluginName), value: answers.pluginName },
252
+ { key: "pluginDescription", message: validatePluginDescription(answers.pluginDescription), value: answers.pluginDescription }
253
+ ];
254
+ const problems = [];
255
+ for (const { key, message, value } of checked) {
256
+ if (message !== void 0) {
257
+ problems.push({ key, message, value });
258
+ }
259
+ }
260
+ return problems;
261
+ }
262
+ function validatePluginDescription(input) {
263
+ if (!input) {
264
+ return "Should not be empty";
265
+ }
266
+ if (EMOJI.test(input)) {
267
+ return "Should not contain emoji -- the Community directory rejects them, though it does accept ordinary punctuation such as backticks, em dashes and parentheses";
268
+ }
269
+ if (OBSIDIAN_WORD.test(input)) {
270
+ return 'Should not contain the word "Obsidian" -- the Community directory rejects it as implied by the plugin directory, even though no Obsidian document says so';
271
+ }
272
+ if (SELF_REFERENCE_PATTERNS.some((pattern) => pattern.test(input))) {
273
+ return 'Should say what the plugin does rather than refer to itself -- the Community directory rejects "This plugin..." and "a plugin that...". Naming another plugin is fine';
274
+ }
275
+ if (input.length < MIN_DESCRIPTION_LENGTH) {
276
+ return `Should be at least ${String(MIN_DESCRIPTION_LENGTH)} characters, so it says what the plugin does`;
277
+ }
278
+ if (input.length > MAX_DESCRIPTION_LENGTH) {
279
+ return `Should be at most ${String(MAX_DESCRIPTION_LENGTH)} characters -- the Community directory rejects a longer one`;
280
+ }
281
+ if (!/^[A-Z]/.test(input)) {
282
+ return 'Should start with a capital letter, ideally on an action verb: "Translates selected text...", "Imports notes from..."';
283
+ }
284
+ if (!input.endsWith(".")) {
285
+ return "Should end with a dot";
286
+ }
287
+ return void 0;
288
+ }
289
+ function validatePluginId(input) {
290
+ if (!input) {
291
+ return "Should not be empty";
292
+ }
293
+ if (!ALLOWED_ID_CHARACTERS.test(input)) {
294
+ return "Should contain only lowercase English letters, digits and hyphens";
295
+ }
296
+ if (!/^[a-z]/.test(input)) {
297
+ return "Should start with a letter";
298
+ }
299
+ if (!/[a-z0-9]$/.test(input)) {
300
+ return "Should end with a letter or digit";
301
+ }
302
+ if (input.includes("obsidian")) {
303
+ return 'Should not contain "obsidian" anywhere -- the Community directory rejects it as implied by the plugin directory, and an id can never be changed once the plugin is published';
304
+ }
305
+ if (input.endsWith("plugin")) {
306
+ return 'Should not end with "plugin" -- the Community directory rejects it as implied, and an id can never be changed once the plugin is published';
307
+ }
308
+ return void 0;
309
+ }
310
+ function validatePluginName(input) {
311
+ if (!input) {
312
+ return "Should not be empty";
313
+ }
314
+ if (OBSIDIAN_NAME_VARIANTS.test(input)) {
315
+ return 'Should not contain "Obsidian" or an abbreviation of it ("Obsi", "sidian") -- the Community directory rejects it as implied by the plugin directory';
316
+ }
317
+ if (input.toLowerCase().includes("plugin")) {
318
+ return 'Should not contain "Plugin" -- the Community directory rejects it as implied by the plugin directory';
319
+ }
320
+ const coreName = findCoreFeatureName(input);
321
+ if (coreName !== void 0) {
322
+ return `Should not be the name of an Obsidian core plugin or core feature -- "${coreName}" is one, and the Community directory rejects a name that takes it`;
323
+ }
324
+ if (!ALLOWED_NAME_CHARACTERS.test(input)) {
325
+ return "Should use Basic Latin letters and digits only, with hyphens, plus signs and parentheses the only punctuation the Community directory accepts";
326
+ }
327
+ return void 0;
328
+ }
329
+ function findCoreFeatureName(name) {
330
+ const normalized = name.trim().toLowerCase();
331
+ return CORE_FEATURE_NAMES.find((candidate) => candidate.toLowerCase() === normalized);
332
+ }
333
+
334
+ // src/features/funding-platform/funding-platform-option.ts
335
+ var FundingPlatformOption = class extends FeatureOption {
336
+ badgeColor;
337
+ badgeLabel;
338
+ badgeLogo;
339
+ badgeLogoColor;
340
+ fundingYmlKey;
341
+ constructor(config) {
342
+ super({ promptHint: config.promptHint, promptLabel: config.promptLabel, settingValue: config.settingValue });
343
+ this.badgeColor = config.badgeColor;
344
+ this.badgeLabel = config.badgeLabel;
345
+ this.badgeLogo = config.badgeLogo;
346
+ this.badgeLogoColor = config.badgeLogoColor;
347
+ this.fundingYmlKey = config.fundingYmlKey;
348
+ }
349
+ /** The shields.io badge, as one markdown image link to {@link getUrl}. */
350
+ getBadge(answers) {
351
+ const label = encodeURIComponent(this.badgeLabel.replaceAll("-", "--").replaceAll("_", "__"));
352
+ let query = "";
353
+ if (this.badgeLogo !== void 0) {
354
+ query = `?logo=${this.badgeLogo}`;
355
+ if (this.badgeLogoColor !== void 0) {
356
+ query += `&logoColor=${this.badgeLogoColor}`;
357
+ }
358
+ }
359
+ return `[![${this.badgeLabel}](https://img.shields.io/badge/${label}-${this.badgeColor}${query})](${this.getUrl(answers)})`;
360
+ }
361
+ /** The value written after `<fundingYmlKey>: ` in `FUNDING.yml`. */
362
+ getFundingYmlValue(answers) {
363
+ return answers.fundingUsername;
364
+ }
365
+ };
366
+
367
+ // src/features/funding-platform/buy-me-a-coffee.ts
368
+ var BuyMeACoffee = class extends FundingPlatformOption {
369
+ constructor() {
370
+ super({
371
+ badgeColor: "ffdd00",
372
+ badgeLabel: "Buy Me a Coffee",
373
+ badgeLogo: "buy-me-a-coffee",
374
+ badgeLogoColor: "black",
375
+ fundingYmlKey: "buy_me_a_coffee",
376
+ promptHint: "buymeacoffee.com/<username>",
377
+ promptLabel: "Buy Me a Coffee",
378
+ settingValue: "buy-me-a-coffee"
379
+ });
380
+ }
381
+ getUrl(answers) {
382
+ return `https://www.buymeacoffee.com/${answers.fundingUsername}`;
383
+ }
384
+ };
385
+
386
+ // src/features/funding-platform/custom.ts
387
+ var Custom = class extends FundingPlatformOption {
388
+ constructor() {
389
+ super({
390
+ badgeColor: "ff69b4",
391
+ badgeLabel: "Support",
392
+ fundingYmlKey: "custom",
393
+ promptHint: "Any other URL",
394
+ promptLabel: "Custom URL",
395
+ settingValue: "custom"
396
+ });
397
+ }
398
+ /** A one-element flow sequence, single-quoted so a URL's `#` or `: ` cannot end the scalar early. */
399
+ getFundingYmlValue(answers) {
400
+ return `['${answers.fundingUrl.replaceAll("'", "''")}']`;
401
+ }
402
+ getUrl(answers) {
403
+ return answers.fundingUrl;
404
+ }
405
+ };
406
+
407
+ // src/features/funding-platform/github-sponsors.ts
408
+ var GitHubSponsors = class extends FundingPlatformOption {
409
+ constructor() {
410
+ super({
411
+ badgeColor: "ea4aaa",
412
+ badgeLabel: "GitHub Sponsors",
413
+ badgeLogo: "githubsponsors",
414
+ badgeLogoColor: "white",
415
+ fundingYmlKey: "github",
416
+ promptHint: "github.com/sponsors/<username>",
417
+ promptLabel: "GitHub Sponsors",
418
+ settingValue: "github-sponsors"
419
+ });
420
+ }
421
+ getUrl(answers) {
422
+ return `https://github.com/sponsors/${answers.fundingUsername}`;
423
+ }
424
+ };
425
+
426
+ // src/features/funding-platform/ko-fi.ts
427
+ var KoFi = class extends FundingPlatformOption {
428
+ constructor() {
429
+ super({
430
+ badgeColor: "ff5e5b",
431
+ badgeLabel: "Ko-fi",
432
+ badgeLogo: "kofi",
433
+ badgeLogoColor: "white",
434
+ fundingYmlKey: "ko_fi",
435
+ promptHint: "ko-fi.com/<username>",
436
+ promptLabel: "Ko-fi",
437
+ settingValue: "ko-fi"
438
+ });
439
+ }
440
+ getUrl(answers) {
441
+ return `https://ko-fi.com/${answers.fundingUsername}`;
442
+ }
443
+ };
444
+
445
+ // src/features/funding-platform/liberapay.ts
446
+ var Liberapay = class extends FundingPlatformOption {
447
+ constructor() {
448
+ super({
449
+ badgeColor: "f6c915",
450
+ badgeLabel: "Liberapay",
451
+ badgeLogo: "liberapay",
452
+ badgeLogoColor: "black",
453
+ fundingYmlKey: "liberapay",
454
+ promptHint: "liberapay.com/<username>",
455
+ promptLabel: "Liberapay",
456
+ settingValue: "liberapay"
457
+ });
458
+ }
459
+ getUrl(answers) {
460
+ return `https://liberapay.com/${answers.fundingUsername}`;
461
+ }
462
+ };
463
+
464
+ // src/features/funding-platform/none.ts
465
+ var None = class extends FundingPlatformOption {
466
+ constructor() {
467
+ super({
468
+ badgeColor: "",
469
+ badgeLabel: "",
470
+ fundingYmlKey: "",
471
+ promptHint: "No funding link, FUNDING.yml or badge",
472
+ promptLabel: "(none)",
473
+ settingValue: "none"
474
+ });
475
+ }
476
+ getUrl() {
477
+ return "";
478
+ }
479
+ };
480
+
481
+ // src/features/funding-platform/open-collective.ts
482
+ var OpenCollective = class extends FundingPlatformOption {
483
+ constructor() {
484
+ super({
485
+ badgeColor: "7fadf2",
486
+ badgeLabel: "Open Collective",
487
+ badgeLogo: "opencollective",
488
+ badgeLogoColor: "white",
489
+ fundingYmlKey: "open_collective",
490
+ promptHint: "opencollective.com/<username>",
491
+ promptLabel: "Open Collective",
492
+ settingValue: "open-collective"
493
+ });
494
+ }
495
+ getUrl(answers) {
496
+ return `https://opencollective.com/${answers.fundingUsername}`;
497
+ }
498
+ };
499
+
500
+ // src/features/funding-platform/patreon.ts
501
+ var Patreon = class extends FundingPlatformOption {
502
+ constructor() {
503
+ super({
504
+ badgeColor: "f96854",
505
+ badgeLabel: "Patreon",
506
+ badgeLogo: "patreon",
507
+ badgeLogoColor: "white",
508
+ fundingYmlKey: "patreon",
509
+ promptHint: "patreon.com/<username>",
510
+ promptLabel: "Patreon",
511
+ settingValue: "patreon"
512
+ });
513
+ }
514
+ getUrl(answers) {
515
+ return `https://www.patreon.com/${answers.fundingUsername}`;
516
+ }
517
+ };
518
+
519
+ // src/features/funding-platform/polar.ts
520
+ var Polar = class extends FundingPlatformOption {
521
+ constructor() {
522
+ super({
523
+ badgeColor: "0062ff",
524
+ badgeLabel: "Polar",
525
+ fundingYmlKey: "polar",
526
+ promptHint: "polar.sh/<username>",
527
+ promptLabel: "Polar",
528
+ settingValue: "polar"
529
+ });
530
+ }
531
+ getUrl(answers) {
532
+ return `https://polar.sh/${answers.fundingUsername}`;
533
+ }
534
+ };
535
+
536
+ // src/features/funding-platform/thanks-dev.ts
537
+ var ThanksDev = class extends FundingPlatformOption {
538
+ constructor() {
539
+ super({
540
+ badgeColor: "000000",
541
+ badgeLabel: "thanks.dev",
542
+ fundingYmlKey: "thanks_dev",
543
+ promptHint: "thanks.dev/<username>, e.g. u/gh/<GitHub username>",
544
+ promptLabel: "thanks.dev",
545
+ settingValue: "thanks-dev"
546
+ });
547
+ }
548
+ getUrl(answers) {
549
+ return `https://thanks.dev/${answers.fundingUsername}`;
550
+ }
551
+ };
552
+
553
+ // src/features/funding-platform/index.ts
554
+ var FUNDING_PLATFORM_OPTIONS = [
555
+ new None(),
556
+ new BuyMeACoffee(),
557
+ new GitHubSponsors(),
558
+ new KoFi(),
559
+ new Liberapay(),
560
+ new OpenCollective(),
561
+ new Patreon(),
562
+ new Polar(),
563
+ new ThanksDev(),
564
+ new Custom()
565
+ ];
566
+ function asksFundingUsername(platform) {
567
+ return platform !== void 0 && platform !== "none" && platform !== "custom";
568
+ }
569
+ async function promptFundingPlatform(savedValue) {
570
+ return promptFeature({ defaultOption: new BuyMeACoffee(), message: "Funding platform", options: FUNDING_PLATFORM_OPTIONS, savedValue });
571
+ }
572
+ function resolveFunding(answers) {
573
+ const option = FUNDING_PLATFORM_OPTIONS.find((candidate) => candidate.settingValue === answers.fundingPlatform);
574
+ if (!option?.getUrl(answers)) {
575
+ return null;
167
576
  }
168
577
  return option;
169
578
  }
579
+ function validateFundingUsername(value) {
580
+ if (!value) {
581
+ return "Should not be empty";
582
+ }
583
+ if (!/^[\w./-]+$/.test(value)) {
584
+ return "Use only letters, digits, `.`, `_`, `-` and `/`";
585
+ }
586
+ return void 0;
587
+ }
588
+
589
+ // src/prompts/prompts.ts
590
+ import {
591
+ cancel as cancel2,
592
+ log
593
+ } from "@clack/prompts";
594
+ import { styleText as styleText3 } from "node:util";
170
595
 
171
596
  // src/features/api-subset/official.ts
172
597
  var Official = class extends FeatureOption {
@@ -191,22 +616,25 @@ async function promptApiSubset(savedValue) {
191
616
  return promptFeature({ defaultOption: new Official(), message: "Obsidian API subset", options: API_SUBSET_OPTIONS, savedValue });
192
617
  }
193
618
 
619
+ // src/features/preset/is-framework-preset.ts
620
+ var FRAMEWORK_PRESETS = /* @__PURE__ */ new Set(["all-in-one", "demo", "docs-showcase"]);
621
+ function isFrameworkPreset(preset) {
622
+ return FRAMEWORK_PRESETS.has(preset);
623
+ }
624
+
194
625
  // src/features/bundler/esbuild.ts
195
626
  var Esbuild = class extends FeatureOption {
196
627
  constructor() {
197
628
  super({ promptHint: "Fast and simple (recommended)", promptLabel: "esbuild", settingValue: "esbuild" });
198
629
  }
199
- configure(builder) {
630
+ configure(builder, answers) {
631
+ if (isFrameworkPreset(answers.preset)) {
632
+ return;
633
+ }
200
634
  builder.addPackage("esbuild");
201
635
  }
202
636
  };
203
637
 
204
- // src/features/preset/is-framework-preset.ts
205
- var FRAMEWORK_PRESETS = /* @__PURE__ */ new Set(["all-in-one", "demo", "docs-showcase"]);
206
- function isFrameworkPreset(preset) {
207
- return FRAMEWORK_PRESETS.has(preset);
208
- }
209
-
210
638
  // src/features/bundler/parcel.ts
211
639
  var Parcel = class extends FeatureOption {
212
640
  constructor() {
@@ -321,14 +749,14 @@ var ConventionalCommits = class extends FeatureOption {
321
749
  };
322
750
 
323
751
  // src/features/commit-linting/none.ts
324
- var None = class extends FeatureOption {
752
+ var None2 = class extends FeatureOption {
325
753
  constructor() {
326
754
  super({ promptHint: "No commit linting", promptLabel: "(none)", settingValue: "none" });
327
755
  }
328
756
  };
329
757
 
330
758
  // src/features/commit-linting/index.ts
331
- var COMMIT_LINTING_OPTIONS = [new None(), new ConventionalCommits()];
759
+ var COMMIT_LINTING_OPTIONS = [new None2(), new ConventionalCommits()];
332
760
  async function promptCommitLinting(savedValue) {
333
761
  return promptFeature({ defaultOption: new ConventionalCommits(), message: "Commit linting", options: COMMIT_LINTING_OPTIONS, savedValue });
334
762
  }
@@ -356,409 +784,154 @@ function isMeasured(answers) {
356
784
  }
357
785
 
358
786
  // src/features/coverage-badge/none.ts
359
- var None2 = class extends FeatureOption {
787
+ var None3 = class extends FeatureOption {
360
788
  constructor() {
361
789
  super({ promptHint: "No coverage badge", promptLabel: "(none)", settingValue: "none" });
362
790
  }
363
791
  };
364
792
 
365
793
  // src/features/coverage-badge/index.ts
366
- var COVERAGE_BADGE_OPTIONS = [new None2(), new CoverageBadge()];
794
+ var COVERAGE_BADGE_OPTIONS = [new None3(), new CoverageBadge()];
367
795
  async function promptCoverageBadge(savedValue) {
368
- return promptFeature({ defaultOption: new None2(), message: "Coverage badge", options: COVERAGE_BADGE_OPTIONS, savedValue });
796
+ return promptFeature({ defaultOption: new None3(), message: "Coverage badge", options: COVERAGE_BADGE_OPTIONS, savedValue });
369
797
  }
370
798
 
371
799
  // src/features/e2e-test-runner/none.ts
372
- var None3 = class extends FeatureOption {
373
- constructor() {
374
- super({ promptHint: "No E2E testing", promptLabel: "(none)", settingValue: "none" });
375
- }
376
- };
377
-
378
- // src/features/e2e-test-runner/obsidian-test.ts
379
- var ObsidianTest = class extends FeatureOption {
380
- constructor() {
381
- super({ promptHint: "Tests run inside Obsidian with real app APIs", promptLabel: "obsidian-test", settingValue: "obsidian-test" });
382
- }
383
- configure(builder) {
384
- builder.addPackage("obsidian-test").addScript("test:e2e").addFiles([
385
- "e2e/sample.spec.ts",
386
- "scripts/test-e2e.ts"
387
- ]).addPartial("has-e2e");
388
- }
389
- };
390
-
391
- // src/features/e2e-test-runner/wdio-obsidian.ts
392
- var WdioObsidian = class extends FeatureOption {
393
- constructor() {
394
- super({ promptHint: "WebdriverIO service for Obsidian, multi-version & CI/CD", promptLabel: "wdio-obsidian", settingValue: "wdio-obsidian" });
395
- }
396
- configure(builder, answers) {
397
- builder.addPackage("@wdio/cli").addDepcheckIgnore("@wdio/cli", "run as the `wdio` CLI by `scripts/test-e2e.ts`.").addPackage("@wdio/globals").addPackage("@wdio/local-runner").addDepcheckIgnore("@wdio/local-runner", "loaded by name by wdio for the config's `runner: 'local'`.").addPackage("@wdio/mocha-framework").addPackage("expect-webdriverio").addPackage("wdio-obsidian-service").addScript("test:e2e").addFiles([
398
- "e2e/sample.spec.ts",
399
- "scripts/test-e2e.ts"
400
- ]).addPartial("has-e2e");
401
- if (isFrameworkPreset(answers.preset)) {
402
- builder.addPackage("wdio-obsidian-reporter").addDepcheckIgnore("wdio-obsidian-reporter", "loaded by name by wdio for the `obsidian` reporter `defineWdioObsidianConfig` names.").addFiles(["wdio.conf.mts"]);
403
- return;
404
- }
405
- builder.addFiles(["wdio.conf.ts"]);
406
- }
407
- };
408
-
409
- // src/features/e2e-test-runner/index.ts
410
- var E2E_TEST_RUNNER_OPTIONS = [new None3(), new ObsidianTest(), new WdioObsidian()];
411
- async function promptE2eTestRunner(savedValue) {
412
- return promptFeature({ defaultOption: new None3(), message: "E2E testing", options: E2E_TEST_RUNNER_OPTIONS, savedValue });
413
- }
414
-
415
- // src/features/editor-extensions/code-mirror.ts
416
- var CodeMirror = class extends FeatureOption {
417
- constructor() {
418
- super({ promptHint: "CodeMirror 6 state fields, view plugins, decorations", promptLabel: "CodeMirror", settingValue: "codemirror" });
419
- }
420
- configure(builder) {
421
- builder.addPackage("@codemirror/state").addPackage("@codemirror/view").addFiles([
422
- "src/editor-extensions/sample-state-field.ts",
423
- "src/editor-extensions/sample-view-plugin.ts",
424
- "src/editor-extensions/sample-widget.ts",
425
- "src/editor-suggests/sample-editor-suggest.ts"
426
- ]);
427
- }
428
- };
429
-
430
- // src/features/editor-extensions/none.ts
431
800
  var None4 = class extends FeatureOption {
432
801
  constructor() {
433
- super({ promptHint: "No editor extensions", promptLabel: "(none)", settingValue: "none" });
434
- }
435
- };
436
-
437
- // src/features/editor-extensions/index.ts
438
- var EDITOR_EXTENSIONS_OPTIONS = [new None4(), new CodeMirror()];
439
- async function promptEditorExtensions(savedValue) {
440
- return promptFeature({ defaultOption: new None4(), message: "Editor extensions", options: EDITOR_EXTENSIONS_OPTIONS, savedValue });
441
- }
442
-
443
- // src/features/formatter/biome.ts
444
- var Biome = class extends FeatureOption {
445
- constructor() {
446
- super({ partialName: "biome-formatter", promptHint: "Fast formatter (pairs with Biome linter)", promptLabel: "Biome", settingValue: "biome" });
447
- }
448
- configure(builder, answers) {
449
- if (answers.linter !== "biome") {
450
- builder.addLintStagedCommand("*.{ts,tsx,mts}", "biome format --write --no-errors-on-unmatched");
451
- }
452
- builder.addPackage("@biomejs/biome").addDepcheckIgnore("@biomejs/biome", "run as the `biome` CLI by the format and lint scripts, configured by `biome.jsonc`.").addScript("format").addScript("format:check").addFiles([
453
- "biome.jsonc",
454
- "scripts/format.ts",
455
- "scripts/format-check.ts"
456
- ]);
457
- }
458
- };
459
-
460
- // src/features/formatter/dprint.ts
461
- var Dprint = class extends FeatureOption {
462
- constructor() {
463
- super({ promptHint: "Fast, pluggable, written in Rust", promptLabel: "dprint", settingValue: "dprint" });
464
- }
465
- configure(builder) {
466
- builder.addLintStagedCommand("*.{ts,tsx,mts}", "dprint fmt").addPackage("dprint").addDepcheckIgnore("dprint", "run as a CLI by the format scripts, configured by `dprint.json`.").addScript("format").addScript("format:check").addFiles([
467
- "dprint.json",
468
- "scripts/format.ts",
469
- "scripts/format-check.ts"
470
- ]);
471
- }
472
- };
473
-
474
- // src/features/formatter/none.ts
475
- var None5 = class extends FeatureOption {
476
- constructor() {
477
- super({ promptHint: "No formatting", promptLabel: "(none)", settingValue: "none" });
478
- }
479
- };
480
-
481
- // src/features/formatter/prettier.ts
482
- var Prettier = class extends FeatureOption {
483
- constructor() {
484
- super({ promptHint: "Opinionated, widely adopted", promptLabel: "Prettier", settingValue: "prettier" });
485
- }
486
- configure(builder, answers) {
487
- builder.addLintStagedCommand("*.{ts,tsx,mts}", "prettier --write").addPackage("prettier").addScript("format").addScript("format:check").addFiles([
488
- ".prettierignore",
489
- "prettier.config.mjs",
490
- "scripts/format.ts",
491
- "scripts/format-check.ts"
492
- ]);
493
- if (!isFrameworkPreset(answers.preset)) {
494
- builder.addFiles(["scripts/prettier.config.ts"]);
495
- }
496
- }
497
- };
498
-
499
- // src/features/formatter/index.ts
500
- var FORMATTER_OPTIONS = [new None5(), new Biome(), new Dprint(), new Prettier()];
501
- var FORMATTERS_NEEDING_INITIAL_FORMAT = /* @__PURE__ */ new Set(["biome", "prettier"]);
502
- function needsInitialFormat(formatter) {
503
- return FORMATTERS_NEEDING_INITIAL_FORMAT.has(formatter);
504
- }
505
- async function promptFormatter(savedValue) {
506
- return promptFeature({ defaultOption: new Dprint(), message: "Formatter", options: FORMATTER_OPTIONS, savedValue });
507
- }
508
-
509
- // src/features/funding-platform/funding-platform-option.ts
510
- var FundingPlatformOption = class extends FeatureOption {
511
- badgeColor;
512
- badgeLabel;
513
- badgeLogo;
514
- badgeLogoColor;
515
- fundingYmlKey;
516
- constructor(config) {
517
- super({ promptHint: config.promptHint, promptLabel: config.promptLabel, settingValue: config.settingValue });
518
- this.badgeColor = config.badgeColor;
519
- this.badgeLabel = config.badgeLabel;
520
- this.badgeLogo = config.badgeLogo;
521
- this.badgeLogoColor = config.badgeLogoColor;
522
- this.fundingYmlKey = config.fundingYmlKey;
523
- }
524
- /** The shields.io badge, as one markdown image link to {@link getUrl}. */
525
- getBadge(answers) {
526
- const label = encodeURIComponent(this.badgeLabel.replaceAll("-", "--").replaceAll("_", "__"));
527
- let query = "";
528
- if (this.badgeLogo !== void 0) {
529
- query = `?logo=${this.badgeLogo}`;
530
- if (this.badgeLogoColor !== void 0) {
531
- query += `&logoColor=${this.badgeLogoColor}`;
532
- }
533
- }
534
- return `[![${this.badgeLabel}](https://img.shields.io/badge/${label}-${this.badgeColor}${query})](${this.getUrl(answers)})`;
535
- }
536
- /** The value written after `<fundingYmlKey>: ` in `FUNDING.yml`. */
537
- getFundingYmlValue(answers) {
538
- return answers.fundingUsername;
539
- }
540
- };
541
-
542
- // src/features/funding-platform/buy-me-a-coffee.ts
543
- var BuyMeACoffee = class extends FundingPlatformOption {
544
- constructor() {
545
- super({
546
- badgeColor: "ffdd00",
547
- badgeLabel: "Buy Me a Coffee",
548
- badgeLogo: "buy-me-a-coffee",
549
- badgeLogoColor: "black",
550
- fundingYmlKey: "buy_me_a_coffee",
551
- promptHint: "buymeacoffee.com/<username>",
552
- promptLabel: "Buy Me a Coffee",
553
- settingValue: "buy-me-a-coffee"
554
- });
555
- }
556
- getUrl(answers) {
557
- return `https://www.buymeacoffee.com/${answers.fundingUsername}`;
558
- }
559
- };
560
-
561
- // src/features/funding-platform/custom.ts
562
- var Custom = class extends FundingPlatformOption {
563
- constructor() {
564
- super({
565
- badgeColor: "ff69b4",
566
- badgeLabel: "Support",
567
- fundingYmlKey: "custom",
568
- promptHint: "Any other URL",
569
- promptLabel: "Custom URL",
570
- settingValue: "custom"
571
- });
572
- }
573
- /** A one-element flow sequence, single-quoted so a URL's `#` or `: ` cannot end the scalar early. */
574
- getFundingYmlValue(answers) {
575
- return `['${answers.fundingUrl.replaceAll("'", "''")}']`;
576
- }
577
- getUrl(answers) {
578
- return answers.fundingUrl;
802
+ super({ promptHint: "No E2E testing", promptLabel: "(none)", settingValue: "none" });
579
803
  }
580
804
  };
581
805
 
582
- // src/features/funding-platform/github-sponsors.ts
583
- var GitHubSponsors = class extends FundingPlatformOption {
806
+ // src/features/e2e-test-runner/obsidian-test.ts
807
+ var ObsidianTest = class extends FeatureOption {
584
808
  constructor() {
585
- super({
586
- badgeColor: "ea4aaa",
587
- badgeLabel: "GitHub Sponsors",
588
- badgeLogo: "githubsponsors",
589
- badgeLogoColor: "white",
590
- fundingYmlKey: "github",
591
- promptHint: "github.com/sponsors/<username>",
592
- promptLabel: "GitHub Sponsors",
593
- settingValue: "github-sponsors"
594
- });
809
+ super({ promptHint: "Tests run inside Obsidian with real app APIs", promptLabel: "obsidian-test", settingValue: "obsidian-test" });
595
810
  }
596
- getUrl(answers) {
597
- return `https://github.com/sponsors/${answers.fundingUsername}`;
811
+ configure(builder) {
812
+ builder.addPackage("obsidian-test").addScript("test:e2e").addFiles([
813
+ "e2e/sample.spec.ts",
814
+ "scripts/test-e2e.ts"
815
+ ]).addPartial("has-e2e");
598
816
  }
599
817
  };
600
818
 
601
- // src/features/funding-platform/ko-fi.ts
602
- var KoFi = class extends FundingPlatformOption {
819
+ // src/features/e2e-test-runner/wdio-obsidian.ts
820
+ var WdioObsidian = class extends FeatureOption {
603
821
  constructor() {
604
- super({
605
- badgeColor: "ff5e5b",
606
- badgeLabel: "Ko-fi",
607
- badgeLogo: "kofi",
608
- badgeLogoColor: "white",
609
- fundingYmlKey: "ko_fi",
610
- promptHint: "ko-fi.com/<username>",
611
- promptLabel: "Ko-fi",
612
- settingValue: "ko-fi"
613
- });
822
+ super({ promptHint: "WebdriverIO service for Obsidian, multi-version & CI/CD", promptLabel: "wdio-obsidian", settingValue: "wdio-obsidian" });
614
823
  }
615
- getUrl(answers) {
616
- return `https://ko-fi.com/${answers.fundingUsername}`;
824
+ configure(builder, answers) {
825
+ builder.addPackage("@wdio/cli").addDepcheckIgnore("@wdio/cli", "run as the `wdio` CLI by `scripts/test-e2e.ts`.").addPackage("@wdio/globals").addPackage("@wdio/local-runner").addDepcheckIgnore("@wdio/local-runner", "loaded by name by wdio for the config's `runner: 'local'`.").addPackage("@wdio/mocha-framework").addPackage("expect-webdriverio").addPackage("wdio-obsidian-service").addScript("test:e2e").addFiles([
826
+ "e2e/sample.spec.ts",
827
+ "scripts/test-e2e.ts"
828
+ ]).addPartial("has-e2e");
829
+ if (isFrameworkPreset(answers.preset)) {
830
+ builder.addPackage("wdio-obsidian-reporter").addDepcheckIgnore("wdio-obsidian-reporter", "loaded by name by wdio for the `obsidian` reporter `defineWdioObsidianConfig` names.").addFiles(["wdio.conf.mts"]);
831
+ return;
832
+ }
833
+ builder.addFiles(["wdio.conf.ts"]);
617
834
  }
618
835
  };
619
836
 
620
- // src/features/funding-platform/liberapay.ts
621
- var Liberapay = class extends FundingPlatformOption {
837
+ // src/features/e2e-test-runner/index.ts
838
+ var E2E_TEST_RUNNER_OPTIONS = [new None4(), new ObsidianTest(), new WdioObsidian()];
839
+ async function promptE2eTestRunner(savedValue) {
840
+ return promptFeature({ defaultOption: new None4(), message: "E2E testing", options: E2E_TEST_RUNNER_OPTIONS, savedValue });
841
+ }
842
+
843
+ // src/features/editor-extensions/code-mirror.ts
844
+ var CodeMirror = class extends FeatureOption {
622
845
  constructor() {
623
- super({
624
- badgeColor: "f6c915",
625
- badgeLabel: "Liberapay",
626
- badgeLogo: "liberapay",
627
- badgeLogoColor: "black",
628
- fundingYmlKey: "liberapay",
629
- promptHint: "liberapay.com/<username>",
630
- promptLabel: "Liberapay",
631
- settingValue: "liberapay"
632
- });
846
+ super({ promptHint: "CodeMirror 6 state fields, view plugins, decorations", promptLabel: "CodeMirror", settingValue: "codemirror" });
633
847
  }
634
- getUrl(answers) {
635
- return `https://liberapay.com/${answers.fundingUsername}`;
848
+ configure(builder) {
849
+ builder.addPackage("@codemirror/state").addPackage("@codemirror/view").addFiles([
850
+ "src/editor-extensions/sample-state-field.ts",
851
+ "src/editor-extensions/sample-view-plugin.ts",
852
+ "src/editor-extensions/sample-widget.ts",
853
+ "src/editor-suggests/sample-editor-suggest.ts"
854
+ ]);
636
855
  }
637
856
  };
638
857
 
639
- // src/features/funding-platform/none.ts
640
- var None6 = class extends FundingPlatformOption {
858
+ // src/features/editor-extensions/none.ts
859
+ var None5 = class extends FeatureOption {
641
860
  constructor() {
642
- super({
643
- badgeColor: "",
644
- badgeLabel: "",
645
- fundingYmlKey: "",
646
- promptHint: "No funding link, FUNDING.yml or badge",
647
- promptLabel: "(none)",
648
- settingValue: "none"
649
- });
650
- }
651
- getUrl() {
652
- return "";
861
+ super({ promptHint: "No editor extensions", promptLabel: "(none)", settingValue: "none" });
653
862
  }
654
863
  };
655
864
 
656
- // src/features/funding-platform/open-collective.ts
657
- var OpenCollective = class extends FundingPlatformOption {
865
+ // src/features/editor-extensions/index.ts
866
+ var EDITOR_EXTENSIONS_OPTIONS = [new None5(), new CodeMirror()];
867
+ async function promptEditorExtensions(savedValue) {
868
+ return promptFeature({ defaultOption: new None5(), message: "Editor extensions", options: EDITOR_EXTENSIONS_OPTIONS, savedValue });
869
+ }
870
+
871
+ // src/features/formatter/biome.ts
872
+ var Biome = class extends FeatureOption {
658
873
  constructor() {
659
- super({
660
- badgeColor: "7fadf2",
661
- badgeLabel: "Open Collective",
662
- badgeLogo: "opencollective",
663
- badgeLogoColor: "white",
664
- fundingYmlKey: "open_collective",
665
- promptHint: "opencollective.com/<username>",
666
- promptLabel: "Open Collective",
667
- settingValue: "open-collective"
668
- });
874
+ super({ partialName: "biome-formatter", promptHint: "Fast formatter (pairs with Biome linter)", promptLabel: "Biome", settingValue: "biome" });
669
875
  }
670
- getUrl(answers) {
671
- return `https://opencollective.com/${answers.fundingUsername}`;
876
+ configure(builder, answers) {
877
+ if (answers.linter !== "biome") {
878
+ builder.addLintStagedCommand("*.{ts,tsx,mts}", "biome format --write --no-errors-on-unmatched");
879
+ }
880
+ builder.addPackage("@biomejs/biome").addDepcheckIgnore("@biomejs/biome", "run as the `biome` CLI by the format and lint scripts, configured by `biome.jsonc`.").addScript("format").addScript("format:check").addFiles([
881
+ "biome.jsonc",
882
+ "scripts/format.ts",
883
+ "scripts/format-check.ts"
884
+ ]);
672
885
  }
673
886
  };
674
887
 
675
- // src/features/funding-platform/patreon.ts
676
- var Patreon = class extends FundingPlatformOption {
888
+ // src/features/formatter/dprint.ts
889
+ var Dprint = class extends FeatureOption {
677
890
  constructor() {
678
- super({
679
- badgeColor: "f96854",
680
- badgeLabel: "Patreon",
681
- badgeLogo: "patreon",
682
- badgeLogoColor: "white",
683
- fundingYmlKey: "patreon",
684
- promptHint: "patreon.com/<username>",
685
- promptLabel: "Patreon",
686
- settingValue: "patreon"
687
- });
891
+ super({ promptHint: "Fast, pluggable, written in Rust", promptLabel: "dprint", settingValue: "dprint" });
688
892
  }
689
- getUrl(answers) {
690
- return `https://www.patreon.com/${answers.fundingUsername}`;
893
+ configure(builder) {
894
+ builder.addLintStagedCommand("*.{ts,tsx,mts}", "dprint fmt").addPackage("dprint").addDepcheckIgnore("dprint", "run as a CLI by the format scripts, configured by `dprint.json`.").addScript("format").addScript("format:check").addFiles([
895
+ "dprint.json",
896
+ "scripts/format.ts",
897
+ "scripts/format-check.ts"
898
+ ]);
691
899
  }
692
900
  };
693
901
 
694
- // src/features/funding-platform/polar.ts
695
- var Polar = class extends FundingPlatformOption {
902
+ // src/features/formatter/none.ts
903
+ var None6 = class extends FeatureOption {
696
904
  constructor() {
697
- super({
698
- badgeColor: "0062ff",
699
- badgeLabel: "Polar",
700
- fundingYmlKey: "polar",
701
- promptHint: "polar.sh/<username>",
702
- promptLabel: "Polar",
703
- settingValue: "polar"
704
- });
705
- }
706
- getUrl(answers) {
707
- return `https://polar.sh/${answers.fundingUsername}`;
905
+ super({ promptHint: "No formatting", promptLabel: "(none)", settingValue: "none" });
708
906
  }
709
907
  };
710
908
 
711
- // src/features/funding-platform/thanks-dev.ts
712
- var ThanksDev = class extends FundingPlatformOption {
909
+ // src/features/formatter/prettier.ts
910
+ var Prettier = class extends FeatureOption {
713
911
  constructor() {
714
- super({
715
- badgeColor: "000000",
716
- badgeLabel: "thanks.dev",
717
- fundingYmlKey: "thanks_dev",
718
- promptHint: "thanks.dev/<username>, e.g. u/gh/<GitHub username>",
719
- promptLabel: "thanks.dev",
720
- settingValue: "thanks-dev"
721
- });
912
+ super({ promptHint: "Opinionated, widely adopted", promptLabel: "Prettier", settingValue: "prettier" });
722
913
  }
723
- getUrl(answers) {
724
- return `https://thanks.dev/${answers.fundingUsername}`;
914
+ configure(builder, answers) {
915
+ builder.addLintStagedCommand("*.{ts,tsx,mts}", "prettier --write").addPackage("prettier").addScript("format").addScript("format:check").addFiles([
916
+ ".prettierignore",
917
+ "prettier.config.mjs",
918
+ "scripts/format.ts",
919
+ "scripts/format-check.ts"
920
+ ]);
921
+ if (!isFrameworkPreset(answers.preset)) {
922
+ builder.addFiles(["scripts/prettier.config.ts"]);
923
+ }
725
924
  }
726
925
  };
727
926
 
728
- // src/features/funding-platform/index.ts
729
- var FUNDING_PLATFORM_OPTIONS = [
730
- new None6(),
731
- new BuyMeACoffee(),
732
- new GitHubSponsors(),
733
- new KoFi(),
734
- new Liberapay(),
735
- new OpenCollective(),
736
- new Patreon(),
737
- new Polar(),
738
- new ThanksDev(),
739
- new Custom()
740
- ];
741
- function asksFundingUsername(platform) {
742
- return platform !== void 0 && platform !== "none" && platform !== "custom";
743
- }
744
- async function promptFundingPlatform(savedValue) {
745
- return promptFeature({ defaultOption: new BuyMeACoffee(), message: "Funding platform", options: FUNDING_PLATFORM_OPTIONS, savedValue });
746
- }
747
- function resolveFunding(answers) {
748
- const option = FUNDING_PLATFORM_OPTIONS.find((candidate) => candidate.settingValue === answers.fundingPlatform);
749
- if (!option?.getUrl(answers)) {
750
- return null;
751
- }
752
- return option;
927
+ // src/features/formatter/index.ts
928
+ var FORMATTER_OPTIONS = [new None6(), new Biome(), new Dprint(), new Prettier()];
929
+ var FORMATTERS_NEEDING_INITIAL_FORMAT = /* @__PURE__ */ new Set(["biome", "prettier"]);
930
+ function needsInitialFormat(formatter) {
931
+ return FORMATTERS_NEEDING_INITIAL_FORMAT.has(formatter);
753
932
  }
754
- function validateFundingUsername(value) {
755
- if (!value) {
756
- return "Should not be empty";
757
- }
758
- if (!/^[\w./-]+$/.test(value)) {
759
- return "Use only letters, digits, `.`, `_`, `-` and `/`";
760
- }
761
- return void 0;
933
+ async function promptFormatter(savedValue) {
934
+ return promptFeature({ defaultOption: new Dprint(), message: "Formatter", options: FORMATTER_OPTIONS, savedValue });
762
935
  }
763
936
 
764
937
  // src/features/git-hub-actions/ci-and-release.ts
@@ -805,12 +978,15 @@ var BugAndFeature = class extends FeatureOption {
805
978
  // The real plugins' names, underscores and all. They used to be emitted as `bug-report.yml` and
806
979
  // `feature-request.yml`, because any `_` in a basename was read as the partial marker and the render
807
980
  // Loop silently skipped both forms; `isPartialTemplatePath` now reads only a kebab-case tail as one.
808
- configure(builder) {
981
+ configure(builder, answers) {
809
982
  builder.addFiles([
810
983
  ".github/ISSUE_TEMPLATE/bug_report.yml",
811
984
  ".github/ISSUE_TEMPLATE/config.yml",
812
985
  ".github/ISSUE_TEMPLATE/feature_request.yml"
813
986
  ]);
987
+ if (isFrameworkPreset(answers.preset)) {
988
+ builder.addPartial("has-bug-report-command");
989
+ }
814
990
  }
815
991
  };
816
992
 
@@ -1069,7 +1245,6 @@ var DEMO_VAULT_TEMPLATE_FILES = [
1069
1245
  "demo-vault/00 Start.md",
1070
1246
  "demo-vault/01 Sample commands.md",
1071
1247
  "demo-vault/02 Settings.md",
1072
- "demo-vault/Materials/01 Sample commands/Scratch note.md",
1073
1248
  "demo-vault/README.md",
1074
1249
  "demo-vault/_assets/CodeScriptToolkit/demoSetup.ts",
1075
1250
  "demo-vault/_assets/CodeScriptToolkit/startup.ts"
@@ -1157,34 +1332,7 @@ var DocsShowcase = class extends FeatureOption {
1157
1332
  builder.addFiles(["src/docs-showcase.desktop.integration.test.ts"]);
1158
1333
  }
1159
1334
  }
1160
- };
1161
-
1162
- // src/features/preset/official-sample.ts
1163
- var OFFICIAL_SAMPLE_PRESET = "official-sample";
1164
- var OFFICIAL_SAMPLE_ANSWER_KEYS = [
1165
- "authorGitHubName",
1166
- "authorName",
1167
- "defaultBranch",
1168
- "fundingPlatform",
1169
- "fundingUrl",
1170
- "fundingUsername",
1171
- "pluginDescription",
1172
- "pluginId",
1173
- "pluginName",
1174
- "preset"
1175
- ];
1176
- var OfficialSample = class extends FeatureOption {
1177
- constructor() {
1178
- super({
1179
- promptHint: "Exactly obsidianmd/obsidian-sample-plugin, with your plugin's id, name, author and description filled in",
1180
- promptLabel: "Official sample plugin",
1181
- settingValue: OFFICIAL_SAMPLE_PRESET
1182
- });
1183
- }
1184
- };
1185
- function isOfficialSamplePreset(preset) {
1186
- return preset === OFFICIAL_SAMPLE_PRESET;
1187
- }
1335
+ };
1188
1336
 
1189
1337
  // src/features/preset/standalone.ts
1190
1338
  var Standalone = class extends FeatureOption {
@@ -1670,305 +1818,99 @@ var Vue = class extends FeatureOption {
1670
1818
  builder.addPackage("vue").addPartial("ui-view").addSentenceCaseBrand("Vue").addFiles([
1671
1819
  "src/vue-components/sample-vue-component.d.ts",
1672
1820
  "src/vue-components/sample-vue-component.vue",
1673
- "src/views/sample-vue-view.ts"
1674
- ]);
1675
- if (isFrameworkPreset(answers.preset)) {
1676
- builder.addBuildFramework("vue").addPackage("unplugin-vue").addDepcheckIgnore("unplugin-vue", "loaded by obsidian-dev-toolkit to compile `.vue` components.");
1677
- if (answers.bundler === "parcel") {
1678
- builder.addPackage("@parcel/transformer-vue").addDepcheckIgnore("@parcel/transformer-vue", "resolved by name by `@parcel/config-default` for `.vue`; nothing imports it.");
1679
- }
1680
- return;
1681
- }
1682
- builder.addPackage(getBuildPlugin2(answers.bundler));
1683
- if (answers.bundler === "rollup") {
1684
- builder.addPackage("@babel/core").addPackage("@babel/preset-typescript").addPackage("@rollup/plugin-babel").addDepcheckIgnore("@babel/preset-typescript", "named as a string in `scripts/rollup.config.ts`, never imported.").addPartial("rollup-babel");
1685
- }
1686
- if (answers.bundler === "parcel") {
1687
- builder.addDepcheckIgnore("@parcel/transformer-vue", "resolved by name by `@parcel/config-default` for `.vue`; nothing imports it.");
1688
- }
1689
- }
1690
- };
1691
- function getBuildPlugin2(bundler) {
1692
- const plugin = BUILD_PLUGINS5[bundler];
1693
- if (!plugin) {
1694
- throw new Error(`Unsupported bundler for Vue: ${bundler}`);
1695
- }
1696
- return plugin;
1697
- }
1698
-
1699
- // src/features/ui-framework/index.ts
1700
- var UI_FRAMEWORK_OPTIONS = [new None16(), new Lit(), new Preact(), new React(), new Solid(), new Svelte(), new Vue()];
1701
- async function promptUiFramework(savedValue) {
1702
- return promptFeature({ defaultOption: new None16(), message: "UI framework", options: UI_FRAMEWORK_OPTIONS, savedValue });
1703
- }
1704
-
1705
- // src/features/wasm-support/none.ts
1706
- var None17 = class extends FeatureOption {
1707
- constructor() {
1708
- super({ promptHint: "No WASM", promptLabel: "(none)", settingValue: "none" });
1709
- }
1710
- };
1711
-
1712
- // src/features/wasm-support/wasm.ts
1713
- var WASM_PLUGINS = {
1714
- esbuild: null,
1715
- parcel: null,
1716
- rollup: "@rollup/plugin-wasm",
1717
- vite: null,
1718
- webpack: null
1719
- };
1720
- var Wasm = class extends FeatureOption {
1721
- constructor() {
1722
- super({ promptHint: "Import and use .wasm modules", promptLabel: "WASM", settingValue: "wasm" });
1723
- }
1724
- configure(builder, answers) {
1725
- const isFramework = isFrameworkPreset(answers.preset);
1726
- if (isFramework) {
1727
- builder.addBuildOption("wasm", "true").addPartial("wasm-adapter");
1728
- } else {
1729
- const plugin = getWasmPlugin(answers.bundler);
1730
- if (plugin !== null) {
1731
- builder.addPackage(plugin);
1732
- }
1733
- builder.addFiles(["src/wasm.d.ts"]).addPartial(`wasm-${answers.bundler}`);
1734
- }
1735
- builder.addSentenceCaseBrand("WASM");
1736
- builder.addFiles([
1737
- // The one binary in the template tree, copied verbatim (see `ASSET_EXTENSIONS`). 39 bytes, one
1738
- // Export, `answer()`, returning 42 -- the sample module from `CodeScript Toolkit`'s demo vault.
1739
- "src/wasm/module.wasm",
1740
- // Its source in WebAssembly text format. Documentation only: nothing in the build reads it, and it
1741
- // Is here so the binary beside it is not opaque.
1742
- "src/wasm/module.wat",
1743
- "src/wasm/answer.ts",
1744
- "src/wasm/sample-command.ts",
1745
- "src/wasm/README.md"
1746
- ]);
1747
- if (isFramework) {
1748
- builder.addFiles(["demo-vault/03 WebAssembly.md"]);
1749
- }
1750
- }
1751
- };
1752
- function getWasmPlugin(bundler) {
1753
- if (!Object.hasOwn(WASM_PLUGINS, bundler)) {
1754
- throw new Error(`Unsupported bundler for WASM: ${bundler}`);
1755
- }
1756
- return WASM_PLUGINS[bundler] ?? null;
1757
- }
1758
-
1759
- // src/features/wasm-support/index.ts
1760
- var WASM_SUPPORT_OPTIONS = [new None17(), new Wasm()];
1761
- async function promptWasmSupport(savedValue) {
1762
- return promptFeature({ defaultOption: new None17(), message: "WebAssembly support", options: WASM_SUPPORT_OPTIONS, savedValue });
1763
- }
1764
-
1765
- // src/answer-space.ts
1766
- var SAMPLE_FUNDING_URL = "https://example.com/support-testuser";
1767
- var SAMPLE_OBSIDIAN_CONFIG_FOLDER = "demo-vault/.obsidian";
1768
- var ANSWER_SPACE = [
1769
- toDimension("apiSubset", API_SUBSET_OPTIONS),
1770
- toDimension("bundler", BUNDLER_OPTIONS),
1771
- toDimension("commitLinting", COMMIT_LINTING_OPTIONS),
1772
- toDimension("coverageBadge", COVERAGE_BADGE_OPTIONS),
1773
- toDimension("e2eTestRunner", E2E_TEST_RUNNER_OPTIONS),
1774
- toDimension("editorExtensions", EDITOR_EXTENSIONS_OPTIONS),
1775
- toDimension("formatter", FORMATTER_OPTIONS),
1776
- toDimension("fundingPlatform", FUNDING_PLATFORM_OPTIONS),
1777
- toValueDimension("fundingUrl", ["", SAMPLE_FUNDING_URL]),
1778
- toDimension("gitHubActions", GITHUB_ACTIONS_OPTIONS),
1779
- toDimension("gitHubIssueTemplates", GITHUB_ISSUE_TEMPLATES_OPTIONS),
1780
- toDimension("hotReload", HOT_RELOAD_OPTIONS),
1781
- toDimension("internationalization", INTERNATIONALIZATION_OPTIONS),
1782
- toDimension("linter", LINTER_OPTIONS),
1783
- toDimension("markdownLinter", MARKDOWN_LINTER_OPTIONS),
1784
- toValueDimension("obsidianConfigFolder", ["", SAMPLE_OBSIDIAN_CONFIG_FOLDER]),
1785
- toDimension("packageManager", PACKAGE_MANAGER_OPTIONS),
1786
- toDimension("platformSupport", PLATFORM_SUPPORT_OPTIONS),
1787
- toDimension("preset", PRESET_OPTIONS),
1788
- toDimension("spellChecker", SPELL_CHECKER_OPTIONS),
1789
- toDimension("styling", STYLING_OPTIONS),
1790
- toDimension("testRunner", TEST_RUNNER_OPTIONS),
1791
- toDimension("uiFramework", UI_FRAMEWORK_OPTIONS),
1792
- toDimension("wasmSupport", WASM_SUPPORT_OPTIONS)
1793
- ];
1794
- var ANSWER_SPACE_SIZE = ANSWER_SPACE.reduce((size, dimension) => size * dimension.values.length, 1);
1795
- var ANSWER_SPACE_DIMENSION_SIZES = ANSWER_SPACE.map((dimension) => dimension.values.length);
1796
- function toDimension(answerKey, options) {
1797
- return {
1798
- answerKey,
1799
- values: options.map((option) => option.settingValue)
1800
- };
1801
- }
1802
- function toValueDimension(answerKey, values) {
1803
- return { answerKey, values };
1804
- }
1805
-
1806
- // src/answers.ts
1807
- var CONFIG_FILE_NAME = ".create-obsidian-plugin.json";
1808
- function getPluginShortName(pluginId) {
1809
- return pluginId.split("-").map((word) => (word[0] ?? "").toUpperCase() + word.slice(1)).join("");
1810
- }
1811
-
1812
- // src/deprecated-answers.ts
1813
- import { log } from "@clack/prompts";
1814
- var DEPRECATED_ANSWER_VALUES = {
1815
- preset: {
1816
- enhanced: "all-in-one"
1817
- }
1818
- };
1819
- function resolveDeprecatedAnswer(key, value, source) {
1820
- const replacement = DEPRECATED_ANSWER_VALUES[key]?.[value];
1821
- if (replacement === void 0) {
1822
- return value;
1823
- }
1824
- log.warn(`${key} "${value}" in ${source} is deprecated and was read as "${replacement}". Use "${replacement}" instead.`);
1825
- return replacement;
1826
- }
1827
-
1828
- // src/directory-constraints.ts
1829
- var CORE_FEATURE_NAMES = [
1830
- "Audio recorder",
1831
- "Backlinks",
1832
- "Bases",
1833
- "Bookmarks",
1834
- "Canvas",
1835
- "Command palette",
1836
- "Daily notes",
1837
- "File recovery",
1838
- "Files",
1839
- "Footnotes",
1840
- "Format converter",
1841
- "Graph view",
1842
- "Live Preview",
1843
- "Note composer",
1844
- "Outgoing links",
1845
- "Outline",
1846
- "Page preview",
1847
- "Properties view",
1848
- "Publish",
1849
- "Quick Switcher",
1850
- "Random note",
1851
- "Reading view",
1852
- "Search",
1853
- "Slash commands",
1854
- "Slides",
1855
- "Source mode",
1856
- "Sync",
1857
- "Tags view",
1858
- "Templates",
1859
- "Unique note creator",
1860
- "Web viewer",
1861
- "Word count",
1862
- "Workspaces"
1863
- ];
1864
- var MAX_DESCRIPTION_LENGTH = 250;
1865
- var MIN_DESCRIPTION_LENGTH = 10;
1866
- var ALLOWED_ID_CHARACTERS = /^[a-z0-9-]+$/;
1867
- var ALLOWED_NAME_CHARACTERS = /^[A-Za-z0-9 \-+()]+$/;
1868
- var EMOJI = /\p{Extended_Pictographic}/u;
1869
- var OBSIDIAN_WORD = /\bobsidian\b/i;
1870
- var OBSIDIAN_NAME_VARIANTS = /obsi|sidian/i;
1871
- var SELF_REFERENCE_PATTERNS = [
1872
- /\bthis plugin\b/i,
1873
- /\bthis is a plugin\b/i,
1874
- /\ba plugin (?:that|which)\b/i,
1875
- /^the plugin\b/i,
1876
- /^plugin\b/i
1877
- ];
1878
- function findUnlistableManifestAnswers(answers) {
1879
- const checked = [
1880
- { key: "pluginId", message: validatePluginId(answers.pluginId), value: answers.pluginId },
1881
- { key: "pluginName", message: validatePluginName(answers.pluginName), value: answers.pluginName },
1882
- { key: "pluginDescription", message: validatePluginDescription(answers.pluginDescription), value: answers.pluginDescription }
1883
- ];
1884
- const problems = [];
1885
- for (const { key, message, value } of checked) {
1886
- if (message !== void 0) {
1887
- problems.push({ key, message, value });
1888
- }
1889
- }
1890
- return problems;
1891
- }
1892
- function validatePluginDescription(input) {
1893
- if (!input) {
1894
- return "Should not be empty";
1895
- }
1896
- if (EMOJI.test(input)) {
1897
- return "Should not contain emoji -- the Community directory rejects them, though it does accept ordinary punctuation such as backticks, em dashes and parentheses";
1898
- }
1899
- if (OBSIDIAN_WORD.test(input)) {
1900
- return 'Should not contain the word "Obsidian" -- the Community directory rejects it as implied by the plugin directory, even though no Obsidian document says so';
1901
- }
1902
- if (SELF_REFERENCE_PATTERNS.some((pattern) => pattern.test(input))) {
1903
- return 'Should say what the plugin does rather than refer to itself -- the Community directory rejects "This plugin..." and "a plugin that...". Naming another plugin is fine';
1904
- }
1905
- if (input.length < MIN_DESCRIPTION_LENGTH) {
1906
- return `Should be at least ${String(MIN_DESCRIPTION_LENGTH)} characters, so it says what the plugin does`;
1907
- }
1908
- if (input.length > MAX_DESCRIPTION_LENGTH) {
1909
- return `Should be at most ${String(MAX_DESCRIPTION_LENGTH)} characters -- the Community directory rejects a longer one`;
1910
- }
1911
- if (!/^[A-Z]/.test(input)) {
1912
- return 'Should start with a capital letter, ideally on an action verb: "Translates selected text...", "Imports notes from..."';
1913
- }
1914
- if (!input.endsWith(".")) {
1915
- return "Should end with a dot";
1916
- }
1917
- return void 0;
1918
- }
1919
- function validatePluginId(input) {
1920
- if (!input) {
1921
- return "Should not be empty";
1922
- }
1923
- if (!ALLOWED_ID_CHARACTERS.test(input)) {
1924
- return "Should contain only lowercase English letters, digits and hyphens";
1925
- }
1926
- if (!/^[a-z]/.test(input)) {
1927
- return "Should start with a letter";
1928
- }
1929
- if (!/[a-z0-9]$/.test(input)) {
1930
- return "Should end with a letter or digit";
1931
- }
1932
- if (input.includes("obsidian")) {
1933
- return 'Should not contain "obsidian" anywhere -- the Community directory rejects it as implied by the plugin directory, and an id can never be changed once the plugin is published';
1821
+ "src/views/sample-vue-view.ts"
1822
+ ]);
1823
+ if (isFrameworkPreset(answers.preset)) {
1824
+ builder.addBuildFramework("vue").addPackage("unplugin-vue").addDepcheckIgnore("unplugin-vue", "loaded by obsidian-dev-toolkit to compile `.vue` components.");
1825
+ if (answers.bundler === "parcel") {
1826
+ builder.addPackage("@parcel/transformer-vue").addDepcheckIgnore("@parcel/transformer-vue", "resolved by name by `@parcel/config-default` for `.vue`; nothing imports it.");
1827
+ }
1828
+ return;
1829
+ }
1830
+ builder.addPackage(getBuildPlugin2(answers.bundler));
1831
+ if (answers.bundler === "rollup") {
1832
+ builder.addPackage("@babel/core").addPackage("@babel/preset-typescript").addPackage("@rollup/plugin-babel").addDepcheckIgnore("@babel/preset-typescript", "named as a string in `scripts/rollup.config.ts`, never imported.").addPartial("rollup-babel");
1833
+ }
1834
+ if (answers.bundler === "parcel") {
1835
+ builder.addDepcheckIgnore("@parcel/transformer-vue", "resolved by name by `@parcel/config-default` for `.vue`; nothing imports it.");
1836
+ }
1934
1837
  }
1935
- if (input.endsWith("plugin")) {
1936
- return 'Should not end with "plugin" -- the Community directory rejects it as implied, and an id can never be changed once the plugin is published';
1838
+ };
1839
+ function getBuildPlugin2(bundler) {
1840
+ const plugin = BUILD_PLUGINS5[bundler];
1841
+ if (!plugin) {
1842
+ throw new Error(`Unsupported bundler for Vue: ${bundler}`);
1937
1843
  }
1938
- return void 0;
1844
+ return plugin;
1939
1845
  }
1940
- function validatePluginName(input) {
1941
- if (!input) {
1942
- return "Should not be empty";
1943
- }
1944
- if (OBSIDIAN_NAME_VARIANTS.test(input)) {
1945
- return 'Should not contain "Obsidian" or an abbreviation of it ("Obsi", "sidian") -- the Community directory rejects it as implied by the plugin directory';
1846
+
1847
+ // src/features/ui-framework/index.ts
1848
+ var UI_FRAMEWORK_OPTIONS = [new None16(), new Lit(), new Preact(), new React(), new Solid(), new Svelte(), new Vue()];
1849
+ async function promptUiFramework(savedValue) {
1850
+ return promptFeature({ defaultOption: new None16(), message: "UI framework", options: UI_FRAMEWORK_OPTIONS, savedValue });
1851
+ }
1852
+
1853
+ // src/features/wasm-support/none.ts
1854
+ var None17 = class extends FeatureOption {
1855
+ constructor() {
1856
+ super({ promptHint: "No WASM", promptLabel: "(none)", settingValue: "none" });
1946
1857
  }
1947
- if (input.toLowerCase().includes("plugin")) {
1948
- return 'Should not contain "Plugin" -- the Community directory rejects it as implied by the plugin directory';
1858
+ };
1859
+
1860
+ // src/features/wasm-support/wasm.ts
1861
+ var WASM_PLUGINS = {
1862
+ esbuild: null,
1863
+ parcel: null,
1864
+ rollup: "@rollup/plugin-wasm",
1865
+ vite: null,
1866
+ webpack: null
1867
+ };
1868
+ var Wasm = class extends FeatureOption {
1869
+ constructor() {
1870
+ super({ promptHint: "Import and use .wasm modules", promptLabel: "WASM", settingValue: "wasm" });
1949
1871
  }
1950
- const coreName = findCoreFeatureName(input);
1951
- if (coreName !== void 0) {
1952
- return `Should not be the name of an Obsidian core plugin or core feature -- "${coreName}" is one, and the Community directory rejects a name that takes it`;
1872
+ configure(builder, answers) {
1873
+ const isFramework = isFrameworkPreset(answers.preset);
1874
+ if (isFramework) {
1875
+ builder.addBuildOption("wasm", "true").addPartial("wasm-adapter");
1876
+ } else {
1877
+ const plugin = getWasmPlugin(answers.bundler);
1878
+ if (plugin !== null) {
1879
+ builder.addPackage(plugin);
1880
+ }
1881
+ builder.addFiles(["src/wasm.d.ts"]).addPartial(`wasm-${answers.bundler}`);
1882
+ }
1883
+ builder.addSentenceCaseBrand("WASM");
1884
+ builder.addFiles([
1885
+ // The one binary in the template tree, copied verbatim (see `ASSET_EXTENSIONS`). 39 bytes, one
1886
+ // Export, `answer()`, returning 42 -- the sample module from `CodeScript Toolkit`'s demo vault.
1887
+ "src/wasm/module.wasm",
1888
+ // Its source in WebAssembly text format. Documentation only: nothing in the build reads it, and it
1889
+ // Is here so the binary beside it is not opaque.
1890
+ "src/wasm/module.wat",
1891
+ "src/wasm/answer.ts",
1892
+ "src/wasm/sample-command.ts",
1893
+ "src/wasm/README.md"
1894
+ ]);
1895
+ if (isFramework) {
1896
+ builder.addFiles(["demo-vault/03 WebAssembly.md"]);
1897
+ }
1953
1898
  }
1954
- if (!ALLOWED_NAME_CHARACTERS.test(input)) {
1955
- return "Should use Basic Latin letters and digits only, with hyphens, plus signs and parentheses the only punctuation the Community directory accepts";
1899
+ };
1900
+ function getWasmPlugin(bundler) {
1901
+ if (!Object.hasOwn(WASM_PLUGINS, bundler)) {
1902
+ throw new Error(`Unsupported bundler for WASM: ${bundler}`);
1956
1903
  }
1957
- return void 0;
1958
- }
1959
- function findCoreFeatureName(name) {
1960
- const normalized = name.trim().toLowerCase();
1961
- return CORE_FEATURE_NAMES.find((candidate) => candidate.toLowerCase() === normalized);
1904
+ return WASM_PLUGINS[bundler] ?? null;
1962
1905
  }
1963
1906
 
1964
- // src/prompts.ts
1965
- import {
1966
- cancel as cancel2,
1967
- log as log2
1968
- } from "@clack/prompts";
1969
- import { styleText as styleText3 } from "node:util";
1907
+ // src/features/wasm-support/index.ts
1908
+ var WASM_SUPPORT_OPTIONS = [new None17(), new Wasm()];
1909
+ async function promptWasmSupport(savedValue) {
1910
+ return promptFeature({ defaultOption: new None17(), message: "WebAssembly support", options: WASM_SUPPORT_OPTIONS, savedValue });
1911
+ }
1970
1912
 
1971
- // src/clack-text.ts
1913
+ // src/prompts/clack-text.ts
1972
1914
  import {
1973
1915
  settings as settings2,
1974
1916
  TextPrompt
@@ -1976,7 +1918,7 @@ import {
1976
1918
  import {
1977
1919
  S_BAR as S_BAR2,
1978
1920
  S_BAR_END as S_BAR_END2,
1979
- symbol as symbol2
1921
+ symbol as $symbol2
1980
1922
  } from "@clack/prompts";
1981
1923
  import { styleText as styleText2 } from "node:util";
1982
1924
  var TextPromptWithCompletion = class extends TextPrompt {
@@ -2005,7 +1947,7 @@ async function text(opts) {
2005
1947
  render() {
2006
1948
  const withGuide = settings2.withGuide;
2007
1949
  const header = `${withGuide ? `${styleText2("gray", S_BAR2)}
2008
- ` : ""}${symbol2(this.state)} ${opts.message}
1950
+ ` : ""}${$symbol2(this.state)} ${opts.message}
2009
1951
  `;
2010
1952
  const placeholderDisplay = opts.placeholder ? styleText2("inverse", opts.placeholder[0] ?? "") + styleText2("dim", opts.placeholder.slice(1)) : styleText2(["inverse", "hidden"], "_");
2011
1953
  const input = this.userInput ? this.userInputWithCursor : placeholderDisplay;
@@ -2059,7 +2001,7 @@ ${barEnd}
2059
2001
  return throwGoBackOnCancel(result) ?? "";
2060
2002
  }
2061
2003
 
2062
- // src/prompts.ts
2004
+ // src/prompts/prompts.ts
2063
2005
  var MAX_HINTED_CHANGES = 3;
2064
2006
  var TOOLING_QUESTIONS = {
2065
2007
  bundler: { message: "Bundler", options: BUNDLER_OPTIONS },
@@ -2554,7 +2496,7 @@ function showHotkeyHints() {
2554
2496
  function key(s) {
2555
2497
  return styleText3("cyan", s);
2556
2498
  }
2557
- log2.info([
2499
+ log.info([
2558
2500
  `${key("\u2191\u2193")} Navigate ${key("Enter")} Confirm ${key("Esc")} Go back`,
2559
2501
  `${dim("Text inputs:")} ${key("Tab")}/${key("\u2192")}/${key("End")} Accept suggestion`
2560
2502
  ].join("\n"));
@@ -2566,7 +2508,70 @@ function skipSuppliedAnswers(steps, supplied) {
2566
2508
  }));
2567
2509
  }
2568
2510
 
2569
- // src/cli-args.ts
2511
+ // src/answers/answer-space.ts
2512
+ var SAMPLE_FUNDING_URL = "https://example.com/support-testuser";
2513
+ var SAMPLE_OBSIDIAN_CONFIG_FOLDER = "demo-vault/.obsidian";
2514
+ var ANSWER_SPACE = [
2515
+ toDimension("apiSubset", API_SUBSET_OPTIONS),
2516
+ toDimension("bundler", BUNDLER_OPTIONS),
2517
+ toDimension("commitLinting", COMMIT_LINTING_OPTIONS),
2518
+ toDimension("coverageBadge", COVERAGE_BADGE_OPTIONS),
2519
+ toDimension("e2eTestRunner", E2E_TEST_RUNNER_OPTIONS),
2520
+ toDimension("editorExtensions", EDITOR_EXTENSIONS_OPTIONS),
2521
+ toDimension("formatter", FORMATTER_OPTIONS),
2522
+ toDimension("fundingPlatform", FUNDING_PLATFORM_OPTIONS),
2523
+ toValueDimension("fundingUrl", ["", SAMPLE_FUNDING_URL]),
2524
+ toDimension("gitHubActions", GITHUB_ACTIONS_OPTIONS),
2525
+ toDimension("gitHubIssueTemplates", GITHUB_ISSUE_TEMPLATES_OPTIONS),
2526
+ toDimension("hotReload", HOT_RELOAD_OPTIONS),
2527
+ toDimension("internationalization", INTERNATIONALIZATION_OPTIONS),
2528
+ toDimension("linter", LINTER_OPTIONS),
2529
+ toDimension("markdownLinter", MARKDOWN_LINTER_OPTIONS),
2530
+ toValueDimension("obsidianConfigFolder", ["", SAMPLE_OBSIDIAN_CONFIG_FOLDER]),
2531
+ toDimension("packageManager", PACKAGE_MANAGER_OPTIONS),
2532
+ toDimension("platformSupport", PLATFORM_SUPPORT_OPTIONS),
2533
+ toDimension("preset", PRESET_OPTIONS),
2534
+ toDimension("spellChecker", SPELL_CHECKER_OPTIONS),
2535
+ toDimension("styling", STYLING_OPTIONS),
2536
+ toDimension("testRunner", TEST_RUNNER_OPTIONS),
2537
+ toDimension("uiFramework", UI_FRAMEWORK_OPTIONS),
2538
+ toDimension("wasmSupport", WASM_SUPPORT_OPTIONS)
2539
+ ];
2540
+ var ANSWER_SPACE_SIZE = ANSWER_SPACE.reduce((size, dimension) => size * dimension.values.length, 1);
2541
+ var ANSWER_SPACE_DIMENSION_SIZES = ANSWER_SPACE.map((dimension) => dimension.values.length);
2542
+ function toDimension(answerKey, options) {
2543
+ return {
2544
+ answerKey,
2545
+ values: options.map((option) => option.settingValue)
2546
+ };
2547
+ }
2548
+ function toValueDimension(answerKey, values) {
2549
+ return { answerKey, values };
2550
+ }
2551
+
2552
+ // src/answers/answers.ts
2553
+ var CONFIG_FILE_NAME = ".create-obsidian-plugin.json";
2554
+ function getPluginShortName(pluginId) {
2555
+ return pluginId.split("-").map((word) => (word[0] ?? "").toUpperCase() + word.slice(1)).join("");
2556
+ }
2557
+
2558
+ // src/answers/deprecated-answers.ts
2559
+ import { log as log2 } from "@clack/prompts";
2560
+ var DEPRECATED_ANSWER_VALUES = {
2561
+ preset: {
2562
+ enhanced: "all-in-one"
2563
+ }
2564
+ };
2565
+ function resolveDeprecatedAnswer(key, value, source) {
2566
+ const replacement = DEPRECATED_ANSWER_VALUES[key]?.[value];
2567
+ if (replacement === void 0) {
2568
+ return value;
2569
+ }
2570
+ log2.warn(`${key} "${value}" in ${source} is deprecated and was read as "${replacement}". Use "${replacement}" instead.`);
2571
+ return replacement;
2572
+ }
2573
+
2574
+ // src/answers/cli-args.ts
2570
2575
  var COMPUTED_ANSWER_KEYS = ["currentYear"];
2571
2576
  var DERIVED_TEMPLATE_KEYS = ["pluginShortName"];
2572
2577
  var REFUSED_KEYS = [...COMPUTED_ANSWER_KEYS, ...DERIVED_TEMPLATE_KEYS];
@@ -2781,7 +2786,7 @@ function toMode(value) {
2781
2786
  return mode;
2782
2787
  }
2783
2788
 
2784
- // src/answers-export.ts
2789
+ // src/answers/answers-export.ts
2785
2790
  var CREATE_COMMANDS = {
2786
2791
  bun: { prefix: "bun create @mnaoumov/obsidian-plugin", separator: "" },
2787
2792
  npm: { prefix: "npm create @mnaoumov/obsidian-plugin", separator: " --" },
@@ -2839,7 +2844,7 @@ function quote(value, shell) {
2839
2844
  return `'${value.replaceAll("'", "'\\''")}'`;
2840
2845
  }
2841
2846
 
2842
- // src/directory-registry.ts
2847
+ // src/directory/directory-registry.ts
2843
2848
  var COMMUNITY_PLUGINS_JSON_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json";
2844
2849
  async function fetchCommunityPluginIds() {
2845
2850
  try {
@@ -2875,14 +2880,14 @@ function validatePluginIdIsUnlisted(pluginId, listedIds) {
2875
2880
  }
2876
2881
 
2877
2882
  // src/official-sample.ts
2878
- import { join as join4 } from "node:path";
2883
+ import { join as join5 } from "node:path";
2879
2884
 
2880
2885
  // src/templates.ts
2881
2886
  import { log as log4 } from "@clack/prompts";
2882
2887
  import ejs from "ejs";
2883
2888
  import { createHash } from "node:crypto";
2884
2889
  import {
2885
- existsSync as existsSync3,
2890
+ existsSync as existsSync4,
2886
2891
  mkdirSync,
2887
2892
  readFileSync as readFileSync3,
2888
2893
  writeFileSync
@@ -2890,7 +2895,7 @@ import {
2890
2895
  import {
2891
2896
  dirname,
2892
2897
  extname,
2893
- join as join2
2898
+ join as join3
2894
2899
  } from "node:path";
2895
2900
  import { fileURLToPath } from "node:url";
2896
2901
 
@@ -3119,8 +3124,54 @@ var TemplateBuilder = class {
3119
3124
  }
3120
3125
  };
3121
3126
 
3127
+ // src/template-index.ts
3128
+ import {
3129
+ existsSync as existsSync3,
3130
+ readdirSync as readdirSync2,
3131
+ statSync
3132
+ } from "node:fs";
3133
+ import { join as join2 } from "node:path";
3134
+ var GROUP_FOLDER_PATTERN = /^\(.+\)$/;
3135
+ function getLogicalTemplatePath(physicalPath) {
3136
+ return physicalPath.split("/").filter((segment) => !GROUP_FOLDER_PATTERN.test(segment)).join("/");
3137
+ }
3138
+ function indexTemplateDir(root) {
3139
+ const index = /* @__PURE__ */ new Map();
3140
+ for (const physicalPath of walkFiles(root, "")) {
3141
+ const logicalPath = getLogicalTemplatePath(physicalPath);
3142
+ const existing = index.get(logicalPath);
3143
+ if (existing !== void 0) {
3144
+ throw new Error(`Two templates in ${root} resolve to ${logicalPath}: ${existing} and ${physicalPath}.`);
3145
+ }
3146
+ index.set(logicalPath, physicalPath);
3147
+ }
3148
+ return index;
3149
+ }
3150
+ function walkFiles(root, relativeDir) {
3151
+ const absoluteDir = join2(root, relativeDir);
3152
+ if (!existsSync3(absoluteDir)) {
3153
+ return [];
3154
+ }
3155
+ const found = [];
3156
+ for (const entry of readdirSync2(absoluteDir)) {
3157
+ const relativePath = relativeDir === "" ? entry : `${relativeDir}/${entry}`;
3158
+ if (statSync(join2(root, relativePath)).isDirectory()) {
3159
+ found.push(...walkFiles(root, relativePath));
3160
+ } else {
3161
+ found.push(relativePath);
3162
+ }
3163
+ }
3164
+ return found;
3165
+ }
3166
+
3122
3167
  // src/versions.ts
3123
3168
  import { log as log3 } from "@clack/prompts";
3169
+ import {
3170
+ maxSatisfying,
3171
+ minVersion,
3172
+ subset,
3173
+ validRange
3174
+ } from "semver";
3124
3175
  var PINNED_VERSIONS = {
3125
3176
  "@babel/core": {
3126
3177
  check: `node -e "const fs=require('node:fs');process.stdout.write(JSON.parse(fs.readFileSync('node_modules/@rollup/plugin-babel/package.json','utf8')).peerDependencies['@babel/core'])"`,
@@ -3280,6 +3331,14 @@ var ADVISORY_OVERRIDES = {
3280
3331
  spec: "^8.0.2",
3281
3332
  why: "Clears GHSA-ggr8-5vv4-36mx (stack exhaustion merging recursive object graphs), patched in 8.0.0. @wdio/utils declares ^7.0.3 up to 9.30, and obsidian-integration-testing pins webdriverio 9.27.0, so no direct bump reaches it and `npm audit fix --force` only offers a downgrade of obsidian-integration-testing to 1.1.2. The forced major is safe for these consumers: 8.0.0 breaks by renaming the mergeInfo system and aligning the customization shorthand, and both surfaces were measured to behave identically on 7.1.6 and 8.0.1 in the exact shapes the tree uses -- @wdio/config's `deepmergeCustom` with a `mergeArrays` handler reading `meta.key` and returning `utils.actions.defaultMerge`, and webdriver's `deepmergeCustom({ mergeArrays: false })`. A scan of the whole installed tree found no other binding than `deepmerge` and `deepmergeCustom`."
3282
3333
  },
3334
+ "re2js": {
3335
+ check: `node -e "const fs=require('node:fs');process.stdout.write(JSON.parse(fs.readFileSync('node_modules/markdownlint/package.json','utf8')).dependencies.re2js)"`,
3336
+ expect: "2.8.6",
3337
+ manualCheck: "The check reads the exact re2js pin of the installed markdownlint, which moves only when a markdownlint-cli2 release pins a newer markdownlint. When it reads 2.8.7 or later, drop the override and this entry and re-run `npm audit`.",
3338
+ requires: ["markdownlint", "markdownlint-cli2", "@mnaoumov/typescript-dev-toolkit", "@mnaoumov/obsidian-dev-toolkit"],
3339
+ spec: "^2.9.1",
3340
+ why: "Clears GHSA-gg6h-894w-4m9c (RE2JS quadratic-time denial of service in lookbehind matching, >=2.2.0 <2.8.7). Reached only through markdownlint, whose newest release 0.42.0 pins re2js at the exact 2.8.6, and markdownlint-cli2 0.24.0 pins that markdownlint exactly in turn, so no bump reaches the fix. The toolkits reach it through their own markdownlint-cli2. 2.9.1 is the version markdownlint itself moved to upstream, so the forced minor is the one it is tested against. Never take the `npm audit fix --force` remedy: it downgrades the toolkit packages."
3341
+ },
3283
3342
  "serialize-javascript": {
3284
3343
  check: `node -e "const fs=require('node:fs');process.stdout.write(JSON.parse(fs.readFileSync('node_modules/mocha/package.json','utf8')).dependencies['serialize-javascript'])"`,
3285
3344
  expect: "^6.0.2",
@@ -3287,14 +3346,6 @@ var ADVISORY_OVERRIDES = {
3287
3346
  requires: ["@wdio/mocha-framework"],
3288
3347
  spec: "^7.1.1",
3289
3348
  why: "Clears GHSA-5c6j-r48x-rmvq (RCE via RegExp.flags and Date.prototype.toISOString) and GHSA-qj8w-gfj5-8c6v (CPU-exhaustion denial of service via crafted array-likes), both fixed in 7.0.5. No direct bump reaches it: mocha declares `serialize-javascript@^6.0.2` at every published version including 11.8.0, and the only consumer here is @wdio/mocha-framework -> mocha. `npm audit fix --force` offers a DOWNGRADE to @wdio/mocha-framework@7.7.3 instead. The forced major is safe for the one call site that exists: mocha's `buffered-worker-pool.js` calls `serializeJavascript(opts, { unsafe: true, ignoreFunction: true })`, and 6.0.2 and 7.1.1 were measured to return byte-identical output for that exact option pair across RegExp, Date, Map, Set, undefined, BigInt, functions and a script-tag string. Note the call is on mocha's parallel-run path, which wdio does not take."
3290
- },
3291
- "smol-toml": {
3292
- check: `node -e "const fs=require('node:fs');const path=['node_modules/@mnaoumov/typescript-dev-toolkit/node_modules/markdownlint-cli2/package.json','node_modules/markdownlint-cli2/package.json'].find((candidate)=>fs.existsSync(candidate));process.stdout.write(JSON.parse(fs.readFileSync(path,'utf8')).dependencies['smol-toml'])"`,
3293
- expect: "1.8.0",
3294
- manualCheck: "The check reads the exact version pinned by the markdownlint-cli2 that @mnaoumov/typescript-dev-toolkit reaches, nested under it when the project also declares a newer markdownlint-cli2, which is what makes the override necessary. When the toolkit moves to markdownlint-cli2 ^0.24.0 or later, that copy pins 1.9.1 and the override and this entry can go.",
3295
- requires: ["@mnaoumov/obsidian-dev-toolkit", "@mnaoumov/typescript-dev-toolkit"],
3296
- spec: "^1.9.1",
3297
- why: "Clears GHSA-r4xh-jqrq-34v2 (quadratic-time parse() from parseKey rescanning to the end of the document), patched in 1.9.0. markdownlint-cli2 pinned `smol-toml` to exactly 1.8.0 up to 0.23.3, and @mnaoumov/typescript-dev-toolkit declares markdownlint-cli2 `^0.23.2`, which on a 0.x package stops below 0.24.0, the first release pinning 1.9.1. So the toolkit presets still reach 1.8.0 through the toolkit, and `npm audit fix --force` offers only a DOWNGRADE of markdownlint-cli2 to 0.21.0. The markdownlint answer's own markdownlint-cli2 resolves to 0.24.0 or later, so `standalone` needs no override. The spec stays inside the 1.x major, and markdownlint-cli2 imports only `parse`, to read a `.markdownlint-cli2.toml` config."
3298
3349
  }
3299
3350
  };
3300
3351
  var DESKTOP_RELEASES_JSON_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/desktop-releases.json";
@@ -3302,6 +3353,8 @@ var FALLBACK_MIN_APP_VERSION = "1.13.0";
3302
3353
  var FALLBACK_VERSION = "latest";
3303
3354
  var JSON_INDENT_SPACES2 = 2;
3304
3355
  var REGISTRY_URL = "https://registry.npmjs.org";
3356
+ var ABBREVIATED_PACKUMENT_MEDIA_TYPE = "application/vnd.npm.install-v1+json";
3357
+ var CONSTRAINING_PACKAGES = ["@mnaoumov/obsidian-dev-toolkit", "@mnaoumov/typescript-dev-toolkit"];
3305
3358
  function buildOverrides(dependencies) {
3306
3359
  const overrides = {};
3307
3360
  for (const packageName of getPinnedPackageNames(dependencies)) {
@@ -3405,22 +3458,68 @@ async function resolveVersions(dependencies) {
3405
3458
  }
3406
3459
  unresolved.push(dependency.packageName);
3407
3460
  }
3408
- const fetched = await Promise.all(unresolved.map(fetchLatestVersion));
3409
3461
  const failed = [];
3410
- for (const [index, version] of fetched.entries()) {
3411
- const packageName = unresolved[index] ?? "";
3412
- if (version === null) {
3462
+ const constraints = /* @__PURE__ */ new Map();
3463
+ function record(packageName, resolution) {
3464
+ if (resolution === null) {
3413
3465
  failed.push(packageName);
3414
3466
  resolved.set(packageName, FALLBACK_VERSION);
3467
+ return;
3468
+ }
3469
+ resolved.set(packageName, resolution.spec);
3470
+ if (resolution.heldBelow !== null) {
3471
+ log3.info(`Holding ${packageName} on ${resolution.spec}, the range ${resolution.heldBy ?? ""} declares, rather than the latest ${resolution.heldBelow}.`);
3472
+ }
3473
+ }
3474
+ for (const constrainer of CONSTRAINING_PACKAGES) {
3475
+ if (!unresolved.includes(constrainer)) {
3415
3476
  continue;
3416
3477
  }
3417
- resolved.set(packageName, `^${version}`);
3478
+ const resolution = await resolveWithin(constrainer, constraints.get(constrainer));
3479
+ record(constrainer, resolution);
3480
+ if (resolution === null) {
3481
+ continue;
3482
+ }
3483
+ const manifest = await fetchManifest(constrainer, resolution.version);
3484
+ for (const [packageName, range] of Object.entries({ ...manifest?.peerDependencies, ...manifest?.dependencies })) {
3485
+ if (!constraints.has(packageName)) {
3486
+ constraints.set(packageName, { by: constrainer, range });
3487
+ }
3488
+ }
3489
+ }
3490
+ const rest = unresolved.filter((packageName) => !CONSTRAINING_PACKAGES.includes(packageName));
3491
+ const resolutions = await Promise.all(rest.map((packageName) => resolveWithin(packageName, constraints.get(packageName))));
3492
+ for (const [index, resolution] of resolutions.entries()) {
3493
+ record(rest[index] ?? "", resolution);
3418
3494
  }
3419
3495
  if (failed.length > 0) {
3420
3496
  log3.warn(`Could not look up the latest version of ${failed.join(", ")}. Falling back to "${FALLBACK_VERSION}".`);
3421
3497
  }
3422
3498
  return resolved;
3423
3499
  }
3500
+ async function fetchManifest(packageName, version) {
3501
+ try {
3502
+ const response = await fetch(`${REGISTRY_URL}/${packageName}/${version}`);
3503
+ if (!response.ok) {
3504
+ return null;
3505
+ }
3506
+ return await response.json();
3507
+ } catch {
3508
+ return null;
3509
+ }
3510
+ }
3511
+ async function fetchPublishedVersions(packageName) {
3512
+ try {
3513
+ const response = await fetch(`${REGISTRY_URL}/${packageName}`, { headers: { accept: ABBREVIATED_PACKUMENT_MEDIA_TYPE } });
3514
+ if (!response.ok) {
3515
+ return null;
3516
+ }
3517
+ const packument = await response.json();
3518
+ return Object.keys(packument.versions ?? {});
3519
+ } catch {
3520
+ return null;
3521
+ }
3522
+ }
3424
3523
  function getAdvisoryOverrides(dependencies) {
3425
3524
  return Object.entries(ADVISORY_OVERRIDES).filter(([, advisoryOverride]) => advisoryOverride.requires.some((packageName) => hasPackage(dependencies, packageName))).sort(([a], [b]) => a.localeCompare(b));
3426
3525
  }
@@ -3430,6 +3529,25 @@ function getPinnedPackageNames(dependencies) {
3430
3529
  function hasPackage(dependencies, packageName) {
3431
3530
  return dependencies.some((dependency) => dependency.packageName === packageName);
3432
3531
  }
3532
+ function isCaretWithin(version, range) {
3533
+ if (version === null || validRange(range) === null) {
3534
+ return false;
3535
+ }
3536
+ return subset(`^${version}`, range);
3537
+ }
3538
+ async function resolveWithin(packageName, constraint) {
3539
+ const latest = await fetchLatestVersion(packageName);
3540
+ if (constraint === void 0 || isCaretWithin(latest, constraint.range)) {
3541
+ return latest === null ? null : { heldBelow: null, heldBy: null, spec: `^${latest}`, version: latest };
3542
+ }
3543
+ const versions = await fetchPublishedVersions(packageName);
3544
+ const newest = versions === null ? null : maxSatisfying(versions, constraint.range);
3545
+ if (newest === null) {
3546
+ return { heldBelow: latest, heldBy: constraint.by, spec: constraint.range, version: minVersion(constraint.range)?.version ?? constraint.range };
3547
+ }
3548
+ const spec = isCaretWithin(newest, constraint.range) ? `^${newest}` : constraint.range;
3549
+ return { heldBelow: latest, heldBy: constraint.by, spec, version: newest };
3550
+ }
3433
3551
 
3434
3552
  // src/templates.ts
3435
3553
  var ASSET_EXTENSIONS = /* @__PURE__ */ new Set([".wasm"]);
@@ -3553,16 +3671,16 @@ function buildTemplate(givenAnswers, overlay = null) {
3553
3671
  }
3554
3672
  function copyTemplates(givenAnswers, targetDir, currentVersion, existingConfig, resolvedVersions = /* @__PURE__ */ new Map(), minAppVersion = FALLBACK_MIN_APP_VERSION, overlay = null, projectFormatter) {
3555
3673
  const answers = pinPresetAnswers(givenAnswers);
3556
- const templatesDir = join2(getScriptDir(), "..", "templates", "default");
3674
+ const templatesDir = join3(getScriptDir(), "..", "templates", "default");
3675
+ const overlayIndex = overlay ? indexTemplateDir(overlay.dir) : null;
3676
+ const builtInIndex = getBuiltInTemplateIndex(templatesDir);
3557
3677
  function findTemplate(relativePath) {
3558
- if (overlay) {
3559
- const overlayPath = join2(overlay.dir, relativePath);
3560
- if (existsSync3(overlayPath)) {
3561
- return overlayPath;
3562
- }
3678
+ const overlayPath = overlayIndex?.get(relativePath);
3679
+ if (overlay && overlayPath !== void 0) {
3680
+ return join3(overlay.dir, overlayPath);
3563
3681
  }
3564
- const builtInPath = join2(templatesDir, relativePath);
3565
- return existsSync3(builtInPath) ? builtInPath : null;
3682
+ const builtInPath = builtInIndex.get(relativePath);
3683
+ return builtInPath === void 0 ? null : join3(templatesDir, builtInPath);
3566
3684
  }
3567
3685
  const builder = buildTemplate(answers, overlay);
3568
3686
  const templateFiles = builder.templateFiles;
@@ -3584,6 +3702,9 @@ function copyTemplates(givenAnswers, targetDir, currentVersion, existingConfig,
3584
3702
  packageName: dependency.packageName,
3585
3703
  version: dependency.version ?? resolvedVersions.get(dependency.packageName) ?? PINNED_VERSIONS[dependency.packageName]?.version ?? UNRESOLVED_VERSION
3586
3704
  })),
3705
+ // The README's `support` seam opens `## Support` in the funding partial, so the issue-filing partial
3706
+ // After it opens the section itself only when there is no funding.
3707
+ _hasFunding: partials.has("has-funding"),
3587
3708
  _lintStagedPatterns: builder.lintStagedPatterns,
3588
3709
  _minAppVersion: minAppVersion,
3589
3710
  _overrides: Object.entries(buildOverrides(dependencies)).map(([packageName, spec]) => ({ packageName, spec })),
@@ -3642,7 +3763,7 @@ function copyTemplates(givenAnswers, targetDir, currentVersion, existingConfig,
3642
3763
  let rendered;
3643
3764
  if (isAsset) {
3644
3765
  currentTemplatePath = registeredPath;
3645
- rendered = readFileSync3(findTemplate(registeredPath) ?? join2(templatesDir, registeredPath));
3766
+ rendered = readFileSync3(findTemplate(registeredPath) ?? join3(templatesDir, registeredPath));
3646
3767
  } else if (ejsPath === null) {
3647
3768
  currentTemplatePath = `${registeredPath}.ejs`;
3648
3769
  rendered = templateContext["render"]();
@@ -3660,13 +3781,14 @@ function copyTemplates(givenAnswers, targetDir, currentVersion, existingConfig,
3660
3781
  renderedFiles.push({ content: rendered, destinationPath });
3661
3782
  }
3662
3783
  if (answers.preset === DOCS_SHOWCASE_PRESET) {
3663
- renderedFiles.push(...readDocsShowcaseFiles(join2(getScriptDir(), "..")));
3784
+ renderedFiles.push(...readDocsShowcaseFiles(join3(getScriptDir(), "..")));
3664
3785
  }
3665
3786
  return writeGeneratedFiles(renderedFiles, targetDir, currentVersion, existingConfig, projectFormatter);
3666
3787
  }
3667
3788
  function getDestinationPath(templatePath, answers) {
3668
3789
  return templatePath.replace(/%= (?<AnswerKey>.+?) %/g, (_match, ...args) => String(answers[String(args[0])]));
3669
3790
  }
3791
+ var builtInTemplateIndexes = /* @__PURE__ */ new Map();
3670
3792
  function getScriptDir() {
3671
3793
  return dirname(fileURLToPath(import.meta.url));
3672
3794
  }
@@ -3676,8 +3798,8 @@ function isPartialTemplatePath(templatePath) {
3676
3798
  return markerIndex > 0 && PARTIAL_NAME_PATTERN.test(fileName.slice(markerIndex + 1));
3677
3799
  }
3678
3800
  function loadConfig(dir) {
3679
- const configPath = join2(dir, CONFIG_FILE_NAME);
3680
- if (!existsSync3(configPath)) {
3801
+ const configPath = join3(dir, CONFIG_FILE_NAME);
3802
+ if (!existsSync4(configPath)) {
3681
3803
  return null;
3682
3804
  }
3683
3805
  const parsed = JSON.parse(readFileSync3(configPath, "utf-8"));
@@ -3691,8 +3813,8 @@ function pinPresetAnswers(answers) {
3691
3813
  function recordHashesOnDisk(targetDir, config) {
3692
3814
  const fileHashes = {};
3693
3815
  for (const [destinationPath, hash] of Object.entries(config.fileHashes)) {
3694
- const fullPath = join2(targetDir, destinationPath);
3695
- fileHashes[destinationPath] = existsSync3(fullPath) ? sha256(readFileSync3(fullPath)) : hash;
3816
+ const fullPath = join3(targetDir, destinationPath);
3817
+ fileHashes[destinationPath] = existsSync4(fullPath) ? sha256(readFileSync3(fullPath)) : hash;
3696
3818
  }
3697
3819
  return { ...config, fileHashes };
3698
3820
  }
@@ -3731,9 +3853,9 @@ function writeGeneratedFiles(files, targetDir, currentVersion, existingConfig, p
3731
3853
  const created = [];
3732
3854
  const written = [];
3733
3855
  for (const { content: rendered, destinationPath } of files) {
3734
- const fullDestinationPath = join2(targetDir, destinationPath);
3856
+ const fullDestinationPath = join3(targetDir, destinationPath);
3735
3857
  const newHash = sha256(rendered);
3736
- if (existingConfig && existsSync3(fullDestinationPath)) {
3858
+ if (existingConfig && existsSync4(fullDestinationPath)) {
3737
3859
  const currentContent = Buffer.isBuffer(rendered) ? readFileSync3(fullDestinationPath) : readFileSync3(fullDestinationPath, "utf-8");
3738
3860
  const currentHash = sha256(currentContent);
3739
3861
  const originalHash = existingConfig.fileHashes[destinationPath];
@@ -3756,14 +3878,14 @@ function writeGeneratedFiles(files, targetDir, currentVersion, existingConfig, p
3756
3878
  }
3757
3879
  newConfig.fileHashes[destinationPath] = newHash;
3758
3880
  const destDir = dirname(fullDestinationPath);
3759
- if (!existsSync3(destDir)) {
3881
+ if (!existsSync4(destDir)) {
3760
3882
  mkdirSync(destDir, { recursive: true });
3761
3883
  }
3762
3884
  writeFileSync(fullDestinationPath, rendered);
3763
3885
  written.push(destinationPath);
3764
3886
  }
3765
3887
  formatWrittenFiles(projectFormatter, targetDir, written, newConfig);
3766
- const configPath = join2(targetDir, CONFIG_FILE_NAME);
3888
+ const configPath = join3(targetDir, CONFIG_FILE_NAME);
3767
3889
  writeFileSync(configPath, `${JSON.stringify(newConfig, null, JSON_INDENT_SPACES3)}
3768
3890
  `);
3769
3891
  if (existingConfig) {
@@ -3793,8 +3915,16 @@ function formatWrittenFiles(projectFormatter, targetDir, written, config) {
3793
3915
  }
3794
3916
  projectFormatter.formatFiles(textFiles);
3795
3917
  for (const destinationPath of textFiles) {
3796
- config.fileHashes[destinationPath] = sha256(readFileSync3(join2(targetDir, destinationPath)));
3918
+ config.fileHashes[destinationPath] = sha256(readFileSync3(join3(targetDir, destinationPath)));
3919
+ }
3920
+ }
3921
+ function getBuiltInTemplateIndex(templatesDir) {
3922
+ let index = builtInTemplateIndexes.get(templatesDir);
3923
+ if (index === void 0) {
3924
+ index = indexTemplateDir(templatesDir);
3925
+ builtInTemplateIndexes.set(templatesDir, index);
3797
3926
  }
3927
+ return index;
3798
3928
  }
3799
3929
  function getCspellIdentityWords(answers) {
3800
3930
  const words = [answers.authorGitHubName, "mnaoumov"];
@@ -3923,12 +4053,12 @@ ${[base, ...extraConfigs.map((config) => JSON.stringify(config))].map((config) =
3923
4053
 
3924
4054
  // src/upstream-snapshot.ts
3925
4055
  import {
3926
- existsSync as existsSync4,
3927
- readdirSync as readdirSync2,
4056
+ existsSync as existsSync5,
4057
+ readdirSync as readdirSync3,
3928
4058
  readFileSync as readFileSync4
3929
4059
  } from "node:fs";
3930
4060
  import {
3931
- join as join3,
4061
+ join as join4,
3932
4062
  relative as relative2
3933
4063
  } from "node:path";
3934
4064
  var VENDORED_SUFFIX = ".vendored";
@@ -3967,10 +4097,10 @@ function readUpstream(upstreamsPath, name) {
3967
4097
  }
3968
4098
  function readVendoredFiles(dir) {
3969
4099
  const files = /* @__PURE__ */ new Map();
3970
- if (!existsSync4(dir)) {
4100
+ if (!existsSync5(dir)) {
3971
4101
  return files;
3972
4102
  }
3973
- const paths = readdirSync2(dir, { recursive: true, withFileTypes: true }).filter((entry) => entry.isFile() && entry.name.endsWith(VENDORED_SUFFIX)).map((entry) => join3(entry.parentPath, entry.name)).sort();
4103
+ const paths = readdirSync3(dir, { recursive: true, withFileTypes: true }).filter((entry) => entry.isFile() && entry.name.endsWith(VENDORED_SUFFIX)).map((entry) => join4(entry.parentPath, entry.name)).sort();
3974
4104
  for (const fullPath of paths) {
3975
4105
  const upstreamPath = relative2(dir, fullPath).replaceAll("\\", "/").slice(0, -VENDORED_SUFFIX.length);
3976
4106
  files.set(upstreamPath, readFileSync4(fullPath));
@@ -3987,7 +4117,7 @@ async function fetchJson(url, headers) {
3987
4117
 
3988
4118
  // src/official-sample.ts
3989
4119
  var OFFICIAL_SAMPLE_UPSTREAM_NAME = "obsidian-sample-plugin";
3990
- var OFFICIAL_SAMPLE_FILES_DIR = join4("templates", "official-sample", "files");
4120
+ var OFFICIAL_SAMPLE_FILES_DIR = join5("templates", "official-sample", "files");
3991
4121
  var OFFICIAL_SAMPLE_PINNED_ANSWERS = {
3992
4122
  formatter: "none",
3993
4123
  packageManager: "npm"
@@ -4046,14 +4176,14 @@ function copyOfficialSample(answers, targetDir, currentVersion, existingConfig,
4046
4176
  return { ...config, upstreamCommit: snapshot.commit };
4047
4177
  }
4048
4178
  function getPackageRoot() {
4049
- return join4(getScriptDir(), "..");
4179
+ return join5(getScriptDir(), "..");
4050
4180
  }
4051
4181
  function getUpstreamsPath() {
4052
- return join4(getPackageRoot(), "upstreams.json");
4182
+ return join5(getPackageRoot(), "upstreams.json");
4053
4183
  }
4054
4184
  function loadOfficialSampleSnapshot() {
4055
4185
  const upstream = readUpstream(getUpstreamsPath(), OFFICIAL_SAMPLE_UPSTREAM_NAME);
4056
- const files = readVendoredFiles(join4(getPackageRoot(), OFFICIAL_SAMPLE_FILES_DIR));
4186
+ const files = readVendoredFiles(join5(getPackageRoot(), OFFICIAL_SAMPLE_FILES_DIR));
4057
4187
  if (files.size === 0) {
4058
4188
  throw new Error(`The vendored snapshot of ${upstream.repo} is missing from ${OFFICIAL_SAMPLE_FILES_DIR}.`);
4059
4189
  }
@@ -4096,27 +4226,21 @@ function renamePackageInLock(lock, upstreamName, packageName) {
4096
4226
  // src/overlay.ts
4097
4227
  import {
4098
4228
  existsSync as existsSync6,
4099
- readdirSync as readdirSync4,
4100
4229
  readFileSync as readFileSync6,
4101
4230
  statSync as statSync2
4102
4231
  } from "node:fs";
4103
4232
  import {
4104
4233
  isAbsolute,
4105
- join as join6,
4234
+ join as join7,
4106
4235
  relative as relative3,
4107
4236
  resolve
4108
4237
  } from "node:path";
4109
4238
 
4110
- // src/plan-checks.ts
4111
- import {
4112
- existsSync as existsSync5,
4113
- readdirSync as readdirSync3,
4114
- readFileSync as readFileSync5,
4115
- statSync
4116
- } from "node:fs";
4239
+ // src/verification/plan-checks.ts
4240
+ import { readFileSync as readFileSync5 } from "node:fs";
4117
4241
  import {
4118
4242
  extname as extname2,
4119
- join as join5
4243
+ join as join6
4120
4244
  } from "node:path";
4121
4245
  var EJS_SUFFIX = ".ejs";
4122
4246
  var RENDER_SITE_PATTERN = /(?:<%[-=]?|\$\{)\s*render\(\s*(?:'(?<Section>[^']*)'|\{(?<Options>[^}]*)\})/g;
@@ -4142,7 +4266,7 @@ function loadTemplateInventory(templatesDir = defaultTemplatesDir()) {
4142
4266
  const emptyTemplates = /* @__PURE__ */ new Set();
4143
4267
  const partials = [];
4144
4268
  const renderSites = [];
4145
- for (const relativePath of walkTemplates(templatesDir, "")) {
4269
+ for (const [relativePath, physicalPath] of indexTemplateDir(templatesDir)) {
4146
4270
  if (ASSET_EXTENSIONS.has(extname2(relativePath))) {
4147
4271
  assetTemplates.add(relativePath);
4148
4272
  continue;
@@ -4151,7 +4275,7 @@ function loadTemplateInventory(templatesDir = defaultTemplatesDir()) {
4151
4275
  continue;
4152
4276
  }
4153
4277
  const withoutSuffix = relativePath.slice(0, -EJS_SUFFIX.length);
4154
- const body = readFileSync5(join5(templatesDir, relativePath), "utf-8");
4278
+ const body = readFileSync5(join6(templatesDir, physicalPath), "utf-8");
4155
4279
  if (isPartialTemplatePath(relativePath)) {
4156
4280
  partials.push(parsePartialPath(relativePath));
4157
4281
  } else {
@@ -4204,7 +4328,7 @@ function parsePartialPath(relativePath) {
4204
4328
  };
4205
4329
  }
4206
4330
  function defaultTemplatesDir() {
4207
- return join5(getScriptDir(), "..", "templates", "default");
4331
+ return join6(getScriptDir(), "..", "templates", "default");
4208
4332
  }
4209
4333
  function getRenderBase(templatePath) {
4210
4334
  if (!isPartialTemplatePath(templatePath)) {
@@ -4213,22 +4337,6 @@ function getRenderBase(templatePath) {
4213
4337
  const { basePath } = parsePartialPath(`${templatePath}${EJS_SUFFIX}`);
4214
4338
  return isPartialTemplatePath(basePath) ? getRenderBase(basePath) : templatePath;
4215
4339
  }
4216
- function walkTemplates(templatesDir, relativeDir) {
4217
- const absoluteDir = join5(templatesDir, relativeDir);
4218
- if (!existsSync5(absoluteDir)) {
4219
- return [];
4220
- }
4221
- const found = [];
4222
- for (const entry of readdirSync3(absoluteDir)) {
4223
- const relativePath = relativeDir === "" ? entry : `${relativeDir}/${entry}`;
4224
- if (statSync(join5(templatesDir, relativePath)).isDirectory()) {
4225
- found.push(...walkTemplates(templatesDir, relativePath));
4226
- } else {
4227
- found.push(relativePath);
4228
- }
4229
- }
4230
- return found;
4231
- }
4232
4340
 
4233
4341
  // src/overlay.ts
4234
4342
  var OVERLAY_MANIFEST_FILE_NAME = "overlay.json";
@@ -4241,7 +4349,7 @@ function loadOverlay(dir, builtIn = loadTemplateInventory()) {
4241
4349
  if (!existsSync6(absoluteDir) || !statSync2(absoluteDir).isDirectory()) {
4242
4350
  throw new Error(`Custom template directory not found: ${absoluteDir}`);
4243
4351
  }
4244
- const manifestPath = join6(absoluteDir, OVERLAY_MANIFEST_FILE_NAME);
4352
+ const manifestPath = join7(absoluteDir, OVERLAY_MANIFEST_FILE_NAME);
4245
4353
  if (!existsSync6(manifestPath)) {
4246
4354
  throw new Error(`Custom template directory has no ${OVERLAY_MANIFEST_FILE_NAME}: ${absoluteDir}`);
4247
4355
  }
@@ -4349,7 +4457,7 @@ function listStrayFiles(dir, own) {
4349
4457
  OVERLAY_MANIFEST_FILE_NAME,
4350
4458
  OVERLAY_README_FILE_NAME
4351
4459
  ]);
4352
- return walkFiles(dir, "").filter((path) => !accounted.has(path));
4460
+ return [...indexTemplateDir(dir)].filter(([logicalPath]) => !accounted.has(logicalPath)).map(([, physicalPath]) => physicalPath);
4353
4461
  }
4354
4462
  function readManifest(manifestPath) {
4355
4463
  let parsed;
@@ -4381,18 +4489,6 @@ function readManifest(manifestPath) {
4381
4489
  partials: readList("partials")
4382
4490
  };
4383
4491
  }
4384
- function walkFiles(root, relativeDir) {
4385
- const found = [];
4386
- for (const entry of readdirSync4(join6(root, relativeDir))) {
4387
- const relativePath = relativeDir === "" ? entry : `${relativeDir}/${entry}`;
4388
- if (statSync2(join6(root, relativePath)).isDirectory()) {
4389
- found.push(...walkFiles(root, relativePath));
4390
- } else {
4391
- found.push(relativePath);
4392
- }
4393
- }
4394
- return found;
4395
- }
4396
4492
 
4397
4493
  // src/project-formatter.ts
4398
4494
  import { spawnSync } from "node:child_process";
@@ -4400,7 +4496,7 @@ import {
4400
4496
  existsSync as existsSync7,
4401
4497
  readFileSync as readFileSync7
4402
4498
  } from "node:fs";
4403
- import { join as join7 } from "node:path";
4499
+ import { join as join8 } from "node:path";
4404
4500
  import process2 from "node:process";
4405
4501
  var FORMATTER_COMMANDS = {
4406
4502
  biome: {
@@ -4435,14 +4531,14 @@ function createProjectFormatter(targetDir, formatter) {
4435
4531
  };
4436
4532
  }
4437
4533
  function resolveBin(targetDir, packageName) {
4438
- const packageDir = join7(targetDir, "node_modules", packageName);
4439
- const packageJsonPath = join7(packageDir, "package.json");
4534
+ const packageDir = join8(targetDir, "node_modules", packageName);
4535
+ const packageJsonPath = join8(packageDir, "package.json");
4440
4536
  if (!existsSync7(packageJsonPath)) {
4441
4537
  return null;
4442
4538
  }
4443
4539
  const { bin } = JSON.parse(readFileSync7(packageJsonPath, "utf-8"));
4444
4540
  const relativeBin = typeof bin === "string" ? bin : Object.values(bin ?? {})[0];
4445
- return relativeBin === void 0 ? null : join7(packageDir, relativeBin);
4541
+ return relativeBin === void 0 ? null : join8(packageDir, relativeBin);
4446
4542
  }
4447
4543
  function runCli(binPath, targetDir, args, input) {
4448
4544
  const result = spawnSync(process2.execPath, [binPath, ...args], { cwd: targetDir, encoding: "utf-8", input });
@@ -4491,7 +4587,7 @@ async function detectMode(cliArgs) {
4491
4587
  if (cliArgs.mode) {
4492
4588
  return cliArgs.mode;
4493
4589
  }
4494
- const configPath = join8(process.cwd(), CONFIG_FILE_NAME);
4590
+ const configPath = join9(process.cwd(), CONFIG_FILE_NAME);
4495
4591
  if (existsSync8(configPath)) {
4496
4592
  if (cliArgs.useDefaults) {
4497
4593
  exitWithUsageError(`Existing project detected (${CONFIG_FILE_NAME}), and --yes cannot ask whether to update it.
@@ -4583,7 +4679,7 @@ function exitWithUsageError(message) {
4583
4679
  process.exit(1);
4584
4680
  }
4585
4681
  function hasPrepareScript(targetDir) {
4586
- const packageJson = JSON.parse(readFileSync8(join8(targetDir, "package.json"), "utf-8"));
4682
+ const packageJson = JSON.parse(readFileSync8(join9(targetDir, "package.json"), "utf-8"));
4587
4683
  return Object.hasOwn(packageJson.scripts ?? {}, "prepare");
4588
4684
  }
4589
4685
  function loadOverlayOrExit(dir, hint = "") {
@@ -4594,7 +4690,7 @@ function loadOverlayOrExit(dir, hint = "") {
4594
4690
  }
4595
4691
  }
4596
4692
  async function main() {
4597
- const packageJsonPath = join8(getScriptDir(), "..", "package.json");
4693
+ const packageJsonPath = join9(getScriptDir(), "..", "package.json");
4598
4694
  const packageJson = JSON.parse(readFileSync8(packageJsonPath, "utf-8"));
4599
4695
  const currentVersion = packageJson.version ?? "0.0.0";
4600
4696
  const m = "\x1B[38;5;135m";
@@ -4650,7 +4746,7 @@ async function offerAnswersExport(answers, customTemplate) {
4650
4746
  let choice = await ask();
4651
4747
  while (choice !== "generate") {
4652
4748
  if (choice === "script") {
4653
- const scriptPath = join8(process.cwd(), scriptName);
4749
+ const scriptPath = join9(process.cwd(), scriptName);
4654
4750
  writeFileSync2(scriptPath, formatCreateScript(answers, shell, customTemplate));
4655
4751
  if (shell === "sh") {
4656
4752
  chmodSync(scriptPath, SCRIPT_MODE);
@@ -4658,7 +4754,7 @@ async function offerAnswersExport(answers, customTemplate) {
4658
4754
  log5.success(`Wrote ${scriptName}`);
4659
4755
  note(formatCreateCommand(answers, shell, customTemplate), "Non-interactive command");
4660
4756
  } else {
4661
- writeFileSync2(join8(process.cwd(), answersFileName), formatAnswersJson(answers));
4757
+ writeFileSync2(join9(process.cwd(), answersFileName), formatAnswersJson(answers));
4662
4758
  log5.success(`Wrote ${answersFileName}`);
4663
4759
  const overlayFlag = customTemplate ? ` --customTemplate=${customTemplate}` : "";
4664
4760
  note(`npm create @mnaoumov/obsidian-plugin -- --yes --mode=create --answersFile=${answersFileName}${overlayFlag}`, "Non-interactive command");
@@ -4709,7 +4805,7 @@ async function runCreate(currentVersion, cliArgs) {
4709
4805
  if (!useDefaults) {
4710
4806
  await offerAnswersExport(answers, customTemplate);
4711
4807
  }
4712
- const targetDir = join8(process.cwd(), `obsidian-${answers.pluginId}`);
4808
+ const targetDir = join9(process.cwd(), `obsidian-${answers.pluginId}`);
4713
4809
  if (existsSync8(targetDir) && !cliArgs.force) {
4714
4810
  if (useDefaults) {
4715
4811
  exitWithUsageError(`Directory obsidian-${answers.pluginId} already exists, and --yes cannot ask whether to scaffold into it.
@@ -4739,14 +4835,14 @@ Pass --force to scaffold into it anyway.`);
4739
4835
  newConfig = copyTemplates(answers, targetDir, currentVersion, null, resolvedVersions, minAppVersion, overlay);
4740
4836
  s.stop("Plugin scaffolded.");
4741
4837
  }
4742
- const configPath = join8(targetDir, CONFIG_FILE_NAME);
4838
+ const configPath = join9(targetDir, CONFIG_FILE_NAME);
4743
4839
  const configWithAnswers = buildSavedConfig(newConfig, answers, overlay, targetDir);
4744
4840
  writeFileSync2(configPath, `${JSON.stringify(configWithAnswers, null, JSON_INDENT_SPACES4)}
4745
4841
  `);
4746
4842
  const isFormatted = useDefaults ? false : await runPostScaffold(targetDir, answers);
4747
4843
  const pm = answers.packageManager;
4748
4844
  const dirName = `obsidian-${answers.pluginId}`;
4749
- const needsInstall = !existsSync8(join8(targetDir, "node_modules"));
4845
+ const needsInstall = !existsSync8(join9(targetDir, "node_modules"));
4750
4846
  const needsFormat = needsInitialFormat(answers.formatter) && !isFormatted;
4751
4847
  const steps = [
4752
4848
  ...needsInstall ? [getInstallCommand(pm)] : [],
@@ -4764,7 +4860,7 @@ async function runInitialFormat(targetDir, answers, isInstalled) {
4764
4860
  s.start("Formatting...");
4765
4861
  try {
4766
4862
  await execAsync(getRunCommand(answers.packageManager, "format"), targetDir);
4767
- const configPath = join8(targetDir, CONFIG_FILE_NAME);
4863
+ const configPath = join9(targetDir, CONFIG_FILE_NAME);
4768
4864
  const config = JSON.parse(readFileSync8(configPath, "utf-8"));
4769
4865
  writeFileSync2(configPath, `${JSON.stringify(recordHashesOnDisk(targetDir, config), null, JSON_INDENT_SPACES4)}
4770
4866
  `);
@@ -4859,7 +4955,7 @@ This project records it in ${CONFIG_FILE_NAME}. Pass --customTemplate=<dir> to p
4859
4955
  );
4860
4956
  log5.info(`Applying the custom template recorded for this project: ${existingConfig.customTemplate}`);
4861
4957
  }
4862
- const configPath = join8(targetDir, CONFIG_FILE_NAME);
4958
+ const configPath = join9(targetDir, CONFIG_FILE_NAME);
4863
4959
  const savedConfig = JSON.parse(readFileSync8(configPath, "utf-8"));
4864
4960
  let answers;
4865
4961
  if (savedConfig.answers) {