@oondemand/oon-core-front 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,91 @@
1
+ # LICENÇA DE USO RESTRITO DO CÓDIGO-FONTE OONDEMAND
2
+ **ODR‑NC v1.0 — Non‑Commercial, Internal‑Use Only**
3
+
4
+ Copyright (c) 2025 OonDemand. Todos os direitos reservados.
5
+
6
+ ## 1. Definições
7
+ **“Licenciante”**: OonDemand.
8
+ **“Código”**: todo o conteúdo deste repositório e seus derivados.
9
+ **“Licenciada”** ou **“Usuário Autorizado”**: a pessoa jurídica nominalmente autorizada pela Licenciante (via contrato ou arquivo `AUTORIZACOES.md`).
10
+ **“Uso Interno Não Comercial”**: uso exclusivo dentro da organização da Licenciada, para suas próprias operações internas, sem disponibilização a terceiros e sem geração de receita direta ou indireta a partir do Código, incluindo sem se limitar a: revenda, prestação de serviços a terceiros, franquia, SaaS, consultoria, sublicenciamento, distribuição ou incorporação em produtos/serviços comercializados.
11
+
12
+ ## 2. Concessão Limitada
13
+ Sujeito ao cumprimento integral desta Licença, a Licenciante concede à Licenciada uma licença **não exclusiva, intransferível e revogável** para **acessar, visualizar, modificar, compilar e executar** o Código **exclusivamente para Uso Interno Não Comercial**. Nenhum direito é concedido para **distribuir, publicar, sublicenciar, ceder** ou **oferecer a terceiros** o Código (ou obras derivadas).
14
+
15
+ Qualquer **Uso Comercial** (incluindo oferta como serviço, SaaS, revenda, consultoria, integração para clientes externos ou uso em qualquer outra empresa do mesmo grupo econômico) **exige autorização prévia e expressa da Licenciante, por escrito** e com condições comerciais específicas. Na ausência de tal autorização, o Uso Comercial é **estritamente proibido**.
16
+
17
+ ## 3. Restrições e Obrigações
18
+ A Licenciada se compromete a:
19
+ 1. **Não** remover ou alterar avisos de copyright, marcas, avisos de confidencialidade e desta Licença;
20
+ 2. **Não** publicar ou tornar o Código (ou parte significativa) acessível publicamente (incl. repositórios públicos, fóruns, pacotes);
21
+ 3. **Não** distribuir, vender, revender, licenciar, sublicenciar, alugar, arrendar, franquear, ceder ou transferir o Código a terceiros;
22
+ 4. **Não** utilizar o Código para treinar modelos de IA, realizar engenharia reversa de mecanismos de licenciamento ou produzir obra concorrente direta;
23
+ 5. Adotar controles de acesso (RBAC), registro de auditoria e medidas razoáveis de segurança para impedir uso não autorizado; e
24
+ 6. Garantir que terceiros (funcionários, prestadores) observem as mesmas obrigações de confidencialidade e uso restrito.
25
+
26
+ ## 4. Propriedade Intelectual
27
+ O Código é protegido por leis de propriedade intelectual. **A titularidade integral permanece com a Licenciante**. Exceto pelos direitos limitados concedidos nesta Licença, **nenhum outro direito** (explícito, implícito, por estoppel) é concedido.
28
+
29
+ ## 5. Autorização Expressa para Uso Comercial
30
+ Qualquer permissão de Uso Comercial deverá:
31
+ - Ser **prévia e por escrito**, concedida pela Licenciante;
32
+ - Constar em contrato específico **ou** no arquivo `AUTORIZACOES.md` deste repositório, com **razão social/CNPJ**, **escopo**, **prazo** e **condições comerciais**; e
33
+ - Ser **revogável** por descumprimento.
34
+
35
+ ## 6. Cláusula Penal (Multa) por Uso Indevido
36
+ O uso em desacordo com esta Licença (incluindo Uso Comercial sem autorização) sujeitará a Licenciada ao pagamento de **cláusula penal não compensatória** no valor de **R$ 600.000,00 (seiscentos mil reais) por infração**, **cumulável** com:
37
+ - **R$ 5.000,00 (cinco mil reais) por dia** enquanto perdurar a infração; e
38
+ - Indenização adicional por **perdas e danos** e **honorários advocatícios**.
39
+ A aplicação desta cláusula penal **não limita** o direito da Licenciante de buscar tutela específica, inclusive **medidas liminares/inibitórias**.
40
+
41
+ ## 7. Confidencialidade
42
+ O Código e a documentação correlata constituem **informação confidencial**. A Licenciada deve preservá-la com o mesmo grau de zelo usado para suas informações confidenciais, nunca inferior ao razoável.
43
+
44
+ ## 8. Ausência de Garantias; Limitação de Responsabilidade
45
+ O Código é fornecido “**no estado em que se encontra**”, sem garantias de qualquer tipo. Na máxima extensão permitida em lei, a Licenciante **não responde** por danos indiretos, lucros cessantes, perda de dados ou danos especiais. A responsabilidade total da Licenciante, por qualquer teoria, **fica limitada ao valor total efetivamente pago** pela Licenciada em favor da Licenciante pelo direito de uso do Código, se houver.
46
+
47
+ ## 9. Vigência, Revogação e Auditoria
48
+ Esta Licença vigora enquanto o Código estiver em posse da Licenciada e poderá ser **revogada** a qualquer tempo em caso de violação. A Licenciante poderá solicitar **evidências razoáveis de conformidade** (ex.: lista de usuários, ambientes de execução) mediante aviso prévio escrito de 5 dias úteis.
49
+
50
+ ## 10. Terceiros e Dependências
51
+ Componentes de terceiros incluídos no repositório permanecem regidos por suas **próprias licenças**. Em caso de conflito, prevalece a licença do respectivo terceiro para tal componente.
52
+
53
+ ## 11. Lei Aplicável e Foro
54
+ Aplica-se a legislação brasileira. Fica eleito o **Foro da Comarca de São Paulo/SP**, com renúncia a qualquer outro, por mais privilegiado que seja.
55
+
56
+ ## 12. Disposições Finais
57
+ Se qualquer cláusula for considerada inválida, as demais permanecem válidas. Qualquer tolerância não implicará renúncia. Esta é a versão **ODR‑NC v1.0**. A Licenciante poderá publicar **atualizações** desta Licença; versões futuras não terão efeito retroativo sem aceite da Licenciada.
58
+
59
+ ---
60
+
61
+ ### Identificação de Autorização (opcional, para uso interno)
62
+ > Este repositório está licenciado para uso interno por: **[RAZÃO SOCIAL]**, **CNPJ [XX.XXX.XXX/0001-XX]**, conforme autorização datada de **[DATA]** e/ou contrato específico. Escopo: **[DESCREVER]**.
63
+
64
+ ### Como cumprir esta Licença
65
+ 1) Mantenha este arquivo `LICENSE.md` na raiz do repositório;
66
+ 2) Liste autorizações de uso comercial, se houver, em `AUTORIZACOES.md`; e
67
+ 3) Inclua o cabeçalho de licença abaixo em **cada arquivo-fonte**.
68
+
69
+ ---
70
+
71
+ ## Cabeçalho de Licença para Arquivos-Fonte
72
+ Copie e adapte o bloco conforme a linguagem:
73
+
74
+ ### Padrão (C/Java/JS/TS)
75
+ /*
76
+ OonDemand — Código-Fonte Proprietário
77
+ Licença ODR‑NC v1.0 — Uso interno não comercial. Proibida revenda/redistribuição/uso comercial sem autorização expressa da OonDemand. Violação sujeita à multa, conforme LICENSE.md.
78
+ (c) 2025 OonDemand. Todos os direitos reservados.
79
+ */
80
+
81
+ ### Python
82
+ """
83
+ OonDemand — Código-Fonte Proprietário
84
+ Licença ODR‑NC v1.0 — Uso interno não comercial. Proibida revenda/redistribuição/uso comercial sem autorização expressa da OonDemand. Violação sujeita à multa, conforme LICENSE.md.
85
+ (c) 2025 OonDemand. Todos os direitos reservados.
86
+ """
87
+
88
+ ### Shell/YAML
89
+ # OonDemand — Código-Fonte Proprietário
90
+ # Licença ODR‑NC v1.0 — Uso interno não comercial. Proibida revenda/redistribuição/uso comercial sem autorização expressa da OonDemand. Violação sujeita à multa, conforme LICENSE.md.
91
+ # (c) 2025 OonDemand. Todos os direitos reservados.
package/README.md ADDED
@@ -0,0 +1,120 @@
1
+ # @oondemand/oon-core-front
2
+
3
+ Core de **frontend** para Centrais Oon. Uma Central de frontend passa a ser
4
+ apenas **declaração**: você escreve um `central.ui.ts` (identidade + views) e
5
+ sobe tudo com `oonCore-front dev`.
6
+
7
+ Todo o resto — bootstrap, providers (React Query + Chakra), roteamento por
8
+ metadata, autenticação, RBAC, layout, menu, SDK REST único do `/core/*`,
9
+ auditoria e os componentes `Core*` (Coleção, Documento, Esteira, Multi-moedas,
10
+ Assistente, Dashboard) — vive aqui dentro.
11
+
12
+ É o par de frontend do [`@oondemand/oon-core-back`](../oonCore-back): o back
13
+ descreve as models em `/core/metadata`; o front monta as telas a partir disso,
14
+ sem código de UI por entidade.
15
+
16
+ ## Instalação
17
+
18
+ ```bash
19
+ npm install @oondemand/oon-core-front
20
+ # peers: react, react-dom, react-router-dom, @tanstack/react-query,
21
+ # @tanstack/react-table, @chakra-ui/react
22
+ ```
23
+
24
+ ## Uso mínimo
25
+
26
+ `central.ui.ts`:
27
+
28
+ ```ts
29
+ import { defineCollectionView, type OonCoreFrontConfig } from "@oondemand/oon-core-front";
30
+
31
+ export const appConfig: OonCoreFrontConfig = {
32
+ app: { id: "minha-central", name: "Minha Central" },
33
+ api: { baseUrl: import.meta.env.VITE_API_URL },
34
+ auth: { mode: "bearer", tokenParam: "code" },
35
+ ui: {
36
+ views: [
37
+ // 100% dinâmico: nada além do nome da model. Grid, form, rota e menu
38
+ // são montados a partir de /core/models/Cotacao.
39
+ defineCollectionView({ model: "Cotacao", mode: "dynamic" }),
40
+ ],
41
+ },
42
+ };
43
+ ```
44
+
45
+ `src/main.tsx`:
46
+
47
+ ```ts
48
+ import { start } from "@oondemand/oon-core-front";
49
+ import { appConfig } from "../central.ui";
50
+
51
+ start(appConfig);
52
+ ```
53
+
54
+ `main.tsx` não conhece providers, router, auth, layout, menu nem serviços.
55
+
56
+ ## Três formas de declarar uma coleção (Seção 4.4)
57
+
58
+ ```ts
59
+ // 1. JSON completo — colunas e form explícitos (mode "full").
60
+ defineCollectionView({
61
+ model: "Pessoa",
62
+ mode: "full",
63
+ columns: [{ field: "nome", label: "Nome", sortable: true }],
64
+ form: [{ field: "nome", label: "Nome", required: true }],
65
+ });
66
+
67
+ // 2. Registro mínimo — só model + label; Core deriva tudo da metadata.
68
+ defineCollectionView({ model: "Pessoa", label: "Prestadores", mode: "minimal" });
69
+
70
+ // 3. 100% dinâmico — consome /core/models/Pessoa e monta sozinho.
71
+ defineCollectionView({ model: "Pessoa", mode: "dynamic" });
72
+ ```
73
+
74
+ Ou direto no JSX, sem registrar view:
75
+
76
+ ```tsx
77
+ import { CoreCollection } from "@oondemand/oon-core-front";
78
+
79
+ <CoreCollection model="Pessoa" />;
80
+ ```
81
+
82
+ ## CLI
83
+
84
+ ```bash
85
+ oonCore-front dev # vite dev
86
+ oonCore-front build # vite build
87
+ oonCore-front preview # vite preview
88
+ oonCore-front sync:metadata # baixa /core/metadata do back e cacheia em src/.oon/metadata.json
89
+ ```
90
+
91
+ ## Componentes Core
92
+
93
+ | Componente | Para quê |
94
+ | ---------------- | ------------------------------------------------------------------- |
95
+ | `CoreCollection` | CRUD genérico: grid + form (3 modos). |
96
+ | `CoreDocument` | Tipos documentais com aprovação/anexos sobre a coleção. |
97
+ | `CorePipeline` | Esteira kanban agrupada por etapa (enum da metadata). |
98
+ | `CoreCurrency` | Multi-moedas: lista + ação `actions/update-rates`. |
99
+ | `CoreIntegration`| Painel de `/core/integrations` + reprocessar ativos. |
100
+ | `CoreAssistant` | Chat de IA seguro — envia só `assistantCode`/`entity`/`message`. |
101
+ | `CoreDashboard` | Widgets `count`/`sum`/`custom` declarados na Central. |
102
+
103
+ ## Segurança por design
104
+
105
+ - **Sem segredos no front**: o assistente nunca envia chave de IA — só
106
+ `assistantCode`, `entity` e `message`; o back resolve modelo/prompt/chave.
107
+ - **Token encapsulado** em `tokenStorage` (try/catch, captura de `?code=` e
108
+ limpeza da URL); 401 dispara logout + redirect para o login externo.
109
+ - **RBAC de UX**: `RouteGuard`/`PermissionGate` escondem o que o usuário não
110
+ pode usar — o back continua sendo a autoridade final.
111
+ - **Auditoria**: toda mutação leva headers `x-oon-origin/module/entity`.
112
+
113
+ ## Contrato com o back
114
+
115
+ | `/core/*` (back) | Uso no front |
116
+ | ----------------------- | ---------------------------------------------- |
117
+ | `GET /core/metadata` | `useCoreMetadata()` — menu/dashboard/derivação |
118
+ | `GET /core/models/:n` | `useModelSchema(n)` — modo dynamic |
119
+ | CRUD em `basePath` | `useOonResource(basePath)` — list/get/CRUD |
120
+ | `GET /auth/validar-token` | `AuthProvider` resolve o usuário |
package/bin/cli.js ADDED
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ /**
5
+ * CLI do @oondemand/oon-core-front (Fase 3 — Seção 4.5).
6
+ *
7
+ * oonCore-front dev Sobe o Vite em modo dev.
8
+ * oonCore-front build Build de produção (vite build).
9
+ * oonCore-front preview Serve o build (vite preview).
10
+ * oonCore-front sync:metadata Baixa /core/metadata do back e cacheia em
11
+ * src/.oon/metadata.json para tipos/dev offline.
12
+ *
13
+ * O Core não impõe Vite ao consumidor: ele apenas encaminha para o binário
14
+ * local do projeto. `sync:metadata` lê a URL do back de OON_API_URL /
15
+ * VITE_API_URL no .env do projeto.
16
+ */
17
+
18
+ const path = require("node:path");
19
+ const fs = require("node:fs");
20
+ const { spawnSync } = require("node:child_process");
21
+
22
+ const cmd = process.argv[2];
23
+ const cwd = process.cwd();
24
+
25
+ function runVite(args) {
26
+ const bin = path.join(cwd, "node_modules", ".bin", process.platform === "win32" ? "vite.cmd" : "vite");
27
+ const exec = fs.existsSync(bin) ? bin : "vite";
28
+ const r = spawnSync(exec, args, { stdio: "inherit", cwd });
29
+ if (r.error) {
30
+ console.error("Falha ao executar vite:", r.error.message);
31
+ console.error("Instale o vite no projeto da Central: npm i -D vite");
32
+ process.exit(1);
33
+ }
34
+ process.exit(r.status || 0);
35
+ }
36
+
37
+ function readEnv(name) {
38
+ if (process.env[name]) return process.env[name];
39
+ const envPath = path.join(cwd, ".env");
40
+ if (!fs.existsSync(envPath)) return undefined;
41
+ const line = fs
42
+ .readFileSync(envPath, "utf8")
43
+ .split("\n")
44
+ .find((l) => l.trim().startsWith(`${name}=`));
45
+ return line ? line.split("=").slice(1).join("=").trim().replace(/^["']|["']$/g, "") : undefined;
46
+ }
47
+
48
+ async function syncMetadata() {
49
+ const apiUrl = readEnv("OON_API_URL") || readEnv("VITE_API_URL");
50
+ if (!apiUrl) {
51
+ console.error("Defina OON_API_URL ou VITE_API_URL (.env) apontando para o back da Central.");
52
+ process.exit(1);
53
+ }
54
+ const url = `${apiUrl.replace(/\/$/, "")}/core/metadata`;
55
+ console.log(`Baixando metadata de ${url} ...`);
56
+ const res = await fetch(url).catch((err) => {
57
+ console.error("Falha de rede:", err.message);
58
+ process.exit(1);
59
+ });
60
+ if (!res.ok) {
61
+ console.error(`Back respondeu ${res.status}.`);
62
+ process.exit(1);
63
+ }
64
+ const metadata = await res.json();
65
+ const outDir = path.join(cwd, "src", ".oon");
66
+ fs.mkdirSync(outDir, { recursive: true });
67
+ const outFile = path.join(outDir, "metadata.json");
68
+ fs.writeFileSync(outFile, JSON.stringify(metadata, null, 2));
69
+ const models = (metadata.models || []).length;
70
+ console.log(`Metadata cacheada em ${path.relative(cwd, outFile)} (${models} models).`);
71
+ process.exit(0);
72
+ }
73
+
74
+ async function main() {
75
+ switch (cmd) {
76
+ case "dev":
77
+ return runVite(["dev"]);
78
+ case "build":
79
+ return runVite(["build"]);
80
+ case "preview":
81
+ return runVite(["preview"]);
82
+ case "sync:metadata":
83
+ return syncMetadata();
84
+ default:
85
+ console.log(`oonCore-front <comando>
86
+
87
+ Comandos:
88
+ dev Sobe a Central em modo dev (vite dev).
89
+ build Build de produção (vite build).
90
+ preview Serve o build (vite preview).
91
+ sync:metadata Baixa /core/metadata do back e cacheia em src/.oon/metadata.json.
92
+ `);
93
+ process.exit(cmd ? 1 : 0);
94
+ }
95
+ }
96
+
97
+ main().catch((err) => {
98
+ console.error(err);
99
+ process.exit(1);
100
+ });