Skip to main content

Pré-requisitos

  • Node.js v19+
  • npm v9+ (ou yarn/pnpm)
  • Git

Instalação

# Clonar o repositório
git clone https://github.com/easygoal/monorepo.git
cd easygoal-monorepo

# Instalar todas as dependências de todos os apps e packages
npm install
O workspaces do npm instala as dependências de todos os projetos automaticamente — sem necessidade de entrar em cada pasta.

Variáveis de ambiente

Copie o arquivo de exemplo e preencha com seus valores:
cp .env.example .env.local
Nunca commite arquivos .env.local ou .env com secrets reais. Use .env.example apenas com valores de placeholder.

Rodar em desenvolvimento

# Rodar todos os apps em paralelo (app-front, sso, club-lp, docs)
npm run dev

# Rodar apenas um app específico
npx turbo dev --filter=sso
npx turbo dev --filter=club-lp
npx turbo dev --filter=docs
Por padrão:
  • app-fronthttp://localhost:3000
  • ssohttp://localhost:3001
  • club-lphttp://localhost:3002
  • docshttp://localhost:3003

Integração Multistack e Webhooks

Para aceitar integração de webhooks em múltiplas linguagens, o SSO deve expor o endpoint POST /api/webhook/payment de forma agnóstica à linguagem do cliente.
import { createHmac, timingSafeEqual } from 'crypto';

function verifyWebhook(rawBody: string, signature: string, secret: string): boolean {
  const expected = createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');

  const sigBuf = Buffer.from(signature, 'hex');
  const expBuf = Buffer.from(expected, 'hex');

  return sigBuf.length === expBuf.length && timingSafeEqual(sigBuf, expBuf);
}

Build e Deploy

# Build de todos os projetos
npm run build

# Lint e type-check
npm run lint
npm run type-check
A ordem de build é gerenciada automaticamente pelo Turborepo com base nas dependências entre pacotes. packages/* é construído antes dos apps/*.

Estrutura do turbo.json

{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "!.next/cache/**", "dist/**"]
    },
    "dev": {
      "cache": false,
      "persistent": true
    },
    "lint": {},
    "type-check": {}
  }
}