bsmnt 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/README.md +18 -18
  2. package/dist/configs/animations.d.ts +25 -0
  3. package/dist/configs/animations.d.ts.map +1 -0
  4. package/dist/configs/animations.js +29 -0
  5. package/dist/configs/animations.js.map +1 -0
  6. package/dist/helpers/add/hooks-config.d.ts +22 -0
  7. package/dist/helpers/add/hooks-config.d.ts.map +1 -0
  8. package/dist/helpers/add/hooks-config.js +37 -0
  9. package/dist/helpers/add/hooks-config.js.map +1 -0
  10. package/dist/helpers/add/index.d.ts +18 -0
  11. package/dist/helpers/add/index.d.ts.map +1 -0
  12. package/dist/helpers/add/index.js +152 -0
  13. package/dist/helpers/add/index.js.map +1 -0
  14. package/dist/helpers/create/copy-template.d.ts +11 -0
  15. package/dist/helpers/create/copy-template.d.ts.map +1 -0
  16. package/dist/helpers/create/copy-template.js +19 -0
  17. package/dist/helpers/create/copy-template.js.map +1 -0
  18. package/dist/helpers/create/index.d.ts +22 -0
  19. package/dist/helpers/create/index.d.ts.map +1 -0
  20. package/dist/helpers/create/index.js +81 -0
  21. package/dist/helpers/create/index.js.map +1 -0
  22. package/dist/helpers/create/install.d.ts +8 -0
  23. package/dist/helpers/create/install.d.ts.map +1 -0
  24. package/dist/helpers/create/install.js +20 -0
  25. package/dist/helpers/create/install.js.map +1 -0
  26. package/dist/helpers/create/rename-files.d.ts +10 -0
  27. package/dist/helpers/create/rename-files.d.ts.map +1 -0
  28. package/dist/helpers/create/rename-files.js +17 -0
  29. package/dist/helpers/create/rename-files.js.map +1 -0
  30. package/dist/helpers/create/setup-agent.d.ts +21 -0
  31. package/dist/helpers/create/setup-agent.d.ts.map +1 -0
  32. package/dist/helpers/create/setup-agent.js +65 -0
  33. package/dist/helpers/create/setup-agent.js.map +1 -0
  34. package/dist/helpers/create/setup-sanity.d.ts +23 -0
  35. package/dist/helpers/create/setup-sanity.d.ts.map +1 -0
  36. package/dist/helpers/create/setup-sanity.js +354 -0
  37. package/dist/helpers/create/setup-sanity.js.map +1 -0
  38. package/dist/helpers/create/update-package.d.ts +20 -0
  39. package/dist/helpers/create/update-package.d.ts.map +1 -0
  40. package/dist/helpers/create/update-package.js +87 -0
  41. package/dist/helpers/create/update-package.js.map +1 -0
  42. package/dist/helpers/integrate/index.d.ts +13 -0
  43. package/dist/helpers/integrate/index.d.ts.map +1 -0
  44. package/dist/helpers/integrate/index.js +204 -0
  45. package/dist/helpers/integrate/index.js.map +1 -0
  46. package/dist/helpers/integrate/merge-config.d.ts +21 -0
  47. package/dist/helpers/integrate/merge-config.d.ts.map +1 -0
  48. package/dist/helpers/integrate/merge-config.js +38 -0
  49. package/dist/helpers/integrate/merge-config.js.map +1 -0
  50. package/dist/helpers/integrate/merge-orchestrator.d.ts +10 -0
  51. package/dist/helpers/integrate/merge-orchestrator.d.ts.map +1 -0
  52. package/dist/helpers/integrate/merge-orchestrator.js +188 -0
  53. package/dist/helpers/integrate/merge-orchestrator.js.map +1 -0
  54. package/dist/helpers/integrate/sanity/config.d.ts +14 -0
  55. package/dist/helpers/integrate/sanity/config.d.ts.map +1 -0
  56. package/dist/helpers/integrate/sanity/config.js +38 -0
  57. package/dist/helpers/integrate/sanity/config.js.map +1 -0
  58. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.d.ts +13 -0
  59. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.d.ts.map +1 -0
  60. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.js +84 -0
  61. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.js.map +1 -0
  62. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts +23 -0
  63. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts.map +1 -0
  64. package/dist/helpers/integrate/sanity/mergers/layout-merger.js +161 -0
  65. package/dist/helpers/integrate/sanity/mergers/layout-merger.js.map +1 -0
  66. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts +13 -0
  67. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts.map +1 -0
  68. package/{packages/create-basement-app/src → dist/helpers/integrate/sanity}/mergers/sitemap-merger.js +33 -45
  69. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +337 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/paths.d.ts +14 -0
  75. package/dist/paths.d.ts.map +1 -0
  76. package/dist/paths.js +24 -0
  77. package/dist/paths.js.map +1 -0
  78. package/dist/utils/detect-project.d.ts +40 -0
  79. package/dist/utils/detect-project.d.ts.map +1 -0
  80. package/dist/utils/detect-project.js +69 -0
  81. package/dist/utils/detect-project.js.map +1 -0
  82. package/dist/utils/format-results.d.ts +24 -0
  83. package/dist/utils/format-results.d.ts.map +1 -0
  84. package/dist/utils/format-results.js +27 -0
  85. package/dist/utils/format-results.js.map +1 -0
  86. package/index.js +25 -0
  87. package/package.json +23 -15
  88. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/package.json +1 -1
  89. package/src/templates/next-webgl/lib/renderer.ts +7 -0
  90. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/package.json +1 -1
  91. package/packages/cli/bin/index.js +0 -259
  92. package/packages/cli/src/commands/add-integration.js +0 -310
  93. package/packages/cli/src/commands/create.js +0 -409
  94. package/packages/cli/src/commands/setup-sanity.js +0 -426
  95. package/packages/cli/src/commands/worktree.js +0 -805
  96. package/packages/create-basement-app/integrations/sanity/config.js +0 -46
  97. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/disable/route.ts +0 -7
  98. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/enable/route.ts +0 -21
  99. package/packages/create-basement-app/integrations/sanity/files/app/api/revalidate/route.ts +0 -37
  100. package/packages/create-basement-app/integrations/sanity/files/app/layout.tsx +0 -111
  101. package/packages/create-basement-app/integrations/sanity/files/app/sitemap.ts +0 -80
  102. package/packages/create-basement-app/integrations/sanity/files/app/studio/[[...tool]]/page.tsx +0 -8
  103. package/packages/create-basement-app/integrations/sanity/files/app/studio/layout.tsx +0 -7
  104. package/packages/create-basement-app/integrations/sanity/files/components/ui/sanity-image/index.tsx +0 -37
  105. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/README.md +0 -58
  106. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/check-integration.ts +0 -62
  107. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/README.md +0 -144
  108. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/client.ts +0 -30
  109. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -29
  110. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/rich-text.tsx +0 -73
  111. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/env.ts +0 -38
  112. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/live/index.tsx +0 -34
  113. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/queries.ts +0 -99
  114. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.cli.ts +0 -20
  115. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.config.ts +0 -94
  116. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.types.ts +0 -337
  117. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schema.json +0 -1850
  118. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/article.ts +0 -132
  119. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/example.ts +0 -203
  120. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/index.ts +0 -37
  121. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/link.ts +0 -127
  122. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/metadata.ts +0 -68
  123. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/navigation.ts +0 -39
  124. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/page.ts +0 -77
  125. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/richText.ts +0 -59
  126. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/structure.ts +0 -5
  127. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/image.ts +0 -11
  128. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/link.ts +0 -61
  129. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/copy-sanity-mcp.ts +0 -23
  130. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/generate-page.ts +0 -310
  131. package/packages/create-basement-app/integrations/sanity/files/lib/utils/metadata.ts +0 -190
  132. package/packages/create-basement-app/integrations/sanity/mergers/check-integration-merger.js +0 -105
  133. package/packages/create-basement-app/integrations/sanity/mergers/layout-merger.js +0 -223
  134. package/packages/create-basement-app/integrations/sanity/mergers/sitemap-merger.js +0 -121
  135. package/packages/create-basement-app/package.json +0 -10
  136. package/packages/create-basement-app/src/configs/animations.js +0 -28
  137. package/packages/create-basement-app/src/index.js +0 -15
  138. package/packages/create-basement-app/src/mergers/check-integration-merger.js +0 -105
  139. package/packages/create-basement-app/src/mergers/config.js +0 -109
  140. package/packages/create-basement-app/src/mergers/index.js +0 -346
  141. package/packages/create-basement-app/src/mergers/layout-merger.js +0 -223
  142. package/packages/create-basement-app/templates/experiment/app/page.tsx +0 -275
  143. package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +0 -21
  144. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-anchor-element.grit +0 -12
  145. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-relative-parent-imports.grit +0 -10
  146. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-unnecessary-forwardref.grit +0 -9
  147. package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +0 -184
  148. package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +0 -437
  149. package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +0 -436
  150. package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +0 -447
  151. package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +0 -278
  152. package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +0 -433
  153. package/packages/create-basement-app/templates/webgl/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  154. package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +0 -136
  155. package/packages/create-basement-app/templates/webgl/.vscode/extensions.json +0 -20
  156. package/packages/create-basement-app/templates/webgl/.vscode/settings.json +0 -105
  157. package/packages/create-basement-app/templates/webgl/app/favicon.ico +0 -0
  158. package/packages/create-basement-app/templates/webgl/app/layout.tsx +0 -104
  159. package/packages/create-basement-app/templates/webgl/app/robots.ts +0 -15
  160. package/packages/create-basement-app/templates/webgl/app/sitemap.ts +0 -16
  161. package/packages/create-basement-app/templates/webgl/components/layout/footer/index.tsx +0 -27
  162. package/packages/create-basement-app/templates/webgl/components/layout/header/index.tsx +0 -11
  163. package/packages/create-basement-app/templates/webgl/components/layout/theme/index.tsx +0 -66
  164. package/packages/create-basement-app/templates/webgl/components/layout/wrapper/index.tsx +0 -65
  165. package/packages/create-basement-app/templates/webgl/components/ui/README.md +0 -77
  166. package/packages/create-basement-app/templates/webgl/components/ui/image/README.md +0 -37
  167. package/packages/create-basement-app/templates/webgl/components/ui/image/index.tsx +0 -224
  168. package/packages/create-basement-app/templates/webgl/components/ui/link/index.tsx +0 -146
  169. package/packages/create-basement-app/templates/webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
  170. /package/{packages/create-basement-app/plugins → plugins}/no-anchor-element.grit +0 -0
  171. /package/{packages/create-basement-app/plugins → plugins}/no-relative-parent-imports.grit +0 -0
  172. /package/{packages/create-basement-app/plugins → plugins}/no-unnecessary-forwardref.grit +0 -0
  173. /package/{packages/create-basement-app → src}/template-hooks/config.js +0 -0
  174. /package/{packages/create-basement-app → src}/template-hooks/use-battery.ts +0 -0
  175. /package/{packages/create-basement-app → src}/template-hooks/use-device-perf.ts +0 -0
  176. /package/{packages/create-basement-app → src}/template-hooks/use-intersection-observer.ts +0 -0
  177. /package/{packages/create-basement-app → src}/template-hooks/use-media.ts +0 -0
  178. /package/{packages/create-basement-app → src/templates/next-default/.biome}/plugins/README.md +0 -0
  179. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.editorconfig +0 -0
  180. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.env.example +0 -0
  181. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.gitattributes +0 -0
  182. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/README.md +0 -0
  183. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/_gitignore +0 -0
  184. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/biome.json +0 -0
  185. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/basement.svg +0 -0
  186. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/README.md +0 -0
  187. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/index.ts +0 -0
  188. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-device-detection.ts +0 -0
  189. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-media-breakpoint.ts +0 -0
  190. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-prefetch.ts +0 -0
  191. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/integrations/.gitkeep +0 -0
  192. /package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/lib/renderer.ts +0 -0
  193. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/dev.ts +0 -0
  194. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-component.ts +0 -0
  195. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-page.ts +0 -0
  196. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate.ts +0 -0
  197. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/utils.ts +0 -0
  198. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/app.ts +0 -0
  199. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/index.ts +0 -0
  200. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/README.md +0 -0
  201. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/cn.ts +0 -0
  202. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/colors.ts +0 -0
  203. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/config.ts +0 -0
  204. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/global.css +0 -0
  205. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/index.css +0 -0
  206. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/reset.css +0 -0
  207. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/root.css +0 -0
  208. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/tailwind.css +0 -0
  209. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/easings.ts +0 -0
  210. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/fonts.ts +0 -0
  211. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/index.ts +0 -0
  212. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/layout.mjs +0 -0
  213. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/README.md +0 -0
  214. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-root.ts +0 -0
  215. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-tailwind.ts +0 -0
  216. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/postcss-functions.mjs +0 -0
  217. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/setup-styles.ts +0 -0
  218. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/utils.ts +0 -0
  219. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/typography.ts +0 -0
  220. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/README.md +0 -0
  221. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/css.d.ts +0 -0
  222. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/easings.ts +0 -0
  223. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/fetch.ts +0 -0
  224. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.test.ts +0 -0
  225. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.ts +0 -0
  226. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/metadata.ts +0 -0
  227. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.test.ts +0 -0
  228. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.ts +0 -0
  229. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/types.d.ts +0 -0
  230. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.test.ts +0 -0
  231. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.ts +0 -0
  232. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/next.config.ts +0 -0
  233. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/package.json +0 -0
  234. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/postcss.config.mjs +0 -0
  235. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/tsconfig.json +0 -0
  236. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/README.md +0 -0
  237. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-anchor-element.grit +0 -0
  238. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  239. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  240. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.cursor/rules/README.md +0 -0
  241. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.cursor/rules/architecture.mdc +0 -0
  242. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.cursor/rules/components.mdc +0 -0
  243. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.cursor/rules/integrations.mdc +0 -0
  244. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.cursor/rules/main.mdc +0 -0
  245. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.cursor/rules/styling.mdc +0 -0
  246. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.editorconfig +0 -0
  247. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.env.example +0 -0
  248. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.gitattributes +0 -0
  249. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  250. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.github/workflows/lighthouse-to-slack.yml +0 -0
  251. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.vscode/extensions.json +0 -0
  252. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.vscode/settings.json +0 -0
  253. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/README.md +0 -0
  254. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/_gitignore +0 -0
  255. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/favicon.ico +0 -0
  256. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/layout.tsx +0 -0
  257. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/page.tsx +0 -0
  258. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/robots.ts +0 -0
  259. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/sitemap.ts +0 -0
  260. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/biome.json +0 -0
  261. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/basement.svg +0 -0
  262. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/footer/index.tsx +0 -0
  263. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/header/index.tsx +0 -0
  264. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/navigation-menu.tsx +0 -0
  265. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/theme/index.tsx +0 -0
  266. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/wrapper/index.tsx +0 -0
  267. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/README.md +0 -0
  268. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/image/README.md +0 -0
  269. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/image/index.tsx +0 -0
  270. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/link/index.tsx +0 -0
  271. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/README.md +0 -0
  272. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/constants.ts +0 -0
  273. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/index.ts +0 -0
  274. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-device-detection.ts +0 -0
  275. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-media-breakpoint.ts +0 -0
  276. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-prefetch.ts +0 -0
  277. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/integrations/.gitkeep +0 -0
  278. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/dev.ts +0 -0
  279. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-component.ts +0 -0
  280. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-page.ts +0 -0
  281. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate.ts +0 -0
  282. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/utils.ts +0 -0
  283. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/app.ts +0 -0
  284. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/index.ts +0 -0
  285. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/README.md +0 -0
  286. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/cn.ts +0 -0
  287. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/colors.ts +0 -0
  288. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/config.ts +0 -0
  289. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/global.css +0 -0
  290. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/index.css +0 -0
  291. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/reset.css +0 -0
  292. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/root.css +0 -0
  293. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/tailwind.css +0 -0
  294. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/easings.ts +0 -0
  295. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/fonts.ts +0 -0
  296. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/index.ts +0 -0
  297. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/layout.mjs +0 -0
  298. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/README.md +0 -0
  299. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-root.ts +0 -0
  300. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-tailwind.ts +0 -0
  301. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/postcss-functions.mjs +0 -0
  302. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/setup-styles.ts +0 -0
  303. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/utils.ts +0 -0
  304. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/typography.ts +0 -0
  305. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/README.md +0 -0
  306. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/css.d.ts +0 -0
  307. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/easings.ts +0 -0
  308. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/fetch.ts +0 -0
  309. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.test.ts +0 -0
  310. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.ts +0 -0
  311. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/metadata.ts +0 -0
  312. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.test.ts +0 -0
  313. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.ts +0 -0
  314. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/types.d.ts +0 -0
  315. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.test.ts +0 -0
  316. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.ts +0 -0
  317. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/next.config.ts +0 -0
  318. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/postcss.config.mjs +0 -0
  319. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  320. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/tsconfig.json +0 -0
  321. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/README.md +0 -0
  322. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-anchor-element.grit +0 -0
  323. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  324. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  325. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.cursor/rules/README.md +0 -0
  326. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.cursor/rules/architecture.mdc +0 -0
  327. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.cursor/rules/components.mdc +0 -0
  328. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.cursor/rules/integrations.mdc +0 -0
  329. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.cursor/rules/main.mdc +0 -0
  330. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.cursor/rules/styling.mdc +0 -0
  331. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.editorconfig +0 -0
  332. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.env.example +0 -0
  333. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.gitattributes +0 -0
  334. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  335. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.github/workflows/lighthouse-to-slack.yml +0 -0
  336. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.vscode/extensions.json +0 -0
  337. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.vscode/settings.json +0 -0
  338. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/README.md +0 -0
  339. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/_gitignore +0 -0
  340. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/favicon.ico +0 -0
  341. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/layout.tsx +0 -0
  342. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/app/page.tsx +0 -0
  343. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/robots.ts +0 -0
  344. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/sitemap.ts +0 -0
  345. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/biome.json +0 -0
  346. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/basement.svg +0 -0
  347. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/footer/index.tsx +0 -0
  348. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/components/layout/header/index.tsx +0 -0
  349. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/theme/index.tsx +0 -0
  350. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/wrapper/index.tsx +0 -0
  351. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/README.md +0 -0
  352. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/image/README.md +0 -0
  353. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/image/index.tsx +0 -0
  354. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/link/index.tsx +0 -0
  355. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/dynamic.tsx +0 -0
  356. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/index.tsx +0 -0
  357. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/components/scene/index.tsx +0 -0
  358. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/README.md +0 -0
  359. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/index.ts +0 -0
  360. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-device-detection.ts +0 -0
  361. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-media-breakpoint.ts +0 -0
  362. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-prefetch.ts +0 -0
  363. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/integrations/.gitkeep +0 -0
  364. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/dev.ts +0 -0
  365. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-component.ts +0 -0
  366. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-page.ts +0 -0
  367. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate.ts +0 -0
  368. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/utils.ts +0 -0
  369. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/app.ts +0 -0
  370. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/index.ts +0 -0
  371. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/README.md +0 -0
  372. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/cn.ts +0 -0
  373. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/colors.ts +0 -0
  374. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/config.ts +0 -0
  375. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/global.css +0 -0
  376. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/index.css +0 -0
  377. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/reset.css +0 -0
  378. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/root.css +0 -0
  379. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/tailwind.css +0 -0
  380. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/easings.ts +0 -0
  381. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/fonts.ts +0 -0
  382. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/index.ts +0 -0
  383. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/layout.mjs +0 -0
  384. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/README.md +0 -0
  385. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-root.ts +0 -0
  386. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-tailwind.ts +0 -0
  387. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/postcss-functions.mjs +0 -0
  388. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/setup-styles.ts +0 -0
  389. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/utils.ts +0 -0
  390. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/typography.ts +0 -0
  391. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/README.md +0 -0
  392. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/css.d.ts +0 -0
  393. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/easings.ts +0 -0
  394. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/fetch.ts +0 -0
  395. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.test.ts +0 -0
  396. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.ts +0 -0
  397. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/metadata.ts +0 -0
  398. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.test.ts +0 -0
  399. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.ts +0 -0
  400. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/types.d.ts +0 -0
  401. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.test.ts +0 -0
  402. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.ts +0 -0
  403. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/next.config.ts +0 -0
  404. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/postcss.config.mjs +0 -0
  405. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  406. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/tsconfig.json +0 -0
