Entradas do Registry
Uma entrada de registry é como o backend do Wippy declara um artefato de frontend — seja um app micro frontend ou um web component reutilizável — para que o Web Host possa descobri-lo e servi-lo. Este documento explica o contrato entre o _index.yaml de um módulo, o bloco wippy do seu package.json e o arquivo wippy-meta.json que os conecta.
Para a configuração do módulo wippy/views que processa essas entradas em tempo de execução, veja Views.
O Que É uma Entrada de Registry
Todo artefato de frontend é declarado como um registry.entry no _index.yaml do módulo. O marcador kind: registry.entry informa ao registry do Wippy que essa entrada carrega metadados consumidos por outros módulos, em vez de definir um componente Lua diretamente.
Armadilha comum:
view.pageeview.componentnão são valores dekind. Escreva semprekind: registry.entrye coloque o tipo do artefato de frontend emmeta.type.kind: view.pageekind: view.componentsão formatos inválidos.
Formato mínimo correto:
- name: main
kind: registry.entry
meta:
type: view.page
version: "1.0"
namespace: app.views
entries:
- name: main
kind: registry.entry
meta:
type: view.page
name: main
title: Admin Panel
icon: tabler:layout-dashboard
order: 0
announced: true
secure: false
url: /app
base_path: app/main
entry_point: app.html
mountRoute: /home/:part(.*)*
O bloco meta é o que o wippy/views lê. O campo meta.type discrimina entre os dois tipos de artefato suportados.
O Discriminador meta.type
| Valor | Significado |
|---|---|
view.page |
Um app micro frontend (SPA completo), renderizado em um iframe dentro do Web Host |
view.component |
Um Web Component (elemento customizado) que pode ser incorporado em qualquer lugar de uma página |
Todos os demais campos em meta são interpretados no contexto desse tipo. Campos que se aplicam a um tipo e não ao outro estão descritos nas páginas de referência por tipo (view.page, view.component).
O Marcador specification
Todo pacote de frontend que participa do registry declara "specification": "wippy-component-1.0" no nível superior do seu package.json. Essa string é o handshake que informa ao Wippy (e às ferramentas) que este pacote segue o contrato wippy-component — ele tem um bloco wippy com um formato conhecido e foi compilado com @wippy-fe/vite-plugin.
{
"name": "@wippy/app-main",
"version": "1.0.0",
"specification": "wippy-component-1.0",
"wippy": { ... }
}
A presença de specification não altera o comportamento em tempo de execução, mas o wippy/views a utiliza ao validar entradas carregadas do registry.
O Contrato wippy-meta.json
O @wippy-fe/vite-plugin emite um arquivo wippy-meta.json junto ao bundle compilado. Esse arquivo é a fonte canônica de verdade para os metadados de runtime do artefato: seu schema de props, schema de eventos, título, ícone e configurações de injeção de proxy.
Resposta curta para agentes e ferramentas:
- Quem o emite:
wippyPagePlugin()para appsview.pageewippyComponentPlugin()para web componentsview.component. - Quem o escreve: ninguém escreve
wippy-meta.jsonà mão; o plugin do vite o gera a partir dopackage.json. - Quem o consome: o
wippy/viewso lê da raiz do bundle servido ao construir descritores de página/componente e respostas de API. - O que o YAML faz: o
_index.yamlcontinua autoritativo para a política de deployment e para qualquer campo que sobrescreva explicitamente.
Quando o wippy/views carrega um registry.entry, ele lê o wippy-meta.json a partir da raiz do bundle servido do artefato. Para páginas, essa raiz é o url + base_path da página; para web components, as entradas atuais servem o componente diretamente a partir de url. O YAML sempre vence: o _index.yaml tem precedência para cada campo que declara. O wippy-meta.json fornece os padrões que o wippy/views lê quando não há sobrescrita em YAML para um determinado campo. Campos de política de deployment — announced, secure, url, mountRoute e base_path — devem ser definidos no _index.yaml, porque expressam decisões do operador em vez da autoria do componente; não existe superfície de autoria em package.json/wippy-meta.json para eles. (base_path é respeitado tanto para páginas quanto para componentes; as entradas de componente do app-template atuais simplesmente o omitem.)
Em contrapartida, entry_point é autorado pelo FE e sobrescrevível por YAML. Ele é gravado no wippy-meta.json a partir do bloco wippy do pacote — wippy.path para páginas (que o @wippy-fe/vite-plugin exige; omiti-lo faz o plugin lançar wippy.path is required for a page package) ou wippy.tagName/browser para componentes. O campo meta.entry_point no _index.yaml é uma sobrescrita opcional por deployment sobre esse padrão autorado; não é um campo exclusivo de YAML.
Essa divisão significa que o autor de um componente escreve os metadados de exibição uma única vez no bloco wippy do package.json, e o plugin do vite os grava no wippy-meta.json em tempo de build como padrões do autor. O operador que faz o deploy do componente define roteamento e política de acesso em YAML, e também pode sobrescrever ali qualquer campo de nível de exibição.
Campos Comuns
Estes campos aparecem no bloco meta tanto para entradas view.page quanto view.component.
| Campo | Tipo | Padrão | Descrição |
|---|---|---|---|
type |
string | — | view.page ou view.component (obrigatório) |
name |
string | nome da entrada | Identificador usado nas respostas da API |
title |
string | — | Nome de exibição legível por humanos |
icon |
string | — | Referência Iconify, por exemplo tabler:layout-dashboard |
announced |
boolean | — | Controla a visibilidade nas APIs de listagem; a semântica difere por tipo (veja abaixo) |
secure |
boolean | false |
Exige autenticação para acesso |
url |
string | — | Prefixo de URL base para servir arquivos estáticos (origem de CDN ou caminho de mount local) |
entry_point |
string | index.html / index.js |
Nome do arquivo de entrada dentro do diretório estático |
Semântica de announced por Tipo
A flag announced tem consequências diferentes dependendo de meta.type:
-
view.page: controla se a página aparece na barra lateral de navegação (GET /api/public/pages/list). Definirannounced: falseoculta a página da navegação, mas ela ainda carrega se acessada diretamente. Esse é um padrão legítimo para páginas incorporadas ou auxiliares. -
view.component: controla a inclusão emGET /api/public/components/list. Seannounced: false, o componente é totalmente excluído desse endpoint, o que significa que o Web Host nunca injeta sua tag de script ecustomElements.get(tagName)permanece indefinido. Para componentes que precisam de autoload,announced: trueé obrigatório — veja view.component para detalhes.
Como os Campos de Serving se Combinam
Para apps micro frontend, os três campos se compõem para produzir a URL do HTML que o Web Host carrega:
<url>/<base_path>/<entry_point>
Por exemplo, com url: /app, base_path: app/main, entry_point: app.html, o host busca /app/app/main/app.html.
A separação entre base_path e entry_point é intencional. O Web Host injeta <url>/<base_path>/ como uma tag HTML <base> na página carregada, o que rege como o navegador resolve todas as URLs relativas dentro dessa página. O arquivo de entrada pode estar em um subdiretório da base — o que importa é que a base aponte para a raiz comum a partir da qual todos os recursos podem ser alcançados de forma relativa.
Por exemplo, se um bundle tem este layout:
static/
shared/
vendor.js
app/
index.html ← entry_point: app/index.html
app.js
e index.html referencia ../shared/vendor.js, então base_path deve apontar para static/ (o diretório que contém tanto app/ quanto shared/), e não para app/. Definir base_path: app faria ../shared/vendor.js resolver para fora do diretório servido e retornar 404.
No caso comum em que todos os assets ficam ao lado do arquivo de entrada, base_path e o diretório que contém entry_point estão no mesmo nível, de modo que a distinção é invisível. Ela só importa quando um bundle compartilha recursos entre diretórios irmãos.
Para web components, o host compõe a URL servida da mesma forma:
<url>/<base_path>/<entry_point>
As entradas de componente do app-template atuais omitem base_path, mas ele é suportado e se compõe da mesma maneira (<url>/<base_path>/<entry_point>) — de modo que, nessas entradas, a URL se reduz a <url>/<entry_point>. A diferença em relação às páginas é que um componente é injetado como um <script type="module"> em vez de receber sua própria tag HTML <base> injetada.