# Ofusca un build de Rollup

@afterpack/rollup lee las directivas Pro de @afterpack de tu código fuente y ejecuta el motor en generateBundle, antes de que Rollup escriba la salida.

Source: https://www.afterpack.dev/es/docs/frameworks/rollup

`@afterpack/rollup` es el equivalente de [`@afterpack/vite`](https://www.afterpack.dev/es/docs/frameworks/vite): Vite se construye sobre Rollup, así que se aplica el mismo enfoque. Lee las [directivas `@afterpack`](https://www.afterpack.dev/es/docs/directives) de tu código fuente y después ejecuta el motor en `generateBundle`, con el bundle terminado en memoria y antes de que Rollup escriba nada.

## Instalación

```bash
npm install -D @afterpack/rollup
```

```js
// rollup.config.mjs
import { afterpackRollup } from "@afterpack/rollup";

export default {
  input: "src/index.js",
  output: { dir: "dist", format: "es", sourcemap: true },
  plugins: [afterpackRollup()],
};
```

La exportación con nombre es `afterpackRollup`.

## Build

El plugin se ejecuta en `generateBundle`, con `order: "post"`, así que es el último hook que toca el bundle. Ofusca cada chunk de JavaScript que contiene el bundle y se los devuelve, de modo que Rollup escribe los chunks ofuscados y nunca los originales. Una ofuscación fallida deja el directorio de salida como estaba.

El nombre de cada chunk [sigue a sus bytes ofuscados](https://www.afterpack.dev/es/docs/builds#file-names-and-caching), y las copias precomprimidas `.gz` y `.br` del bundle se regeneran a partir de los bytes ofuscados.

## Verificación

El [Protection Map](https://www.afterpack.dev/es/docs/protection-map) se escribe por defecto cuando `output.sourcemap` está definido y el build no se ejecuta en CI (`CI=true` o `CI=1`); un [build de producción](https://www.afterpack.dev/es/docs/config#build-mode) no lo desactiva. Pídelo de forma explícita cuando quieras inspeccionar uno:

```js
afterpackRollup({ protectionMap: { enabled: true } });
```

Se guarda en `.afterpack/protectionMap.html`, ignorado por git. Con `output.sourcemap` activado muestra tu código fuente original; sin él, no hay nada a partir de lo que mostrarlo y la pasada lo indica. El informe contiene todo tu código fuente. Nunca lo subas al repositorio ni lo sirvas.

*(live Protection Map demo embed — see https://www.afterpack.dev/protection-map-demo)*

## Opciones

Cualquier [clave de configuración](https://www.afterpack.dev/es/docs/config) se puede pasar aquí en el objeto de opciones, por ejemplo `afterpackRollup({ preset: "hard", complexity: 40 })`.

## Directivas

Las directivas son una función [Pro](https://www.afterpack.dev/es/docs/pro). En un [build Free](https://www.afterpack.dev/es/docs/directives#free-builds), una directiva que aumenta la protección detiene el build con `DIAG_PRO_DIRECTIVE_REQUIRES_KEY`.

El plugin lee las directivas de tu código fuente, antes de la minificación, así que una [directiva](https://www.afterpack.dev/es/docs/directives) sobrevive al empaquetado.

```js
/* @afterpack preset=hard */
export function signRequest(payload) {
  // ...
}
/* @afterpack end */
```

La captura omite `node_modules`, los módulos virtuales y los archivos que no son JS/TS. La [gramática](https://www.afterpack.dev/es/docs/directives#writing-one) es la misma en todas partes.

## Casos límite

### Varias salidas

Una configuración con dos salidas ejecuta `generateBundle` una vez por salida, y cada ejecución solo ve su propio bundle. Nada se ofusca dos veces, sean cuales sean los directorios en los que escriben las salidas:

```js
output: [
  { dir: "dist/esm", format: "es", entryFileNames: "lib.js" },
  { dir: "dist/cjs", format: "cjs", entryFileNames: "lib.cjs" },
],
plugins: [afterpackRollup({ seed: "git" })],
```

Fija una única [`seed`](https://www.afterpack.dev/es/docs/config#seed) para las salidas que se publican juntas.

### Builds de librerías

AfterPack se ejecuta sobre el bundle que compiló Rollup, así que cada nombre exportado que importan tus consumidores se conserva tal como está escrito; solo se renombran y reestructuran los elementos internos.

## Siguiente

- [Frameworks](https://www.afterpack.dev/es/docs/frameworks): la matriz completa.
- [Vite](https://www.afterpack.dev/es/docs/frameworks/vite): los mismos hooks, con la resolución de configuración de Vite.
- [Build y CI](https://www.afterpack.dev/es/docs/builds): semillas, desarrollo frente a producción, promocionar los mismos bytes.
- [Protection Map](https://www.afterpack.dev/es/docs/protection-map): cómo leer el informe.
- [Directivas](https://www.afterpack.dev/es/docs/directives): cada clave de marcador y lo que hace.
- [Configuración](https://www.afterpack.dev/es/docs/config): la superficie de configuración del motor.
