forlogic-core 3.0.0 → 3.0.2
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/.note/memory/security/react-router-dom-v7-migration.md +33 -33
- package/.note/memory/security/react19-migration-roadmap.md +66 -66
- package/dist/components/ui/updates-notification.d.ts +7 -1
- package/dist/config/environments.d.ts +6 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/docs/design-system/examples.md +275 -275
- package/docs/design-system/notifications-feedback.md +2 -2
- package/docs/design-system/patterns/core-providers.md +258 -258
- package/package.json +1 -1
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: react-router-dom v7 migration + peer dependency
|
|
3
|
-
description: forlogic-core 2.5.0 bumpou react-router-dom 6→7 e moveu pra peerDependencies — consumidores precisam alinhar a própria versão antes de atualizar
|
|
4
|
-
type: feature
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## O que mudou (forlogic-core 2.5.0)
|
|
8
|
-
|
|
9
|
-
- `react-router-dom`: `6.30.1` → `7.18.1`.
|
|
10
|
-
- Saiu de `dependencies` e virou `peerDependencies` — o app consumidor agora é responsável por instalar a versão compatível.
|
|
11
|
-
|
|
12
|
-
## Por que isso quebra apps que não atualizarem
|
|
13
|
-
|
|
14
|
-
`react-router-dom` era dependência normal mas já tratada como externa no build (`rollup.config.js#externalDeps`) — ou seja, o app sempre precisou fornecer a própria instância em runtime. O problema: sem ser peer, o npm não avisava sobre incompatibilidade de versão, só instalava as duas cópias silenciosamente. Um app ainda em v6 + lib pedindo v7 = duas instâncias de React Router no bundle = contexto de `<Router>` não bate entre os hooks da lib (`useNavigate`, `useLocation`, etc. usados em `lib/components/layout/*`, `lib/crud/*`, `lib/auth/*`) e o `<BrowserRouter>` do app.
|
|
15
|
-
|
|
16
|
-
## Checklist pra IA/dev atualizando um app consumidor
|
|
17
|
-
|
|
18
|
-
1. Checar `package.json` do app: `react-router-dom` precisa ser `^7.18.1` (ou compatível) **antes** de subir `forlogic-core` pra `>=2.5.0`.
|
|
19
|
-
2. Se o app usa só API declarativa (`Routes`, `Route`, `Link`, `Navigate`, `Outlet`, `useNavigate`, `useLocation`, `useParams`, `useSearchParams`, `BrowserRouter`) — migração 6→7 tende a ser troca de versão sem mudança de código.
|
|
20
|
-
3. Se o app usa **data router** (`createBrowserRouter`, loaders, actions, `<Form>`) — revisar changelog oficial do react-router v7, há mudanças de API nesse modo que a lib não usa e portanto não foi validado aqui.
|
|
21
|
-
4. Rodar `npm ls react-router-dom` no app depois do install — se aparecer mais de uma versão resolvida (não deduped), o conflito não foi resolvido.
|
|
22
|
-
|
|
23
|
-
## Risco aceito relacionado: GHSA-qwww-vcr4-c8h2 (high) — RESOLVIDO na 3.0.0
|
|
24
|
-
|
|
25
|
-
react-router (core, 7.12.0–8.2.0) tem CVE alto de CSRF bypass em "RSC Mode". Fix é `react-router@8.3.0`, mas na época:
|
|
26
|
-
- `react-router-dom` (pacote usado aqui) não tem release 8.x.
|
|
27
|
-
- `react-router@8.3.0` exige React `>=19.2.7` — ver [[react19-migration-roadmap]].
|
|
28
|
-
|
|
29
|
-
Foi aceito como risco porque não exploitável no padrão de uso desta lib (sem RSC, sem actions/loaders, sem SSR — só roteamento client-side declarativo).
|
|
30
|
-
|
|
31
|
-
**Corrigido em 2026-08-01 (`forlogic-core@3.0.0`):** migração pra React 19 + `react-router@8.3.0` executada. `npm audit` = 0 vulnerabilidades. Detalhes e checklist pro app consumidor em [[react19-migration-roadmap]].
|
|
32
|
-
|
|
33
|
-
> **Este documento descreve a 2.5.0 e está superado a partir da 3.0.0.** O pacote `react-router-dom` não existe mais no v8 — quem for atualizar direto de `<2.5.0` pra `^3.0.0` deve seguir o checklist do [[react19-migration-roadmap]], não o daqui.
|
|
1
|
+
---
|
|
2
|
+
name: react-router-dom v7 migration + peer dependency
|
|
3
|
+
description: forlogic-core 2.5.0 bumpou react-router-dom 6→7 e moveu pra peerDependencies — consumidores precisam alinhar a própria versão antes de atualizar
|
|
4
|
+
type: feature
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## O que mudou (forlogic-core 2.5.0)
|
|
8
|
+
|
|
9
|
+
- `react-router-dom`: `6.30.1` → `7.18.1`.
|
|
10
|
+
- Saiu de `dependencies` e virou `peerDependencies` — o app consumidor agora é responsável por instalar a versão compatível.
|
|
11
|
+
|
|
12
|
+
## Por que isso quebra apps que não atualizarem
|
|
13
|
+
|
|
14
|
+
`react-router-dom` era dependência normal mas já tratada como externa no build (`rollup.config.js#externalDeps`) — ou seja, o app sempre precisou fornecer a própria instância em runtime. O problema: sem ser peer, o npm não avisava sobre incompatibilidade de versão, só instalava as duas cópias silenciosamente. Um app ainda em v6 + lib pedindo v7 = duas instâncias de React Router no bundle = contexto de `<Router>` não bate entre os hooks da lib (`useNavigate`, `useLocation`, etc. usados em `lib/components/layout/*`, `lib/crud/*`, `lib/auth/*`) e o `<BrowserRouter>` do app.
|
|
15
|
+
|
|
16
|
+
## Checklist pra IA/dev atualizando um app consumidor
|
|
17
|
+
|
|
18
|
+
1. Checar `package.json` do app: `react-router-dom` precisa ser `^7.18.1` (ou compatível) **antes** de subir `forlogic-core` pra `>=2.5.0`.
|
|
19
|
+
2. Se o app usa só API declarativa (`Routes`, `Route`, `Link`, `Navigate`, `Outlet`, `useNavigate`, `useLocation`, `useParams`, `useSearchParams`, `BrowserRouter`) — migração 6→7 tende a ser troca de versão sem mudança de código.
|
|
20
|
+
3. Se o app usa **data router** (`createBrowserRouter`, loaders, actions, `<Form>`) — revisar changelog oficial do react-router v7, há mudanças de API nesse modo que a lib não usa e portanto não foi validado aqui.
|
|
21
|
+
4. Rodar `npm ls react-router-dom` no app depois do install — se aparecer mais de uma versão resolvida (não deduped), o conflito não foi resolvido.
|
|
22
|
+
|
|
23
|
+
## Risco aceito relacionado: GHSA-qwww-vcr4-c8h2 (high) — RESOLVIDO na 3.0.0
|
|
24
|
+
|
|
25
|
+
react-router (core, 7.12.0–8.2.0) tem CVE alto de CSRF bypass em "RSC Mode". Fix é `react-router@8.3.0`, mas na época:
|
|
26
|
+
- `react-router-dom` (pacote usado aqui) não tem release 8.x.
|
|
27
|
+
- `react-router@8.3.0` exige React `>=19.2.7` — ver [[react19-migration-roadmap]].
|
|
28
|
+
|
|
29
|
+
Foi aceito como risco porque não exploitável no padrão de uso desta lib (sem RSC, sem actions/loaders, sem SSR — só roteamento client-side declarativo).
|
|
30
|
+
|
|
31
|
+
**Corrigido em 2026-08-01 (`forlogic-core@3.0.0`):** migração pra React 19 + `react-router@8.3.0` executada. `npm audit` = 0 vulnerabilidades. Detalhes e checklist pro app consumidor em [[react19-migration-roadmap]].
|
|
32
|
+
|
|
33
|
+
> **Este documento descreve a 2.5.0 e está superado a partir da 3.0.0.** O pacote `react-router-dom` não existe mais no v8 — quem for atualizar direto de `<2.5.0` pra `^3.0.0` deve seguir o checklist do [[react19-migration-roadmap]], não o daqui.
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: React 19 migration roadmap
|
|
3
|
-
description: Migração do forlogic-core para React 19 + react-router v8 — CONCLUÍDA na 3.0.0 (2026-08-01); consumidores precisam estar em React 19 antes de atualizar
|
|
4
|
-
type: feature
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
**Status: concluída na `forlogic-core@3.0.0` (2026-08-01).** Levantada em 2026-07-24 a partir de
|
|
8
|
-
[[react-router-dom-v7-migration]], quando a decisão foi manter React 18 e aceitar o risco do
|
|
9
|
-
CVE GHSA-qwww-vcr4-c8h2. Executada agora porque `react-router@8.3.0` (fix do CVE) exige
|
|
10
|
-
peer `react >=19.2.7`.
|
|
11
|
-
|
|
12
|
-
## O que foi feito
|
|
13
|
-
|
|
14
|
-
Os 6 passos do escopo original, todos aplicados:
|
|
15
|
-
|
|
16
|
-
1. **`react`/`react-dom` movidos de `dependencies` → `peerDependencies` (`^19.2.7`)** — mesmo
|
|
17
|
-
problema de duplicação silenciosa que motivou mover `react-router-dom` na 2.5.0. Ficaram
|
|
18
|
-
também em `devDependencies` (`^19.2.8`) para o build e o vite dev do próprio app.
|
|
19
|
-
2. **`next-themes` `^0.3.0` → `^0.4.6`** — era o bloqueio conhecido; a 0.4.6 aceita
|
|
20
|
-
`react ^19`.
|
|
21
|
-
3. **`react-router-dom` → `react-router`** em 33 imports / 31 arquivos (`lib/` + `src/`),
|
|
22
|
-
mais o externo em `rollup.config.js#externalDeps` e os snippets em
|
|
23
|
-
`docs/design-system/examples.md` e `docs/design-system/patterns/core-providers.md`.
|
|
24
|
-
4. **`react`/`react-dom` `^19.2.8`, `@types/react` `^19.2.18`, `@types/react-dom` `^19.2.4`.**
|
|
25
|
-
5. Build e typecheck validados (ver abaixo). **Validação visual do `/ds` continua pendente
|
|
26
|
-
para quem for publicar** — mudanças de comportamento de render do React 19 não aparecem
|
|
27
|
-
em erro de compilação.
|
|
28
|
-
6. Coordenação com Forlogic/Qualiex — **pendente do lado dos apps**, ver checklist abaixo.
|
|
29
|
-
|
|
30
|
-
## Achados da execução
|
|
31
|
-
|
|
32
|
-
- **O levantamento de 2026-07-24 estava certo:** o código já estava limpo pra React 19.
|
|
33
|
-
Único ajuste necessário no repo inteiro foi `lib/hooks/useDebounce.ts:60` —
|
|
34
|
-
`useRef<NodeJS.Timeout>()` → `useRef<NodeJS.Timeout | undefined>(undefined)`, porque os
|
|
35
|
-
types do React 19 passaram a exigir argumento inicial em `useRef`.
|
|
36
|
-
- **`react-router/dom` não foi necessário.** O guia de upgrade do v8 destaca o subpath, mas
|
|
37
|
-
ele só serve pra `RouterProvider` (framework mode). Todas as APIs usadas aqui
|
|
38
|
-
(`BrowserRouter`, `Routes`, `Route`, `Link`, `Navigate`, `Outlet`, `useNavigate`,
|
|
39
|
-
`useLocation`, `useParams`, `useSearchParams`) continuam no entry point raiz. Verificado
|
|
40
|
-
direto nos `.d.ts` do pacote, não no guia.
|
|
41
|
-
- **As outras breaking changes do v8 não se aplicam:** `data` → `loaderData` só afeta
|
|
42
|
-
`meta()`/`useMatches()`, e `cloudflareDevProxy` só framework mode — nada disso é usado.
|
|
43
|
-
- **Requisitos de ambiente do v8:** `node@22.22+` e `vite@7+`. O repo já atendia (node
|
|
44
|
-
v24.16.0, vite 7.3.0).
|
|
45
|
-
- **`npm audit` = 0 vulnerabilidades** (antes: 2 high). Lint segue em 556 problems /
|
|
46
|
-
492 errors, idêntico ao baseline pré-migração — ruído pré-existente de
|
|
47
|
-
`no-explicit-any`, nada relacionado.
|
|
48
|
-
|
|
49
|
-
## Armadilha do build (não relacionada ao React 19, mas morde aqui)
|
|
50
|
-
|
|
51
|
-
`npm run build` (vite, `outDir` default = `dist`) e `npm run build:lib` (rollup) escrevem no
|
|
52
|
-
**mesmo `dist/`**, e o vite limpa o diretório antes de escrever. Rodar `npm run build`
|
|
53
|
-
depois de `npm run build:lib` **sobrescreve o artefato publicável com o bundle do app**.
|
|
54
|
-
Sempre rodar `build:lib` por último antes de publicar (idealmente `rm -rf dist` antes).
|
|
55
|
-
|
|
56
|
-
## Checklist pro app consumidor (Forlogic/Qualiex)
|
|
57
|
-
|
|
58
|
-
1. Subir o app pra `react`/`react-dom` `>=19.2.7` **antes** de subir `forlogic-core` pra `^3.0.0`.
|
|
59
|
-
2. Trocar `react-router-dom` por `react-router@^8.3.0` no `package.json` do app e reescrever
|
|
60
|
-
os imports (`from 'react-router-dom'` → `from 'react-router'`).
|
|
61
|
-
3. Se o app usa `RouterProvider`/`createBrowserRouter`, importar de `react-router/dom` — a lib
|
|
62
|
-
não exercita esse caminho, então não foi validado aqui.
|
|
63
|
-
4. Se o app usa `meta()` ou `useMatches()`, aplicar `data` → `loaderData`.
|
|
64
|
-
5. `node@22.22+` e `vite@7+` no ambiente de build do app.
|
|
65
|
-
6. Rodar `npm ls react react-dom react-router` depois do install — mais de uma versão
|
|
66
|
-
resolvida (não deduped) significa que o conflito não foi resolvido.
|
|
1
|
+
---
|
|
2
|
+
name: React 19 migration roadmap
|
|
3
|
+
description: Migração do forlogic-core para React 19 + react-router v8 — CONCLUÍDA na 3.0.0 (2026-08-01); consumidores precisam estar em React 19 antes de atualizar
|
|
4
|
+
type: feature
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
**Status: concluída na `forlogic-core@3.0.0` (2026-08-01).** Levantada em 2026-07-24 a partir de
|
|
8
|
+
[[react-router-dom-v7-migration]], quando a decisão foi manter React 18 e aceitar o risco do
|
|
9
|
+
CVE GHSA-qwww-vcr4-c8h2. Executada agora porque `react-router@8.3.0` (fix do CVE) exige
|
|
10
|
+
peer `react >=19.2.7`.
|
|
11
|
+
|
|
12
|
+
## O que foi feito
|
|
13
|
+
|
|
14
|
+
Os 6 passos do escopo original, todos aplicados:
|
|
15
|
+
|
|
16
|
+
1. **`react`/`react-dom` movidos de `dependencies` → `peerDependencies` (`^19.2.7`)** — mesmo
|
|
17
|
+
problema de duplicação silenciosa que motivou mover `react-router-dom` na 2.5.0. Ficaram
|
|
18
|
+
também em `devDependencies` (`^19.2.8`) para o build e o vite dev do próprio app.
|
|
19
|
+
2. **`next-themes` `^0.3.0` → `^0.4.6`** — era o bloqueio conhecido; a 0.4.6 aceita
|
|
20
|
+
`react ^19`.
|
|
21
|
+
3. **`react-router-dom` → `react-router`** em 33 imports / 31 arquivos (`lib/` + `src/`),
|
|
22
|
+
mais o externo em `rollup.config.js#externalDeps` e os snippets em
|
|
23
|
+
`docs/design-system/examples.md` e `docs/design-system/patterns/core-providers.md`.
|
|
24
|
+
4. **`react`/`react-dom` `^19.2.8`, `@types/react` `^19.2.18`, `@types/react-dom` `^19.2.4`.**
|
|
25
|
+
5. Build e typecheck validados (ver abaixo). **Validação visual do `/ds` continua pendente
|
|
26
|
+
para quem for publicar** — mudanças de comportamento de render do React 19 não aparecem
|
|
27
|
+
em erro de compilação.
|
|
28
|
+
6. Coordenação com Forlogic/Qualiex — **pendente do lado dos apps**, ver checklist abaixo.
|
|
29
|
+
|
|
30
|
+
## Achados da execução
|
|
31
|
+
|
|
32
|
+
- **O levantamento de 2026-07-24 estava certo:** o código já estava limpo pra React 19.
|
|
33
|
+
Único ajuste necessário no repo inteiro foi `lib/hooks/useDebounce.ts:60` —
|
|
34
|
+
`useRef<NodeJS.Timeout>()` → `useRef<NodeJS.Timeout | undefined>(undefined)`, porque os
|
|
35
|
+
types do React 19 passaram a exigir argumento inicial em `useRef`.
|
|
36
|
+
- **`react-router/dom` não foi necessário.** O guia de upgrade do v8 destaca o subpath, mas
|
|
37
|
+
ele só serve pra `RouterProvider` (framework mode). Todas as APIs usadas aqui
|
|
38
|
+
(`BrowserRouter`, `Routes`, `Route`, `Link`, `Navigate`, `Outlet`, `useNavigate`,
|
|
39
|
+
`useLocation`, `useParams`, `useSearchParams`) continuam no entry point raiz. Verificado
|
|
40
|
+
direto nos `.d.ts` do pacote, não no guia.
|
|
41
|
+
- **As outras breaking changes do v8 não se aplicam:** `data` → `loaderData` só afeta
|
|
42
|
+
`meta()`/`useMatches()`, e `cloudflareDevProxy` só framework mode — nada disso é usado.
|
|
43
|
+
- **Requisitos de ambiente do v8:** `node@22.22+` e `vite@7+`. O repo já atendia (node
|
|
44
|
+
v24.16.0, vite 7.3.0).
|
|
45
|
+
- **`npm audit` = 0 vulnerabilidades** (antes: 2 high). Lint segue em 556 problems /
|
|
46
|
+
492 errors, idêntico ao baseline pré-migração — ruído pré-existente de
|
|
47
|
+
`no-explicit-any`, nada relacionado.
|
|
48
|
+
|
|
49
|
+
## Armadilha do build (não relacionada ao React 19, mas morde aqui)
|
|
50
|
+
|
|
51
|
+
`npm run build` (vite, `outDir` default = `dist`) e `npm run build:lib` (rollup) escrevem no
|
|
52
|
+
**mesmo `dist/`**, e o vite limpa o diretório antes de escrever. Rodar `npm run build`
|
|
53
|
+
depois de `npm run build:lib` **sobrescreve o artefato publicável com o bundle do app**.
|
|
54
|
+
Sempre rodar `build:lib` por último antes de publicar (idealmente `rm -rf dist` antes).
|
|
55
|
+
|
|
56
|
+
## Checklist pro app consumidor (Forlogic/Qualiex)
|
|
57
|
+
|
|
58
|
+
1. Subir o app pra `react`/`react-dom` `>=19.2.7` **antes** de subir `forlogic-core` pra `^3.0.0`.
|
|
59
|
+
2. Trocar `react-router-dom` por `react-router@^8.3.0` no `package.json` do app e reescrever
|
|
60
|
+
os imports (`from 'react-router-dom'` → `from 'react-router'`).
|
|
61
|
+
3. Se o app usa `RouterProvider`/`createBrowserRouter`, importar de `react-router/dom` — a lib
|
|
62
|
+
não exercita esse caminho, então não foi validado aqui.
|
|
63
|
+
4. Se o app usa `meta()` ou `useMatches()`, aplicar `data` → `loaderData`.
|
|
64
|
+
5. `node@22.22+` e `vite@7+` no ambiente de build do app.
|
|
65
|
+
6. Rodar `npm ls react react-dom react-router` depois do install — mais de uma versão
|
|
66
|
+
resolvida (não deduped) significa que o conflito não foi resolvido.
|
|
@@ -21,12 +21,18 @@ export interface UpdatesNotificationProps {
|
|
|
21
21
|
badgeCount?: number;
|
|
22
22
|
onOpen?: () => void;
|
|
23
23
|
onViewAll?: () => void;
|
|
24
|
+
/**
|
|
25
|
+
* Rota interna (relativa ao router do app, sem base path) do portal de
|
|
26
|
+
* atualizações. Quando informada, navega internamente em vez de abrir o app
|
|
27
|
+
* Common V5. Default: abre `{commonV5AppUrl}{alias}/up/view` em nova aba.
|
|
28
|
+
*/
|
|
29
|
+
viewAllPath?: string;
|
|
24
30
|
}
|
|
25
31
|
/**
|
|
26
32
|
* Botão de notificações do header (ícone de café ☕). Possui dois modos:
|
|
27
33
|
*
|
|
28
34
|
* - **Automático** (sem props): busca atualizações via `useUpdatesNotification`,
|
|
29
|
-
* marca como visualizado ao abrir e
|
|
35
|
+
* marca como visualizado ao abrir e navega para a rota de atualizações do app.
|
|
30
36
|
* - **Controlado**: passe `updates` + `badgeCount` + `onOpen` + `onViewAll`.
|
|
31
37
|
*
|
|
32
38
|
* @example Automático (recomendado dentro do AppHeader)
|
|
@@ -51,6 +51,12 @@ export interface EnvironmentConfig {
|
|
|
51
51
|
* ao V4 as unidades SEM a flag `has_common_v5` ao trocar de unidade.
|
|
52
52
|
*/
|
|
53
53
|
commonV4AppUrl: string;
|
|
54
|
+
/**
|
|
55
|
+
* URL do app V5 (React) do módulo common, COM barra final
|
|
56
|
+
* (ex.: `https://apps5.qualiex.com/common/`). Único app que hospeda a página
|
|
57
|
+
* de atualizações (`{alias}/up/view`).
|
|
58
|
+
*/
|
|
59
|
+
commonV5AppUrl: string;
|
|
54
60
|
}
|
|
55
61
|
/**
|
|
56
62
|
* Override parcial injetado em runtime pelo app consumidor (ex.: a partir de um
|
package/dist/config/index.d.ts
CHANGED
|
@@ -56,6 +56,11 @@ export declare const getLoginApiUrlOverride: () => string;
|
|
|
56
56
|
* de unidades SEM a flag `has_common_v5` ao trocar de unidade no V5.
|
|
57
57
|
*/
|
|
58
58
|
export declare const getCommonV4AppUrl: () => string;
|
|
59
|
+
/**
|
|
60
|
+
* URL do app V5 (React) do módulo common, COM barra final. Único app que hospeda
|
|
61
|
+
* a página de atualizações (`{alias}/up/view`).
|
|
62
|
+
*/
|
|
63
|
+
export declare const getCommonV5AppUrl: () => string;
|
|
59
64
|
export declare const QUERY_KEYS: {
|
|
60
65
|
readonly crud: (entity: string) => readonly [string];
|
|
61
66
|
readonly list: (entity: string, filters?: Record<string, any>) => readonly [string, "list", Record<string, any>];
|