bsmnt 0.1.3 → 0.2.4

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 (407) 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 +40 -15
  88. package/{packages/create-basement-app/templates/experiment → src/templates/next-default}/app/layout.tsx +18 -18
  89. package/src/templates/next-default/app/page.tsx +11 -0
  90. package/{packages/create-basement-app/templates/experiment → src/templates/next-default}/app/robots.ts +3 -3
  91. package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/app/sitemap.ts +4 -4
  92. package/{packages/create-basement-app/templates/default → src/templates/next-default}/biome.json +2 -2
  93. package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/components/layout/footer/index.tsx +5 -1
  94. package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/components/layout/header/index.tsx +1 -3
  95. package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/layout/theme/index.tsx +1 -1
  96. package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/layout/wrapper/index.tsx +0 -2
  97. package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/components/ui/image/index.tsx +6 -11
  98. package/{packages/create-basement-app/templates/experiment → src/templates/next-default}/components/ui/link/index.tsx +39 -33
  99. package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/metadata.ts +26 -26
  100. package/{packages/create-basement-app/templates/default → src/templates/next-default}/package.json +4 -4
  101. package/{packages/create-basement-app/templates/webgl → src/templates/next-experiments}/app/layout.tsx +18 -18
  102. package/{packages/create-basement-app/templates/webgl → src/templates/next-experiments}/app/robots.ts +3 -3
  103. package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/sitemap.ts +4 -4
  104. package/{packages/create-basement-app/templates/webgl → src/templates/next-experiments}/biome.json +2 -2
  105. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/theme/index.tsx +1 -1
  106. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/wrapper/index.tsx +7 -9
  107. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/ui/image/index.tsx +39 -46
  108. package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/link/index.tsx +6 -0
  109. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/metadata.ts +26 -26
  110. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/package.json +4 -4
  111. package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/app/layout.tsx +18 -18
  112. package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/app/robots.ts +3 -3
  113. package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/sitemap.ts +4 -4
  114. package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/biome.json +2 -2
  115. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/layout/theme/index.tsx +1 -1
  116. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/layout/wrapper/index.tsx +0 -2
  117. package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/components/ui/image/index.tsx +6 -11
  118. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/ui/link/index.tsx +9 -2
  119. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/components/scene/index.tsx +1 -0
  120. package/src/templates/next-webgl/lib/renderer.ts +7 -0
  121. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/metadata.ts +26 -26
  122. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/package.json +4 -4
  123. package/packages/cli/bin/index.js +0 -259
  124. package/packages/cli/src/commands/add-integration.js +0 -310
  125. package/packages/cli/src/commands/create.js +0 -409
  126. package/packages/cli/src/commands/setup-sanity.js +0 -426
  127. package/packages/cli/src/commands/worktree.js +0 -805
  128. package/packages/create-basement-app/integrations/sanity/config.js +0 -46
  129. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/disable/route.ts +0 -7
  130. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/enable/route.ts +0 -21
  131. package/packages/create-basement-app/integrations/sanity/files/app/api/revalidate/route.ts +0 -37
  132. package/packages/create-basement-app/integrations/sanity/files/app/layout.tsx +0 -111
  133. package/packages/create-basement-app/integrations/sanity/files/app/sitemap.ts +0 -80
  134. package/packages/create-basement-app/integrations/sanity/files/app/studio/[[...tool]]/page.tsx +0 -8
  135. package/packages/create-basement-app/integrations/sanity/files/app/studio/layout.tsx +0 -7
  136. package/packages/create-basement-app/integrations/sanity/files/components/ui/sanity-image/index.tsx +0 -37
  137. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/README.md +0 -58
  138. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/check-integration.ts +0 -62
  139. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/README.md +0 -144
  140. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/client.ts +0 -30
  141. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -29
  142. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/rich-text.tsx +0 -73
  143. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/env.ts +0 -38
  144. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/live/index.tsx +0 -34
  145. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/queries.ts +0 -99
  146. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.cli.ts +0 -20
  147. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.config.ts +0 -94
  148. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.types.ts +0 -337
  149. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schema.json +0 -1850
  150. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/article.ts +0 -132
  151. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/example.ts +0 -203
  152. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/index.ts +0 -37
  153. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/link.ts +0 -127
  154. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/metadata.ts +0 -68
  155. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/navigation.ts +0 -39
  156. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/page.ts +0 -77
  157. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/richText.ts +0 -59
  158. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/structure.ts +0 -5
  159. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/image.ts +0 -11
  160. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/link.ts +0 -61
  161. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/copy-sanity-mcp.ts +0 -23
  162. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/generate-page.ts +0 -310
  163. package/packages/create-basement-app/integrations/sanity/files/lib/utils/metadata.ts +0 -190
  164. package/packages/create-basement-app/integrations/sanity/mergers/check-integration-merger.js +0 -105
  165. package/packages/create-basement-app/integrations/sanity/mergers/layout-merger.js +0 -223
  166. package/packages/create-basement-app/integrations/sanity/mergers/sitemap-merger.js +0 -121
  167. package/packages/create-basement-app/package.json +0 -10
  168. package/packages/create-basement-app/src/configs/animations.js +0 -28
  169. package/packages/create-basement-app/src/index.js +0 -15
  170. package/packages/create-basement-app/src/mergers/check-integration-merger.js +0 -105
  171. package/packages/create-basement-app/src/mergers/config.js +0 -109
  172. package/packages/create-basement-app/src/mergers/index.js +0 -346
  173. package/packages/create-basement-app/src/mergers/layout-merger.js +0 -223
  174. package/packages/create-basement-app/templates/default/.cursor/rules/README.md +0 -184
  175. package/packages/create-basement-app/templates/default/.cursor/rules/architecture.mdc +0 -437
  176. package/packages/create-basement-app/templates/default/.cursor/rules/components.mdc +0 -436
  177. package/packages/create-basement-app/templates/default/.cursor/rules/integrations.mdc +0 -447
  178. package/packages/create-basement-app/templates/default/.cursor/rules/main.mdc +0 -278
  179. package/packages/create-basement-app/templates/default/.cursor/rules/styling.mdc +0 -433
  180. package/packages/create-basement-app/templates/default/.github/workflows/lighthouse-to-slack.yml +0 -136
  181. package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +0 -184
  182. package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +0 -437
  183. package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +0 -436
  184. package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +0 -447
  185. package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +0 -278
  186. package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +0 -433
  187. package/packages/create-basement-app/templates/experiment/.github/workflows/lighthouse-to-slack.yml +0 -136
  188. package/packages/create-basement-app/templates/experiment/app/page.tsx +0 -275
  189. package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +0 -21
  190. package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +0 -184
  191. package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +0 -437
  192. package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +0 -436
  193. package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +0 -447
  194. package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +0 -278
  195. package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +0 -433
  196. package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +0 -136
  197. /package/{packages/create-basement-app/plugins → plugins}/no-anchor-element.grit +0 -0
  198. /package/{packages/create-basement-app/plugins → plugins}/no-relative-parent-imports.grit +0 -0
  199. /package/{packages/create-basement-app/plugins → plugins}/no-unnecessary-forwardref.grit +0 -0
  200. /package/{packages/create-basement-app → src}/template-hooks/config.js +0 -0
  201. /package/{packages/create-basement-app → src}/template-hooks/use-battery.ts +0 -0
  202. /package/{packages/create-basement-app → src}/template-hooks/use-device-perf.ts +0 -0
  203. /package/{packages/create-basement-app → src}/template-hooks/use-intersection-observer.ts +0 -0
  204. /package/{packages/create-basement-app → src}/template-hooks/use-media.ts +0 -0
  205. /package/{packages/create-basement-app → src/templates/next-default/.biome}/plugins/README.md +0 -0
  206. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.biome/plugins/no-anchor-element.grit +0 -0
  207. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  208. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  209. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.editorconfig +0 -0
  210. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.env.example +0 -0
  211. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.gitattributes +0 -0
  212. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  213. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.vscode/extensions.json +0 -0
  214. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.vscode/settings.json +0 -0
  215. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/README.md +0 -0
  216. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/_gitignore +0 -0
  217. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/app/favicon.ico +0 -0
  218. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/basement.svg +0 -0
  219. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/ui/README.md +0 -0
  220. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/ui/image/README.md +0 -0
  221. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/README.md +0 -0
  222. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/index.ts +0 -0
  223. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-device-detection.ts +0 -0
  224. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-media-breakpoint.ts +0 -0
  225. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-prefetch.ts +0 -0
  226. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/integrations/.gitkeep +0 -0
  227. /package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/lib/renderer.ts +0 -0
  228. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/dev.ts +0 -0
  229. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-component.ts +0 -0
  230. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-page.ts +0 -0
  231. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate.ts +0 -0
  232. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/utils.ts +0 -0
  233. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/app.ts +0 -0
  234. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/index.ts +0 -0
  235. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/README.md +0 -0
  236. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/cn.ts +0 -0
  237. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/colors.ts +0 -0
  238. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/config.ts +0 -0
  239. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/global.css +0 -0
  240. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/index.css +0 -0
  241. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/reset.css +0 -0
  242. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/root.css +0 -0
  243. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/tailwind.css +0 -0
  244. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/easings.ts +0 -0
  245. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/fonts.ts +0 -0
  246. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/index.ts +0 -0
  247. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/layout.mjs +0 -0
  248. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/README.md +0 -0
  249. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-root.ts +0 -0
  250. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-tailwind.ts +0 -0
  251. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/postcss-functions.mjs +0 -0
  252. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/setup-styles.ts +0 -0
  253. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/utils.ts +0 -0
  254. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/typography.ts +0 -0
  255. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/README.md +0 -0
  256. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/css.d.ts +0 -0
  257. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/easings.ts +0 -0
  258. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/fetch.ts +0 -0
  259. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.test.ts +0 -0
  260. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.ts +0 -0
  261. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.test.ts +0 -0
  262. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.ts +0 -0
  263. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/types.d.ts +0 -0
  264. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.test.ts +0 -0
  265. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.ts +0 -0
  266. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/next.config.ts +0 -0
  267. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/postcss.config.mjs +0 -0
  268. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  269. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/tsconfig.json +0 -0
  270. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/README.md +0 -0
  271. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.biome/plugins/no-anchor-element.grit +0 -0
  272. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  273. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  274. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.editorconfig +0 -0
  275. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.env.example +0 -0
  276. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.gitattributes +0 -0
  277. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  278. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.vscode/extensions.json +0 -0
  279. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.vscode/settings.json +0 -0
  280. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/README.md +0 -0
  281. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/_gitignore +0 -0
  282. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/app/favicon.ico +0 -0
  283. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/page.tsx +0 -0
  284. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/basement.svg +0 -0
  285. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/footer/index.tsx +0 -0
  286. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/header/index.tsx +0 -0
  287. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/navigation-menu.tsx +0 -0
  288. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/ui/README.md +0 -0
  289. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/ui/image/README.md +0 -0
  290. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/README.md +0 -0
  291. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/constants.ts +0 -0
  292. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/index.ts +0 -0
  293. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-device-detection.ts +0 -0
  294. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-media-breakpoint.ts +0 -0
  295. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-prefetch.ts +0 -0
  296. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/integrations/.gitkeep +0 -0
  297. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/dev.ts +0 -0
  298. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-component.ts +0 -0
  299. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-page.ts +0 -0
  300. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate.ts +0 -0
  301. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/utils.ts +0 -0
  302. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/app.ts +0 -0
  303. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/index.ts +0 -0
  304. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/README.md +0 -0
  305. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/cn.ts +0 -0
  306. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/colors.ts +0 -0
  307. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/config.ts +0 -0
  308. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/global.css +0 -0
  309. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/index.css +0 -0
  310. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/reset.css +0 -0
  311. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/root.css +0 -0
  312. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/tailwind.css +0 -0
  313. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/easings.ts +0 -0
  314. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/fonts.ts +0 -0
  315. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/index.ts +0 -0
  316. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/layout.mjs +0 -0
  317. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/README.md +0 -0
  318. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-root.ts +0 -0
  319. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-tailwind.ts +0 -0
  320. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/postcss-functions.mjs +0 -0
  321. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/setup-styles.ts +0 -0
  322. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/utils.ts +0 -0
  323. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/typography.ts +0 -0
  324. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/README.md +0 -0
  325. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/css.d.ts +0 -0
  326. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/easings.ts +0 -0
  327. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/fetch.ts +0 -0
  328. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.test.ts +0 -0
  329. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.ts +0 -0
  330. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.test.ts +0 -0
  331. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.ts +0 -0
  332. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/types.d.ts +0 -0
  333. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.test.ts +0 -0
  334. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.ts +0 -0
  335. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/next.config.ts +0 -0
  336. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/postcss.config.mjs +0 -0
  337. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  338. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/tsconfig.json +0 -0
  339. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/README.md +0 -0
  340. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.biome/plugins/no-anchor-element.grit +0 -0
  341. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  342. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  343. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.editorconfig +0 -0
  344. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.env.example +0 -0
  345. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.gitattributes +0 -0
  346. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  347. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.vscode/extensions.json +0 -0
  348. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.vscode/settings.json +0 -0
  349. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/README.md +0 -0
  350. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/_gitignore +0 -0
  351. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/app/favicon.ico +0 -0
  352. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/app/page.tsx +0 -0
  353. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/basement.svg +0 -0
  354. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/footer/index.tsx +0 -0
  355. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/components/layout/header/index.tsx +0 -0
  356. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/ui/README.md +0 -0
  357. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/ui/image/README.md +0 -0
  358. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/dynamic.tsx +0 -0
  359. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/index.tsx +0 -0
  360. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/README.md +0 -0
  361. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/index.ts +0 -0
  362. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-device-detection.ts +0 -0
  363. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-media-breakpoint.ts +0 -0
  364. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-prefetch.ts +0 -0
  365. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/integrations/.gitkeep +0 -0
  366. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/dev.ts +0 -0
  367. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-component.ts +0 -0
  368. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-page.ts +0 -0
  369. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate.ts +0 -0
  370. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/utils.ts +0 -0
  371. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/app.ts +0 -0
  372. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/index.ts +0 -0
  373. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/README.md +0 -0
  374. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/cn.ts +0 -0
  375. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/colors.ts +0 -0
  376. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/config.ts +0 -0
  377. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/global.css +0 -0
  378. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/index.css +0 -0
  379. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/reset.css +0 -0
  380. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/root.css +0 -0
  381. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/tailwind.css +0 -0
  382. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/easings.ts +0 -0
  383. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/fonts.ts +0 -0
  384. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/index.ts +0 -0
  385. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/layout.mjs +0 -0
  386. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/README.md +0 -0
  387. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-root.ts +0 -0
  388. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-tailwind.ts +0 -0
  389. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/postcss-functions.mjs +0 -0
  390. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/setup-styles.ts +0 -0
  391. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/utils.ts +0 -0
  392. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/typography.ts +0 -0
  393. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/README.md +0 -0
  394. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/css.d.ts +0 -0
  395. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/easings.ts +0 -0
  396. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/fetch.ts +0 -0
  397. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.test.ts +0 -0
  398. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.ts +0 -0
  399. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.test.ts +0 -0
  400. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.ts +0 -0
  401. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/types.d.ts +0 -0
  402. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.test.ts +0 -0
  403. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.ts +0 -0
  404. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/next.config.ts +0 -0
  405. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/postcss.config.mjs +0 -0
  406. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  407. /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
- }