forlogic-core 2.3.0 → 2.3.1

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.
Files changed (35) hide show
  1. package/.note/memory/patterns/dynamic-supabase-config.md +2 -2
  2. package/.note/memory/patterns/environment-detection-logic.md +21 -15
  3. package/README.md +1 -1
  4. package/dist/action-plans/config/environments.d.ts +18 -3
  5. package/dist/action-plans/config/index.d.ts +3 -3
  6. package/dist/action-plans/index.d.ts +1 -1
  7. package/dist/audit-trail/config/environments.d.ts +18 -3
  8. package/dist/audit-trail/config/index.d.ts +3 -3
  9. package/dist/audit-trail/index.d.ts +1 -1
  10. package/dist/config/environments.d.ts +18 -3
  11. package/dist/config/index.d.ts +3 -3
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.esm.js +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/leadership/config/environments.d.ts +18 -3
  16. package/dist/leadership/config/index.d.ts +3 -3
  17. package/dist/leadership/index.d.ts +1 -1
  18. package/dist/leadership/index.esm.js +1 -1
  19. package/dist/leadership/index.js +1 -1
  20. package/dist/places/config/environments.d.ts +18 -3
  21. package/dist/places/config/index.d.ts +3 -3
  22. package/dist/places/index.d.ts +1 -1
  23. package/dist/places/index.esm.js +1 -1
  24. package/dist/places/index.js +1 -1
  25. package/dist/sign/config/environments.d.ts +18 -3
  26. package/dist/sign/config/index.d.ts +3 -3
  27. package/dist/sign/index.d.ts +1 -1
  28. package/dist/sign/index.esm.js +1 -1
  29. package/dist/sign/index.js +1 -1
  30. package/dist/vite/index.esm.js +24 -1
  31. package/dist/vite/index.js +24 -0
  32. package/docs/WORKSPACE_KNOWLEDGE.md +1 -1
  33. package/docs/design-system/patterns/core-providers.md +11 -2
  34. package/docs/design-system/patterns/feature-flags.md +53 -21
  35. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
1
  # Memory: patterns/dynamic-supabase-config
2
- Updated: 2026-03-24
2
+ Updated: 2026-05-25
3
3
 
4
- As credenciais do Supabase vêm exclusivamente do `.env` (auto-populado pelo Lovable ao trocar banco). O Vite injeta automaticamente variáveis `VITE_*` em `import.meta.env` não bloco `define` manual nem extração de `client.ts`. O `vite.config.ts` usa `loadEnv()` apenas para ler o project ID no contexto Node (CSP headers). O `SupabaseSingleton` `import.meta.env.VITE_SUPABASE_URL` e `VITE_SUPABASE_PUBLISHABLE_KEY` em runtime no browser.
4
+ O `vite.config.ts` chama `resolveSupabaseEnv(mode)` (de `forlogic-core/vite`), que lê tanto `VITE_SUPABASE_*` quanto `SUPABASE_*` (formato novo Lovable Cloud), prioriza `VITE_*` e injeta valores consolidados via `define`: `import.meta.env.VITE_SUPABASE_URL`, `VITE_SUPABASE_PUBLISHABLE_KEY`, `VITE_SUPABASE_PROJECT_ID`, `VITE_SUPABASE_PK_OVERRIDE`. O `.env` precisa apenas de UMA versão (`SUPABASE_URL` + `SUPABASE_PUBLISHABLE_KEY`). `VITE_SUPABASE_PK_OVERRIDE` continua obrigatório por causa do bug do Lovable sobrescrever a publishable key com a legacy JWT. `projectId` é derivado da URL quando ausente.
@@ -1,35 +1,41 @@
1
1
  # Memory: patterns/environment-detection-logic
2
- Updated: 2026-03-24
2
+ Updated: 2026-05-25
3
3
 
4
4
  O sistema separa duas preocupações independentes de ambiente:
5
5
 
6
6
  ## 1. Método de autenticação (`shouldUseDevTokens()` / `isLovablePreview()`)
