BMAD-METHOD/expansion-packs/bmad-nextjs-fullstack/tasks/setup-from-template.md

339 lines
8.3 KiB
Markdown

# Setup Project from nextjs-new-app Template
## Task Overview
Initialize a new Feature-Based Architecture project using the pre-configured `nextjs-new-app` template with Next.js 15+, TypeScript, Tailwind CSS 4.x, and development tooling.
## Prerequisites
- Node.js 20.10.0+ installed
- pnpm (recommended) or npm package manager
- Git for version control
- Access to https://github.com/marciobarroso/nextjs-new-app
## Steps
### 1. Clone Template Repository
```bash
# Clone the nextjs-new-app template
git clone https://github.com/marciobarroso/nextjs-new-app.git {project_name}
cd {project_name}
# Remove original git history and initialize new repository
rm -rf .git
git init
git add .
git commit -m "Initial commit from nextjs-new-app template"
```
### 2. Install Dependencies
```bash
# Install using pnpm (recommended by template)
pnpm install
# Alternative: using npm
# npm install
```
### 3. Configure Project Details
Update `package.json`:
```json
{
"name": "{project_name}",
"version": "1.0.0",
"description": "{project_description}",
"author": "{author_name}"
}
```
### 4. Set Up Feature-Based Architecture Structure
```bash
# Create the Feature-Based Architecture directories
mkdir -p app/\(features\)
mkdir -p app/shared/core
mkdir -p app/shared/types
mkdir -p app/shared/lib
# The template already provides:
# - app/shared/components/
# - app/shared/hooks/
# - app/shared/lib/
# - app/shared/locales/
```
### 5. Implement BaseController Foundation
Create `app/shared/core/base-controller.ts`:
```typescript
import { z } from 'zod';
import { NextRequest, NextResponse } from 'next/server';
export abstract class BaseController<T> {
protected dbClient: any;
protected schema?: z.ZodSchema;
constructor(dbClient: any, schema?: z.ZodSchema) {
this.dbClient = dbClient;
this.schema = schema;
}
// Standard CRUD operations
async getAll(request: NextRequest): Promise<NextResponse> {
try {
const { searchParams } = new URL(request.url);
const query = searchParams.get('query');
const page = parseInt(searchParams.get('page') || '1');
const limit = parseInt(searchParams.get('limit') || '20');
const filter = this.buildSearchFilter(query);
// Implement database-specific query here
return NextResponse.json({
data: [],
pagination: { page, limit, total: 0, totalPages: 0 },
success: true,
});
} catch (error) {
return NextResponse.json(
{ error: 'Failed to fetch records', success: false },
{ status: 500 },
);
}
}
async getById(
request: NextRequest,
{ params }: { params: { id: string } },
): Promise<NextResponse> {
try {
// Implement database-specific findById here
return NextResponse.json({ data: null, success: true });
} catch (error) {
return NextResponse.json(
{ error: 'Failed to fetch record', success: false },
{ status: 500 },
);
}
}
async create(request: NextRequest): Promise<NextResponse> {
try {
const body = await request.json();
if (this.schema) {
const validatedData = this.schema.parse(body);
// Implement database-specific create here
}
return NextResponse.json({ data: null, success: true }, { status: 201 });
} catch (error) {
if (error instanceof z.ZodError) {
return NextResponse.json(
{ error: 'Validation failed', details: error.errors, success: false },
{ status: 400 },
);
}
return NextResponse.json(
{ error: 'Failed to create record', success: false },
{ status: 500 },
);
}
}
async update(
request: NextRequest,
{ params }: { params: { id: string } },
): Promise<NextResponse> {
try {
const body = await request.json();
if (this.schema) {
const validatedData = this.schema.partial().parse(body);
// Implement database-specific update here
}
return NextResponse.json({ data: null, success: true });
} catch (error) {
if (error instanceof z.ZodError) {
return NextResponse.json(
{ error: 'Validation failed', details: error.errors, success: false },
{ status: 400 },
);
}
return NextResponse.json(
{ error: 'Failed to update record', success: false },
{ status: 500 },
);
}
}
async delete(
request: NextRequest,
{ params }: { params: { id: string } },
): Promise<NextResponse> {
try {
// Implement database-specific delete here
return NextResponse.json({ success: true, message: 'Record deleted successfully' });
} catch (error) {
return NextResponse.json(
{ error: 'Failed to delete record', success: false },
{ status: 500 },
);
}
}
// Abstract method for search filtering
protected abstract buildSearchFilter(query: string | null): Record<string, any>;
}
```
### 6. Add Zod for Schema Validation
```bash
# Install Zod for schema validation
pnpm add zod
# or npm install zod
```
### 7. Configure Environment Variables
Create `.env.local`:
```env
# Database Configuration (customize based on your choice)
DATABASE_URL="your-database-url"
# Next.js Configuration
NEXT_PUBLIC_APP_NAME="{project_name}"
NEXT_PUBLIC_APP_VERSION="1.0.0"
# Add other environment variables as needed
```
### 8. Update TypeScript Configuration
The template already provides optimal TypeScript configuration, but you can extend `tsconfig.json` if needed:
```json
{
"compilerOptions": {
// Template already includes optimal settings
"baseUrl": ".",
"paths": {
"@/*": ["./*"]
}
}
}
```
### 9. Test the Setup
```bash
# Run development server
pnpm dev
# or npm run dev
# Run linting
pnpm lint
# or npm run lint
# Run formatting
pnpm format
# or npm run format
# Run build test
pnpm build
# or npm run build
```
### 10. Initialize Git Repository
```bash
# Add remote repository (replace with your repository URL)
git remote add origin https://github.com/yourusername/{project_name}.git
# Make initial commit with template
git add .
git commit -m "feat: initialize project from nextjs-new-app template
- Set up Next.js 15+ with TypeScript and Tailwind CSS 4.x
- Implemented Feature-Based Architecture structure
- Added BaseController foundation for database-agnostic patterns
- Configured development tooling (ESLint, Prettier, Husky)
Template: https://github.com/marciobarroso/nextjs-new-app"
# Push to remote repository
git push -u origin main
```
## Validation Checklist
- [ ] Template repository successfully cloned
- [ ] Dependencies installed without errors
- [ ] Development server runs on http://localhost:3000
- [ ] ESLint and Prettier configured and working
- [ ] TypeScript compilation successful
- [ ] Feature-Based Architecture directories created
- [ ] BaseController foundation implemented
- [ ] Zod schema validation set up
- [ ] Environment variables configured
- [ ] Git repository initialized and connected
## Template Features Already Configured
- ✅ Next.js 15.5.3 with App Router
- ✅ React 19.1.0 with latest features
- ✅ TypeScript 5 with strict configuration
- ✅ Tailwind CSS 4.1.13 with PostCSS
- ✅ ESLint 9 with Next.js integration
- ✅ Prettier 3.6.2 with import sorting
- ✅ Husky 9.1.7 for git hooks
- ✅ Jest testing framework (configured)
- ✅ Shared components structure
- ✅ Basic layouts and providers
- ✅ Internationalization setup
## Next Steps After Setup
1. Plan your first business domain feature
2. Implement your chosen database integration (Prisma, TypeORM, Mongoose, etc.)
3. Create your first feature following Feature-Based Architecture
4. Set up authentication system
5. Configure your preferred database
6. Implement testing for your features
7. Set up CI/CD pipeline for deployment
## Database Integration Examples
### For Prisma (PostgreSQL)
```bash
pnpm add prisma @prisma/client
pnpm add -D prisma
npx prisma init
```
### For TypeORM (SQL databases)
```bash
pnpm add typeorm reflect-metadata
pnpm add pg # for PostgreSQL
# or pnpm add mysql2 # for MySQL
```
### For Mongoose (MongoDB)
```bash
pnpm add mongoose
pnpm add -D @types/mongoose
```
The `nextjs-new-app` template provides an excellent foundation for Feature-Based Architecture, and this setup process will get you ready to build scalable, maintainable Next.js applications following Domain-Driven Design principles.