@@ -1,109 +0,0 @@
1
- // packages/create-basement-app/src/mergers/config.js
2
-
3
- /**
4
- * CMS-specific configuration for smart merge integration
5
- * Each CMS has its own branch, merge files, and additive paths
6
- */
7
- export const CMS_CONFIG = {
8
- sanity: {
9
- // Files that need smart merging (exist in both template and integration)
10
- mergeFiles: [
11
- "app/layout.tsx",
12
- "app/sitemap.ts",
13
- "lib/integrations/check-integration.ts",
14
- ],
15
-
16
- // Paths that are purely additive (copy directly, no conflict)
17
- additivePaths: [
18
- "lib/integrations/sanity",
19
- "components/ui/sanity-image",
20
- "app/api/draft-mode",
21
- "app/api/revalidate",
22
- "app/studio",
23
- "lib/utils/metadata.ts",
24
- "lib/scripts/generate-page.ts",
25
- "lib/scripts/copy-sanity-mcp.ts",
26
- "lib/integrations/README.md",
27
- ],
28
- },
29
- };
30
-
31
- /**
32
- * Get configuration for a specific CMS
33
- * @param {string} cms - The CMS name (e.g., 'sanity')
34
- * @returns {object|null} CMS configuration or null if not supported
35
- */
36
- export function getCmsConfig(cms) {
37
- return CMS_CONFIG[cms] || null;
38
- }
39
-
40
- /**
41
- * Check if a CMS is supported
42
- * @param {string} cms - The CMS name
43
- * @returns {boolean} Whether the CMS has a configuration
44
- */
45
- export function isCmsSupported(cms) {
46
- return cms in CMS_CONFIG;
47
- }
48
-
49
- /**
50
- * Technology layer configuration for overlay on next-starter base
51
- * Each layer defines files to replace, additive paths, and dependencies
52
- */
53
- /**
54
- * Technology layer configuration for overlay on next-starter base.
55
- *
56
- * next-starter already provides: clsx, tailwind-merge, zustand, zod, cva, etc.
57
- * Layers only add packages that are NOT in next-starter.
58
- */
59
- export const LAYER_CONFIG = {
60
- // webgl and webgpu share the same template — renderer is configured via lib/renderer.ts
61
- webgl: {
62
- replaceFiles: ["app/page.tsx"],
63
- additivePaths: [
64
- "components/webgl/canvas/dynamic.tsx",
65
- "components/webgl/canvas/index.tsx",
66
- "components/webgl/components/scene/index.tsx",
67
- "lib/renderer.ts",
68
- ],
69
- dependencies: {
70
- "@react-three/fiber": "10.0.0-alpha.2",
71
- "@react-three/drei": "^11.0.0-alpha.4",
72
- three: "^0.182.0",
73
- "@radix-ui/react-navigation-menu": "^1.2.5",
74
- leva: "^0.9.35",
75
- },
76
- devDependencies: {
77
- "@types/three": "^0.182.0",
78
- },
79
- },
80
-
81
- experiment: {
82
- replaceFiles: ["components/layout/header/index.tsx"],
83
- additivePaths: [
84
- "components/layout/navigation-menu.tsx",
85
- "lib/constants.ts",
86
- ],
87
- dependencies: {
88
- "@react-three/fiber": "^9.5.0",
89
- "@react-three/drei": "^10.7.7",
90
- three: "^0.182.0",
91
- "class-variance-authority": "^0.7.0",
92
- leva: "^0.9.35",
93
- "lucide-react": "^0.474.0",
94
- "@radix-ui/react-navigation-menu": "^1.2.5",
95
- },
96
- devDependencies: {
97
- "@types/three": "^0.182.0",
98
- },
99
- },
100
- };
101
-
102
- /**
103
- * Get configuration for a specific technology layer
104
- * @param {string} layer - The layer name (e.g., 'webgl', 'webgpu', 'experiment')
105
- * @returns {object|null} Layer configuration or null if not found
106
- */
107
- export function getLayerConfig(layer) {
108
- return LAYER_CONFIG[layer] || null;
109
- }
@@ -1,346 +0,0 @@
1
- // packages/create-basement-app/src/mergers/index.js
2
-
3
- import path from "node:path";
4
- import { fileURLToPath } from "node:url";
5
- import fs from "fs-extra";
6
- import { getCmsConfig, getLayerConfig } from "./config.js";
7
-
8
- const __filename = fileURLToPath(import.meta.url);
9
- const __dirname = path.dirname(__filename);
10
-
11
- /**
12
- * CMS-specific merger functions (using base paths without src/ prefix)
13
- * Only loaded when the specific CMS is selected
14
- */
15
- const CMS_MERGERS = {
16
- sanity: {
17
- "app/layout.tsx": () =>
18
- import("../../integrations/sanity/mergers/layout-merger.js").then(
19
- (m) => m.mergeLayout,
20
- ),
21
- "app/sitemap.ts": () =>
22
- import("../../integrations/sanity/mergers/sitemap-merger.js").then(
23
- (m) => m.mergeSitemap,
24
- ),
25
- "lib/integrations/check-integration.ts": () =>
26
- import(
27
- "../../integrations/sanity/mergers/check-integration-merger.js"
28
- ).then((m) => m.mergeCheckIntegration),
29
- },
30
- };
31
-
32
- /**
33
- * Detect if the target project uses src/ prefix for app, lib, components
34
- * @param {string} targetDir - The project directory
35
- * @returns {Promise<string>} Empty string or 'src/' prefix
36
- */
37
- async function detectPathPrefix(targetDir) {
38
- // Check for src/app/ directory (Next.js App Router in src/)
39
- const srcAppExists = await fs.pathExists(path.join(targetDir, "src/app"));
40
- if (srcAppExists) {
41
- return "src/";
42
- }
43
- return "";
44
- }
45
-
46
- /**
47
- * Transform a path by adding prefix where needed
48
- * Only transforms paths that start with app/, lib/, or components/
49
- * @param {string} filePath - Original path
50
- * @param {string} prefix - Prefix to add (e.g., 'src/')
51
- * @returns {string} Transformed path
52
- */
53
- function transformPath(filePath, prefix) {
54
- if (!prefix) return filePath;
55
-
56
- // Paths that should be prefixed when using src/ structure
57
- const prefixablePaths = ["app/", "lib/", "components/"];
58
-
59
- for (const prefixable of prefixablePaths) {
60
- if (filePath.startsWith(prefixable)) {
61
- return prefix + filePath;
62
- }
63
- }
64
-
65
- const prefixableFiles = ["middleware.ts", "middleware.js"];
66
- for (const prefixableFile of prefixableFiles) {
67
- if (filePath === prefixableFile) {
68
- return prefix + filePath;
69
- }
70
- }
71
-
72
- return filePath;
73
- }
74
-
75
- /**
76
- * Get merger function for a specific CMS and file
77
- * @param {string} cms - The CMS name
78
- * @param {string} basePath - The base file path (without src/ prefix)
79
- * @returns {Promise<Function|null>} Merger function or null
80
- */
81
- async function getMerger(cms, basePath) {
82
- const cmsmergers = CMS_MERGERS[cms];
83
- if (!cmsmergers || !cmsmergers[basePath]) {
84
- return null;
85
- }
86
- return await cmsmergers[basePath]();
87
- }
88
-
89
- /**
90
- * Inject CMS integration using smart merge
91
- * @param {string} targetDir - The project directory
92
- * @param {string} cms - The CMS name (e.g., 'sanity')
93
- * @param {object} spinner - Ora spinner for progress
94
- * @returns {object} Results of the merge operation
95
- */
96
- export async function injectIntegration(targetDir, cms, spinner) {
97
- const results = {
98
- merged: [],
99
- copied: [],
100
- skipped: [],
101
- failed: [],
102
- };
103
-
104
- // Get CMS-specific configuration
105
- const cmsConfig = getCmsConfig(cms);
106
-
107
- if (!cmsConfig) {
108
- results.failed.push({
109
- path: cms,
110
- error: `CMS "${cms}" is not supported. Supported: sanity`,
111
- });
112
- return results;
113
- }
114
-
115
- const { mergeFiles, additivePaths } = cmsConfig;
116
-
117
- // Detect if project uses src/ prefix (e.g., src/app/ instead of app/)
118
- const pathPrefix = await detectPathPrefix(targetDir);
119
- if (pathPrefix) {
120
- spinner.text = `Detected src/ directory structure...`;
121
- }
122
-
123
- // Resolve local integration files directory
124
- const integrationDir = path.resolve(
125
- __dirname,
126
- "../../integrations",
127
- cms,
128
- "files",
129
- );
130
-
131
- if (!(await fs.pathExists(integrationDir))) {
132
- results.failed.push({
133
- path: cms,
134
- error: `Integration directory not found: ${integrationDir}`,
135
- });
136
- return results;
137
- }
138
-
139
- // 1. Copy additive files/directories (CMS-specific paths)
140
- spinner.text = `Adding ${cms} files...`;
141
-
142
- for (const additivePath of additivePaths) {
143
- const src = path.join(integrationDir, additivePath);
144
- // Transform destination path based on project structure
145
- const transformedPath = transformPath(additivePath, pathPrefix);
146
- const dest = path.join(targetDir, transformedPath);
147
-
148
- try {
149
- if (await fs.pathExists(src)) {
150
- await fs.copy(src, dest, { overwrite: false });
151
- results.copied.push(transformedPath);
152
- }
153
- } catch (error) {
154
- results.failed.push({ path: transformedPath, error: error.message });
155
- }
156
- }
157
-
158
- // 2. Smart merge files that exist in both (CMS-specific mergers)
159
- if (mergeFiles.length > 0) {
160
- spinner.text = `Merging ${cms} integration...`;
161
-
162
- for (const mergeFile of mergeFiles) {
163
- // Transform path for the target project
164
- const transformedPath = transformPath(mergeFile, pathPrefix);
165
- const templateFile = path.join(targetDir, transformedPath);
166
- const integrationFile = path.join(integrationDir, mergeFile);
167
-
168
- try {
169
- // Check if template file exists
170
- if (!(await fs.pathExists(templateFile))) {
171
- // Template doesn't have this file - copy from integration
172
- if (await fs.pathExists(integrationFile)) {
173
- await fs.ensureDir(path.dirname(templateFile));
174
- await fs.copy(integrationFile, templateFile);
175
- results.copied.push(transformedPath);
176
- } else {
177
- results.skipped.push({
178
- path: transformedPath,
179
- reason: "Not in integration",
180
- });
181
- }
182
- continue;
183
- }
184
-
185
- // Check if integration file exists
186
- if (!(await fs.pathExists(integrationFile))) {
187
- results.skipped.push({
188
- path: transformedPath,
189
- reason: "Not in integration",
190
- });
191
- continue;
192
- }
193
-
194
- // Get the CMS-specific merger function (use base path for lookup)
195
- const merger = await getMerger(cms, mergeFile);
196
-
197
- if (merger) {
198
- const result = await merger(templateFile, {
199
- targetDir,
200
- pathPrefix,
201
- });
202
- if (result.skipped) {
203
- results.skipped.push({
204
- path: transformedPath,
205
- reason: result.reason,
206
- });
207
- } else {
208
- results.merged.push(transformedPath);
209
- }
210
- } else {
211
- results.skipped.push({
212
- path: transformedPath,
213
- reason: `No merger for ${cms}`,
214
- });
215
- }
216
- } catch (error) {
217
- results.failed.push({ path: transformedPath, error: error.message });
218
- }
219
- }
220
- }
221
-
222
- return results;
223
- }
224
-
225
- /**
226
- * Inject technology layer files on top of next-starter base
227
- * @param {string} targetDir - The project directory
228
- * @param {string} layer - The layer name (e.g., 'webgl', 'webgpu', 'experiment')
229
- * @param {object} spinner - Ora spinner for progress
230
- * @returns {object} Results of the layer injection
231
- */
232
- export async function injectLayer(targetDir, layer, spinner) {
233
- const results = {
234
- replaced: [],
235
- copied: [],
236
- skipped: [],
237
- failed: [],
238
- };
239
-
240
- const layerConfig = getLayerConfig(layer);
241
-
242
- if (!layerConfig || layer === "default") {
243
- results.skipped.push({ path: layer, reason: "No layer to apply" });
244
- return results;
245
- }
246
-
247
- // Resolve the layer directory from create-basement-app's templates/{type}/ path
248
- const layerDir = path.resolve(__dirname, "../../templates", layer);
249
-
250
- if (!(await fs.pathExists(layerDir))) {
251
- results.skipped.push({
252
- path: layer,
253
- reason: `Layer directory not found: ${layerDir}`,
254
- });
255
- return results;
256
- }
257
-
258
- // Detect if project uses src/ prefix
259
- const pathPrefix = await detectPathPrefix(targetDir);
260
- if (pathPrefix && spinner) {
261
- spinner.text = `Detected src/ directory structure...`;
262
- }
263
-
264
- const { replaceFiles, additivePaths } = layerConfig;
265
-
266
- // 1. Replace files (overwrite base version)
267
- for (const replaceFile of replaceFiles) {
268
- const src = path.join(layerDir, replaceFile);
269
- const transformedPath = transformPath(replaceFile, pathPrefix);
270
- const dest = path.join(targetDir, transformedPath);
271
-
272
- try {
273
- if (await fs.pathExists(src)) {
274
- await fs.ensureDir(path.dirname(dest));
275
- await fs.copy(src, dest, { overwrite: true });
276
- results.replaced.push(transformedPath);
277
- } else {
278
- results.skipped.push({
279
- path: transformedPath,
280
- reason: "Source file not found in layer",
281
- });
282
- }
283
- } catch (error) {
284
- results.failed.push({ path: transformedPath, error: error.message });
285
- }
286
- }
287
-
288
- // 2. Copy additive files
289
- for (const additivePath of additivePaths) {
290
- const src = path.join(layerDir, additivePath);
291
- const transformedPath = transformPath(additivePath, pathPrefix);
292
- const dest = path.join(targetDir, transformedPath);
293
-
294
- try {
295
- if (await fs.pathExists(src)) {
296
- await fs.ensureDir(path.dirname(dest));
297
- await fs.copy(src, dest, { overwrite: false });
298
- results.copied.push(transformedPath);
299
- } else {
300
- results.skipped.push({
301
- path: transformedPath,
302
- reason: "Source file not found in layer",
303
- });
304
- }
305
- } catch (error) {
306
- results.failed.push({ path: transformedPath, error: error.message });
307
- }
308
- }
309
-
310
- return results;
311
- }
312
-
313
- /**
314
- * Format merge results for display
315
- * @param {object} results - Results from injectIntegration or injectLayer
316
- * @returns {string[]} Lines to display
317
- */
318
- export function formatMergeResults(results) {
319
- const lines = [];
320
-
321
- if (results.replaced && results.replaced.length > 0) {
322
- lines.push(...results.replaced.map((f) => ` ✓ Replaced: ${f}`));
323
- }
324
-
325
- if (results.merged && results.merged.length > 0) {
326
- lines.push(...results.merged.map((f) => ` ✓ Merged: ${f}`));
327
- }
328
-
329
- if (results.copied && results.copied.length > 0) {
330
- lines.push(...results.copied.map((f) => ` ✓ Added: ${f}`));
331
- }
332
-
333
- if (results.skipped && results.skipped.length > 0) {
334
- lines.push(
335
- ...results.skipped.map((s) => ` ○ Skipped: ${s.path} (${s.reason})`),
336
- );
337
- }
338
-
339
- if (results.failed && results.failed.length > 0) {
340
- lines.push(
341
- ...results.failed.map((f) => ` ✗ Failed: ${f.path} (${f.error})`),
342
- );
343
- }
344
-
345
- return lines;
346
- }
@@ -1,223 +0,0 @@
1
- // packages/create-basement-app/src/mergers/layout-merger.js
2
-
3
- import path from "node:path";
4
- import fs from "fs-extra";
5
-
6
- /**
7
- * Sanity-specific imports to inject into layout.
8
- * Only two lightweight components — no dynamic functions (draftMode, headers, etc.)
9
- */
10
- const SANITY_IMPORTS = `import { SanityStudioGuard } from "@/components/sanity/studio-guard"
11
- import { SanityVisualEditing } from "@/components/sanity/visual-editing"`;
12
-
13
- /**
14
- * Client component that hides site chrome on /studio routes.
15
- * Uses useSelectedLayoutSegment() — a stable Next.js client API.
16
- */
17
- const STUDIO_GUARD_COMPONENT = `"use client"
18
-
19
- import { useSelectedLayoutSegment } from "next/navigation"
20
-
21
- export function SanityStudioGuard({ children }: { children: React.ReactNode }) {
22
- const segment = useSelectedLayoutSegment()
23
- if (segment === "studio") return null
24
- return <>{children}</>
25
- }
26
- `;
27
-
28
- /**
29
- * Server component that handles Sanity visual editing.
30
- * Keeps draftMode() inside its own <Suspense> boundary so the root layout
31
- * never calls dynamic functions directly — preserving static rendering.
32
- */
33
- const VISUAL_EDITING_COMPONENT = `import { Suspense } from "react"
34
- import { draftMode } from "next/headers"
35
- import { VisualEditing } from "next-sanity/visual-editing"
36
- import { isSanityConfigured } from "@/lib/integrations/check-integration"
37
- import { SanityLive } from "@/lib/integrations/sanity/live"
38
-
39
- async function VisualEditingInner() {
40
- const { isEnabled: isDraftMode } = await draftMode()
41
- const sanityConfigured = isSanityConfigured()
42
-
43
- if (!sanityConfigured || !isDraftMode) return null
44
-
45
- return (
46
- <>
47
- <VisualEditing />
48
- <SanityLive />
49
- </>
50
- )
51
- }
52
-
53
- export function SanityVisualEditing() {
54
- return (
55
- <Suspense fallback={null}>
56
- <VisualEditingInner />
57
- </Suspense>
58
- )
59
- }
60
- `;
61
-
62
- /**
63
- * Merge Sanity integration into template layout.
64
- * The layout itself stays free of dynamic functions (draftMode, headers, etc.)
65
- * All dynamic behavior is encapsulated in generated components.
66
- *
67
- * Strategy:
68
- * 1. Inject two imports (SanityStudioGuard, SanityVisualEditing)
69
- * 2. Wrap body chrome in <SanityStudioGuard>
70
- * 3. Add <SanityVisualEditing /> before </body>
71
- * 4. Generate the two component files
72
- *
73
- * @param {string} templatePath - Path to the template's layout.tsx
74
- * @param {object} options - Options from the merge orchestrator
75
- * @param {string} options.targetDir - The project root directory
76
- * @param {string} options.pathPrefix - Path prefix (e.g., 'src/' or '')
77
- * @returns {Promise<{skipped?: boolean, reason?: string, success?: boolean}>}
78
- */
79
- export async function mergeLayout(
80
- templatePath,
81
- { targetDir, pathPrefix } = {},
82
- ) {
83
- let content = await fs.readFile(templatePath, "utf-8");
84
-
85
- // Skip if already has Sanity integration
86
- if (
87
- content.includes("SanityStudioGuard") ||
88
- content.includes("isSanityConfigured")
89
- ) {
90
- return { skipped: true, reason: "Already has Sanity integration" };
91
- }
92
-
93
- // 1. Add Sanity imports after existing imports
94
- const importMatches = [...content.matchAll(/^import .+$/gm)];
95
- if (importMatches.length > 0) {
96
- const lastImport = importMatches[importMatches.length - 1];
97
- const insertPos = lastImport.index + lastImport[0].length;
98
- content =
99
- content.slice(0, insertPos) +
100
- "\n" +
101
- SANITY_IMPORTS +
102
- content.slice(insertPos);
103
- }
104
-
105
- // 2. Ensure Suspense is imported from react
106
- if (!content.match(/import\s+.*Suspense.*from\s+["']react["']/)) {
107
- const reactImportMatch = content.match(
108
- /import\s+\{([^}]*)\}\s+from\s+["']react["']/,
109
- );
110
- if (reactImportMatch) {
111
- if (!reactImportMatch[1].includes("Suspense")) {
112
- content = content.replace(
113
- reactImportMatch[0],
114
- reactImportMatch[0].replace(
115
- reactImportMatch[1],
116
- `${reactImportMatch[1].trim()}, Suspense`,
117
- ),
118
- );
119
- }
120
- } else {
121
- const lastImportMatch = content.match(/^(import\s+.+\n)/gm);
122
- if (lastImportMatch) {
123
- const lastImport = lastImportMatch[lastImportMatch.length - 1];
124
- content = content.replace(
125
- lastImport,
126
- `${lastImport}import { Suspense } from "react"\n`,
127
- );
128
- }
129
- }
130
- }
131
-
132
- // 3. Wrap body chrome in <SanityStudioGuard> and add <SanityVisualEditing />
133
- content = content.replace(
134
- /(\s*)(<body[^>]*>)([\s\S]*?)(\{children\})([\s\S]*?)(<\/body>)/m,
135
- (
136
- _match,
137
- bodyIndent,
138
- bodyOpen,
139
- beforeChildren,
140
- _childrenExpr,
141
- afterChildren,
142
- bodyClose,
143
- ) => {
144
- const baseIndent = bodyIndent || " ";
145
- const indent = `${baseIndent} `;
146
- const innerIndent = `${indent} `;
147
-
148
- const trimmedBefore = beforeChildren.trim();
149
- const trimmedAfter = afterChildren.trim();
150
- const hasChrome = trimmedBefore.length > 0 || trimmedAfter.length > 0;
151
-
152
- // Preserve relative indentation of chrome content
153
- const reindent = (text, targetIndent) => {
154
- const lines = text.split("\n").filter((line) => line.trim());
155
- if (lines.length === 0) return "";
156
- const minIndent = Math.min(
157
- ...lines
158
- .map((line) => line.match(/^(\s*)/)[1].length)
159
- .filter((n) => n > 0),
160
- Infinity,
161
- );
162
- return lines
163
- .map((line) => {
164
- const currentIndent = line.match(/^(\s*)/)[1].length;
165
- const relativeIndent = Math.max(
166
- 0,
167
- currentIndent - (minIndent === Infinity ? 0 : minIndent),
168
- );
169
- return targetIndent + " ".repeat(relativeIndent) + line.trim();
170
- })
171
- .join("\n");
172
- };
173
-
174
- let result = `${baseIndent}${bodyOpen}\n`;
175
-
176
- if (hasChrome && trimmedBefore) {
177
- result += `${indent}<Suspense fallback={null}>\n`;
178
- result += `${innerIndent}<SanityStudioGuard>\n`;
179
- result += reindent(trimmedBefore, `${innerIndent} `);
180
- result += `\n${innerIndent}</SanityStudioGuard>\n`;
181
- result += `${indent}</Suspense>\n\n`;
182
- }
183
-
184
- result += `${indent}{children}\n`;
185
-
186
- if (hasChrome && trimmedAfter) {
187
- result += `\n${indent}<Suspense fallback={null}>\n`;
188
- result += `${innerIndent}<SanityStudioGuard>\n`;
189
- result += reindent(trimmedAfter, `${innerIndent} `);
190
- result += `\n${innerIndent}</SanityStudioGuard>\n`;
191
- result += `${indent}</Suspense>\n`;
192
- }
193
-
194
- result += `\n${indent}<SanityVisualEditing />\n${baseIndent}${bodyClose}`;
195
- return result;
196
- },
197
- );
198
-
199
- await fs.writeFile(templatePath, content);
200
-
201
- // 3. Generate component files
202
- if (targetDir) {
203
- const sanityDir = path.join(
204
- targetDir,
205
- pathPrefix || "",
206
- "components",
207
- "sanity",
208
- );
209
- await fs.ensureDir(sanityDir);
210
-
211
- const guardPath = path.join(sanityDir, "studio-guard.tsx");
212
- if (!(await fs.pathExists(guardPath))) {
213
- await fs.writeFile(guardPath, STUDIO_GUARD_COMPONENT);
214
- }
215
-
216
- const visualEditingPath = path.join(sanityDir, "visual-editing.tsx");
217
- if (!(await fs.pathExists(visualEditingPath))) {
218
- await fs.writeFile(visualEditingPath, VISUAL_EDITING_COMPONENT);
219
- }
220
- }
221
-
222
- return { success: true };
223
- }