@trismegisto/spine 2.0.1 → 2.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.
Files changed (49) hide show
  1. package/README.md +35 -5
  2. package/fesm2022/trismegisto-spine-audit.mjs +1 -1
  3. package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
  4. package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +48 -0
  5. package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +1 -0
  6. package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +55 -0
  7. package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +1 -0
  8. package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs +42 -0
  9. package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +1 -0
  10. package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs +63 -0
  11. package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +1 -0
  12. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs +784 -0
  13. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +1 -0
  14. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +39 -0
  15. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +1 -0
  16. package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs → trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs} +32 -7
  17. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +1 -0
  18. package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs +46 -0
  19. package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +1 -0
  20. package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs +80 -0
  21. package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +1 -0
  22. package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +39 -0
  23. package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +1 -0
  24. package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +54 -0
  25. package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +1 -0
  26. package/fesm2022/trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs +35 -0
  27. package/fesm2022/trismegisto-spine-auto-service-home.technical-BrVhcgDO.mjs.map +1 -0
  28. package/fesm2022/trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs +43 -0
  29. package/fesm2022/trismegisto-spine-auto-service-home.usage-D6cb4B3Z.mjs.map +1 -0
  30. package/fesm2022/trismegisto-spine-auto-service.mjs +82 -40
  31. package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
  32. package/fesm2022/trismegisto-spine-layout.mjs +988 -46
  33. package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
  34. package/fesm2022/trismegisto-spine-shell.mjs +3 -1
  35. package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
  36. package/fesm2022/trismegisto-spine.mjs +591 -16
  37. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  38. package/package.json +7 -7
  39. package/types/trismegisto-spine-auto-service.d.ts +41 -2
  40. package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
  41. package/types/trismegisto-spine-layout.d.ts +214 -13
  42. package/types/trismegisto-spine-layout.d.ts.map +1 -1
  43. package/types/trismegisto-spine-shell.d.ts +1 -0
  44. package/types/trismegisto-spine-shell.d.ts.map +1 -1
  45. package/types/trismegisto-spine.d.ts +214 -8
  46. package/types/trismegisto-spine.d.ts.map +1 -1
  47. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs +0 -595
  48. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-BYkUOwWL.mjs.map +0 -1
  49. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-B5tyJ2zY.mjs.map +0 -1
package/README.md CHANGED
@@ -7,7 +7,7 @@ configurações (tema, família, densidade, fonte, atalhos), tour de boas-vindas
7
7
  tela.
8
8
 
9
9
  Na cadeia de camadas (`tokens ← icons ← primitives ← core ← angular ← maps · charts · spine`) é a ponta: monta
10
- peças grandes sobre o `@trismegisto/angular` e é o que os apps da organização usam como esqueleto. Ao contrário
10
+ peças grandes sobre o `@trismegisto/angular` e é o que os apps usam como esqueleto. Ao contrário
11
11
  dos outros pacotes, é acoplado à autenticação (`@orfeu/angular` ≥ 0.9.9, OIDC + PKCE contra o Argos): serve a
12
12
  apps que se autenticam nesse servidor. O app e o spine precisam usar a **mesma** cópia do `@orfeu/angular` — com o
13
13
  app ainda no SDK antigo (`@caronte-sdk/angular`) os serviços seriam outros e o shell quebraria
@@ -51,7 +51,12 @@ export const appConfig: ApplicationConfig = {
51
51
  o tema no `<body>` e usa `clientId` como prefixo de **todas** as chaves salvas (tema, menu lateral, abas):
52
52
  apps diferentes na mesma origem não misturam preferências. Opções: `clientId`, `appName` (nome ao lado do
53
53
  logo no cabeçalho), `logo`, `showAppName` e `favicon` (ver "Logo e favicon" abaixo), `technicalDocs` (mostra a
54
- especificação técnica das telas; padrão `isDevMode()`).
54
+ especificação técnica das telas e o botão "Copiar token de acesso" do painel de configurações; padrão
55
+ `isDevMode()`).
56
+ - **Recentes, buscas recentes e favoritos** ficam no `localStorage` por usuário (`SpineUserStorage`: chave
57
+ `<clientId>_<lista>_<sub>`, com o `sub` do token). No logout (pelo spine ou vindo de outra aba, via `isAuth$`) os
58
+ históricos são apagados; os favoritos ficam. Logout próprio do app: chame `SpineUserStorage.clearHistory()` antes
59
+ de `AuthorizationService.logout()`.
55
60
  - **`APP_ROUTES`** traz login, callback, saída e as rotas privadas sob o `spine-layout`
