forlogic-core 1.16.8 → 1.16.10

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 (36) hide show
  1. package/.note/memory/architecture/documentation-strategy.md +59 -0
  2. package/.note/memory/patterns/core-providers-setup.md +39 -0
  3. package/.note/memory/patterns/deprecated-patterns.md +14 -0
  4. package/.note/memory/patterns/feature-flags.md +19 -0
  5. package/.note/memory/patterns/header-metadata-pattern.md +62 -0
  6. package/.note/memory/patterns/i18n-setup.md +43 -0
  7. package/.note/memory/patterns/vite-tailwind-setup.md +49 -0
  8. package/.note/memory/rules/doc-sync-rule.md +32 -0
  9. package/.note/memory/rules/i18n-import-rule.md +29 -0
  10. package/.note/memory/rules/lib-first-rule.md +42 -0
  11. package/.note/memory/rules/no-auto-index-rule.md +37 -9
  12. package/.note/memory/rules/no-delete-policy-rule.md +41 -12
  13. package/.note/memory/rules/rls-syntax-rule.md +50 -0
  14. package/.note/memory/rules/sql-naming-rule.md +23 -0
  15. package/.note/memory/rules/supabase-import-rule.md +31 -0
  16. package/.note/memory/rules/supabase-schema-rule.md +5 -4
  17. package/.note/memory/ui/components/combo-tree.md +9 -1
  18. package/.note/memory/ui/design-system/documentation-standard.md +17 -0
  19. package/README.md +78 -212
  20. package/dist/README.md +78 -212
  21. package/dist/bin/bootstrap.js +40 -0
  22. package/dist/bin/pull-docs.js +14 -22
  23. package/dist/components/ui/combo-tree.d.ts +2 -0
  24. package/dist/contexts/PageMetadataContext.d.ts +6 -1
  25. package/dist/docs/KNOWLEDGE.md +68 -167
  26. package/dist/i18n/config.d.ts +11 -0
  27. package/dist/i18n/index.d.ts +1 -1
  28. package/dist/index.css +1 -1
  29. package/dist/index.css.map +1 -1
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.esm.js +1 -1
  32. package/dist/index.js +1 -1
  33. package/dist/providers/CoreProviders.d.ts +31 -34
  34. package/docs/KNOWLEDGE.md +68 -167
  35. package/package.json +3 -4
  36. package/docs/DESIGN_SYSTEM.md +0 -12186
@@ -1,6 +1,18 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { QueryClient } from '@tanstack/react-query';
3
3
  import { ModuleAccessGuardProps } from '../components/modules';
4
+ /**
5
+ * Mapa de traduções por idioma para o namespace 'app' do projeto consumidor.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const appTranslations = {
10
+ * 'pt-BR': { greeting: 'Olá' },
11
+ * 'en-US': { greeting: 'Hello' },
12
+ * };
13
+ * ```
14
+ */
15
+ export type AppTranslationsMap = Record<string, Record<string, string>>;
4
16
  /**
5
17
  * Props for CoreProviders component
6
18
  */
@@ -29,54 +41,39 @@ export interface CoreProvidersProps {
29
41
  * Permite configurar módulos contratados, callbacks e URLs.
30
42
  */
31
43
  moduleAccessGuardProps?: Omit<ModuleAccessGuardProps, 'children'>;
44
+ /**
45
+ * Traduções do projeto consumidor, organizadas por idioma.
46
+ * Injetadas no namespace 'app' do i18next, sobrepondo o namespace 'core' da lib.
47
+ *
48
+ * @example
49
+ * ```tsx
50
+ * <CoreProviders appTranslations={{
51
+ * 'pt-BR': { my_key: 'Meu valor' },
52
+ * 'en-US': { my_key: 'My value' },
53
+ * }}>
54
+ * ```
55
+ */
56
+ appTranslations?: AppTranslationsMap;
32
57
  }
