fix: switch production build to webpack

This commit is contained in:
Esdras Renan 2025-11-05 21:15:10 -03:00
parent 1079111de2
commit ea8612b8fd
7 changed files with 48 additions and 31 deletions

View file

@ -1,6 +1,6 @@
## Sistema de Chamados ## Sistema de Chamados
Aplicação **Next.js 16 (App Router)** com **React 19**, **Convex** e **Better Auth** para gestão de tickets da Rever. A stack ainda inclui **Prisma 6** (SQLite padrão para DEV), **Tailwind** e **Turbopack** como bundler padrão. Todo o código-fonte fica na raiz do monorepo seguindo as convenções do App Router. Aplicação **Next.js 16 (App Router)** com **React 19**, **Convex** e **Better Auth** para gestão de tickets da Rever. A stack ainda inclui **Prisma 6** (SQLite padrão para DEV), **Tailwind** e **Turbopack** em desenvolvimento (o build de produção roda com o webpack padrão do Next). Todo o código-fonte fica na raiz do monorepo seguindo as convenções do App Router.
## Requisitos ## Requisitos
@ -35,7 +35,7 @@ Aplicação **Next.js 16 (App Router)** com **React 19**, **Convex** e **Better
bun run convex:dev:bun bun run convex:dev:bun
``` ```
> Alternativa: `bun run convex:dev` (runtime Node) caso queira manter o comportamento anterior. > Alternativa: `bun run convex:dev` (runtime Node) caso queira manter o comportamento anterior.
7. Em outro terminal, suba o frontend Next.js (Turbopack): 7. Em outro terminal, suba o frontend Next.js (dev com Turbopack):
```bash ```bash
bun run dev:bun bun run dev:bun
``` ```
@ -66,10 +66,11 @@ Para fluxos detalhados de desenvolvimento — banco de dados local (SQLite/Prism
- `bun run dev:bun` — padrão atual para o Next.js com runtime Bun (`bun run dev:webpack` permanece como fallback). - `bun run dev:bun` — padrão atual para o Next.js com runtime Bun (`bun run dev:webpack` permanece como fallback).
- `bun run convex:dev:bun` — runtime Bun para o Convex (`bun run convex:dev` mantém o fluxo antigo usando Node). - `bun run convex:dev:bun` — runtime Bun para o Convex (`bun run convex:dev` mantém o fluxo antigo usando Node).
- `bun run build:bun` / `bun run start:bun` — build e serve com Bun; `bun run build` mantém o fallback Node. - `bun run build:bun` / `bun run start:bun` — build e serve com Bun; `bun run build` mantém o fallback Node.
- `bun run dev:webpack` / `bun run build:webpack` — fallback oficial caso Turbopack apresente problemas. - `bun run dev:webpack` — fallback do Next.js em modo desenvolvimento (webpack).
- `bun run lint` — ESLint com as regras do projeto. - `bun run lint` — ESLint com as regras do projeto.
- `bun test` — suíte de testes unitários usando o runner do Bun (o teste de screenshot fica automaticamente ignorado se o matcher não existir). - `bun test` — suíte de testes unitários usando o runner do Bun (o teste de screenshot fica automaticamente ignorado se o matcher não existir).
- `bun run build` — executa `next build --turbopack` usando Node como fallback. - `bun run build` — executa `next build --webpack` (webpack padrão do Next).
- `bun run build:turbopack` — executa `next build --turbopack` para reproduzir/debugar problemas.
- `bun run auth:seed` — atualiza/cria contas padrão do Better Auth (credenciais em `agents.md`). - `bun run auth:seed` — atualiza/cria contas padrão do Better Auth (credenciais em `agents.md`).
- `bunx prisma migrate deploy` — aplica migrações ao banco SQLite local. - `bunx prisma migrate deploy` — aplica migrações ao banco SQLite local.
- `bun run convex:dev` — roda o Convex em modo desenvolvimento com Node, gerando tipos em `convex/_generated`. - `bun run convex:dev` — roda o Convex em modo desenvolvimento com Node, gerando tipos em `convex/_generated`.
@ -106,7 +107,7 @@ Consulte `PROXIMOS_PASSOS.md` para acompanhar o backlog funcional e o progresso
- `bun install` é o fluxo padrão (o arquivo `bun.lock` deve ser versionado; use `bun install --frozen-lockfile` em CI). - `bun install` é o fluxo padrão (o arquivo `bun.lock` deve ser versionado; use `bun install --frozen-lockfile` em CI).
- `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun` e `bun run start:bun` já estão configurados; internamente executam `bun run --bun <script>` para usar o runtime do Bun sem abrir mão dos scripts existentes. O `cross-env` garante os valores esperados de `NODE_ENV` (`development`/`production`). - `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun` e `bun run start:bun` já estão configurados; internamente executam `bun run --bun <script>` para usar o runtime do Bun sem abrir mão dos scripts existentes. O `cross-env` garante os valores esperados de `NODE_ENV` (`development`/`production`).
- Em caso de incompatibilidade do Turbopack (relatada em algumas combinações Bun + Next 16), use `bun run dev:webpack` ou `bun run build:webpack` como fallback imediato. - Se precisar validar o bundler experimental, use `bun run build:turbopack`; para o fluxo estável mantenha `bun run build` (webpack).
- `bun test` utiliza o test runner do Bun. O teste de snapshot de screenshot é automaticamente ignorado quando o matcher não está disponível; testes de navegador completos continuam via `bun run test:browser` (Vitest + Playwright). - `bun test` utiliza o test runner do Bun. O teste de snapshot de screenshot é automaticamente ignorado quando o matcher não está disponível; testes de navegador completos continuam via `bun run test:browser` (Vitest + Playwright).
<!-- ci: smoke test 3 --> <!-- ci: smoke test 3 -->

View file

@ -19,10 +19,10 @@ Os demais colaboradores reais são provisionados via **Convites & acessos**. Cas
- Seeds de usuários/tickets demo: `convex/seed.ts`. - Seeds de usuários/tickets demo: `convex/seed.ts`.
- Para DEV: rode `bun run convex:dev:bun` e acesse `/dev/seed` uma vez para popular dados realistas. - Para DEV: rode `bun run convex:dev:bun` e acesse `/dev/seed` uma vez para popular dados realistas.
## Stack atual (18/10/2025) ## Stack atual (06/11/2025)
- **Next.js**: `15.5.5` (Turbopack em produção + cache de filesystem em DEV). - **Next.js**: `16.0.1` (Turbopack em desenvolvimento; builds de produção usam webpack).
- Whitelist de domínios em `src/config/allowed-hosts.ts` é aplicada pelo `middleware.ts`. - Whitelist de domínios em `src/config/allowed-hosts.ts` é aplicada pelo `middleware.ts`.
- **React / React DOM**: `18.2.0`. - **React / React DOM**: `19.2.0`.
- **Trilha de testes**: Vitest (`bun test`) sem modo watch por padrão (`--run --passWithNoTests`). - **Trilha de testes**: Vitest (`bun test`) sem modo watch por padrão (`--run --passWithNoTests`).
- **CI**: workflow `Quality Checks` (`.github/workflows/quality-checks.yml`) roda `bun install`, `bun run prisma:generate`, `bun run lint`, `bun test`, `bun run build:bun`. Variáveis críticas (`BETTER_AUTH_SECRET`, `NEXT_PUBLIC_APP_URL`, etc.) são definidas apenas no runner — não afetam a VPS. - **CI**: workflow `Quality Checks` (`.github/workflows/quality-checks.yml`) roda `bun install`, `bun run prisma:generate`, `bun run lint`, `bun test`, `bun run build:bun`. Variáveis críticas (`BETTER_AUTH_SECRET`, `NEXT_PUBLIC_APP_URL`, etc.) são definidas apenas no runner — não afetam a VPS.
- **Disciplina pós-mudanças**: sempre que fizer alterações locais, rode **obrigatoriamente** `bun run lint`, `bun run build:bun` e `bun test` antes de entregar ou abrir PR. Esses comandos são mandatórios também para os agentes/automations, garantindo que o projeto continua íntegro. - **Disciplina pós-mudanças**: sempre que fizer alterações locais, rode **obrigatoriamente** `bun run lint`, `bun run build:bun` e `bun test` antes de entregar ou abrir PR. Esses comandos são mandatórios também para os agentes/automations, garantindo que o projeto continua íntegro.
@ -90,7 +90,7 @@ bun run build:bun
- **Testes unitários/integrados (Vitest)**: - **Testes unitários/integrados (Vitest)**:
- Cobertura atual inclui utilitários (`tests/*.test.ts`), rotas `/api/machines/*` e `sendSmtpMail`. - Cobertura atual inclui utilitários (`tests/*.test.ts`), rotas `/api/machines/*` e `sendSmtpMail`.
- Executar `bun test -- --watch` apenas quando precisar de modo interativo. - Executar `bun test -- --watch` apenas quando precisar de modo interativo.
- **Build**: `bun run build:bun` (`next build --turbopack`). - **Build**: `bun run build:bun` (`next build --webpack`, webpack). Para reproduzir problemas do bundler experimental, use `bun run build:turbopack`.
- **CI**: falhas mais comuns - **CI**: falhas mais comuns
- `ERR_BUN_LOCKFILE_OUTDATED`: confirme que o `bun.lock` foi regenerado (`bun install`) após alterar dependências, especialmente do app desktop. - `ERR_BUN_LOCKFILE_OUTDATED`: confirme que o `bun.lock` foi regenerado (`bun install`) após alterar dependências, especialmente do app desktop.
- Variáveis Better Auth ausentes (`BETTER_AUTH_SECRET`): definidas no workflow (`Quality Checks`). - Variáveis Better Auth ausentes (`BETTER_AUTH_SECRET`): definidas no workflow (`Quality Checks`).
@ -168,4 +168,4 @@ bun run build:bun
- `docs/admin-inventory-ui.md`, `docs/plano-app-desktop-maquinas.md` — detalhes do inventário/agente. - `docs/admin-inventory-ui.md`, `docs/plano-app-desktop-maquinas.md` — detalhes do inventário/agente.
--- ---
_Última atualização: 18/10/2025 (Next.js 15.5.5 estável, Turbopack, fluxos desktop + portal documentados)._ _Última atualização: 06/11/2025 (Next.js 16, build de produção com webpack, fluxos desktop + portal documentados)._

View file

@ -6,7 +6,7 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve
- **Bun (runtime padrão)**: 1.3+ já instalado no runner e VPS (`bun --version`). Após instalar localmente, exporte `PATH="$HOME/.bun/bin:$PATH"` para tornar o binário disponível. Use `bun install`, `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun` e `bun test` como fluxo principal (scripts Node continuam disponíveis como fallback). - **Bun (runtime padrão)**: 1.3+ já instalado no runner e VPS (`bun --version`). Após instalar localmente, exporte `PATH="$HOME/.bun/bin:$PATH"` para tornar o binário disponível. Use `bun install`, `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun` e `bun test` como fluxo principal (scripts Node continuam disponíveis como fallback).
- **Node.js**: mantenha a versão 20.9+ instalada para ferramentas auxiliares (Prisma CLI, scripts legados em Node) quando não estiver usando o runtime do Bun. - **Node.js**: mantenha a versão 20.9+ instalada para ferramentas auxiliares (Prisma CLI, scripts legados em Node) quando não estiver usando o runtime do Bun.
- **Next.js 15.5.5**: Projeto voltou para a versão estável (`next@15.5.5`) com Turbopack como bundler padrão e whitelist de domínios garantida pelo middleware. - **Next.js 16**: Projeto roda em `next@16.0.1` com Turbopack apenas no ambiente de desenvolvimento; builds de produção usam o webpack padrão do framework.
- **Lint/Test/Build**: `bun run lint`, `bun test`, `bun run build:bun`. O test runner do Bun já roda em modo não interativo; utilize `bunx vitest --watch` apenas quando precisar do modo watch manualmente. - **Lint/Test/Build**: `bun run lint`, `bun test`, `bun run build:bun`. O test runner do Bun já roda em modo não interativo; utilize `bunx vitest --watch` apenas quando precisar do modo watch manualmente.
- **Banco DEV**: SQLite em `prisma/prisma/db.dev.sqlite`. Defina `DATABASE_URL="file:./prisma/db.dev.sqlite"` ao chamar CLI do Prisma. - **Banco DEV**: SQLite em `prisma/prisma/db.dev.sqlite`. Defina `DATABASE_URL="file:./prisma/db.dev.sqlite"` ao chamar CLI do Prisma.
- **Desktop (Tauri)**: fonte em `apps/desktop`. Usa Radix tabs + componentes shadcn-like, integra com os endpoints `/api/machines/*` e suporta atualização automática via GitHub Releases. - **Desktop (Tauri)**: fonte em `apps/desktop`. Usa Radix tabs + componentes shadcn-like, integra com os endpoints `/api/machines/*` e suporta atualização automática via GitHub Releases.
@ -35,12 +35,11 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve
> **Por quê inline?** Evitamos declarar `DATABASE_URL` em `prisma/.env` porque o Prisma lê também o `.env` da raiz (produção). O override inline garante isolamento do banco DEV. > **Por quê inline?** Evitamos declarar `DATABASE_URL` em `prisma/.env` porque o Prisma lê também o `.env` da raiz (produção). O override inline garante isolamento do banco DEV.
## Next.js 15 (estável) ## Next.js 16 (estável)
- Mantemos o projeto em `next@15.5.5`, priorizando estabilidade enquanto acompanhamos as novidades do 16. - Mantemos o projeto em `next@16.0.1`, com React 19 e o App Router completo.
- **React 18.2**: voltamos para a versão suportada oficialmente pelo Next 15. Evite APIs exclusivas do React 19 (`use(...)`, `useActionState`, etc.). - **Bundlers**: Turbopack permanece habilitado no `next dev`/`bun run dev:bun` pela velocidade, mas o `next build --webpack` é o caminho oficial para produção. Execute `bun run build:turbopack` apenas para reproduzir bugs.
- **Turbopack** segue como bundler padrão, sem flags experimentais adicionais. - **Whitelist de hosts**: o release estável continua sem aceitar `server.allowedHosts` (vide [`invalid-next-config`](https://nextjs.org/docs/messages/invalid-next-config)), portanto bloqueamos domínios exclusivamente via `middleware.ts`.
- **Whitelist de hosts**: o release estável 15.5 não aceita `server.allowedHosts` (vide [`invalid-next-config`](https://nextjs.org/docs/messages/invalid-next-config)), portanto bloqueamos domínios exclusivamente via `middleware.ts`.
### Editor rich text (TipTap) — menções de ticket ### Editor rich text (TipTap) — menções de ticket
@ -53,9 +52,10 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve
- `bun run lint`: executa ESLint (flat config) sobre os arquivos do projeto. - `bun run lint`: executa ESLint (flat config) sobre os arquivos do projeto.
- `bun test`: roda a suíte de testes utilizando o runner nativo do Bun. Para modo watch, use `bunx vitest --watch` manualmente. - `bun test`: roda a suíte de testes utilizando o runner nativo do Bun. Para modo watch, use `bunx vitest --watch` manualmente.
- `bun run build:bun`: `next build --turbopack` usando o runtime Bun. `bun run build` permanece disponível como fallback em Node. - `bun run build:bun`: `next build --webpack` usando o runtime Bun (webpack).
- Scripts com Bun (padrão atual): `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun`, `bun run start:bun`. Eles mantêm os scripts existentes, apenas forçando o runtime do Bun via `bun run --bun`. O `cross-env` garante `NODE_ENV` consistente (`development`/`production`). - Scripts com Bun (padrão atual): `bun run dev:bun`, `bun run convex:dev:bun`, `bun run build:bun`, `bun run start:bun`. Eles mantêm os scripts existentes, apenas forçando o runtime do Bun via `bun run --bun`. O `cross-env` garante `NODE_ENV` consistente (`development`/`production`).
- Fallback Webpack disponível via `bun run dev:webpack` / `bun run build:webpack` quando Turbopack não coopera (caso observado em combinações Bun + Next 16). - `bun run build:turbopack`: build experimental com Turbopack. Use apenas para debugging/local, pois ainda causa inconsistências em produção.
- `bun run dev:webpack`: fallback do Next em dev quando o Turbopack apresentar problemas.
- `bun run prisma:generate`: necessário antes do build quando o client Prisma muda. Para migrações use `bunx prisma migrate deploy`. - `bun run prisma:generate`: necessário antes do build quando o client Prisma muda. Para migrações use `bunx prisma migrate deploy`.
### Automação no CI ### Automação no CI

View file

@ -332,9 +332,11 @@ Benefícios
- Guia CI/CD Desktop: `apps/desktop/docs/guia-ci-cd-web-desktop.md` - Guia CI/CD Desktop: `apps/desktop/docs/guia-ci-cd-web-desktop.md`
- Docs Convex selfhosted: imagem oficial `ghcr.io/get-convex/convex-backend` - Docs Convex selfhosted: imagem oficial `ghcr.io/get-convex/convex-backend`
## Turbopack (Next.js) ## Bundlers (Next.js)
- O projeto usa Turbopack em dev e build. - Em desenvolvimento utilizamos Turbopack (`next dev --turbopack`) pela velocidade incremental.
- Scripts (package.json): - Builds de produção rodam com `next build --webpack` para evitar mismatches de chunks vistos com o Turbopack em produção.
- Scripts principais (package.json):
- `dev`: `next dev --turbopack` - `dev`: `next dev --turbopack`
- `build`: `next build --turbopack` - `build`: `next build --webpack`
- O workflow de CI executa `bun run build:bun` (que já chama Turbopack via script), e a stack utiliza `bun run start:bun` sobre o artefato gerado. - `build:turbopack`: `next build --turbopack` (uso pontual para debug)
- O workflow de CI executa `bun run build:bun` (que agora roda `next build --webpack` via Bun) e a stack continua a usar `bun run start:bun` sobre o artefato gerado.

View file

@ -6,8 +6,8 @@
"prebuild": "prisma generate", "prebuild": "prisma generate",
"dev": "next dev --turbopack", "dev": "next dev --turbopack",
"dev:webpack": "next dev --webpack", "dev:webpack": "next dev --webpack",
"build": "next build --turbopack", "build": "next build --webpack",
"build:webpack": "next build --webpack", "build:turbopack": "next build --turbopack",
"start": "next start", "start": "next start",
"lint": "eslint", "lint": "eslint",
"prisma:generate": "prisma generate", "prisma:generate": "prisma generate",

View file

@ -4,15 +4,23 @@ import { SiteHeader } from "@/components/site-header"
import { requireStaffSession } from "@/lib/auth-server" import { requireStaffSession } from "@/lib/auth-server"
type PageProps = { type PageProps = {
params: { id: string } params?: Promise<{ id: string }>
searchParams: { [key: string]: string | string[] | undefined } searchParams?: Promise<{ [key: string]: string | string[] | undefined }>
} }
export const dynamic = "force-dynamic" export const dynamic = "force-dynamic"
export default async function DashboardDetailPage({ params, searchParams }: PageProps) { export default async function DashboardDetailPage({ params, searchParams }: PageProps) {
if (!params) {
throw new Error("Dashboard id not provided")
}
const { id } = await params
const resolvedSearchParams =
(searchParams ? await searchParams : {}) as Record<string, string | string[] | undefined>
await requireStaffSession() await requireStaffSession()
const tvMode = searchParams?.tv === "1" const tvMode = resolvedSearchParams?.tv === "1"
return ( return (
<AppShell <AppShell
@ -25,7 +33,7 @@ export default async function DashboardDetailPage({ params, searchParams }: Page
> >
<div className="mx-auto w-full max-w-7xl px-4 pb-12 lg:px-6"> <div className="mx-auto w-full max-w-7xl px-4 pb-12 lg:px-6">
<DashboardBuilder <DashboardBuilder
dashboardId={params.id} dashboardId={id}
editable={!tvMode} editable={!tvMode}
mode={tvMode ? "tv" : "edit"} mode={tvMode ? "tv" : "edit"}
/> />

View file

@ -2,16 +2,22 @@ import { DashboardBuilder } from "@/components/dashboards/dashboard-builder"
import { requireStaffSession } from "@/lib/auth-server" import { requireStaffSession } from "@/lib/auth-server"
type PageProps = { type PageProps = {
params: { id: string } params?: Promise<{ id: string }>
} }
export const dynamic = "force-dynamic" export const dynamic = "force-dynamic"
export default async function DashboardPrintPage({ params }: PageProps) { export default async function DashboardPrintPage({ params }: PageProps) {
if (!params) {
throw new Error("Dashboard id not provided")
}
const { id } = await params
await requireStaffSession() await requireStaffSession()
return ( return (
<div className="min-h-screen bg-white p-6" data-dashboard-print> <div className="min-h-screen bg-white p-6" data-dashboard-print>
<DashboardBuilder dashboardId={params.id} editable={false} mode="print" /> <DashboardBuilder dashboardId={id} editable={false} mode="print" />
</div> </div>
) )
} }