bsmnt 0.0.2 → 0.1.1
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.
- package/.github/workflows/release.yml +2 -0
- package/CHANGELOG.md +31 -0
- package/CLAUDE.md +42 -24
- package/README.md +33 -12
- package/biome.json +1 -0
- package/bun.lock +2 -1
- package/docs/architecture.drawio +250 -0
- package/docs/architecture.mermaid +85 -0
- package/package.json +42 -42
- package/{bin → packages/cli/bin}/index.js +28 -31
- package/packages/cli/package.json +16 -0
- package/{src → packages/cli/src}/commands/add-integration.js +22 -37
- package/{src → packages/cli/src}/commands/create.js +125 -131
- package/packages/create-basement-app/integrations/sanity/config.js +46 -0
- package/{src → packages/create-basement-app/integrations/sanity}/mergers/check-integration-merger.js +1 -1
- package/{src → packages/create-basement-app/integrations/sanity}/mergers/layout-merger.js +1 -1
- package/{src → packages/create-basement-app/integrations/sanity}/mergers/sitemap-merger.js +1 -1
- package/packages/create-basement-app/package.json +10 -0
- package/packages/create-basement-app/src/configs/animations.js +28 -0
- package/packages/create-basement-app/src/index.js +15 -0
- package/packages/create-basement-app/src/mergers/check-integration-merger.js +105 -0
- package/{src → packages/create-basement-app/src}/mergers/config.js +5 -33
- package/{src → packages/create-basement-app/src}/mergers/index.js +89 -98
- package/packages/create-basement-app/src/mergers/layout-merger.js +223 -0
- package/packages/create-basement-app/src/mergers/sitemap-merger.js +121 -0
- package/packages/create-basement-app/template-hooks/config.js +38 -0
- package/packages/create-basement-app/templates/default/.biome/plugins/README.md +21 -0
- package/packages/create-basement-app/templates/default/.biome/plugins/no-anchor-element.grit +12 -0
- package/packages/create-basement-app/templates/default/.biome/plugins/no-relative-parent-imports.grit +10 -0
- package/packages/create-basement-app/templates/default/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/README.md +184 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/architecture.mdc +437 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/components.mdc +436 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/integrations.mdc +447 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/main.mdc +278 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/styling.mdc +433 -0
- package/packages/create-basement-app/templates/default/.editorconfig +40 -0
- package/packages/create-basement-app/templates/default/.env.example +81 -0
- package/packages/create-basement-app/templates/default/.gitattributes +19 -0
- package/packages/create-basement-app/templates/default/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/packages/create-basement-app/templates/default/.github/workflows/lighthouse-to-slack.yml +136 -0
- package/packages/create-basement-app/templates/default/.vscode/extensions.json +20 -0
- package/packages/create-basement-app/templates/default/.vscode/settings.json +105 -0
- package/packages/create-basement-app/templates/default/README.md +221 -0
- package/packages/create-basement-app/templates/default/_gitignore +67 -0
- package/packages/create-basement-app/templates/default/app/favicon.ico +0 -0
- package/packages/create-basement-app/templates/default/app/layout.tsx +104 -0
- package/packages/create-basement-app/templates/default/app/page.tsx +275 -0
- package/packages/create-basement-app/templates/default/app/robots.ts +15 -0
- package/packages/create-basement-app/templates/default/app/sitemap.ts +16 -0
- package/packages/create-basement-app/templates/default/biome.json +250 -0
- package/packages/create-basement-app/templates/default/components/basement.svg +1 -0
- package/packages/create-basement-app/templates/default/components/layout/footer/index.tsx +27 -0
- package/packages/create-basement-app/templates/default/components/layout/header/index.tsx +11 -0
- package/packages/create-basement-app/templates/default/components/layout/theme/index.tsx +66 -0
- package/packages/create-basement-app/templates/default/components/layout/wrapper/index.tsx +65 -0
- package/packages/create-basement-app/templates/default/components/ui/README.md +77 -0
- package/packages/create-basement-app/templates/default/components/ui/image/README.md +37 -0
- package/packages/create-basement-app/templates/default/components/ui/image/index.tsx +224 -0
- package/packages/create-basement-app/templates/default/components/ui/link/index.tsx +146 -0
- package/packages/create-basement-app/templates/default/lib/README.md +33 -0
- package/packages/create-basement-app/templates/default/lib/hooks/index.ts +12 -0
- package/packages/create-basement-app/templates/default/lib/hooks/use-device-detection.ts +81 -0
- package/packages/create-basement-app/templates/default/lib/hooks/use-media-breakpoint.ts +15 -0
- package/packages/create-basement-app/templates/default/lib/hooks/use-prefetch.ts +74 -0
- package/packages/create-basement-app/templates/default/lib/scripts/dev.ts +52 -0
- package/packages/create-basement-app/templates/default/lib/scripts/generate-component.ts +322 -0
- package/packages/create-basement-app/templates/default/lib/scripts/generate-page.ts +193 -0
- package/packages/create-basement-app/templates/default/lib/scripts/generate.ts +79 -0
- package/packages/create-basement-app/templates/default/lib/scripts/utils.ts +246 -0
- package/packages/create-basement-app/templates/default/lib/store/app.ts +11 -0
- package/packages/create-basement-app/templates/default/lib/store/index.ts +11 -0
- package/packages/create-basement-app/templates/default/lib/styles/README.md +64 -0
- package/packages/create-basement-app/templates/default/lib/styles/cn.ts +7 -0
- package/packages/create-basement-app/templates/default/lib/styles/colors.ts +63 -0
- package/packages/create-basement-app/templates/default/lib/styles/config.ts +34 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/global.css +85 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/index.css +6 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/reset.css +166 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/root.css +68 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/tailwind.css +132 -0
- package/packages/create-basement-app/templates/default/lib/styles/easings.ts +21 -0
- package/packages/create-basement-app/templates/default/lib/styles/fonts.ts +28 -0
- package/packages/create-basement-app/templates/default/lib/styles/index.ts +12 -0
- package/packages/create-basement-app/templates/default/lib/styles/layout.mjs +27 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/README.md +29 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-root.ts +57 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-tailwind.ts +162 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/postcss-functions.mjs +168 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/setup-styles.ts +24 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/utils.ts +20 -0
- package/packages/create-basement-app/templates/default/lib/styles/typography.ts +36 -0
- package/packages/create-basement-app/templates/default/lib/utils/README.md +40 -0
- package/packages/create-basement-app/templates/default/lib/utils/css.d.ts +21 -0
- package/packages/create-basement-app/templates/default/lib/utils/easings.ts +240 -0
- package/packages/create-basement-app/templates/default/lib/utils/fetch.ts +84 -0
- package/packages/create-basement-app/templates/default/lib/utils/math.test.ts +221 -0
- package/packages/create-basement-app/templates/default/lib/utils/math.ts +236 -0
- package/packages/create-basement-app/templates/default/lib/utils/metadata.ts +126 -0
- package/packages/create-basement-app/templates/default/lib/utils/strings.test.ts +166 -0
- package/packages/create-basement-app/templates/default/lib/utils/strings.ts +246 -0
- package/packages/create-basement-app/templates/default/lib/utils/types.d.ts +15 -0
- package/packages/create-basement-app/templates/default/lib/utils/viewport.test.ts +256 -0
- package/packages/create-basement-app/templates/default/lib/utils/viewport.ts +193 -0
- package/packages/create-basement-app/templates/default/next.config.ts +142 -0
- package/packages/create-basement-app/templates/default/package.json +62 -0
- package/packages/create-basement-app/templates/default/postcss.config.mjs +42 -0
- package/packages/create-basement-app/templates/default/public/fonts/geist/Geist-Mono.woff2 +0 -0
- package/packages/create-basement-app/templates/default/tsconfig.json +43 -0
- package/packages/create-basement-app/templates/experiment/.biome/plugins/README.md +21 -0
- package/packages/create-basement-app/templates/experiment/.biome/plugins/no-anchor-element.grit +12 -0
- package/packages/create-basement-app/templates/experiment/.biome/plugins/no-relative-parent-imports.grit +10 -0
- package/packages/create-basement-app/templates/experiment/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +184 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +437 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +436 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +447 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +278 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +433 -0
- package/packages/create-basement-app/templates/experiment/.editorconfig +40 -0
- package/packages/create-basement-app/templates/experiment/.env.example +81 -0
- package/packages/create-basement-app/templates/experiment/.gitattributes +19 -0
- package/packages/create-basement-app/templates/experiment/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/packages/create-basement-app/templates/experiment/.github/workflows/lighthouse-to-slack.yml +136 -0
- package/packages/create-basement-app/templates/experiment/.vscode/extensions.json +20 -0
- package/packages/create-basement-app/templates/experiment/.vscode/settings.json +105 -0
- package/packages/create-basement-app/templates/experiment/README.md +221 -0
- package/packages/create-basement-app/templates/experiment/_gitignore +67 -0
- package/packages/create-basement-app/templates/experiment/app/favicon.ico +0 -0
- package/packages/create-basement-app/templates/experiment/app/layout.tsx +104 -0
- package/packages/create-basement-app/templates/experiment/app/page.tsx +275 -0
- package/packages/create-basement-app/templates/experiment/app/robots.ts +15 -0
- package/packages/create-basement-app/templates/experiment/app/sitemap.ts +16 -0
- package/packages/create-basement-app/templates/experiment/biome.json +250 -0
- package/packages/create-basement-app/templates/experiment/components/basement.svg +1 -0
- package/packages/create-basement-app/templates/experiment/components/layout/footer/index.tsx +27 -0
- package/packages/create-basement-app/templates/experiment/components/layout/header/index.tsx +58 -0
- package/packages/create-basement-app/templates/experiment/components/layout/navigation-menu.tsx +127 -0
- package/packages/create-basement-app/templates/experiment/components/layout/theme/index.tsx +66 -0
- package/packages/create-basement-app/templates/experiment/components/layout/wrapper/index.tsx +65 -0
- package/packages/create-basement-app/templates/experiment/components/ui/README.md +77 -0
- package/packages/create-basement-app/templates/experiment/components/ui/image/README.md +37 -0
- package/packages/create-basement-app/templates/experiment/components/ui/image/index.tsx +224 -0
- package/packages/create-basement-app/templates/experiment/components/ui/link/index.tsx +146 -0
- package/packages/create-basement-app/templates/experiment/lib/README.md +33 -0
- package/packages/create-basement-app/templates/experiment/lib/constants.ts +12 -0
- package/packages/create-basement-app/templates/experiment/lib/hooks/index.ts +12 -0
- package/packages/create-basement-app/templates/experiment/lib/hooks/use-device-detection.ts +81 -0
- package/packages/create-basement-app/templates/experiment/lib/hooks/use-media-breakpoint.ts +15 -0
- package/packages/create-basement-app/templates/experiment/lib/hooks/use-prefetch.ts +74 -0
- package/packages/create-basement-app/templates/experiment/lib/integrations/.gitkeep +0 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/dev.ts +52 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/generate-component.ts +322 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/generate-page.ts +193 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/generate.ts +79 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/utils.ts +246 -0
- package/packages/create-basement-app/templates/experiment/lib/store/app.ts +11 -0
- package/packages/create-basement-app/templates/experiment/lib/store/index.ts +11 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/README.md +64 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/cn.ts +7 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/colors.ts +63 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/config.ts +34 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/global.css +85 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/index.css +6 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/reset.css +166 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/root.css +68 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/tailwind.css +132 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/easings.ts +21 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/fonts.ts +28 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/index.ts +12 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/layout.mjs +27 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/README.md +29 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-root.ts +57 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-tailwind.ts +162 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/postcss-functions.mjs +168 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/setup-styles.ts +24 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/utils.ts +20 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/typography.ts +36 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/README.md +40 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/css.d.ts +21 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/easings.ts +240 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/fetch.ts +84 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/math.test.ts +221 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/math.ts +236 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/metadata.ts +126 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/strings.test.ts +166 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/strings.ts +246 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/types.d.ts +15 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/viewport.test.ts +256 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/viewport.ts +193 -0
- package/packages/create-basement-app/templates/experiment/next.config.ts +142 -0
- package/packages/create-basement-app/templates/experiment/package.json +69 -0
- package/packages/create-basement-app/templates/experiment/postcss.config.mjs +42 -0
- package/packages/create-basement-app/templates/experiment/public/fonts/geist/Geist-Mono.woff2 +0 -0
- package/packages/create-basement-app/templates/experiment/tsconfig.json +43 -0
- package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +21 -0
- package/packages/create-basement-app/templates/webgl/.biome/plugins/no-anchor-element.grit +12 -0
- package/packages/create-basement-app/templates/webgl/.biome/plugins/no-relative-parent-imports.grit +10 -0
- package/packages/create-basement-app/templates/webgl/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +184 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +437 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +436 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +447 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +278 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +433 -0
- package/packages/create-basement-app/templates/webgl/.editorconfig +40 -0
- package/packages/create-basement-app/templates/webgl/.env.example +81 -0
- package/packages/create-basement-app/templates/webgl/.gitattributes +19 -0
- package/packages/create-basement-app/templates/webgl/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +136 -0
- package/packages/create-basement-app/templates/webgl/.vscode/extensions.json +20 -0
- package/packages/create-basement-app/templates/webgl/.vscode/settings.json +105 -0
- package/packages/create-basement-app/templates/webgl/README.md +221 -0
- package/packages/create-basement-app/templates/webgl/_gitignore +67 -0
- package/packages/create-basement-app/templates/webgl/app/favicon.ico +0 -0
- package/packages/create-basement-app/templates/webgl/app/layout.tsx +104 -0
- package/packages/create-basement-app/templates/webgl/app/page.tsx +10 -0
- package/packages/create-basement-app/templates/webgl/app/robots.ts +15 -0
- package/packages/create-basement-app/templates/webgl/app/sitemap.ts +16 -0
- package/packages/create-basement-app/templates/webgl/biome.json +250 -0
- package/packages/create-basement-app/templates/webgl/components/basement.svg +1 -0
- package/packages/create-basement-app/templates/webgl/components/layout/footer/index.tsx +27 -0
- package/packages/create-basement-app/templates/webgl/components/layout/header/index.tsx +11 -0
- package/packages/create-basement-app/templates/webgl/components/layout/theme/index.tsx +66 -0
- package/packages/create-basement-app/templates/webgl/components/layout/wrapper/index.tsx +65 -0
- package/packages/create-basement-app/templates/webgl/components/ui/README.md +77 -0
- package/packages/create-basement-app/templates/webgl/components/ui/image/README.md +37 -0
- package/packages/create-basement-app/templates/webgl/components/ui/image/index.tsx +224 -0
- package/packages/create-basement-app/templates/webgl/components/ui/link/index.tsx +146 -0
- package/packages/create-basement-app/templates/webgl/components/webgl/canvas/dynamic.tsx +34 -0
- package/packages/create-basement-app/templates/webgl/components/webgl/canvas/index.tsx +38 -0
- package/packages/create-basement-app/templates/webgl/components/webgl/components/scene/index.tsx +29 -0
- package/packages/create-basement-app/templates/webgl/lib/README.md +33 -0
- package/packages/create-basement-app/templates/webgl/lib/hooks/index.ts +12 -0
- package/packages/create-basement-app/templates/webgl/lib/hooks/use-device-detection.ts +81 -0
- package/packages/create-basement-app/templates/webgl/lib/hooks/use-media-breakpoint.ts +15 -0
- package/packages/create-basement-app/templates/webgl/lib/hooks/use-prefetch.ts +74 -0
- package/packages/create-basement-app/templates/webgl/lib/integrations/.gitkeep +0 -0
- package/packages/create-basement-app/templates/webgl/lib/renderer.ts +7 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/dev.ts +52 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/generate-component.ts +322 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/generate-page.ts +193 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/generate.ts +79 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/utils.ts +246 -0
- package/packages/create-basement-app/templates/webgl/lib/store/app.ts +11 -0
- package/packages/create-basement-app/templates/webgl/lib/store/index.ts +11 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/README.md +64 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/cn.ts +7 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/colors.ts +63 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/config.ts +34 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/global.css +85 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/index.css +6 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/reset.css +166 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/root.css +68 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/tailwind.css +132 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/easings.ts +21 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/fonts.ts +28 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/index.ts +12 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/layout.mjs +27 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/README.md +29 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/generate-root.ts +57 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/generate-tailwind.ts +162 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/postcss-functions.mjs +168 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/setup-styles.ts +24 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/utils.ts +20 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/typography.ts +36 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/README.md +40 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/css.d.ts +21 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/easings.ts +240 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/fetch.ts +84 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/math.test.ts +221 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/math.ts +236 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/metadata.ts +126 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/strings.test.ts +166 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/strings.ts +246 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/types.d.ts +15 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/viewport.test.ts +256 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/viewport.ts +193 -0
- package/packages/create-basement-app/templates/webgl/next.config.ts +142 -0
- package/packages/create-basement-app/templates/webgl/package.json +68 -0
- package/packages/create-basement-app/templates/webgl/postcss.config.mjs +42 -0
- package/packages/create-basement-app/templates/webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
- package/packages/create-basement-app/templates/webgl/tsconfig.json +43 -0
- package/tasks/.last-branch +1 -0
- package/tasks/CLAUDE.md +104 -0
- package/tasks/archive/2026-02-09-next-starter-dynamic-layers/prd.json +153 -0
- package/tasks/archive/2026-02-09-next-starter-dynamic-layers/progress.txt +115 -0
- package/tasks/prd-project-restructure.md +375 -0
- package/tasks/prd.json +227 -91
- package/tasks/progress.txt +281 -87
- package/tasks/ralph.sh +113 -0
- package/integrations/basehub/README.md +0 -3
- package/layers/experiment/components/layout/header/index.tsx +0 -58
- package/layers/experiment/components/layout/navigation-menu.tsx +0 -127
- package/layers/experiment/lib/constants.ts +0 -12
- package/layers/webgl/app/page.tsx +0 -10
- package/layers/webgl/components/webgl/canvas/dynamic.tsx +0 -34
- package/layers/webgl/components/webgl/canvas/index.tsx +0 -43
- package/layers/webgl/components/webgl/components/scene/index.tsx +0 -21
- package/src/mergers/next-config-merger.js +0 -63
- /package/{src → packages/cli/src}/commands/setup-sanity.js +0 -0
- /package/{src → packages/cli/src}/commands/worktree.js +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/disable/route.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/enable/route.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/revalidate/route.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/layout.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/sitemap.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/[[...tool]]/page.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/layout.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/components/ui/sanity-image/index.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/README.md +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/check-integration.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/README.md +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/client.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/rich-text.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/env.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/live/index.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/queries.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.cli.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.config.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.types.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schema.json +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/article.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/example.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/index.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/link.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/metadata.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/navigation.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/page.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/richText.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/structure.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/image.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/link.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/copy-sanity-mcp.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/generate-page.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/utils/metadata.ts +0 -0
- /package/{plugins → packages/create-basement-app/plugins}/README.md +0 -0
- /package/{plugins → packages/create-basement-app/plugins}/no-anchor-element.grit +0 -0
- /package/{plugins → packages/create-basement-app/plugins}/no-relative-parent-imports.grit +0 -0
- /package/{plugins → packages/create-basement-app/plugins}/no-unnecessary-forwardref.grit +0 -0
- /package/{template-hooks → packages/create-basement-app/template-hooks}/use-battery.ts +0 -0
- /package/{template-hooks → packages/create-basement-app/template-hooks}/use-device-perf.ts +0 -0
- /package/{template-hooks → packages/create-basement-app/template-hooks}/use-intersection-observer.ts +0 -0
- /package/{template-hooks → packages/create-basement-app/template-hooks}/use-media.ts +0 -0
- /package/{layers/webgpu → packages/create-basement-app/templates/default/lib/integrations}/.gitkeep +0 -0
|
@@ -1,23 +1,50 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
import dotenv from "dotenv";
|
|
5
4
|
import fs from "fs-extra";
|
|
6
5
|
import ora from "ora";
|
|
7
6
|
import pc from "picocolors";
|
|
8
7
|
import prompts from "prompts";
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
8
|
+
import { sanityConfig } from "../../../create-basement-app/integrations/sanity/config.js";
|
|
9
|
+
import { getAnimationConfig } from "../../../create-basement-app/src/configs/animations.js";
|
|
10
|
+
import { hooksConfig } from "../../../create-basement-app/template-hooks/config.js";
|
|
11
11
|
|
|
12
12
|
const __filename = fileURLToPath(import.meta.url);
|
|
13
13
|
const __dirname = path.dirname(__filename);
|
|
14
14
|
|
|
15
|
-
dotenv.config({ path: path.resolve(__dirname, "../../.env") });
|
|
16
|
-
|
|
17
15
|
/**
|
|
18
|
-
* Creates a new project by
|
|
16
|
+
* Creates a new project by copying a local standalone template.
|
|
19
17
|
*/
|
|
20
18
|
export async function createProject(projectName, options = {}) {
|
|
19
|
+
// Discover available templates dynamically from create-basement-app/templates/
|
|
20
|
+
const templatesDir = path.resolve(
|
|
21
|
+
__dirname,
|
|
22
|
+
"../../../create-basement-app/templates",
|
|
23
|
+
);
|
|
24
|
+
const discoveredTemplates = (
|
|
25
|
+
await fs.readdir(templatesDir, { withFileTypes: true })
|
|
26
|
+
)
|
|
27
|
+
.filter((d) => d.isDirectory())
|
|
28
|
+
.map((d) => d.name);
|
|
29
|
+
|
|
30
|
+
// Virtual templates that alias to an existing template folder
|
|
31
|
+
const TEMPLATE_ALIASES = { webgpu: "webgl" };
|
|
32
|
+
|
|
33
|
+
// Build full list: discovered folders + virtual aliases (preserving order)
|
|
34
|
+
const templateNames = [
|
|
35
|
+
...discoveredTemplates,
|
|
36
|
+
...Object.keys(TEMPLATE_ALIASES).filter(
|
|
37
|
+
(v) => !discoveredTemplates.includes(v),
|
|
38
|
+
),
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
const templateLabels = {
|
|
42
|
+
default: "Default (Next.js Starter)",
|
|
43
|
+
webgl: "WebGL (3D Graphics)",
|
|
44
|
+
webgpu: "WebGPU (Next-gen Graphics)",
|
|
45
|
+
experiment: "Experiment (Creative Coding)",
|
|
46
|
+
};
|
|
47
|
+
|
|
21
48
|
// 1. Interactive Prompts (skip if flag provided)
|
|
22
49
|
const answers = await prompts([
|
|
23
50
|
{
|
|
@@ -34,12 +61,10 @@ export async function createProject(projectName, options = {}) {
|
|
|
34
61
|
type: options.template ? null : "select",
|
|
35
62
|
name: "projectType",
|
|
36
63
|
message: "What type of project are you building?",
|
|
37
|
-
choices:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
{ title: "Experiment (Creative Coding)", value: "experiment" },
|
|
42
|
-
],
|
|
64
|
+
choices: templateNames.map((name) => ({
|
|
65
|
+
title: templateLabels[name] || name,
|
|
66
|
+
value: name,
|
|
67
|
+
})),
|
|
43
68
|
},
|
|
44
69
|
{
|
|
45
70
|
type: options.cms ? null : "select",
|
|
@@ -47,7 +72,6 @@ export async function createProject(projectName, options = {}) {
|
|
|
47
72
|
message: "Which CMS will you use?",
|
|
48
73
|
choices: [
|
|
49
74
|
{ title: "Sanity", value: "sanity" },
|
|
50
|
-
{ title: "BaseHub", value: "basehub" },
|
|
51
75
|
{ title: "None", value: "none" },
|
|
52
76
|
],
|
|
53
77
|
},
|
|
@@ -74,13 +98,7 @@ export async function createProject(projectName, options = {}) {
|
|
|
74
98
|
type: options.hooks !== undefined ? null : "multiselect",
|
|
75
99
|
name: "hooks",
|
|
76
100
|
message: "Select hooks you want to add:",
|
|
77
|
-
choices:
|
|
78
|
-
const hooksPath = path.join(__dirname, "..", "..", "template-hooks");
|
|
79
|
-
const files = await fs.readdir(hooksPath);
|
|
80
|
-
return files
|
|
81
|
-
.filter((f) => f.endsWith(".ts"))
|
|
82
|
-
.map((f) => ({ title: f.replace(".ts", ""), value: f }));
|
|
83
|
-
},
|
|
101
|
+
choices: hooksConfig.map((h) => ({ title: h.name, value: h.file })),
|
|
84
102
|
},
|
|
85
103
|
]);
|
|
86
104
|
|
|
@@ -114,76 +132,46 @@ export async function createProject(projectName, options = {}) {
|
|
|
114
132
|
await fs.remove(targetDir);
|
|
115
133
|
}
|
|
116
134
|
|
|
117
|
-
// 3.
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
force: true,
|
|
126
|
-
verbose: true,
|
|
127
|
-
mode: "git",
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
// Diagnostic logging
|
|
131
|
-
emitter.on("info", (info) => {
|
|
132
|
-
downloadSpinner.text = pc.dim(`[tiged] ${info.message}`);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
emitter.on("warn", (warning) => {
|
|
136
|
-
console.warn(pc.yellow(`\n⚠ [tiged] ${warning.message}`));
|
|
137
|
-
});
|
|
135
|
+
// 3. Copy local template (standalone, no network call)
|
|
136
|
+
const actualTemplate = TEMPLATE_ALIASES[type] || type;
|
|
137
|
+
const templateDir = path.resolve(
|
|
138
|
+
__dirname,
|
|
139
|
+
"../../../create-basement-app/templates",
|
|
140
|
+
actualTemplate,
|
|
141
|
+
);
|
|
142
|
+
const copySpinner = ora(`Copying ${pc.cyan(type)} template...`).start();
|
|
138
143
|
|
|
139
144
|
try {
|
|
140
|
-
await
|
|
145
|
+
await fs.copy(templateDir, targetDir);
|
|
141
146
|
|
|
142
|
-
//
|
|
143
|
-
const
|
|
144
|
-
if (fs.
|
|
145
|
-
await fs.
|
|
147
|
+
// Rename _gitignore to .gitignore (npm strips dotfiles from published packages)
|
|
148
|
+
const underscoreGitignore = path.join(targetDir, "_gitignore");
|
|
149
|
+
if (await fs.pathExists(underscoreGitignore)) {
|
|
150
|
+
await fs.rename(underscoreGitignore, path.join(targetDir, ".gitignore"));
|
|
146
151
|
}
|
|
147
152
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
"../mergers/index.js"
|
|
157
|
-
);
|
|
158
|
-
const layerResults = await injectLayer(targetDir, type, layerSpinner);
|
|
159
|
-
|
|
160
|
-
const hasErrors = layerResults.failed.length > 0;
|
|
161
|
-
const resultLines = formatMergeResults(layerResults);
|
|
162
|
-
|
|
163
|
-
if (hasErrors) {
|
|
164
|
-
layerSpinner.warn(pc.yellow(`${type} layer applied with warnings:`));
|
|
165
|
-
} else {
|
|
166
|
-
layerSpinner.succeed(pc.green(`${type} layer applied:`));
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
for (const line of resultLines) {
|
|
170
|
-
console.log(pc.dim(line));
|
|
171
|
-
}
|
|
172
|
-
} catch (e) {
|
|
173
|
-
console.warn(
|
|
174
|
-
pc.yellow(`\n⚠ Failed to apply ${type} layer: ${e.message}`),
|
|
153
|
+
// Configure renderer for aliased templates (e.g. webgpu uses webgl template with WebGPU renderer)
|
|
154
|
+
if (type === "webgpu") {
|
|
155
|
+
const rendererPath = path.join(targetDir, "lib/renderer.ts");
|
|
156
|
+
if (await fs.pathExists(rendererPath)) {
|
|
157
|
+
let content = await fs.readFile(rendererPath, "utf-8");
|
|
158
|
+
content = content.replace(
|
|
159
|
+
"export const FORCE_WEBGL = true",
|
|
160
|
+
"export const FORCE_WEBGL = false",
|
|
175
161
|
);
|
|
176
|
-
|
|
162
|
+
await fs.writeFile(rendererPath, content);
|
|
177
163
|
}
|
|
178
164
|
}
|
|
179
165
|
|
|
166
|
+
copySpinner.succeed(pc.green(`${type} template copied.`));
|
|
167
|
+
|
|
180
168
|
// 3.5. Inject Integration Files (Smart Merge)
|
|
181
169
|
if (cms && cms !== "none") {
|
|
182
170
|
const integrationSpinner = ora(`Integrating ${pc.cyan(cms)}...`).start();
|
|
183
171
|
|
|
184
172
|
try {
|
|
185
173
|
const { injectIntegration, formatMergeResults } = await import(
|
|
186
|
-
"
|
|
174
|
+
"../../../create-basement-app/src/mergers/index.js"
|
|
187
175
|
);
|
|
188
176
|
const results = await injectIntegration(
|
|
189
177
|
targetDir,
|
|
@@ -222,61 +210,70 @@ export async function createProject(projectName, options = {}) {
|
|
|
222
210
|
pkg.name = name;
|
|
223
211
|
pkg.version = "0.1.0";
|
|
224
212
|
|
|
225
|
-
//
|
|
226
|
-
|
|
227
|
-
|
|
213
|
+
// Layer deps are already in the standalone template's package.json — no injection needed
|
|
214
|
+
|
|
215
|
+
// Inject CMS Dependencies from integration config manifests
|
|
216
|
+
const cmsConfigs = { sanity: sanityConfig };
|
|
217
|
+
const cmsIntegrationConfig = cmsConfigs[cms];
|
|
218
|
+
if (cmsIntegrationConfig) {
|
|
228
219
|
pkg.dependencies = {
|
|
229
220
|
...pkg.dependencies,
|
|
230
|
-
...
|
|
231
|
-
};
|
|
232
|
-
pkg.devDependencies = {
|
|
233
|
-
...pkg.devDependencies,
|
|
234
|
-
...layerConfig.devDependencies,
|
|
221
|
+
...cmsIntegrationConfig.dependencies,
|
|
235
222
|
};
|
|
223
|
+
if (
|
|
224
|
+
cmsIntegrationConfig.devDependencies &&
|
|
225
|
+
Object.keys(cmsIntegrationConfig.devDependencies).length > 0
|
|
226
|
+
) {
|
|
227
|
+
pkg.devDependencies = {
|
|
228
|
+
...pkg.devDependencies,
|
|
229
|
+
...cmsIntegrationConfig.devDependencies,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
if (
|
|
233
|
+
cmsIntegrationConfig.scripts &&
|
|
234
|
+
Object.keys(cmsIntegrationConfig.scripts).length > 0
|
|
235
|
+
) {
|
|
236
|
+
pkg.scripts = {
|
|
237
|
+
...pkg.scripts,
|
|
238
|
+
...cmsIntegrationConfig.scripts,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
236
241
|
}
|
|
237
242
|
|
|
238
|
-
// Inject
|
|
239
|
-
|
|
243
|
+
// Inject Animation Dependencies from config manifest
|
|
244
|
+
const animationConfig = getAnimationConfig(animation);
|
|
245
|
+
if (animationConfig) {
|
|
240
246
|
pkg.dependencies = {
|
|
241
247
|
...pkg.dependencies,
|
|
242
|
-
|
|
243
|
-
"@sanity/image-url": "^2.0.3",
|
|
244
|
-
"@sanity/visual-editing": "^5.1.1",
|
|
245
|
-
"@sanity/vision": "^5.7.0",
|
|
246
|
-
"next-sanity": "^12.0.14",
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
pkg.devDependencies = {
|
|
250
|
-
...pkg.devDependencies,
|
|
251
|
-
sanity: "^5.6.0",
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
pkg.scripts = {
|
|
255
|
-
...pkg.scripts,
|
|
256
|
-
"sanity:extract":
|
|
257
|
-
"cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity schema extract",
|
|
258
|
-
"sanity:typegen":
|
|
259
|
-
"cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity typegen generate && bun biome check --write --unsafe",
|
|
260
|
-
};
|
|
261
|
-
} else if (cms === "basehub") {
|
|
262
|
-
pkg.dependencies = {
|
|
263
|
-
...pkg.dependencies,
|
|
264
|
-
basehub: "^3.0.0",
|
|
248
|
+
...animationConfig.dependencies,
|
|
265
249
|
};
|
|
266
250
|
}
|
|
267
251
|
|
|
268
|
-
// Inject
|
|
269
|
-
if (
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
252
|
+
// Inject Hook Dependencies from config manifest
|
|
253
|
+
if (hooks && hooks.length > 0) {
|
|
254
|
+
for (const hookFile of hooks) {
|
|
255
|
+
const hookConfig = hooksConfig.find((h) => h.file === hookFile);
|
|
256
|
+
if (hookConfig) {
|
|
257
|
+
if (
|
|
258
|
+
hookConfig.dependencies &&
|
|
259
|
+
Object.keys(hookConfig.dependencies).length > 0
|
|
260
|
+
) {
|
|
261
|
+
pkg.dependencies = {
|
|
262
|
+
...pkg.dependencies,
|
|
263
|
+
...hookConfig.dependencies,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
if (
|
|
267
|
+
hookConfig.devDependencies &&
|
|
268
|
+
Object.keys(hookConfig.devDependencies).length > 0
|
|
269
|
+
) {
|
|
270
|
+
pkg.devDependencies = {
|
|
271
|
+
...pkg.devDependencies,
|
|
272
|
+
...hookConfig.devDependencies,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
280
277
|
}
|
|
281
278
|
|
|
282
279
|
await fs.writeJson(finalPkgPath, pkg, { spaces: 2 });
|
|
@@ -371,14 +368,12 @@ export async function createProject(projectName, options = {}) {
|
|
|
371
368
|
const projectHooksPath = path.join(targetDir, "hooks");
|
|
372
369
|
await fs.ensureDir(projectHooksPath);
|
|
373
370
|
|
|
371
|
+
const hooksSourceDir = path.resolve(
|
|
372
|
+
__dirname,
|
|
373
|
+
"../../../create-basement-app/template-hooks",
|
|
374
|
+
);
|
|
374
375
|
for (const hookFile of hooks) {
|
|
375
|
-
const sourcePath = path.join(
|
|
376
|
-
__dirname,
|
|
377
|
-
"..",
|
|
378
|
-
"..",
|
|
379
|
-
"template-hooks",
|
|
380
|
-
hookFile,
|
|
381
|
-
);
|
|
376
|
+
const sourcePath = path.join(hooksSourceDir, hookFile);
|
|
382
377
|
await fs.copy(sourcePath, path.join(projectHooksPath, hookFile));
|
|
383
378
|
}
|
|
384
379
|
hooksSpinner.succeed(pc.green(`${hooks.length} hooks added.`));
|
|
@@ -404,12 +399,11 @@ export async function createProject(projectName, options = {}) {
|
|
|
404
399
|
|
|
405
400
|
console.log(pc.cyan(` bun dev\n`));
|
|
406
401
|
} catch (error) {
|
|
407
|
-
|
|
402
|
+
copySpinner.fail(pc.red("Failed to create project."));
|
|
408
403
|
console.error(pc.dim(`\nError details: ${error.message}`));
|
|
409
404
|
console.log(pc.yellow("\n💡 Troubleshooting:"));
|
|
410
|
-
console.log(`1.
|
|
411
|
-
console.log(`2.
|
|
412
|
-
console.log(`3. Branch "main" must exist in the repository.`);
|
|
405
|
+
console.log(`1. Verify the template exists: ${templateDir}`);
|
|
406
|
+
console.log(`2. Check file permissions on the target directory.`);
|
|
413
407
|
process.exit(1);
|
|
414
408
|
}
|
|
415
409
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// packages/create-basement-app/integrations/sanity/config.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sanity integration configuration manifest.
|
|
5
|
+
* Single source of truth for dependencies, scripts, paths, and merge rules.
|
|
6
|
+
*/
|
|
7
|
+
export const sanityConfig = {
|
|
8
|
+
name: "sanity",
|
|
9
|
+
|
|
10
|
+
dependencies: {
|
|
11
|
+
"@sanity/asset-utils": "^2.3.0",
|
|
12
|
+
"@sanity/image-url": "^2.0.3",
|
|
13
|
+
"@sanity/visual-editing": "^5.1.1",
|
|
14
|
+
"@sanity/vision": "^5.7.0",
|
|
15
|
+
"next-sanity": "^12.0.14",
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
devDependencies: {
|
|
19
|
+
sanity: "^5.6.0",
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
scripts: {
|
|
23
|
+
"sanity:extract":
|
|
24
|
+
"cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity schema extract",
|
|
25
|
+
"sanity:typegen":
|
|
26
|
+
"cd lib/integrations/sanity && bun --env-file ../../../.env.local sanity typegen generate && bun biome check --write --unsafe",
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
additivePaths: [
|
|
30
|
+
"lib/integrations/sanity",
|
|
31
|
+
"components/ui/sanity-image",
|
|
32
|
+
"app/api/draft-mode",
|
|
33
|
+
"app/api/revalidate",
|
|
34
|
+
"app/studio",
|
|
35
|
+
"lib/utils/metadata.ts",
|
|
36
|
+
"lib/scripts/generate-page.ts",
|
|
37
|
+
"lib/scripts/copy-sanity-mcp.ts",
|
|
38
|
+
"lib/integrations/README.md",
|
|
39
|
+
],
|
|
40
|
+
|
|
41
|
+
mergeFiles: [
|
|
42
|
+
"app/layout.tsx",
|
|
43
|
+
"app/sitemap.ts",
|
|
44
|
+
"lib/integrations/check-integration.ts",
|
|
45
|
+
],
|
|
46
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// packages/create-basement-app/src/configs/animations.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Animation library configuration manifest.
|
|
5
|
+
* Single source of truth for animation library dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export const ANIMATION_CONFIG = {
|
|
8
|
+
gsap: {
|
|
9
|
+
dependencies: {
|
|
10
|
+
gsap: "^3.12.0",
|
|
11
|
+
"@gsap/react": "^2.0.0",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
motion: {
|
|
15
|
+
dependencies: {
|
|
16
|
+
motion: "^12.0.0",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get configuration for a specific animation library
|
|
23
|
+
* @param {string} name - The animation library name (e.g., 'gsap', 'motion')
|
|
24
|
+
* @returns {object|null} Animation configuration or null if not found
|
|
25
|
+
*/
|
|
26
|
+
export function getAnimationConfig(name) {
|
|
27
|
+
return ANIMATION_CONFIG[name] || null;
|
|
28
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// packages/create-basement-app/src/index.js
|
|
2
|
+
|
|
3
|
+
export { ANIMATION_CONFIG, getAnimationConfig } from "./configs/animations.js";
|
|
4
|
+
export {
|
|
5
|
+
CMS_CONFIG,
|
|
6
|
+
getCmsConfig,
|
|
7
|
+
getLayerConfig,
|
|
8
|
+
isCmsSupported,
|
|
9
|
+
LAYER_CONFIG,
|
|
10
|
+
} from "./mergers/config.js";
|
|
11
|
+
export {
|
|
12
|
+
formatMergeResults,
|
|
13
|
+
injectIntegration,
|
|
14
|
+
injectLayer,
|
|
15
|
+
} from "./mergers/index.js";
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// packages/create-basement-app/src/mergers/check-integration-merger.js
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Sanity configuration check function to add
|
|
6
|
+
*/
|
|
7
|
+
const SANITY_FUNCTION = `
|
|
8
|
+
/**
|
|
9
|
+
* Check if Sanity CMS is configured
|
|
10
|
+
* Requires: NEXT_PUBLIC_SANITY_PROJECT_ID and NEXT_PUBLIC_SANITY_DATASET
|
|
11
|
+
*/
|
|
12
|
+
export function isSanityConfigured(): boolean {
|
|
13
|
+
return Boolean(
|
|
14
|
+
process.env.NEXT_PUBLIC_SANITY_PROJECT_ID &&
|
|
15
|
+
process.env.NEXT_PUBLIC_SANITY_DATASET
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Update to getConfiguredIntegrations to include Sanity
|
|
22
|
+
*/
|
|
23
|
+
const SANITY_CONFIGURED_CHECK = ` if (isSanityConfigured()) integrations.push("Sanity")`;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Update to getUnconfiguredIntegrations to include Sanity
|
|
27
|
+
*/
|
|
28
|
+
const SANITY_UNCONFIGURED_CHECK = ` if (!isSanityConfigured()) integrations.push("Sanity")`;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Merge Sanity integration into template check-integration
|
|
32
|
+
* @param {string} templatePath - Path to the template's check-integration.ts
|
|
33
|
+
* @returns {Promise<{skipped?: boolean, reason?: string, success?: boolean}>}
|
|
34
|
+
*/
|
|
35
|
+
export async function mergeCheckIntegration(templatePath) {
|
|
36
|
+
let content = await fs.readFile(templatePath, "utf-8");
|
|
37
|
+
|
|
38
|
+
// Skip if already has isSanityConfigured
|
|
39
|
+
if (content.includes("isSanityConfigured")) {
|
|
40
|
+
return { skipped: true, reason: "Already has isSanityConfigured" };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 1. Add isSanityConfigured function after isAnalyticsConfigured
|
|
44
|
+
const analyticsMatch = content.match(
|
|
45
|
+
/(export function isAnalyticsConfigured\(\)[^}]+\})/s,
|
|
46
|
+
);
|
|
47
|
+
if (analyticsMatch) {
|
|
48
|
+
const insertPos = analyticsMatch.index + analyticsMatch[0].length;
|
|
49
|
+
content =
|
|
50
|
+
content.slice(0, insertPos) +
|
|
51
|
+
"\n" +
|
|
52
|
+
SANITY_FUNCTION +
|
|
53
|
+
content.slice(insertPos);
|
|
54
|
+
} else {
|
|
55
|
+
// If no isAnalyticsConfigured, add before getConfiguredIntegrations
|
|
56
|
+
const getConfiguredMatch = content.match(
|
|
57
|
+
/export function getConfiguredIntegrations/,
|
|
58
|
+
);
|
|
59
|
+
if (getConfiguredMatch) {
|
|
60
|
+
content =
|
|
61
|
+
content.slice(0, getConfiguredMatch.index) +
|
|
62
|
+
SANITY_FUNCTION +
|
|
63
|
+
"\n" +
|
|
64
|
+
content.slice(getConfiguredMatch.index);
|
|
65
|
+
} else {
|
|
66
|
+
// Fallback: append to end
|
|
67
|
+
content = `${content.trimEnd()}\n${SANITY_FUNCTION}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// 2. Update getConfiguredIntegrations to include Sanity check
|
|
72
|
+
const configuredFnMatch = content.match(
|
|
73
|
+
/(export function getConfiguredIntegrations\(\)[^{]*\{[\s\S]*?)(if \(isAnalyticsConfigured\(\)\))/m,
|
|
74
|
+
);
|
|
75
|
+
if (configuredFnMatch) {
|
|
76
|
+
const insertPos = content.indexOf(
|
|
77
|
+
configuredFnMatch[2],
|
|
78
|
+
configuredFnMatch.index,
|
|
79
|
+
);
|
|
80
|
+
content =
|
|
81
|
+
content.slice(0, insertPos) +
|
|
82
|
+
SANITY_CONFIGURED_CHECK +
|
|
83
|
+
"\n " +
|
|
84
|
+
content.slice(insertPos);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 3. Update getUnconfiguredIntegrations to include Sanity check
|
|
88
|
+
const unconfiguredFnMatch = content.match(
|
|
89
|
+
/(export function getUnconfiguredIntegrations\(\)[^{]*\{[\s\S]*?)(if \(!isAnalyticsConfigured\(\)\))/m,
|
|
90
|
+
);
|
|
91
|
+
if (unconfiguredFnMatch) {
|
|
92
|
+
const insertPos = content.indexOf(
|
|
93
|
+
unconfiguredFnMatch[2],
|
|
94
|
+
unconfiguredFnMatch.index,
|
|
95
|
+
);
|
|
96
|
+
content =
|
|
97
|
+
content.slice(0, insertPos) +
|
|
98
|
+
SANITY_UNCONFIGURED_CHECK +
|
|
99
|
+
"\n " +
|
|
100
|
+
content.slice(insertPos);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
await fs.writeFile(templatePath, content);
|
|
104
|
+
return { success: true };
|
|
105
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/mergers/config.js
|
|
1
|
+
// packages/create-basement-app/src/mergers/config.js
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* CMS-specific configuration for smart merge integration
|
|
@@ -6,9 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export const CMS_CONFIG = {
|
|
8
8
|
sanity: {
|
|
9
|
-
// Git branch containing the Sanity integration files
|
|
10
|
-
branch: "sanity-integration",
|
|
11
|
-
|
|
12
9
|
// Files that need smart merging (exist in both template and integration)
|
|
13
10
|
mergeFiles: [
|
|
14
11
|
"app/layout.tsx",
|
|
@@ -29,22 +26,11 @@ export const CMS_CONFIG = {
|
|
|
29
26
|
"lib/integrations/README.md",
|
|
30
27
|
],
|
|
31
28
|
},
|
|
32
|
-
|
|
33
|
-
basehub: {
|
|
34
|
-
// Git branch containing the BaseHub integration files
|
|
35
|
-
branch: "basehub-integration",
|
|
36
|
-
|
|
37
|
-
// Files that need smart merging for BaseHub
|
|
38
|
-
mergeFiles: [],
|
|
39
|
-
|
|
40
|
-
// Paths that are purely additive for BaseHub
|
|
41
|
-
additivePaths: ["lib/integrations/basehub"],
|
|
42
|
-
},
|
|
43
29
|
};
|
|
44
30
|
|
|
45
31
|
/**
|
|
46
32
|
* Get configuration for a specific CMS
|
|
47
|
-
* @param {string} cms - The CMS name (e.g., 'sanity'
|
|
33
|
+
* @param {string} cms - The CMS name (e.g., 'sanity')
|
|
48
34
|
* @returns {object|null} CMS configuration or null if not supported
|
|
49
35
|
*/
|
|
50
36
|
export function getCmsConfig(cms) {
|
|
@@ -71,35 +57,21 @@ export function isCmsSupported(cms) {
|
|
|
71
57
|
* Layers only add packages that are NOT in next-starter.
|
|
72
58
|
*/
|
|
73
59
|
export const LAYER_CONFIG = {
|
|
60
|
+
// webgl and webgpu share the same template — renderer is configured via lib/renderer.ts
|
|
74
61
|
webgl: {
|
|
75
62
|
replaceFiles: ["app/page.tsx"],
|
|
76
63
|
additivePaths: [
|
|
77
64
|
"components/webgl/canvas/dynamic.tsx",
|
|
78
65
|
"components/webgl/canvas/index.tsx",
|
|
79
66
|
"components/webgl/components/scene/index.tsx",
|
|
67
|
+
"lib/renderer.ts",
|
|
80
68
|
],
|
|
81
|
-
dependencies: {
|
|
82
|
-
"@react-three/fiber": "^9.5.0",
|
|
83
|
-
"@react-three/drei": "^10.7.7",
|
|
84
|
-
three: "^0.182.0",
|
|
85
|
-
"@radix-ui/react-navigation-menu": "^1.2.5",
|
|
86
|
-
leva: "^0.9.35",
|
|
87
|
-
},
|
|
88
|
-
devDependencies: {
|
|
89
|
-
"@types/three": "^0.182.0",
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
|
|
93
|
-
webgpu: {
|
|
94
|
-
replaceFiles: [],
|
|
95
|
-
additivePaths: [],
|
|
96
69
|
dependencies: {
|
|
97
70
|
"@react-three/fiber": "10.0.0-alpha.2",
|
|
98
71
|
"@react-three/drei": "^11.0.0-alpha.4",
|
|
99
72
|
three: "^0.182.0",
|
|
100
|
-
leva: "^0.9.35",
|
|
101
|
-
"lucide-react": "^0.474.0",
|
|
102
73
|
"@radix-ui/react-navigation-menu": "^1.2.5",
|
|
74
|
+
leva: "^0.9.35",
|
|
103
75
|
},
|
|
104
76
|
devDependencies: {
|
|
105
77
|
"@types/three": "^0.182.0",
|