Um monorepo moderno usando Turbo, Next.js, NestJS, Drizzle ORM e Better Auth.
├── apps/
│ ├── api/ # API NestJS
│ └── web/ # Frontend Next.js
├── packages/
│ ├── auth/ # Configuração Better Auth compartilhada
│ ├── database/ # Schema Drizzle ORM compartilhado
│ ├── ui/ # Componentes UI (shadcn/ui)
│ ├── eslint-config/# Configuração ESLint compartilhada
│ └── typescript-config/# Configuração TypeScript compartilhada
- Node.js >= 20
- pnpm >= 8
- PostgreSQL
# Clone o repositório
git clone <repository-url>
cd turbo-next-nest
# Instale as dependências
pnpm install
# Configure as variáveis de ambiente
cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env
# Configure o banco de dados
pnpm db:push
# Inicie o desenvolvimento
pnpm dev
Schema do banco de dados compartilhado usando Drizzle ORM.
import { user, eq } from "@workspace/database";
Configuração de autenticação compartilhada usando Better Auth.
import { authClient } from "@workspace/auth/client";
Componentes UI baseados em shadcn/ui.
import { Button } from "@workspace/ui/components/button";
# Gerar migrações
pnpm db:generate
# Aplicar migrações
pnpm db:migrate
# Push schema (desenvolvimento)
pnpm db:push
# Abrir Drizzle Studio
pnpm db:studio
# Verificar schema
pnpm db:check
- Users: Gerenciamento de usuários e autenticação
- Sessions: Sessões de autenticação
- Organizations: Sistema de organizações/empresas
# Desenvolvimento (todos os apps)
pnpm dev
# Build (todos os packages/apps)
pnpm build
# Lint (todos os packages/apps)
pnpm lint
# Formatação de código
pnpm format
# Adicionar novos componentes shadcn/ui
pnpm dlx shadcn@latest add button -c packages/ui
- Apps dependem de packages
- Packages usam peer dependencies para evitar conflitos de versão
- Database package re-exporta utilitários do Drizzle
- Auth package centraliza configuração do Better Auth
- Monorepo: Turborepo
- Frontend: Next.js 14, React, TypeScript
- Backend: NestJS, TypeScript
- Database: PostgreSQL, Drizzle ORM
- Authentication: Better Auth
- UI: shadcn/ui, Tailwind CSS
- Package Manager: pnpm
- Linting: ESLint, Prettier
A API usa injeção de dependências para o Drizzle client:
@Injectable()
export class DatabaseService {
constructor(private readonly config: DatabaseConfig) {
this.client = drizzle(config.databaseUrl, { schema });
}
}
Os packages usam peer dependencies para evitar conflitos de versão:
{
"peerDependencies": {
"drizzle-orm": "^0.44.5"
}
}
- Fork o projeto
- Crie uma branch (
git checkout -b feature/nova-feature
) - Commit suas mudanças (
git commit -am 'Add nova feature'
) - Push para a branch (
git push origin feature/nova-feature
) - Abra um Pull Request
Este projeto está sob a licença MIT.