# Ofusca un build de esbuild

@afterpack/esbuild se engancha a build.onEnd y ofusca la salida emitida en el sitio.

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

`@afterpack/esbuild` es un plugin estándar de esbuild (`{ name, setup(build) }`). Se engancha a `build.onEnd`, que se dispara cuando esbuild ha terminado de escribir la salida en disco (`write !== false`, el valor por defecto).

Maneja las dos formas de salida: `outdir` (muchos archivos) y `outfile` (un único archivo). Omite un build que ya ha fallado.

## Instalación

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

```js
// build.mjs
import { build } from "esbuild";
import { afterpackEsbuild } from "@afterpack/esbuild";

await build({
  entryPoints: ["src/main.js"],
  bundle: true,
  format: "esm",
  outfile: "dist/app.js",
  plugins: [afterpackEsbuild()],
});
```

La exportación con nombre es `afterpackEsbuild`.

## Build

El plugin se ejecuta en `build.onEnd`, después de que esbuild haya terminado de escribir la salida en disco, tanto con `outdir` como con `outfile`. No hay un comando de desarrollo aparte que deba omitir: cada llamada a `build()` que escribe archivos ejecuta el plugin.

esbuild no expone ningún hook dentro del pipeline, así que tu bundle sin ofuscar está en disco hasta que termina la pasada, lo que lleva aproximadamente un cuarto de segundo para un bundle de 185 KB con el preset por defecto, y cualquier cosa que pueda leer el directorio de salida en ese intervalo puede leerlo. Una ofuscación fallida deja esa salida donde está: el build falla, así que no se publica nada, pero los archivos se quedan hasta que el siguiente build los sobrescriba.

## Verificación

El [Protection Map](https://www.afterpack.dev/es/docs/protection-map) se escribe por defecto cuando esbuild emite un [source map](https://www.afterpack.dev/es/docs/config#sourceMap-enabled) y el build no se ejecuta en CI (`CI=true` o `CI=1`); el modo de [producción](https://www.afterpack.dev/es/docs/config#build-mode) no lo desactiva. esbuild no emite ningún source map a menos que configures `sourcemap`, así que el mapa está desactivado por defecto. Pídelo de forma explícita:

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

Se guarda en `.afterpack/protectionMap.html`, ignorado por git. Sin `sourcemap: true`, el plugin avisa de que no encontró ningún map del bundler desde el que mostrar el código fuente original. El informe contiene todo tu código fuente. Nunca lo subas al repositorio ni lo sirvas.

## Opciones

Cada [clave de configuración](https://www.afterpack.dev/es/docs/config) se puede pasar aquí como objeto de opciones, por ejemplo `afterpackEsbuild({ 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`.

Las directivas se recuperan del source map del bundler, así que compila con `sourcemap: true` si las usas. Consulta [Directivas](https://www.afterpack.dev/es/docs/directives).

## Casos límite

- **[Fallo seguro (fail closed)](https://www.afterpack.dev/es/docs/diagnostics#fail-closed-no-exceptions).** Un archivo fallido o una salida vacía rechazan el build.
- **`write: false`.** No hay nada en disco, así que el plugin no hace nada. AfterPack necesita archivos escritos.
- **TypeScript.** esbuild ya ha eliminado los tipos cuando se ejecuta AfterPack; los maps se encadenan hasta tus líneas `.ts`.

## Siguiente

- [Frameworks](https://www.afterpack.dev/es/docs/frameworks): la matriz completa.
- [Vite](https://www.afterpack.dev/es/docs/frameworks/vite): la integración de referencia y la semántica completa de las opciones.
- [Builds 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.
