@mnaoumov/create-obsidian-plugin 1.1.0 → 1.3.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 +16 -334
  2. package/dist/main.js +903 -803
  3. package/package.json +16 -5
  4. package/src/main.ts +17 -15
  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"
@@ -1156,35 +1331,8 @@ var DocsShowcase = class extends FeatureOption {
1156
1331
  if (answers.testRunner === "vitest") {
1157
1332
  builder.addFiles(["src/docs-showcase.desktop.integration.test.ts"]);
1158
1333
  }
1159
- }
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
- }
1334
+ }
1335
+ };
1188
1336
 
1189
1337
  // src/features/preset/standalone.ts
1190
1338
  var Standalone = class extends FeatureOption {
@@ -1671,304 +1819,98 @@ var Vue = class extends FeatureOption {
1671
1819
  "src/vue-components/sample-vue-component.d.ts",
1672
1820
  "src/vue-components/sample-vue-component.vue",
1673
1821
  "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';
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];
@@ -2607,7 +2612,11 @@ function getAnswerableKeys() {
2607
2612
  }
2608
2613
  function getHelpText() {
2609
2614
  const lines = [
2610
- "Usage: npm create @mnaoumov/obsidian-plugin [-- <options>]",
2615
+ 'Usage: npm create @mnaoumov/obsidian-plugin ["--" <options>]',
2616
+ "",
2617
+ 'npm needs the "--" before the options; pnpm, yarn and bun do not. Keep its quotes: PowerShell',
2618
+ "swallows a bare --. See https://mnaoumov.dev/create-obsidian-plugin/guides/powershell-separator/",
2619
+ "Full documentation: https://mnaoumov.dev/create-obsidian-plugin/",
2611
2620
  "",
2612
2621
  "Options:",
2613
2622
  " -y, --yes Take every default and skip the post-scaffold prompts. Never asks:",
@@ -2781,7 +2790,7 @@ function toMode(value) {
2781
2790
  return mode;
2782
2791
  }
2783
2792
 
2784
- // src/answers-export.ts
2793
+ // src/answers/answers-export.ts
2785
2794
  var CREATE_COMMANDS = {
2786
2795
  bun: { prefix: "bun create @mnaoumov/obsidian-plugin", separator: "" },
2787
2796
  npm: { prefix: "npm create @mnaoumov/obsidian-plugin", separator: " --" },
@@ -2839,7 +2848,7 @@ function quote(value, shell) {
2839
2848
  return `'${value.replaceAll("'", "'\\''")}'`;
2840
2849
  }
2841
2850
 
2842
- // src/directory-registry.ts
2851
+ // src/directory/directory-registry.ts
2843
2852
  var COMMUNITY_PLUGINS_JSON_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/community-plugins.json";
2844
2853
  async function fetchCommunityPluginIds() {
2845
2854
  try {
@@ -2875,14 +2884,14 @@ function validatePluginIdIsUnlisted(pluginId, listedIds) {
2875
2884
  }
2876
2885
 
2877
2886
  // src/official-sample.ts
2878
- import { join as join4 } from "node:path";
2887
+ import { join as join5 } from "node:path";
2879
2888
 
2880
2889
  // src/templates.ts
2881
2890
  import { log as log4 } from "@clack/prompts";
2882
2891
  import ejs from "ejs";
2883
2892
  import { createHash } from "node:crypto";
2884
2893
  import {
2885
- existsSync as existsSync3,
2894
+ existsSync as existsSync4,
2886
2895
  mkdirSync,
2887
2896
  readFileSync as readFileSync3,
2888
2897
  writeFileSync
@@ -2890,7 +2899,7 @@ import {
2890
2899
  import {
2891
2900
  dirname,
2892
2901
  extname,
2893
- join as join2
2902
+ join as join3
2894
2903
  } from "node:path";
2895
2904
  import { fileURLToPath } from "node:url";
2896
2905
 
@@ -3119,8 +3128,54 @@ var TemplateBuilder = class {
3119
3128
  }
3120
3129
  };
3121
3130
 
3131
+ // src/template-index.ts
3132
+ import {
3133
+ existsSync as existsSync3,
3134
+ readdirSync as readdirSync2,
3135
+ statSync
3136
+ } from "node:fs";
3137
+ import { join as join2 } from "node:path";
3138
+ var GROUP_FOLDER_PATTERN = /^\(.+\)$/;
3139
+ function getLogicalTemplatePath(physicalPath) {
3140
+ return physicalPath.split("/").filter((segment) => !GROUP_FOLDER_PATTERN.test(segment)).join("/");
3141
+ }
3142
+ function indexTemplateDir(root) {
3143
+ const index = /* @__PURE__ */ new Map();
3144
+ for (const physicalPath of walkFiles(root, "")) {
3145
+ const logicalPath = getLogicalTemplatePath(physicalPath);
3146
+ const existing = index.get(logicalPath);
3147
+ if (existing !== void 0) {
3148
+ throw new Error(`Two templates in ${root} resolve to ${logicalPath}: ${existing} and ${physicalPath}.`);
3149
+ }
3150
+ index.set(logicalPath, physicalPath);
3151
+ }
3152
+ return index;
3153
+ }
3154
+ function walkFiles(root, relativeDir) {
3155
+ const absoluteDir = join2(root, relativeDir);
3156
+ if (!existsSync3(absoluteDir)) {
3157
+ return [];
3158
+ }
3159
+ const found = [];
3160
+ for (const entry of readdirSync2(absoluteDir)) {
3161
+ const relativePath = relativeDir === "" ? entry : `${relativeDir}/${entry}`;
3162
+ if (statSync(join2(root, relativePath)).isDirectory()) {
3163
+ found.push(...walkFiles(root, relativePath));
3164
+ } else {
3165
+ found.push(relativePath);
3166
+ }
3167
+ }
3168
+ return found;
3169
+ }
3170
+
3122
3171
  // src/versions.ts
3123
3172
  import { log as log3 } from "@clack/prompts";
3173
+ import {
3174
+ maxSatisfying,
3175
+ minVersion,
3176
+ subset,
3177
+ validRange
3178
+ } from "semver";
3124
3179
  var PINNED_VERSIONS = {
3125
3180
  "@babel/core": {
3126
3181
  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 +3335,14 @@ var ADVISORY_OVERRIDES = {
3280
3335
  spec: "^8.0.2",
3281
3336
  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
3337
  },
3338
+ "re2js": {
3339
+ check: `node -e "const fs=require('node:fs');process.stdout.write(JSON.parse(fs.readFileSync('node_modules/markdownlint/package.json','utf8')).dependencies.re2js)"`,
3340
+ expect: "2.8.6",
3341
+ 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`.",
3342
+ requires: ["markdownlint", "markdownlint-cli2", "@mnaoumov/typescript-dev-toolkit", "@mnaoumov/obsidian-dev-toolkit"],
3343
+ spec: "^2.9.1",
3344
+ 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."
3345
+ },
3283
3346
  "serialize-javascript": {
3284
3347
  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
3348
  expect: "^6.0.2",
@@ -3287,14 +3350,6 @@ var ADVISORY_OVERRIDES = {
3287
3350
  requires: ["@wdio/mocha-framework"],
3288
3351
  spec: "^7.1.1",
3289
3352
  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
3353
  }
3299
3354
  };
3300
3355
  var DESKTOP_RELEASES_JSON_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/master/desktop-releases.json";
@@ -3302,6 +3357,8 @@ var FALLBACK_MIN_APP_VERSION = "1.13.0";
3302
3357
  var FALLBACK_VERSION = "latest";
3303
3358
  var JSON_INDENT_SPACES2 = 2;
3304
3359
  var REGISTRY_URL = "https://registry.npmjs.org";
3360
+ var ABBREVIATED_PACKUMENT_MEDIA_TYPE = "application/vnd.npm.install-v1+json";
3361
+ var CONSTRAINING_PACKAGES = ["@mnaoumov/obsidian-dev-toolkit", "@mnaoumov/typescript-dev-toolkit"];
3305
3362
  function buildOverrides(dependencies) {
3306
3363
  const overrides = {};
3307
3364
  for (const packageName of getPinnedPackageNames(dependencies)) {
@@ -3405,22 +3462,68 @@ async function resolveVersions(dependencies) {
3405
3462
  }
3406
3463
  unresolved.push(dependency.packageName);
3407
3464
  }
3408
- const fetched = await Promise.all(unresolved.map(fetchLatestVersion));
3409
3465
  const failed = [];
3410
- for (const [index, version] of fetched.entries()) {
3411
- const packageName = unresolved[index] ?? "";
3412
- if (version === null) {
3466
+ const constraints = /* @__PURE__ */ new Map();
3467
+ function record(packageName, resolution) {
3468
+ if (resolution === null) {
3413
3469
  failed.push(packageName);
3414
3470
  resolved.set(packageName, FALLBACK_VERSION);
3471
+ return;
3472
+ }
3473
+ resolved.set(packageName, resolution.spec);
3474
+ if (resolution.heldBelow !== null) {
3475
+ log3.info(`Holding ${packageName} on ${resolution.spec}, the range ${resolution.heldBy ?? ""} declares, rather than the latest ${resolution.heldBelow}.`);
3476
+ }
3477
+ }
3478
+ for (const constrainer of CONSTRAINING_PACKAGES) {
3479
+ if (!unresolved.includes(constrainer)) {
3415
3480
  continue;
3416
3481
  }
3417
- resolved.set(packageName, `^${version}`);
3482
+ const resolution = await resolveWithin(constrainer, constraints.get(constrainer));
3483
+ record(constrainer, resolution);
3484
+ if (resolution === null) {
3485
+ continue;
3486
+ }
3487
+ const manifest = await fetchManifest(constrainer, resolution.version);
3488
+ for (const [packageName, range] of Object.entries({ ...manifest?.peerDependencies, ...manifest?.dependencies })) {
3489
+ if (!constraints.has(packageName)) {
3490
+ constraints.set(packageName, { by: constrainer, range });
3491
+ }
3492
+ }
3493
+ }
3494
+ const rest = unresolved.filter((packageName) => !CONSTRAINING_PACKAGES.includes(packageName));
3495
+ const resolutions = await Promise.all(rest.map((packageName) => resolveWithin(packageName, constraints.get(packageName))));
3496
+ for (const [index, resolution] of resolutions.entries()) {
3497
+ record(rest[index] ?? "", resolution);
3418
3498
  }
3419
3499
  if (failed.length > 0) {
3420
3500
  log3.warn(`Could not look up the latest version of ${failed.join(", ")}. Falling back to "${FALLBACK_VERSION}".`);
3421
3501
  }
3422
3502
  return resolved;
3423
3503
  }
3504
+ async function fetchManifest(packageName, version) {
3505
+ try {
3506
+ const response = await fetch(`${REGISTRY_URL}/${packageName}/${version}`);
3507
+ if (!response.ok) {
3508
+ return null;
3509
+ }
3510
+ return await response.json();
3511
+ } catch {
3512
+ return null;
3513
+ }
3514
+ }
3515
+ async function fetchPublishedVersions(packageName) {
3516
+ try {
3517
+ const response = await fetch(`${REGISTRY_URL}/${packageName}`, { headers: { accept: ABBREVIATED_PACKUMENT_MEDIA_TYPE } });
3518
+ if (!response.ok) {
3519
+ return null;
3520
+ }
3521
+ const packument = await response.json();
3522
+ return Object.keys(packument.versions ?? {});
3523
+ } catch {
3524
+ return null;
3525
+ }
3526
+ }
3424
3527
  function getAdvisoryOverrides(dependencies) {
3425
3528
  return Object.entries(ADVISORY_OVERRIDES).filter(([, advisoryOverride]) => advisoryOverride.requires.some((packageName) => hasPackage(dependencies, packageName))).sort(([a], [b]) => a.localeCompare(b));
3426
3529
  }
@@ -3430,6 +3533,25 @@ function getPinnedPackageNames(dependencies) {
3430
3533
  function hasPackage(dependencies, packageName) {
3431
3534
  return dependencies.some((dependency) => dependency.packageName === packageName);
3432
3535
  }
3536
+ function isCaretWithin(version, range) {
3537
+ if (version === null || validRange(range) === null) {
3538
+ return false;
3539
+ }
3540
+ return subset(`^${version}`, range);
3541
+ }
3542
+ async function resolveWithin(packageName, constraint) {
3543
+ const latest = await fetchLatestVersion(packageName);
3544
+ if (constraint === void 0 || isCaretWithin(latest, constraint.range)) {
3545
+ return latest === null ? null : { heldBelow: null, heldBy: null, spec: `^${latest}`, version: latest };
3546
+ }
3547
+ const versions = await fetchPublishedVersions(packageName);
3548
+ const newest = versions === null ? null : maxSatisfying(versions, constraint.range);
3549
+ if (newest === null) {
3550
+ return { heldBelow: latest, heldBy: constraint.by, spec: constraint.range, version: minVersion(constraint.range)?.version ?? constraint.range };
3551
+ }
3552
+ const spec = isCaretWithin(newest, constraint.range) ? `^${newest}` : constraint.range;
3553
+ return { heldBelow: latest, heldBy: constraint.by, spec, version: newest };
3554
+ }
3433
3555
 
3434
3556
  // src/templates.ts
3435
3557
  var ASSET_EXTENSIONS = /* @__PURE__ */ new Set([".wasm"]);
@@ -3553,16 +3675,16 @@ function buildTemplate(givenAnswers, overlay = null) {
3553
3675
  }
3554
3676
  function copyTemplates(givenAnswers, targetDir, currentVersion, existingConfig, resolvedVersions = /* @__PURE__ */ new Map(), minAppVersion = FALLBACK_MIN_APP_VERSION, overlay = null, projectFormatter) {
3555
3677
  const answers = pinPresetAnswers(givenAnswers);
3556
- const templatesDir = join2(getScriptDir(), "..", "templates", "default");
3678
+ const templatesDir = join3(getScriptDir(), "..", "templates", "default");
3679
+ const overlayIndex = overlay ? indexTemplateDir(overlay.dir) : null;
3680
+ const builtInIndex = getBuiltInTemplateIndex(templatesDir);
3557
3681
  function findTemplate(relativePath) {
3558
- if (overlay) {
3559
- const overlayPath = join2(overlay.dir, relativePath);
3560
- if (existsSync3(overlayPath)) {
3561
- return overlayPath;
3562
- }
3682
+ const overlayPath = overlayIndex?.get(relativePath);
3683
+ if (overlay && overlayPath !== void 0) {
3684
+ return join3(overlay.dir, overlayPath);
3563
3685
  }
3564
- const builtInPath = join2(templatesDir, relativePath);
3565
- return existsSync3(builtInPath) ? builtInPath : null;
3686
+ const builtInPath = builtInIndex.get(relativePath);
3687
+ return builtInPath === void 0 ? null : join3(templatesDir, builtInPath);
3566
3688
  }
3567
3689
  const builder = buildTemplate(answers, overlay);
3568
3690
  const templateFiles = builder.templateFiles;
@@ -3584,6 +3706,9 @@ function copyTemplates(givenAnswers, targetDir, currentVersion, existingConfig,
3584
3706
  packageName: dependency.packageName,
3585
3707
  version: dependency.version ?? resolvedVersions.get(dependency.packageName) ?? PINNED_VERSIONS[dependency.packageName]?.version ?? UNRESOLVED_VERSION
3586
3708
  })),
3709
+ // The README's `support` seam opens `## Support` in the funding partial, so the issue-filing partial
3710
+ // After it opens the section itself only when there is no funding.
3711
+ _hasFunding: partials.has("has-funding"),
3587
3712
  _lintStagedPatterns: builder.lintStagedPatterns,
3588
3713
  _minAppVersion: minAppVersion,
3589
3714
  _overrides: Object.entries(buildOverrides(dependencies)).map(([packageName, spec]) => ({ packageName, spec })),
@@ -3642,7 +3767,7 @@ function copyTemplates(givenAnswers, targetDir, currentVersion, existingConfig,
3642
3767
  let rendered;
3643
3768
  if (isAsset) {
3644
3769
  currentTemplatePath = registeredPath;
3645
- rendered = readFileSync3(findTemplate(registeredPath) ?? join2(templatesDir, registeredPath));
3770
+ rendered = readFileSync3(findTemplate(registeredPath) ?? join3(templatesDir, registeredPath));
3646
3771
  } else if (ejsPath === null) {
3647
3772
  currentTemplatePath = `${registeredPath}.ejs`;
3648
3773
  rendered = templateContext["render"]();
@@ -3660,13 +3785,14 @@ function copyTemplates(givenAnswers, targetDir, currentVersion, existingConfig,
3660
3785
  renderedFiles.push({ content: rendered, destinationPath });
3661
3786
  }
3662
3787
  if (answers.preset === DOCS_SHOWCASE_PRESET) {
3663
- renderedFiles.push(...readDocsShowcaseFiles(join2(getScriptDir(), "..")));
3788
+ renderedFiles.push(...readDocsShowcaseFiles(join3(getScriptDir(), "..")));
3664
3789
  }
3665
3790
  return writeGeneratedFiles(renderedFiles, targetDir, currentVersion, existingConfig, projectFormatter);
3666
3791
  }
3667
3792
  function getDestinationPath(templatePath, answers) {
3668
3793
  return templatePath.replace(/%= (?<AnswerKey>.+?) %/g, (_match, ...args) => String(answers[String(args[0])]));
3669
3794
  }
3795
+ var builtInTemplateIndexes = /* @__PURE__ */ new Map();
3670
3796
  function getScriptDir() {
3671
3797
  return dirname(fileURLToPath(import.meta.url));
3672
3798
  }
@@ -3676,8 +3802,8 @@ function isPartialTemplatePath(templatePath) {
3676
3802
  return markerIndex > 0 && PARTIAL_NAME_PATTERN.test(fileName.slice(markerIndex + 1));
3677
3803
  }
3678
3804
  function loadConfig(dir) {
3679
- const configPath = join2(dir, CONFIG_FILE_NAME);
3680
- if (!existsSync3(configPath)) {
3805
+ const configPath = join3(dir, CONFIG_FILE_NAME);
3806
+ if (!existsSync4(configPath)) {
3681
3807
  return null;
3682
3808
  }
3683
3809
  const parsed = JSON.parse(readFileSync3(configPath, "utf-8"));
@@ -3691,8 +3817,8 @@ function pinPresetAnswers(answers) {
3691
3817
  function recordHashesOnDisk(targetDir, config) {
3692
3818
  const fileHashes = {};
3693
3819
  for (const [destinationPath, hash] of Object.entries(config.fileHashes)) {
3694
- const fullPath = join2(targetDir, destinationPath);
3695
- fileHashes[destinationPath] = existsSync3(fullPath) ? sha256(readFileSync3(fullPath)) : hash;
3820
+ const fullPath = join3(targetDir, destinationPath);
3821
+ fileHashes[destinationPath] = existsSync4(fullPath) ? sha256(readFileSync3(fullPath)) : hash;
3696
3822
  }
3697
3823
  return { ...config, fileHashes };
3698
3824
  }
@@ -3731,9 +3857,9 @@ function writeGeneratedFiles(files, targetDir, currentVersion, existingConfig, p
3731
3857
  const created = [];
3732
3858
  const written = [];
3733
3859
  for (const { content: rendered, destinationPath } of files) {
3734
- const fullDestinationPath = join2(targetDir, destinationPath);
3860
+ const fullDestinationPath = join3(targetDir, destinationPath);
3735
3861
  const newHash = sha256(rendered);
3736
- if (existingConfig && existsSync3(fullDestinationPath)) {
3862
+ if (existingConfig && existsSync4(fullDestinationPath)) {
3737
3863
  const currentContent = Buffer.isBuffer(rendered) ? readFileSync3(fullDestinationPath) : readFileSync3(fullDestinationPath, "utf-8");
3738
3864
  const currentHash = sha256(currentContent);
3739
3865
  const originalHash = existingConfig.fileHashes[destinationPath];
@@ -3756,14 +3882,14 @@ function writeGeneratedFiles(files, targetDir, currentVersion, existingConfig, p
3756
3882
  }
3757
3883
  newConfig.fileHashes[destinationPath] = newHash;
3758
3884
  const destDir = dirname(fullDestinationPath);
3759
- if (!existsSync3(destDir)) {
3885
+ if (!existsSync4(destDir)) {
3760
3886
  mkdirSync(destDir, { recursive: true });
3761
3887
  }
3762
3888
  writeFileSync(fullDestinationPath, rendered);
3763
3889
  written.push(destinationPath);
3764
3890
  }
3765
3891
  formatWrittenFiles(projectFormatter, targetDir, written, newConfig);
3766
- const configPath = join2(targetDir, CONFIG_FILE_NAME);
3892
+ const configPath = join3(targetDir, CONFIG_FILE_NAME);
3767
3893
  writeFileSync(configPath, `${JSON.stringify(newConfig, null, JSON_INDENT_SPACES3)}
3768
3894
  `);
3769
3895
  if (existingConfig) {
@@ -3793,8 +3919,16 @@ function formatWrittenFiles(projectFormatter, targetDir, written, config) {
3793
3919
  }
3794
3920
  projectFormatter.formatFiles(textFiles);
3795
3921
  for (const destinationPath of textFiles) {
3796
- config.fileHashes[destinationPath] = sha256(readFileSync3(join2(targetDir, destinationPath)));
3922
+ config.fileHashes[destinationPath] = sha256(readFileSync3(join3(targetDir, destinationPath)));
3923
+ }
3924
+ }
3925
+ function getBuiltInTemplateIndex(templatesDir) {
3926
+ let index = builtInTemplateIndexes.get(templatesDir);
3927
+ if (index === void 0) {
3928
+ index = indexTemplateDir(templatesDir);
3929
+ builtInTemplateIndexes.set(templatesDir, index);
3797
3930
  }
3931
+ return index;
3798
3932
  }
3799
3933
  function getCspellIdentityWords(answers) {
3800
3934
  const words = [answers.authorGitHubName, "mnaoumov"];
@@ -3923,12 +4057,12 @@ ${[base, ...extraConfigs.map((config) => JSON.stringify(config))].map((config) =
3923
4057
 
3924
4058
  // src/upstream-snapshot.ts
3925
4059
  import {
3926
- existsSync as existsSync4,
3927
- readdirSync as readdirSync2,
4060
+ existsSync as existsSync5,
4061
+ readdirSync as readdirSync3,
3928
4062
  readFileSync as readFileSync4
3929
4063
  } from "node:fs";
3930
4064
  import {
3931
- join as join3,
4065
+ join as join4,
3932
4066
  relative as relative2
3933
4067
  } from "node:path";
3934
4068
  var VENDORED_SUFFIX = ".vendored";
@@ -3967,10 +4101,10 @@ function readUpstream(upstreamsPath, name) {
3967
4101
  }
3968
4102
  function readVendoredFiles(dir) {
3969
4103
  const files = /* @__PURE__ */ new Map();
3970
- if (!existsSync4(dir)) {
4104
+ if (!existsSync5(dir)) {
3971
4105
  return files;
3972
4106
  }
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();
4107
+ 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
4108
  for (const fullPath of paths) {
3975
4109
  const upstreamPath = relative2(dir, fullPath).replaceAll("\\", "/").slice(0, -VENDORED_SUFFIX.length);
3976
4110
  files.set(upstreamPath, readFileSync4(fullPath));
@@ -3987,7 +4121,7 @@ async function fetchJson(url, headers) {
3987
4121
 
3988
4122
  // src/official-sample.ts
3989
4123
  var OFFICIAL_SAMPLE_UPSTREAM_NAME = "obsidian-sample-plugin";
3990
- var OFFICIAL_SAMPLE_FILES_DIR = join4("templates", "official-sample", "files");
4124
+ var OFFICIAL_SAMPLE_FILES_DIR = join5("templates", "official-sample", "files");
3991
4125
  var OFFICIAL_SAMPLE_PINNED_ANSWERS = {
3992
4126
  formatter: "none",
3993
4127
  packageManager: "npm"
@@ -4046,14 +4180,14 @@ function copyOfficialSample(answers, targetDir, currentVersion, existingConfig,
4046
4180
  return { ...config, upstreamCommit: snapshot.commit };
4047
4181
  }
4048
4182
  function getPackageRoot() {
4049
- return join4(getScriptDir(), "..");
4183
+ return join5(getScriptDir(), "..");
4050
4184
  }
4051
4185
  function getUpstreamsPath() {
4052
- return join4(getPackageRoot(), "upstreams.json");
4186
+ return join5(getPackageRoot(), "upstreams.json");
4053
4187
  }
4054
4188
  function loadOfficialSampleSnapshot() {
4055
4189
  const upstream = readUpstream(getUpstreamsPath(), OFFICIAL_SAMPLE_UPSTREAM_NAME);
4056
- const files = readVendoredFiles(join4(getPackageRoot(), OFFICIAL_SAMPLE_FILES_DIR));
4190
+ const files = readVendoredFiles(join5(getPackageRoot(), OFFICIAL_SAMPLE_FILES_DIR));
4057
4191
  if (files.size === 0) {
4058
4192
  throw new Error(`The vendored snapshot of ${upstream.repo} is missing from ${OFFICIAL_SAMPLE_FILES_DIR}.`);
4059
4193
  }
@@ -4096,27 +4230,21 @@ function renamePackageInLock(lock, upstreamName, packageName) {
4096
4230
  // src/overlay.ts
4097
4231
  import {
4098
4232
  existsSync as existsSync6,
4099
- readdirSync as readdirSync4,
4100
4233
  readFileSync as readFileSync6,
4101
4234
  statSync as statSync2
4102
4235
  } from "node:fs";
4103
4236
  import {
4104
4237
  isAbsolute,
4105
- join as join6,
4238
+ join as join7,
4106
4239
  relative as relative3,
4107
4240
  resolve
4108
4241
  } from "node:path";
4109
4242
 
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";
4243
+ // src/verification/plan-checks.ts
4244
+ import { readFileSync as readFileSync5 } from "node:fs";
4117
4245
  import {
4118
4246
  extname as extname2,
4119
- join as join5
4247
+ join as join6
4120
4248
  } from "node:path";
4121
4249
  var EJS_SUFFIX = ".ejs";
4122
4250
  var RENDER_SITE_PATTERN = /(?:<%[-=]?|\$\{)\s*render\(\s*(?:'(?<Section>[^']*)'|\{(?<Options>[^}]*)\})/g;
@@ -4142,7 +4270,7 @@ function loadTemplateInventory(templatesDir = defaultTemplatesDir()) {
4142
4270
  const emptyTemplates = /* @__PURE__ */ new Set();
4143
4271
  const partials = [];
4144
4272
  const renderSites = [];
4145
- for (const relativePath of walkTemplates(templatesDir, "")) {
4273
+ for (const [relativePath, physicalPath] of indexTemplateDir(templatesDir)) {
4146
4274
  if (ASSET_EXTENSIONS.has(extname2(relativePath))) {
4147
4275
  assetTemplates.add(relativePath);
4148
4276
  continue;
@@ -4151,7 +4279,7 @@ function loadTemplateInventory(templatesDir = defaultTemplatesDir()) {
4151
4279
  continue;
4152
4280
  }
4153
4281
  const withoutSuffix = relativePath.slice(0, -EJS_SUFFIX.length);
4154
- const body = readFileSync5(join5(templatesDir, relativePath), "utf-8");
4282
+ const body = readFileSync5(join6(templatesDir, physicalPath), "utf-8");
4155
4283
  if (isPartialTemplatePath(relativePath)) {
4156
4284
  partials.push(parsePartialPath(relativePath));
4157
4285
  } else {
@@ -4204,7 +4332,7 @@ function parsePartialPath(relativePath) {
4204
4332
  };
4205
4333
  }
4206
4334
  function defaultTemplatesDir() {
4207
- return join5(getScriptDir(), "..", "templates", "default");
4335
+ return join6(getScriptDir(), "..", "templates", "default");
4208
4336
  }
4209
4337
  function getRenderBase(templatePath) {
4210
4338
  if (!isPartialTemplatePath(templatePath)) {
@@ -4213,22 +4341,6 @@ function getRenderBase(templatePath) {
4213
4341
  const { basePath } = parsePartialPath(`${templatePath}${EJS_SUFFIX}`);
4214
4342
  return isPartialTemplatePath(basePath) ? getRenderBase(basePath) : templatePath;
4215
4343
  }
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
4344
 
4233
4345
  // src/overlay.ts
4234
4346
  var OVERLAY_MANIFEST_FILE_NAME = "overlay.json";
@@ -4241,7 +4353,7 @@ function loadOverlay(dir, builtIn = loadTemplateInventory()) {
4241
4353
  if (!existsSync6(absoluteDir) || !statSync2(absoluteDir).isDirectory()) {
4242
4354
  throw new Error(`Custom template directory not found: ${absoluteDir}`);
4243
4355
  }
4244
- const manifestPath = join6(absoluteDir, OVERLAY_MANIFEST_FILE_NAME);
4356
+ const manifestPath = join7(absoluteDir, OVERLAY_MANIFEST_FILE_NAME);
4245
4357
  if (!existsSync6(manifestPath)) {
4246
4358
  throw new Error(`Custom template directory has no ${OVERLAY_MANIFEST_FILE_NAME}: ${absoluteDir}`);
4247
4359
  }
@@ -4349,7 +4461,7 @@ function listStrayFiles(dir, own) {
4349
4461
  OVERLAY_MANIFEST_FILE_NAME,
4350
4462
  OVERLAY_README_FILE_NAME
4351
4463
  ]);
4352
- return walkFiles(dir, "").filter((path) => !accounted.has(path));
4464
+ return [...indexTemplateDir(dir)].filter(([logicalPath]) => !accounted.has(logicalPath)).map(([, physicalPath]) => physicalPath);
4353
4465
  }
4354
4466
  function readManifest(manifestPath) {
4355
4467
  let parsed;
@@ -4381,18 +4493,6 @@ function readManifest(manifestPath) {
4381
4493
  partials: readList("partials")
4382
4494
  };
4383
4495
  }
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
4496
 
4397
4497
  // src/project-formatter.ts
4398
4498
  import { spawnSync } from "node:child_process";
@@ -4400,7 +4500,7 @@ import {
4400
4500
  existsSync as existsSync7,
4401
4501
  readFileSync as readFileSync7
4402
4502
  } from "node:fs";
4403
- import { join as join7 } from "node:path";
4503
+ import { join as join8 } from "node:path";
4404
4504
  import process2 from "node:process";
4405
4505
  var FORMATTER_COMMANDS = {
4406
4506
  biome: {
@@ -4435,14 +4535,14 @@ function createProjectFormatter(targetDir, formatter) {
4435
4535
  };
4436
4536
  }
4437
4537
  function resolveBin(targetDir, packageName) {
4438
- const packageDir = join7(targetDir, "node_modules", packageName);
4439
- const packageJsonPath = join7(packageDir, "package.json");
4538
+ const packageDir = join8(targetDir, "node_modules", packageName);
4539
+ const packageJsonPath = join8(packageDir, "package.json");
4440
4540
  if (!existsSync7(packageJsonPath)) {
4441
4541
  return null;
4442
4542
  }
4443
4543
  const { bin } = JSON.parse(readFileSync7(packageJsonPath, "utf-8"));
4444
4544
  const relativeBin = typeof bin === "string" ? bin : Object.values(bin ?? {})[0];
4445
- return relativeBin === void 0 ? null : join7(packageDir, relativeBin);
4545
+ return relativeBin === void 0 ? null : join8(packageDir, relativeBin);
4446
4546
  }
4447
4547
  function runCli(binPath, targetDir, args, input) {
4448
4548
  const result = spawnSync(process2.execPath, [binPath, ...args], { cwd: targetDir, encoding: "utf-8", input });
@@ -4491,7 +4591,7 @@ async function detectMode(cliArgs) {
4491
4591
  if (cliArgs.mode) {
4492
4592
  return cliArgs.mode;
4493
4593
  }
4494
- const configPath = join8(process.cwd(), CONFIG_FILE_NAME);
4594
+ const configPath = join9(process.cwd(), CONFIG_FILE_NAME);
4495
4595
  if (existsSync8(configPath)) {
4496
4596
  if (cliArgs.useDefaults) {
4497
4597
  exitWithUsageError(`Existing project detected (${CONFIG_FILE_NAME}), and --yes cannot ask whether to update it.
@@ -4583,7 +4683,7 @@ function exitWithUsageError(message) {
4583
4683
  process.exit(1);
4584
4684
  }
4585
4685
  function hasPrepareScript(targetDir) {
4586
- const packageJson = JSON.parse(readFileSync8(join8(targetDir, "package.json"), "utf-8"));
4686
+ const packageJson = JSON.parse(readFileSync8(join9(targetDir, "package.json"), "utf-8"));
4587
4687
  return Object.hasOwn(packageJson.scripts ?? {}, "prepare");
4588
4688
  }
4589
4689
  function loadOverlayOrExit(dir, hint = "") {
@@ -4594,7 +4694,7 @@ function loadOverlayOrExit(dir, hint = "") {
4594
4694
  }
4595
4695
  }
4596
4696
  async function main() {
4597
- const packageJsonPath = join8(getScriptDir(), "..", "package.json");
4697
+ const packageJsonPath = join9(getScriptDir(), "..", "package.json");
4598
4698
  const packageJson = JSON.parse(readFileSync8(packageJsonPath, "utf-8"));
4599
4699
  const currentVersion = packageJson.version ?? "0.0.0";
4600
4700
  const m = "\x1B[38;5;135m";
@@ -4650,7 +4750,7 @@ async function offerAnswersExport(answers, customTemplate) {
4650
4750
  let choice = await ask();
4651
4751
  while (choice !== "generate") {
4652
4752
  if (choice === "script") {
4653
- const scriptPath = join8(process.cwd(), scriptName);
4753
+ const scriptPath = join9(process.cwd(), scriptName);
4654
4754
  writeFileSync2(scriptPath, formatCreateScript(answers, shell, customTemplate));
4655
4755
  if (shell === "sh") {
4656
4756
  chmodSync(scriptPath, SCRIPT_MODE);
@@ -4658,10 +4758,10 @@ async function offerAnswersExport(answers, customTemplate) {
4658
4758
  log5.success(`Wrote ${scriptName}`);
4659
4759
  note(formatCreateCommand(answers, shell, customTemplate), "Non-interactive command");
4660
4760
  } else {
4661
- writeFileSync2(join8(process.cwd(), answersFileName), formatAnswersJson(answers));
4761
+ writeFileSync2(join9(process.cwd(), answersFileName), formatAnswersJson(answers));
4662
4762
  log5.success(`Wrote ${answersFileName}`);
4663
4763
  const overlayFlag = customTemplate ? ` --customTemplate=${customTemplate}` : "";
4664
- note(`npm create @mnaoumov/obsidian-plugin -- --yes --mode=create --answersFile=${answersFileName}${overlayFlag}`, "Non-interactive command");
4764
+ note(`npm create @mnaoumov/obsidian-plugin "--" --yes --mode=create --answersFile=${answersFileName}${overlayFlag}`, "Non-interactive command");
4665
4765
  }
4666
4766
  choice = await ask();
4667
4767
  }
@@ -4709,7 +4809,7 @@ async function runCreate(currentVersion, cliArgs) {
4709
4809
  if (!useDefaults) {
4710
4810
  await offerAnswersExport(answers, customTemplate);
4711
4811
  }
4712
- const targetDir = join8(process.cwd(), `obsidian-${answers.pluginId}`);
4812
+ const targetDir = join9(process.cwd(), `obsidian-${answers.pluginId}`);
4713
4813
  if (existsSync8(targetDir) && !cliArgs.force) {
4714
4814
  if (useDefaults) {
4715
4815
  exitWithUsageError(`Directory obsidian-${answers.pluginId} already exists, and --yes cannot ask whether to scaffold into it.
@@ -4739,14 +4839,14 @@ Pass --force to scaffold into it anyway.`);
4739
4839
  newConfig = copyTemplates(answers, targetDir, currentVersion, null, resolvedVersions, minAppVersion, overlay);
4740
4840
  s.stop("Plugin scaffolded.");
4741
4841
  }
4742
- const configPath = join8(targetDir, CONFIG_FILE_NAME);
4842
+ const configPath = join9(targetDir, CONFIG_FILE_NAME);
4743
4843
  const configWithAnswers = buildSavedConfig(newConfig, answers, overlay, targetDir);
4744
4844
  writeFileSync2(configPath, `${JSON.stringify(configWithAnswers, null, JSON_INDENT_SPACES4)}
4745
4845
  `);
4746
4846
  const isFormatted = useDefaults ? false : await runPostScaffold(targetDir, answers);
4747
4847
  const pm = answers.packageManager;
4748
4848
  const dirName = `obsidian-${answers.pluginId}`;
4749
- const needsInstall = !existsSync8(join8(targetDir, "node_modules"));
4849
+ const needsInstall = !existsSync8(join9(targetDir, "node_modules"));
4750
4850
  const needsFormat = needsInitialFormat(answers.formatter) && !isFormatted;
4751
4851
  const steps = [
4752
4852
  ...needsInstall ? [getInstallCommand(pm)] : [],
@@ -4764,7 +4864,7 @@ async function runInitialFormat(targetDir, answers, isInstalled) {
4764
4864
  s.start("Formatting...");
4765
4865
  try {
4766
4866
  await execAsync(getRunCommand(answers.packageManager, "format"), targetDir);
4767
- const configPath = join8(targetDir, CONFIG_FILE_NAME);
4867
+ const configPath = join9(targetDir, CONFIG_FILE_NAME);
4768
4868
  const config = JSON.parse(readFileSync8(configPath, "utf-8"));
4769
4869
  writeFileSync2(configPath, `${JSON.stringify(recordHashesOnDisk(targetDir, config), null, JSON_INDENT_SPACES4)}
4770
4870
  `);
@@ -4859,7 +4959,7 @@ This project records it in ${CONFIG_FILE_NAME}. Pass --customTemplate=<dir> to p
4859
4959
  );
4860
4960
  log5.info(`Applying the custom template recorded for this project: ${existingConfig.customTemplate}`);
4861
4961
  }
4862
- const configPath = join8(targetDir, CONFIG_FILE_NAME);
4962
+ const configPath = join9(targetDir, CONFIG_FILE_NAME);
4863
4963
  const savedConfig = JSON.parse(readFileSync8(configPath, "utf-8"));
4864
4964
  let answers;
4865
4965
  if (savedConfig.answers) {