7
7
  Detecta se o app roda em contexto de desenvolvimento (preview Lovable via iframe, `*.lovable.dev`, localhost ou `import.meta.env.DEV`). Quando true, usa a edge function `dev-tokens` do Supabase conectado para autenticar. Quando false (app publicado), usa OAuth padrão do Qualiex.
8
8
 
9
- ## 2. Qual API usar (`getEnvironmentConfig()` / `isDevSupabaseProject()`)
10
- Compara o project ID do Supabase conectado com `PROD_PROJECT_ID` (`ccjfvpnndclajkleyqkc`). Se igual → config PROD (API prod, OAuth prod). Se diferente → config DEV (API dev, OAuth dev).
9
+ ## 2. Qual API usar (`getEnvironmentConfig()` / `isDevEnv()`)
10
+ Fonte de verdade **única e explícita**: env var `VITE_APP_ENV`.
11
11
 
12
- ## Fonte de verdade do Project ID
13
- O project ID vem do `.env` (auto-populado pelo Lovable ao trocar banco), que o Vite injeta automaticamente em `import.meta.env.VITE_SUPABASE_PROJECT_ID`. **Não** é extraído de `src/integrations/supabase/client.ts`. O `vite.config.ts` usa `loadEnv()` apenas no contexto Node para configurar CSP headers.
12
+ | `VITE_APP_ENV` | Resultado |
13
+ |---------------------------------|-----------------------|
14
+ | `"PROD"` | PROD (API/OAuth prod) |
15
+ | `"DEV"` | DEV (API/OAuth dev) |
16
+ | ausente / qualquer outro valor | **PROD (failsafe)** |
17
+
18
+ Não há fallback derivado do Supabase. Apps que querem apontar para dev precisam declarar `VITE_APP_ENV="DEV"` no `.env`. Apps prod simplesmente omitem (ou setam `"PROD"`).
14
19
 
15
20
  ## Tabela de regras
16
21
 
17
- | Cenário | API | Auth |
18
- |------------------------------|------|------------|
19
- | Preview + Prod Supabase | Prod | dev-tokens |
20
- | Preview + Dev Supabase | Dev | dev-tokens |
21
- | Publicado + Prod Supabase | Prod | OAuth |
22
- | Publicado + Dev Supabase | Dev | OAuth |
22
+ | Cenário | API | Auth |
23
+ |---------------------------------|------|------------|
24
+ | Preview + `VITE_APP_ENV=PROD` | Prod | dev-tokens |
25
+ | Preview + `VITE_APP_ENV=DEV` | Dev | dev-tokens |
26
+ | Publicado + `VITE_APP_ENV=PROD` | Prod | OAuth |
27
+ | Publicado + `VITE_APP_ENV=DEV` | Dev | OAuth |
23
28
 
24
29
  ## Guard de troca de projeto (`TokenManager.checkProjectMismatch()`)
25
- Ao inicializar (`AuthService.initialize()`), o sistema compara `import.meta.env.VITE_SUPABASE_PROJECT_ID` com o valor armazenado em `localStorage('supabase_project_id')`. Se diferente, limpa todos os tokens stale automaticamente antes de qualquer chamada a `validate-token`, evitando 401 desnecessários. Após a limpeza, armazena o novo project ID. Isso garante transição limpa ao trocar de banco Supabase sem erros ou blank screen.
30
+ Independente de `VITE_APP_ENV`. Ao inicializar (`AuthService.initialize()`), compara `import.meta.env.VITE_SUPABASE_PROJECT_ID` (consolidado por `resolveSupabaseEnv()` no `vite.config.ts`) com o valor armazenado em `localStorage('supabase_project_id')`. Se diferente, limpa tokens stale antes de qualquer chamada a `validate-token`. Sem efeito em apps `backend="dotnet"`.
26
31
 
27
32
  ## Funções (lib/config/index.ts)
28
33
  - `isLovablePreview()` — detecta contexto de preview/localhost
29
- - `shouldUseDevTokens()` — wrapper semântico sobre `isLovablePreview()`
34
+ - `shouldUseDevTokens()` — wrapper semântico sobre `isLovablePreview()` (apenas modo Supabase)
30
35
  - `isDevEnvironment` — alias deprecated, mantido para compatibilidade
