# Comparar uma versão em sombra

Execute uma cópia oculta, compare suas saídas WU e entenda os limites da comparação.

Esta página descreve o WU Framework `4.0.0`. Consulte o [guia de migração para Framework 4.0 e CLI 1.2](/pt/docs/guides/releases/) antes de atualizar um projeto existente.

A app primária permanece visível e montada. `wu.shadow` monta uma cópia oculta e inerte, replica entradas que passam pelo WU e registra suas saídas pela facade. Use para comparar uma reescrita ou atualização antes de substituir a app visível.

```js
import { wu } from 'wu-framework/core';
import 'wu-framework/shadow';

// cart must already be registered and mounted.
await wu.shadow.start('cart', { url: '/apps/cart-v2/', rpcTimeout: 5000 });
try {
  await wu.update('cart', { currency: 'EUR' });
  const report = wu.shadow.report('cart');
  console.log(report.equal, report.dom, report.outputs);
} finally {
  await wu.shadow.stop('cart');
}
```

<span id="entradas-y-salidas"></span>

<span class="section-anchor" id="section-1"></span>

## Entradas e saídas

A cópia recebe props, eventos e leituras do store. Suas escritas usam uma camada própria. Chamadas RPC ou de contratos recebem respostas registradas da primária para o mesmo canal e argumentos. `emit`, `handle` e `provide` da cópia são registrados sem publicar seus efeitos pelo WU.

A comparação cobre operações da facade; não intercepta todos os efeitos do navegador. Um `fetch` direto ou uma escrita externa feita pela cópia continua sendo responsabilidade dessa app. Também não reproduz cliques do usuário nem comprova equivalência visual do layout.

<span id="leer-el-informe"></span>

<span class="section-anchor" id="section-2"></span>

## Ler o relatório

`report().dom` compara árvores normalizadas sem atributos internos; `outputs` compara operações e argumentos registrados. `equal` significa que essas comparações não encontraram diferenças. `unmatchedCalls` identifica chamadas sem par; após `rpcTimeout`, rejeitam com `WU_SHADOW_NO_TWIN_CALL`. Isso não é aprovação automática de implantação.

`start` retorna o primeiro relatório; `report` retorna o atual ou `null`; `stop` libera cópia, hooks e esperas e retorna o relatório final. `sessions` lista sessões. A primária precisa estar montada; uma segunda sombra falha com `WU_SHADOW_EXISTS`. A cópia mantém os grants da primária e se registra como `<app>~shadow`, salvo configuração de `name`.

<span id="interceptar-operaciones-del-host"></span>

<span class="section-anchor" id="section-3"></span>

## Interceptar operações pelo host

```js
const release = wu.intercept('cart', (kind, args, next) => {
  if (kind === 'store.set') console.log('cart writes', args[0]);
  return next(...args);
});
// Remove the middleware when the host no longer needs it.
release();
```

`intercept` retorna uma função de limpeza. `next(...args)` continua a operação; outro resultado a substitui. Vários interceptores executam na ordem de registro. Preserve o contrato síncrono ou assíncrono esperado pela app.

O relatório de shadow inclui `props.failures` quando uma atualização de props não chega ao twin. Enquanto existirem essas falhas, `equal` é `false`; não interprete uma comparação parcial como equivalência do deploy.