33
58
  /**
34
59
  * CoreProviders - Encapsulates all essential providers for forlogic-core applications
35
60
  *
36
- * This component wraps your application with all necessary providers:
37
- * - ErrorBoundary (error handling)
38
- * - I18nextProvider (internationalization)
39
- * - QueryClientProvider (data fetching)
40
- * - AuthProvider (authentication)
41
- * - LocaleProvider (locale management)
42
- * - ModuleProvider (module access configuration)
43
- *
44
61
  * @example
45
62
  * ```tsx
46
63
  * import { CoreProviders } from 'forlogic-core';
47
- * import { BrowserRouter } from 'react-router-dom';
48
64
  *
49
65
  * function App() {
50
66
  * return (
51
- * <CoreProviders moduleAlias="performance">
67
+ * <CoreProviders
68
+ * moduleAlias="performance"
69
+ * appTranslations={{ 'pt-BR': { greeting: 'Olá' } }}
70
+ * >
52
71
  * <BrowserRouter>
53
- * <Routes>
54
- * {/* Your routes here *\/}
55
- * </Routes>
72
+ * <Routes />
56
73
  * </BrowserRouter>
57
74
  * </CoreProviders>
58
75
  * );
59
76
  * }
60
77
  * ```
61
- *
62
- * @example With custom QueryClient
63
- * ```tsx
64
- * import { CoreProviders } from 'forlogic-core';
65
- * import { QueryClient } from '@tanstack/react-query';
66
- *
67
- * const queryClient = new QueryClient({
68
- * defaultOptions: {
69
- * queries: { staleTime: 10 * 60 * 1000 },
70
- * },
71
- * });
72
- *
73
- * function App() {
74
- * return (
75
- * <CoreProviders queryClient={queryClient} moduleAlias="suppliers">
76
- * {/* Your app *\/}
77
- * </CoreProviders>
78
- * );
79
- * }
80
- * ```
81
78
  */
82
- export declare function CoreProviders({ children, queryClient, moduleAlias, moduleAccessGuardProps }: CoreProvidersProps): import("react/jsx-runtime").JSX.Element;
79
+ export declare function CoreProviders({ children, queryClient, moduleAlias, moduleAccessGuardProps, appTranslations }: CoreProvidersProps): import("react/jsx-runtime").JSX.Element;
package/docs/KNOWLEDGE.md CHANGED
@@ -1,206 +1,107 @@
1
1
  # KNOWLEDGE — Regras Críticas do Projeto
2
2
 
3
- > 📖 **Fonte oficial completa**: `README.md` | 🎨 **Design System**: `docs/DESIGN_SYSTEM.md`
4
- > 🤖 **Para IA**: Consulte `.note/memory/` para padrões de componentes e layout
3
+ > 🤖 **Para IA**: Detalhes de componentes, props e tipos → ler do projeto **Admin** via cross-project.
4
+ > Consulte `.note/memory/` para padrões de layout e componentes.
5
5
 
6
6
  ---
7
7
 
8
- ## 0. Variável de Schema
8
+ ## 0. Schema do Projeto
9
9
 
10
- > ⚠️ **SCHEMA_PADRAO = `common`**
11
- >
12
- > Todos os exemplos abaixo usam `SCHEMA_PADRAO`. Em cada projeto, substitua pelo schema correto.
13
- > **Neste projeto o schema é `common`.**
10
+ **SCHEMA = `common`**
14
11
 
15
- ---
16
-
17
- ## 1. Schema Padrão
18
-
19
- Toda query Supabase **DEVE** usar `.schema('SCHEMA_PADRAO')`. O projeto **NÃO** usa o schema `public`.
12
+ ☝️ Este é o **único local** onde o schema é definido. Toda query Supabase
13
+ **DEVE** usar `.schema('<valor acima>')`. Altere **apenas aqui** ao configurar
14
+ um novo projeto.
20
15
 
21
16
  ```ts
22
- // ✅ CORRETO
23
- const { data } = await supabase.schema('SCHEMA_PADRAO').from('tabela').select('*');
24
-
25
- // ❌ ERRADO (vai falhar em produção)
26
- const { data } = await supabase.from('tabela').select('*');
17
+ // ✅ usar o schema definido acima
18
+ supabase.schema('common').from('tabela').select('*');
19
+ // ❌ vai falhar (sem schema)
20
+ supabase.from('tabela').select('*');
27
21
  ```
28
22
 
29
23
  ---
30
24
 