31
- - `getEnvironmentConfig()` — retorna config PROD ou DEV baseado no project ID
32
- - `isDevSupabaseProject()` — true se project ID PROD_PROJECT_ID
36
+ - `getAppEnv()` — retorna `'PROD' | 'DEV'` lendo `VITE_APP_ENV` (default `'PROD'`)
37
+ - `getEnvironmentConfig()` — retorna config PROD ou DEV baseado em `getAppEnv()`
38
+ - `isDevEnv()` — true se `getAppEnv() === 'DEV'`
33
39
 
34
40
  ## Funções (lib/auth/services/TokenManager.ts)
35
41
  - `checkProjectMismatch()` — detecta troca de projeto Supabase e limpa tokens stale
package/README.md CHANGED
@@ -49,7 +49,7 @@ function App() {
49
49
 
50
50
  A partir da versão com `CoreProviders backend="..."`, o Supabase deixou de ser obrigatório:
51
51
 
52
- - `backend="supabase"` (default, retrocompat) — exige `VITE_SUPABASE_URL` + `VITE_SUPABASE_PUBLISHABLE_KEY`.
52
+ - `backend="supabase"` (default, retrocompat) — exige `SUPABASE_URL` + `SUPABASE_PUBLISHABLE_KEY` (ou `VITE_SUPABASE_*` legadas; o `vite.config.ts` consolida ambos).
53
53
  - `backend="dotnet"` — autentica apenas com tokens OAuth do Qualiex; **não** lê envs do Supabase.
54
54
 
55
55
  **Breaking change:** os módulos `sign`, `audit-trail`, `action-plans`, `leadership` e `places` foram **removidos do barrel principal** e só podem ser importados via subpath (ex.: `import { DocumentSigner } from 'forlogic-core/sign'`). Eles continuam exigindo Supabase em runtime mesmo quando o app usa `backend="dotnet"`.
@@ -1,12 +1,27 @@
1
- declare const PROD_PROJECT_ID = "ccjfvpnndclajkleyqkc";
1
+ /**
2
+ * Detecção de ambiente prod/dev.
3
+ *
4
+ * Fonte de verdade ÚNICA: `VITE_APP_ENV` (`"PROD"` | `"DEV"`).
5
+ * - `"DEV"` → API/OAuth/Supabase de dev.
6
+ * - `"PROD"` ou ausente / qualquer outro valor → PROD (failsafe).
7
+ *
8
+ * Não há fallback baseado em env vars Supabase: apps sem Supabase precisam
9
+ * configurar `VITE_APP_ENV="DEV"` explicitamente quando quiserem apontar para dev.
10
+ *
11
+ * **Storage de assets (logos/favicon) é sempre prod** — bucket público fixo.
12
+ */
13
+ export type AppEnv = 'PROD' | 'DEV';
2
14
  export interface EnvironmentConfig {
3
15
  storageProjectId: string;
16
+ supabaseProjectId: string;
17
+ supabaseUrl: string;
18
+ supabasePublishableKey: string;
4
19
  oauth: {
5
20
  authUrl: string;
6
21
  clientId: string;
7
22
  };
8
23
  qualiexApiUrl: string;
9
24
  }
25
+ export declare function getAppEnv(): AppEnv;
10
26
  export declare function getEnvironmentConfig(): EnvironmentConfig;
11
- export declare function isDevSupabaseProject(): boolean;
12
- export { PROD_PROJECT_ID };
27
+ export declare function isDevEnv(): boolean;
@@ -22,13 +22,13 @@ export declare const SEARCH_CONFIG: {
22
22
  export declare const isLovablePreview: () => boolean;
23
23
  /**
24
24
  * Determines auth method: true → use dev-tokens edge function, false → use OAuth.
25
- * This is independent of which API environment (prod/dev) is used that's decided
26
- * by getEnvironmentConfig() based on the Supabase project ID.
25
+ * Requer modo Supabase: em modo dotnet, dev-tokens não existe e devemos sempre
26
+ * cair no OAuth real (loginProd), mesmo em localhost/preview.
27
27
  */
28
28
  export declare const shouldUseDevTokens: () => boolean;
29
29
  /** @deprecated Use `isLovablePreview()` or `shouldUseDevTokens()` instead */
30
30
  export declare const isDevEnvironment: () => boolean;
31
- export { isDevSupabaseProject } from './environments';
31
+ export { isDevEnv, getAppEnv, type AppEnv } from './environments';
32
32
  export declare const getQualiexApiUrl: () => string;
33
33
  export declare const QUERY_KEYS: {
34
34
  readonly crud: (entity: string) => readonly [string];
@@ -90,7 +90,7 @@ export { loadForlogicFonts } from './utils/load-fonts';
90
90
  export * from './types';
91
91
  export * from './types/sidebar';
92
92
  export * from './config';
93
- export { getEnvironmentConfig, PROD_PROJECT_ID, isDevSupabaseProject } from './config/environments';
93
+ export { getEnvironmentConfig, isDevEnv, getAppEnv, type AppEnv } from './config/environments';
94
94
  export type { EnvironmentConfig } from './config/environments';
95
95
  export { setBackendMode, getBackendMode, isSupabaseBackend } from './config/backend';
96
96
  export type { BackendMode } from './config/backend';
@@ -1,12 +1,27 @@
1
- declare const PROD_PROJECT_ID = "ccjfvpnndclajkleyqkc";
1
+ /**
2
+ * Detecção de ambiente prod/dev.
3
+ *
4
+ * Fonte de verdade ÚNICA: `VITE_APP_ENV` (`"PROD"` | `"DEV"`).
5
+ * - `"DEV"` → API/OAuth/Supabase de dev.
6
+ * - `"PROD"` ou ausente / qualquer outro valor → PROD (failsafe).
7
+ *
8
+ * Não há fallback baseado em env vars Supabase: apps sem Supabase precisam
9
+ * configurar `VITE_APP_ENV="DEV"` explicitamente quando quiserem apontar para dev.
10
+ *
11
+ * **Storage de assets (logos/favicon) é sempre prod** — bucket público fixo.
12
+ */
13
+ export type AppEnv = 'PROD' | 'DEV';
2
14
  export interface EnvironmentConfig {
3
15
  storageProjectId: string;
16
+ supabaseProjectId: string;
17
+ supabaseUrl: string;
18
+ supabasePublishableKey: string;
4
19
  oauth: {
5
20
  authUrl: string;
6
21
  clientId: string;
7
22
  };
8
23
  qualiexApiUrl: string;
9
24
  }
25
+ export declare function getAppEnv(): AppEnv;
10
26
  export declare function getEnvironmentConfig(): EnvironmentConfig;
11
- export declare function isDevSupabaseProject(): boolean;
12
- export { PROD_PROJECT_ID };
27
+ export declare function isDevEnv(): boolean;
@@ -22,13 +22,13 @@ export declare const SEARCH_CONFIG: {
22
22
  export declare const isLovablePreview: () => boolean;
23
23
  /**
24
24
  * Determines auth method: true → use dev-tokens edge function, false → use OAuth.
25
- * This is independent of which API environment (prod/dev) is used that's decided
26
- * by getEnvironmentConfig() based on the Supabase project ID.
25
+ * Requer modo Supabase: em modo dotnet, dev-tokens não existe e devemos sempre
26
+ * cair no OAuth real (loginProd), mesmo em localhost/preview.
27
27
  */
28
28
  export declare const shouldUseDevTokens: () => boolean;
29
29
  /** @deprecated Use `isLovablePreview()` or `shouldUseDevTokens()` instead */
30
30
  export declare const isDevEnvironment: () => boolean;
31
- export { isDevSupabaseProject } from './environments';
31
+ export { isDevEnv, getAppEnv, type AppEnv } from './environments';
32
32
  export declare const getQualiexApiUrl: () => string;
33
33
  export declare const QUERY_KEYS: {
34
34
  readonly crud: (entity: string) => readonly [string];
@@ -90,7 +90,7 @@ export { loadForlogicFonts } from './utils/load-fonts';
90
90
  export * from './types';
91
91
  export * from './types/sidebar';
92
92
  export * from './config';
93
- export { getEnvironmentConfig, PROD_PROJECT_ID, isDevSupabaseProject } from './config/environments';
93
+ export { getEnvironmentConfig, isDevEnv, getAppEnv, type AppEnv } from './config/environments';
94
94
  export type { EnvironmentConfig } from './config/environments';
95
95
  export { setBackendMode, getBackendMode, isSupabaseBackend } from './config/backend';
96
96
  export type { BackendMode } from './config/backend';
@@ -1,12 +1,27 @@
1
- declare const PROD_PROJECT_ID = "ccjfvpnndclajkleyqkc";
1
+ /**
2
+ * Detecção de ambiente prod/dev.
3
+ *
4
+ * Fonte de verdade ÚNICA: `VITE_APP_ENV` (`"PROD"` | `"DEV"`).
5
+ * - `"DEV"` → API/OAuth/Supabase de dev.
6
+ * - `"PROD"` ou ausente / qualquer outro valor → PROD (failsafe).
7
+ *
8
+ * Não há fallback baseado em env vars Supabase: apps sem Supabase precisam
9
+ * configurar `VITE_APP_ENV="DEV"` explicitamente quando quiserem apontar para dev.
10
+ *
11
+ * **Storage de assets (logos/favicon) é sempre prod** — bucket público fixo.
12
+ */
13
+ export type AppEnv = 'PROD' | 'DEV';
2
14
  export interface EnvironmentConfig {
3
15
  storageProjectId: string;
16
+ supabaseProjectId: string;
17
+ supabaseUrl: string;
18
+ supabasePublishableKey: string;
4
19
  oauth: {
5
20
  authUrl: string;
6
21
  clientId: string;
7
22
  };
8
23
  qualiexApiUrl: string;
9
24
  }
25
+ export declare function getAppEnv(): AppEnv;
10
26
  export declare function getEnvironmentConfig(): EnvironmentConfig;
11
- export declare function isDevSupabaseProject(): boolean;
12
- export { PROD_PROJECT_ID };
27
+ export declare function isDevEnv(): boolean;
@@ -22,13 +22,13 @@ export declare const SEARCH_CONFIG: {
22
22
  export declare const isLovablePreview: () => boolean;
23
23
  /**
24
24
  * Determines auth method: true → use dev-tokens edge function, false → use OAuth.
25
- * This is independent of which API environment (prod/dev) is used that's decided
26
- * by getEnvironmentConfig() based on the Supabase project ID.
25
+ * Requer modo Supabase: em modo dotnet, dev-tokens não existe e devemos sempre
26
+ * cair no OAuth real (loginProd), mesmo em localhost/preview.
27
27
  */
28
28
  export declare const shouldUseDevTokens: () => boolean;
29
29
  /** @deprecated Use `isLovablePreview()` or `shouldUseDevTokens()` instead */
30
30
  export declare const isDevEnvironment: () => boolean;
31
- export { isDevSupabaseProject } from './environments';
31
+ export { isDevEnv, getAppEnv, type AppEnv } from './environments';
32
32
  export declare const getQualiexApiUrl: () => string;
33
33
  export declare const QUERY_KEYS: {
34
34
  readonly crud: (entity: string) => readonly [string];
package/dist/index.d.ts CHANGED
@@ -90,7 +90,7 @@ export { loadForlogicFonts } from './utils/load-fonts';
90
90
  export * from './types';
91
91
  export * from './types/sidebar';
92
92
  export * from './config';
93
- export { getEnvironmentConfig, PROD_PROJECT_ID, isDevSupabaseProject } from './config/environments';
93
+ export { getEnvironmentConfig, isDevEnv, getAppEnv, type AppEnv } from './config/environments';
94
94
  export type { EnvironmentConfig } from './config/environments';
95
95
  export { setBackendMode, getBackendMode, isSupabaseBackend } from './config/backend';
96
96
  export type { BackendMode } from './config/backend';