Protocolo do admin
Como admin.deco.cx conversa com sua loja — meta, decofile, render, invoke.
O protocolo do admin é o contrato entre admin.deco.cx e a sua loja self-hosted. É pequeno — quatro endpoints — mas é como funcionam edição, preview e sincronização de conteúdo.
Os quatro endpoints
| Método | Path | Função |
|---|---|---|
GET | /live/_meta | JSON Schema + manifesto de section/loader, para o admin |
GET | /.decofile | Todos os blocks do site (bundle do decofile) |
POST | /deco/render | Renderiza uma section ou página no iframe de preview |
POST | /deco/invoke | Roda um loader ou action e retorna o resultado |
Todos vivem em @decocms/start/admin e são plugados no worker via createDecoWorkerEntry .
/live/_meta
Retorna um JSON com:
schemas— JSON Schema paraPropsde cada section, derivado do TypeScript em build time porgenerate-schema.ts.manifest— registro de IDs de sections, loaders, actions, apps.framework— definições base (Page,MultivariateBlock, etc.).
A resposta carrega um ETag computado como hash de conteúdo DJB2. O admin cacheia por ETag e só re-busca quando o conteúdo muda.
curl https://minha-loja.com/live/_meta -H "Accept: application/json"
/.decofile
Retorna todos os blocks do site:
{
"blocks": {
"blockId1": { "__resolveType": "...", "...": "..." },
"blockId2": { "...": "..." }
}
}
O admin lê isso para popular o editor e usa diffs contra esse snapshot para publicar mudanças. O endpoint é content-hashed para invalidação.
/deco/render
O iframe de preview do admin posta para esse endpoint para renderizar uma section isoladamente:
POST /deco/render
Content-Type: application/json
{
"__resolveType": "site/sections/Hero/HeroBanner.tsx",
"title": "Título de preview"
}
O framework:
- Resolve o block.
- Roda os loaders (com overrides do editor).
- Renderiza a árvore React em HTML.
- Embrulha num shell de preview com
data-theme="light"(necessário para os tokens de cor do DaisyUI v4). - Devolve o HTML.
O shell usa LiveControls para o admin ter hover-highlight, jump-to-source e reload em edição. Veja getRenderShellConfig .
/deco/invoke
Roda um loader ou action e devolve o resultado. Usado para:
- Busca de dados client-side —
useCart,useUser,useWishlistpostam aqui. - Preview do admin — admin invoca loaders para preview.
- API programática — seu próprio código client-side chamando loaders tipados via
invoke.gen.ts.
POST /deco/invoke
Content-Type: application/json
{
"__resolveType": "vtex/loaders/cart.ts",
"props": {}
}
Veja Referência de invoke para o cliente tipado e modo batch.
Por que esses endpoints estão no worker (não no TanStack Start)
Os handlers de admin moram em worker-entry.ts , não em server.ts . Importa porque:
O Vite remove lógica custom de
createServerEntryem builds de produção.—
@decocms/start/CLAUDE.md
Se você puser rotas de admin dentro do server entry do framework, funciona em dev e some em prod. Sempre conecte via createDecoWorkerEntry :
import { createDecoWorkerEntry } from "@decocms/start/sdk/workerEntry";
import { handleMeta, handleDecofile, handleRender, handleInvoke } from "@decocms/start/admin";
const decoWorker = createDecoWorkerEntry(serverEntry, {
admin: { handleMeta, handleDecofile, handleRender, handleInvoke },
});
export default decoWorker;
CORS e live controls
Admin roda em admin.deco.cx ; sua loja roda em outra origem. Os endpoints de admin emitem CORS permissivo para a origem do admin:
import { applyCorsHeaders } from "@decocms/start/middleware";
LiveControls (carregado pelo shell de preview) usa postMessage para coordenar hover-highlight e jump entre sections com o frame pai do admin.
Invariantes de ETag
Algumas coisas têm que valer para o admin cachear corretamente:
- O ETag do
_metamuda toda vez que o schema de uma section muda. - O ETag do decofile muda toda vez que algum block muda.
- Ambos os ETags precisam estar no formato que o admin espera (DJB2 do conteúdo, base64 com padding compatível).
O framework cuida disso — mas se você customizar os handlers de meta ou decofile, preserve o contrato de ETag.
Não sobrescreva data-theme="light" no shell de preview. Variáveis de cor do DaisyUI v4 dependem de data-theme , e o iframe de preview assume tema claro. Setar data-theme="dark" quebra todas as sections coloridas.
Geração de schema
generate-schema.ts lê todo src/sections/**/*.tsx e emite JSON Schema analisando TypeScript com ts-morph . Anotações que sobrevivem para o JSON Schema:
@description(TSDoc) → descrição do campo.@title→ label do campo.@default→ valor default.- Tipos widget de
@decocms/start/types/widgets→ controles de UI customizados.
O gerador roda como parte do script generate:schema . A saída ( meta.gen.json ) é o que /live/_meta serve.
Veja também
Found an error or want to improve this page?
Edit this page