31
- ## 2. RLS Policies
32
-
33
- ### Regras obrigatórias
34
- - **NUNCA** criar policy `FOR DELETE` — usar soft delete (`deleted_at` + policy `FOR UPDATE`)
35
- - **SEMPRE** usar `(SELECT auth.uid())` ou `(SELECT auth.jwt())` com parênteses — evita re-execução por linha
36
- - Sintaxe: `SELECT` → `USING` | `INSERT` → `WITH CHECK` | `UPDATE` → `USING` + `WITH CHECK`
37
-
38
- ### Padrão JWT alias (multi-tenancy por alias)
39
-
40
- ```sql
41
- -- SELECT
42
- CREATE POLICY "table_select" ON SCHEMA_PADRAO.tabela
43
- FOR SELECT USING (
44
- ((SELECT auth.jwt()) ->> 'alias'::text) = alias
45
- );
46
-
47
- -- INSERT
48
- CREATE POLICY "table_insert" ON SCHEMA_PADRAO.tabela
49
- FOR INSERT WITH CHECK (
50
- ((SELECT auth.jwt()) ->> 'alias'::text) = alias
51
- );
52
-
53
- -- UPDATE
54
- CREATE POLICY "table_update" ON SCHEMA_PADRAO.tabela
55
- FOR UPDATE
56
- USING (((SELECT auth.jwt()) ->> 'alias'::text) = alias)
57
- WITH CHECK (((SELECT auth.jwt()) ->> 'alias'::text) = alias);
58
- ```
59
-
60
- ### Alternativa: auth.uid() (quando tabela tem `id_user`)
61
-
62
- ```sql
63
- CREATE POLICY "table_select" ON SCHEMA_PADRAO.tabela
64
- FOR SELECT USING (auth.uid() = id_user);
65
-
66
- CREATE POLICY "table_insert" ON SCHEMA_PADRAO.tabela
67
- FOR INSERT WITH CHECK (auth.uid() = id_user);
68
-
69
- CREATE POLICY "table_update" ON SCHEMA_PADRAO.tabela
70
- FOR UPDATE
71
- USING (auth.uid() = id_user)
72
- WITH CHECK (auth.uid() = id_user);
73
- ```
74
-
75
- ### Padrão company_id (multi-tenancy por empresa)
25
+ ## 1. Regras Invioláveis
76
26
 
77
- ```sql
78
- CREATE POLICY "table_select" ON SCHEMA_PADRAO.tabela
79
- FOR SELECT TO authenticated
80
- USING (
81
- company_id = (
82
- SELECT (auth.jwt() -> 'user_metadata' ->> 'company_id')::uuid
83
- )
84
- );
85
- ```
86
-
87
- ### ❌ Erros comuns de RLS
88
-
89
- ```sql
90
- -- ❌ WITH CHECK em SELECT (deve ser USING)
91
- CREATE POLICY "x" ON SCHEMA_PADRAO.t FOR SELECT WITH CHECK (...);
92
-
93
- -- ❌ USING em INSERT (deve ser WITH CHECK)
94
- CREATE POLICY "x" ON SCHEMA_PADRAO.t FOR INSERT USING (...);
95
-
96
- -- ❌ Parênteses extra no JWT
97
- CREATE POLICY "x" ON SCHEMA_PADRAO.t FOR SELECT USING (
98
- ((SELECT (auth.jwt()) ->> 'alias'::text)) = alias
99
- );
100
-
101
- -- ❌ Política DELETE (usar soft delete)
102
- CREATE POLICY "x" ON SCHEMA_PADRAO.t FOR DELETE USING (...);
103
- ```
104
-
105
- ### Soft delete (padrão obrigatório)
106
-
107
- ```sql
108
- ALTER TABLE SCHEMA_PADRAO.tabela ADD COLUMN deleted_at TIMESTAMP WITH TIME ZONE;
109
-
110
- -- Filtrar registros ativos
111
- CREATE POLICY "table_select" ON SCHEMA_PADRAO.tabela
112
- FOR SELECT USING (
113
- deleted_at IS NULL
114
- AND ((SELECT auth.jwt()) ->> 'alias'::text) = alias
115
- );
116
- ```
27
+ | Regra | Detalhe |
28
+ |-------|---------|
29
+ | Schema obrigatório | `.schema()` com o schema do projeto (seção 0) em toda query |
30
+ | Sem DELETE físico | Soft delete com `deleted_at` + policy `FOR UPDATE` |
31
+ | Sem índices automáticos | Apenas com aprovação explícita |
32
+ | Sem modificar `.env` | Apenas com autorização do usuário |
33
+ | Sem hardcoded admin | Nunca localStorage/sessionStorage para roles |
34
+ | Lib-first | Usar `forlogic-core` antes de criar componente |
35
+ | Import do Supabase | Sempre `getSupabaseClient()` de `forlogic-core`, nunca `@/integrations/supabase/client` |
117
36
 
118
- ### Tabela de roles (quando necessário)
37
+ ---
119
38
 
120
- Usar função `SECURITY DEFINER` para checar roles e evitar recursão RLS:
39
+ ## 2. RLS Resumo de Sintaxe
121
40
 