56
61
  (`LayoutComponent`). O `/callback` usa o `handleCallback()` do `@orfeu/angular`: confere state/verifier, volta
57
62
  para a URL pedida antes do login e, no `login_required` da reautorização silenciosa, segue sozinho para o login
@@ -112,6 +117,27 @@ provideUi({
112
117
  - **Marca em componente:** `{ provide: SPINE_BRAND, useValue: MarcaComponent }` (`@trismegisto/spine/layout`) tem
113
118
  prioridade sobre a imagem (ex.: SVG inline com `currentColor`). Ele fica dentro do link — sem link/botão dentro.
114
119
 
120
+ ## Conta e segurança (painel de configurações)
121
+
122
+ A seção **Conta e segurança** do painel (`?settings=seguranca`) gerencia a conta da pessoa no Argos sem sair do app:
123
+ **Verificação em duas etapas** (adicionar o aplicativo autenticador com QR Code, adicionar o e-mail, trocar o aparelho,
124
+ remover), **Códigos de recuperação** (gerar um lote novo, mostrado uma vez, com copiar e baixar) e **Sessões e
125
+ dispositivos** (encerrar uma sessão ou todas as outras; a deste login vem marcada). Antes de qualquer alteração a
126
+ pessoa confirma a identidade (senha, código do autenticador, código no e-mail cadastrado ou código de recuperação); o
127
+ Argos guarda essa prova por 5 minutos.
128
+
129
+ - **API**: a área da conta do Argos com Bearer, `{authority}/api/realms/{realmId}/account/*` (`security`, `reauth`,
130
+ `mfa/*`, `recovery-codes`, `sessions`), com o access token da sessão do `@orfeu/angular` no `Authorization` — o
131
+ mesmo `{authority}/api` que o Orfeu usa no OIDC (a `authority` já traz o `/argos`). Sem cookie: o Argos reconhece
132
+ a sessão pelo `sid` do token. Token vencido renova uma vez e repete.
133
+ - **Configuração**: nenhuma além do `provideAuth`. A origem do app precisa estar nas `redirect_uris` do client no
134
+ Argos (é o que o CORS do Argos libera — o login já exige isso). Sem `authority`/`realmId` (ou com `CHANGE_ME`) a
135
+ seção não aparece.
136
+ - **Versão do Argos**: precisa da área da conta por Bearer (`/realms/{realm}/account`). Num Argos anterior a seção
137
+ mostra o erro de carregamento.
138
+ - A mesma API sai de `SpineAccountSecurityService` / `argosAccountApi(authority, realm)` (`@trismegisto/spine/layout`),
139
+ para outra tela do app.
140
+
115
141
  ## Pontos de entrada
116
142
 
117
143
  | Import | Conteúdo |
@@ -123,7 +149,7 @@ provideUi({
123
149
  | `@trismegisto/spine/modal` | `ModalService` (`open(config)` devolve um `Observable` com o resultado), `ModalContent` |
124
150
  | `@trismegisto/spine/side-panel` | `SidePanelService`, `SidePanelContent` |
125
151
  | `@trismegisto/spine/notification` | `NotificationService` (`addNotification`) |
126
- | `@trismegisto/spine/auto-service` | `provideAutoService({ adminApi })`: telas prontas de autosserviço (início, grupos, aplicações, cliente, auditoria), sempre carregadas sob demanda (`AUTO_SERVICE_SCREENS`); as classes das telas não são exportadas. `AutoServiceService` e o tipo `AutoServiceClient` são |
152
+ | `@trismegisto/spine/auto-service` | `provideAutoService({ adminApi })`: telas prontas de autosserviço (início, grupos, aplicações, cliente, auditoria), sempre carregadas sob demanda (`AUTO_SERVICE_SCREENS`); as classes das telas não são exportadas. Cada tela já vem com a documentação (manual de uso e especificação técnica, em `AUTO_SERVICE_DOCUMENTS`, também sob demanda) no botão de documentação da página. `AutoServiceService` e o tipo `AutoServiceClient` são exportados |
127
153
  | `@trismegisto/spine/audit` | A tela de Auditoria (`SpineAuditComponent`, `spine-audit`), a mesma para o painel central (`scope="admin"`) e o auto-serviço (`scope="client"`), + `SpineAuditService` e os tipos/funções puras (`AuditEvent`, `AuditQuery`, `buildAuditQuery`, `auditApiBase`…). **Exporta o componente: importe só de código lazy** |
128
154
  | `@trismegisto/spine/graphql` | `provideGraphql({ endpoints })`: um cliente Apollo nomeado por backend |
129
155
 
@@ -174,7 +200,10 @@ component: async () => (await import('./admin-audit-page.component')).AdminAudit
174
200
  `provideAutoService`) pelo deles. Nunca forneça o token sem `multi: true`. Um `id` igual ao de uma tela
175
201
  base do shell faz o `provideShell` lançar erro.
176
202
  - **Documentação de tela** (`document.load`) é markdown cru importado como texto: configure o loader
177
- `".md": "text"` no `angular.json` do app. O texto vai no chunk lazy da tela.
203
+ `".md": "text"` no `angular.json` do app. O `spine-markdown` limpa o HTML com um perfil restrito do DOMPurify
204
+ (`SPINE_MARKDOWN_PURIFY_CONFIG`): sem `<style>`/`style`, formulários e `<iframe>`; link externo abre em outra aba
205
+ com `rel="noopener noreferrer"`. Formatação além do Markdown (cor, layout) não passa. O texto vai no chunk lazy da tela. (As telas do auto-serviço não
206
+ dependem disso: o pacote publica o Markdown delas em módulos `.ts` próprios, cada um num chunk lazy.)
178
207
  - **Idioma:** os textos do spine seguem `HermesI18nService.setLocale` (o idioma em si se configura com
179
208
  `provideHermesI18n` do `@trismegisto/angular`). `provideSpineMessages({ override, catalogs })` só sobrescreve
180
209
  textos ou acrescenta idiomas.
@@ -198,7 +227,8 @@ O código fica em `projects/ui/` (um ponto de entrada por pasta). `npm run build
198
227
  empacota com ng-packagr em `dist/ui/` (o que vai publicado) e copia este README para lá
199
228
  (`scripts/copy-readme.mjs`); `npm run check-strings` sozinho confere que
200
229
  nenhum texto de interface está fora do catálogo. O build termina com `scripts/check-lazy.mjs`, que falha se uma
201
- tela carregada por `import()` (as do auto-serviço) acabar colada no arquivo do ponto de entrada, ou se o ponto
230
+ tela carregada por `import()` (as do auto-serviço) ou o texto da documentação delas acabar colado no arquivo do
231
+ ponto de entrada, ou se o ponto
202
232
  principal/`auto-service` importar `@trismegisto/spine/audit` estaticamente — acontece quando
203
233
  ela é exportada no `public-api.ts` (o rollup troca o `import()` por `Promise.resolve()` e a tela vai para o bundle
204
234
  inicial do app).
@@ -299,7 +299,7 @@ class SpineAuditService {
299
299
  }
300
300
  /** Um ranking paginado (`apps` | `operations` | `users`) com os mesmos filtros/janela do resumo. */
301
301
  tops(base, kind, query, page) {
302
- return firstValueFrom(this.http.get(`${base}/tops/${kind}`, { headers: this.headers, params: auditParams(query, page) }));
302
+ return firstValueFrom(this.http.get(`${base}/tops/${encodeURIComponent(kind)}`, { headers: this.headers, params: auditParams(query, page) }));
303
303
  }
304
304
  /** Apps para o filtro (`{ apps: [{ id, name }] }` — `/admin/apps` ou `/auto-service/:clientId/apps`). */
305
305
  apps(url) {