Bugs do deco-migrate (packages/blocks-cli) encontrados na primeira migração real de um site de conteúdo deco-fresh (deco-sites/portal-davinci → TanStack). Todos reproduzíveis, com fix sugerido. Contexto completo: decocms/parity#233-265.
1. siteName gerado com maiúscula → lookup CMS falha (blank SSR) [ALTO]
As rotas geradas (src/routes/index.tsx, $.tsx) usam siteName: "Portaldavinci-tanstack" (capitalizado). O lookup do decofile é case-sensitive → retorna vazio → todas as seções renderizam vazias no SSR (CLS alto, página em branco sem JS).
Fix: siteName = nome do site em minúsculas (igual ao name do wrangler.jsonc). ctx.siteName.toLowerCase().
2. wrangler.jsonc com KV placeholder inválido [ALTO]
Gera "kv_namespaces": [{ "binding": "SITES_KV", "id": "dev-sites-kv" }]. O id precisa ser um UUID real → deploy falha com KV namespace 'dev-sites-kv' is not valid [code 10042].
Fix: criar o KV via wrangler kv namespace create no bootstrap e injetar o id, OU deixar comentado com instrução explícita.
3. // line comments dentro de funções useScript quebram após minificação [ALTO]
O minifyJs do useScript colapsa newlines → qualquer // comment dentro da função serializada engole o resto do código → Unexpected end of input em runtime (script inline malformado). No portal-davinci havia 15 (@ts-ignore + comentários) no Maps.tsx → mapa em branco + erro de console. Passa no typecheck e no build, só quebra em runtime.
Fix: o codemod do deco-migrate deve remover/converter // line comments (→ /* */) dentro de funções passadas a useScript/useScriptAsDataURI.
4. Template do setup.ts gera campos fora do SiteSetupOptions [MÉDIO]
O template emite css, fonts, meta, previewWrapper em createSiteSetup({...}), mas o tipo SiteSetupOptions do @decocms/blocks não tem esses campos → erros TS na fase build (meta does not exist in type SiteSetupOptions, @ts-expect-error não usado). O template usa @ts-ignore mas o generate usa @ts-expect-error.
Fix: alinhar o tipo SiteSetupOptions com o que o template gera (add css/fonts/previewWrapper/meta) OU remover do template.
5. Não gera public/_headers → assets sem cache imutável [MÉDIO]
Assets hasheados (/assets/*-<hash>.js) são servidos pelo CF Workers Assets com o default max-age=0, must-revalidate (a lógica de immutable do worker-entry não roda neles, pois são servidos antes do worker). PageSpeed/parity penalizam.
Fix: gerar public/_headers com /assets/* → Cache-Control: public, max-age=31536000, immutable (filenames são content-addressed).
6. Migrate não deve decriptar Secret blocks pra plaintext [MÉDIO/segurança]
Se o site origem usa Secret blocks (valor criptografado, decriptado server-side via decrypt key), a migração deve preservar o __resolveType de Secret + o ciphertext — não inline em plaintext no decofile de destino (regressão de segurança). No portal-davinci a Maps apiKey já estava plaintext no origem, mas validar o caminho Secret.
Menores relacionados (orchestrator-side, já tratados no plugin parity): bun run predev falha em deco-fresh (sem package.json); bun run generate precisa rodar antes do typecheck.
Bugs do
deco-migrate(packages/blocks-cli) encontrados na primeira migração real de um site de conteúdo deco-fresh (deco-sites/portal-davinci→ TanStack). Todos reproduzíveis, com fix sugerido. Contexto completo: decocms/parity#233-265.1.
siteNamegerado com maiúscula → lookup CMS falha (blank SSR) [ALTO]As rotas geradas (
src/routes/index.tsx,$.tsx) usamsiteName: "Portaldavinci-tanstack"(capitalizado). O lookup do decofile é case-sensitive → retorna vazio → todas as seções renderizam vazias no SSR (CLS alto, página em branco sem JS).Fix:
siteName= nome do site em minúsculas (igual aonamedo wrangler.jsonc).ctx.siteName.toLowerCase().2.
wrangler.jsonccom KV placeholder inválido [ALTO]Gera
"kv_namespaces": [{ "binding": "SITES_KV", "id": "dev-sites-kv" }]. Oidprecisa ser um UUID real → deploy falha comKV namespace 'dev-sites-kv' is not valid [code 10042].Fix: criar o KV via
wrangler kv namespace createno bootstrap e injetar o id, OU deixar comentado com instrução explícita.3.
//line comments dentro de funçõesuseScriptquebram após minificação [ALTO]O
minifyJsdouseScriptcolapsa newlines → qualquer// commentdentro da função serializada engole o resto do código →Unexpected end of inputem runtime (script inline malformado). No portal-davinci havia 15 (@ts-ignore+ comentários) no Maps.tsx → mapa em branco + erro de console. Passa no typecheck e no build, só quebra em runtime.Fix: o codemod do deco-migrate deve remover/converter
//line comments (→/* */) dentro de funções passadas auseScript/useScriptAsDataURI.4. Template do
setup.tsgera campos fora doSiteSetupOptions[MÉDIO]O template emite
css,fonts,meta,previewWrapperemcreateSiteSetup({...}), mas o tipoSiteSetupOptionsdo@decocms/blocksnão tem esses campos → erros TS na fase build (meta does not exist in type SiteSetupOptions,@ts-expect-errornão usado). O template usa@ts-ignoremas o generate usa@ts-expect-error.Fix: alinhar o tipo
SiteSetupOptionscom o que o template gera (add css/fonts/previewWrapper/meta) OU remover do template.5. Não gera
public/_headers→ assets sem cache imutável [MÉDIO]Assets hasheados (
/assets/*-<hash>.js) são servidos pelo CF Workers Assets com o defaultmax-age=0, must-revalidate(a lógica de immutable do worker-entry não roda neles, pois são servidos antes do worker). PageSpeed/parity penalizam.Fix: gerar
public/_headerscom/assets/*→Cache-Control: public, max-age=31536000, immutable(filenames são content-addressed).6. Migrate não deve decriptar
Secretblocks pra plaintext [MÉDIO/segurança]Se o site origem usa
Secretblocks (valor criptografado, decriptado server-side via decrypt key), a migração deve preservar o__resolveTypede Secret + o ciphertext — não inline em plaintext no decofile de destino (regressão de segurança). No portal-davinci a Maps apiKey já estava plaintext no origem, mas validar o caminho Secret.Menores relacionados (orchestrator-side, já tratados no plugin parity):
bun run predevfalha em deco-fresh (sem package.json);bun run generateprecisa rodar antes do typecheck.