122
- ```sql
123
- CREATE FUNCTION public.has_role(_user_id uuid, _role app_role)
124
- RETURNS boolean LANGUAGE sql STABLE SECURITY DEFINER
125
- SET search_path = public AS $$
126
- SELECT EXISTS (SELECT 1 FROM public.user_roles WHERE user_id = _user_id AND role = _role)
127
- $$;
128
- ```
41
+ - `SELECT` → `USING` | `INSERT` → `WITH CHECK` | `UPDATE` → `USING` + `WITH CHECK`
42
+ - **Nunca** `FOR DELETE`
43
+ - **Sempre** `(SELECT auth.jwt())` com parênteses (evita re-execução por linha)
44
+ - Padrão multi-tenant: `((SELECT auth.jwt()) ->> 'alias'::text) = alias`
129
45
 
130
46
  ---
131
47
 
132
- ## 3. Convenções de Nomenclatura (SQL)
48
+ ## 3. Convenções SQL
133
49
 
134
50
  | Tipo | Padrão | Exemplo |
135
51
  |------|--------|---------|
136
- | FK | `id_<tabela_singular>` | `id_process`, `id_user` |
137
- | Boolean | `is_` ou `has_` | `is_active`, `has_access` |
52
+ | FK | `id_<singular>` | `id_process` |
53
+ | Boolean | `is_` / `has_` | `is_active` |
138
54
  | Timestamps | `created_at`, `updated_at`, `deleted_at` | — |
139
- | Tabelas | plural, snake_case | `processes`, `user_roles` |
55
+ | Tabelas | plural, snake_case | `processes` |
140
56
 
141
57
  ---
142
58
 
143
- ## 4. Proibições
144
-
145
- | Regra | Detalhe |
146
- |-------|---------|
147
- | Índices automáticos | Nunca criar índices em migrations sem aprovação explícita |
148
- | ❌ Modificar `.env` | Nunca sem autorização explícita do usuário |
149
- | Policy DELETE | Usar soft delete com `deleted_at` |
150
- | Duplicar componentes da lib | Sempre usar `forlogic-core` primeiro |
151
- | Hardcoded admin checks | Nunca usar localStorage/sessionStorage para verificar roles |
152
- | Import direto do client auto-gerado | Nunca importar de `@/integrations/supabase/client`. Usar `getSupabaseClient()` de `forlogic-core`. ESLint `no-restricted-imports` bloqueia automaticamente. O arquivo existe apenas como fonte de dados para o `vite.config.ts`. |
59
+ ## 4. Mapa de Módulos (forlogic-core)
60
+
61
+ > Para props, tipos e implementação: ler do projeto **Admin** (forlogic-core) via cross-project.
62
+
63
+ | Módulo | Caminho | O que contém |
64
+ |--------|---------|--------------|
65
+ | **UI Components** | `lib/components/ui/` | Button, Dialog, Input, Select, Combobox, Badge, Tabs, etc. |
66
+ | **Layout** | `lib/components/layout/` | AppLayout, AppHeader, AppSidebar, BodyContent |
67
+ | **CRUD** | `lib/crud/` | createCrudPage, CrudTable, CrudGrid, BaseForm, ActionBar |
68
+ | **CRUD Primitives** | `lib/crud/primitives/` | Table, FilterBar, Pagination, ActionMenu, TreeTable |
69
+ | **Auth** | `lib/auth/` | AuthContext, ProtectedRoute, LoginPage, TokenManager |
70
+ | **Módulos** | `lib/components/modules/` | ModulesDialog, ModuleGrid, ModuleAccessGuard |
71
+ | **Places** | `lib/places/` | PlacesList, PlaceCard, ManageAccessModal |
72
+ | **Leadership** | `lib/leadership/` | LeadershipPage, LeadershipDialog |
73
+ | **Media** | `lib/media/` | ImageEditor, VideoEditor, useMediaUpload |
74
+ | **Sign** | `lib/sign/` | SignWidget, D4SignWidget, SignConfigForm |
75
+ | **Qualiex** | `lib/qualiex/` | QualiexUserField, useQualiexUsers |
76
+ | **i18n** | `lib/i18n/` | Namespaces core/app, JSONs por idioma, addAppTranslations, formatadores |
77
+ | **Config** | `lib/config/` | Environments, CRUD defaults, mensagens |
78
+ | **Services** | `lib/services/` | BaseService, EmailService, ErrorService |
79
+ | **Hooks** | `lib/hooks/` | useDebounce, useWizard, useModuleAccess, useColumnResize |
80
+ | **Providers** | `lib/providers/` | CoreProviders (setup simplificado) |
81
+ | **Vite** | `lib/vite/` | create-config, CSP, security headers |
82
+ | **Tailwind** | `lib/tailwind/` | Preset compartilhado |
153
83
 
154
84
  ---
155
85
 
