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.
@@ -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 abre o portal Qualiex no "Ver todas".
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
@@ -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>];