156
- ## 5. Lib-First (forlogic-core)
157
-
158
- Antes de criar qualquer componente, verificar se já existe em `forlogic-core`:
159
-
160
- - **UI**: Button, Dialog, Input, Select, Combobox, SplitButton, RichTextEditor, ColorPicker, IconPicker, etc.
161
- - **Layout**: AppLayout, AppHeader, AppSidebar, BodyContent
162
- - **CRUD**: createCrudPage, CrudTable, CrudGrid, CrudActionBar, BaseForm
163
- - **Utilitários**: ActionButton, Pagination, FilterBar, EmptyState, LoadingState, StepSelector
164
- - **Módulos**: Sign, Places, Leadership, Media, ModulesDialog
86
+ ## 5. Padrões Deprecated
165
87
 
166
- ```ts
167
- import { Button, Dialog, createCrudPage, cn, formatDatetime } from 'forlogic-core';
168
- ```
169
-
170
- ---
171
-
172
- ## 6. Padrões CRUD
173
-
174
- - **Toolbar**: Layout 3 zonas — Esquerda (Botão Novo + Ações em lote), Centro (Busca), Direita (Filtros + Toggle view)
175
- - **Paginação**: Sempre usar `CrudPrimitivePagination` com `variant="full"`
176
- - **Ações em lote**: Dropdown "Ações em lote" no CrudActionBar (não criar BulkActionBar separado)
177
- - **Ações de linha**: Sempre usar `ActionButton` da lib (nunca botão genérico com ícone MoreHorizontal)
178
-
179
- ---
180
-
181
- ## 7. Componentes/Padrões Deprecated
182
-
183
- | Não usar | Usar em vez disso |
184
- |----------|-------------------|
185
- | `BulkActionBar` separado | Dropdown integrado no `CrudActionBar` |
186
- | Botão genérico `<MoreHorizontal>` | `ActionButton` da lib |
88
+ | ❌ Não usar | ✅ Usar |
89
+ |------------|--------|
90
+ | `BulkActionBar` separado | Dropdown no `CrudActionBar` |
91
+ | `<MoreHorizontal>` genérico | `ActionButton` |
187
92
  | Paginação manual | `CrudPrimitivePagination` |
188
- | `public` schema | `.schema('SCHEMA_PADRAO')` |
189
93
  | `StatusSelect` | `Combobox` |
190
94
  | `DeleteConfirmationDialog` | `Dialog` |
191
95
  | `Searchbar` | `Input` com ícone |
192
96
 
193
97
  ---
194
98
 
195
- ## 8. Fontes Complementares
99
+ ## 6. Fontes de Contexto
196
100
 
197
- | Fonte | Caminho | Conteúdo |
198
- |-------|---------|----------|
199
- | **Memory rules** | `.note/memory/rules/` | Regras de schema, RLS, índices, .env |
200
- | **Memory patterns** | `.note/memory/patterns/` | Layouts CRUD, toolbar, scroll, navegação SPA |
201
- | **Memory components** | `.note/memory/components/` | ActionButton, BaseForm, Dialog, Pagination |
202
- | **README.md** | `README.md` | Documentação completa e genérica da lib |
203
- | **Design System** | Rota `/ds` no app | Documentação visual de todos os componentes |
204
- | **DESIGN_SYSTEM.md** | `docs/DESIGN_SYSTEM.md` | Documentação técnica do Design System |
205
-
206
- > 📌 Ao implementar qualquer funcionalidade, consulte as fontes acima antes de criar código novo.
101
+ | Fonte | Caminho |
102
+ |-------|---------|
103
+ | Memory rules | `.note/memory/rules/` |
104
+ | Memory patterns | `.note/memory/patterns/` |
105
+ | Memory components | `.note/memory/components/` |
106
+ | Código-fonte da lib | Cross-project projeto **Admin** (forlogic-core) |
107
+ | Design System (visual) | Rota `/ds` no app do projeto **Admin** |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forlogic-core",
3
- "version": "1.16.8",
3
+ "version": "1.16.10",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -27,8 +27,7 @@
27
27
  "files": [
28
28
  "dist",
29
29
  "docs",
30
- ".note/memory",
31
- "DESIGN_SYSTEM.md"
30
+ ".note/memory"
32
31
  ],
33
32
  "sideEffects": [
34
33
  "*.css"
@@ -43,7 +42,7 @@
43
42
  "preview": "vite preview"
44
43
  },
45
44
  "bin": {
46
- "lib-update": "dist/bin/pull-docs.js"
45
+ "lib-update": "dist/bin/bootstrap.js"
47
46
  },
48
47
  "dependencies": {
49
48
  "@dnd-kit/core": "^6.3.1",