npx afterpack@latest ofusca un directorio de build. Úsalo cuando no exista un plugin para tu bundler, o en CI. Si existe un plugin para tu framework, instala @afterpack/<fw> en su lugar: tu build habitual emitirá entonces salida ofuscada sin ningún paso adicional. Consulta Frameworks.
Esta página cubre el argumento, los ejemplos, qué hace una ejecución, verify, audit, la salida legible por máquina y los códigos de salida. Cada opción se define una sola vez, en Configuración.
Uso
afterpack [path] [--<key>=<value> ...] [-h | --help] [-v | --version]
afterpack verify [dir]
afterpack audit <url>$ npx afterpack@latestLa ruta acepta una de dos cosas:
- un directorio, recorrido de forma recursiva en busca de cada
.js,.mjsy.cjs, o - un único archivo
.js,.mjso.cjs, ofuscado por sí solo.
Si lo ejecutas sin ruta, afterpack detecta la salida de tu build: el directorio en el que escribe por convención el bundler declarado en tu package.json (Next.js → .next/, Nuxt → .output/, SvelteKit → build/, Electron → out/, cualquier otro bundler compatible → dist/) cuando ese directorio existe; si no, el más reciente entre dist/, build/, out/, .output/ y .next/. Nunca lee el archivo de configuración de tu bundler, así que un directorio de salida personalizado no se detecta: pasa la ruta tú mismo cuando tengas uno. Imprime qué encontró y qué va a hacer, y después se ejecuta; en CI nunca pide confirmación. Cuando no encuentra nada, imprime la ayuda de inicio rápido y sale con 1. El comando también lee tu bundler desde package.json e imprime al final de la ejecución una línea que sugiere el plugin correspondiente.
Apúntalo a la salida de tu bundler, no a tu código fuente. La mayoría de los bundlers (Vite, Rollup, esbuild, webpack, Astro, Parcel) escriben en dist/. Next.js escribe en .next/ y Nuxt en .output/.
Ejemplos
npx afterpack@latest # detects the build output, light default
npx afterpack@latest dist/ # a directory you choose
npx afterpack@latest dist/ --preset=hard # heavier posture
npx afterpack@latest .next/ --seed=git # reproducible output, pinned to the commit
npx afterpack@latest build/widget.js # one file
npx afterpack@latest dist/ --diagnostics.level=all # every diagnostic, not the rolled-up summary
AFTERPACK_complexity=40 npx afterpack@latest dist/ # any flag also works as an env varQué hace una ejecución
- Recopila el JavaScript en
<path>. Recorre de forma recursiva cuando la ruta es un directorio, omite sus propias copias.backup.<hash>y omitenode_modules/a menos que lo incluyas con--paths.include='**/node_modules/**'. Si no recopila nada, el build falla. - Mantiene
.afterpack/fuera de git con un.gitignoredentro de él, que se escribe la primera vez que hace falta. Tu propio.gitignorenunca se edita. - Ofusca en el sitio cada archivo recopilado, con el preset solicitado, o con
--complexitycuando lo fijas de forma explícita. - Escribe los artefactos que los flags permiten y, siempre, el recibo de protección. El Protection Map combinado se guarda siempre en
.afterpack/protectionMap.html, ignorado por git y nunca servido, porque incrusta tu código fuente original. Un source map o una copia de seguridad contiene tu código fuente completo. Nunca despliegues ninguno de los dos. Si alguno queda bajo un segmento de ruta servido, la CLI avisa una vez. - Imprime los diagnósticos y, después, la sugerencia de bundler si encontró uno.
El comando sobrescribe la salida de tu build en el sitio y no conserva ninguna copia desde la que volver a ofuscar. Compila y luego ejecútalo una sola vez. En CI ese orden es automático.
No lo ejecutes dos veces sobre la misma salida
AfterPack se niega a ofuscar un archivo que ya contiene su propia salida ofuscada de una ejecución anterior: compara los archivos recopilados con el recibo de protección por hash de contenido y hace fallar el build con DIAG_ALREADY_OBFUSCATED en lugar de ofuscar código ya ofuscado. Primero vuelve a compilar desde el código fuente: borra el directorio de salida o ejecuta el paso de limpieza de tu bundler.
Flags
Cada clave de configuración es un flag: --<key>=<value>, por ejemplo --complexity=40 o --identifiers.reserved=Hls,Foo para una lista. Un flag booleano se escribe sin valor para true (--build.backup) y =false la desactiva (--protectionMap.enabled=false). -h, --help y -v, --version imprimen y salen con 0.
Cada clave escalar o de lista de la referencia de opciones funciona como flag de esta forma. Los valores estructurados van en afterpack.json. Las variables de entorno siguen los mismos nombres con los puntos convertidos en guiones bajos, consulta Configuración; por ejemplo, AFTERPACK_key, AFTERPACK_preset y AFTERPACK_telemetry_enabled.
Archivos
| Ruta | Función |
|---|---|
afterpack.json | El archivo de configuración. AfterPack sube desde el directorio de trabajo hasta la coincidencia más cercana. Contiene toda la configuración del motor: opciones de build, key, todo. |
.afterpack/protectionMap.html | El Protection Map combinado. Ignorado por git automáticamente. Incrusta tu código fuente original. Nunca lo confirmes en git ni lo sirvas. |
.afterpack/backup/ | Tus originales, byte a byte, replicados bajo la raíz del proyecto con un manifest.json que registra en qué se convirtió cada archivo. Se escribe en cada ejecución (--build.backup=false lo desactiva), y afterpack restore lo lee para deshacer la ejecución. Es tu código fuente. Nunca lo confirmes en git ni lo despliegues. |
.afterpack-protection.json | El recibo de protección, escrito en el directorio que la ejecución recorrió tras su última escritura: cada archivo de salida con el hash de los bytes escritos, la versión del motor y la semilla. afterpack verify vuelve a calcular los hashes contra él, y gracias a él se rechaza una ejecución posterior sobre el mismo árbol sin recompilar. Se puede desplegar sin riesgo; no contiene código fuente. |
<file>.js.map | El source map emitido, cuando sourceMap.enabled está activado. Desactivado por defecto en producción. Un source map publicado lleva la salida directamente de vuelta a tu código fuente. |
afterpack verify [dir]
La puerta de despliegue. Un build que protegió su propia salida escribió en ella un recibo de protección; verify vuelve a calcular el hash de cada archivo que el recibo nombra y falla cuando alguno ya no coincide, cuando el recibo falta o cuando procede de otro build.
npx afterpack@latest verify . # a project root: looks in ./ then ./.next/
npx afterpack@latest verify dist # or the build output directory itselfNo lee ninguna configuración del motor, solo --diagnostics.format y --diagnostics.level. Ejecútalo como último paso antes de desplegar; consulta Builds y CI.
afterpack restore [dir]
El deshacer. Una ejecución replica tus originales en .afterpack/backup/ antes de reescribir nada; restore los devuelve a su sitio y borra la copia de seguridad y el recibo obsoleto que registró.
npx afterpack@latest restore # the project root, or anywhere beneath itBusca hacia arriba desde [dir] la raíz del proyecto que contiene .afterpack/backup/, y falla de forma segura (fail closed): cada archivo registrado se comprueba contra el hash con el que la ejecución lo ofuscó antes de escribir nada, de modo que un archivo que hayas editado desde la ejecución detiene la restauración en lugar de ser sobrescrito. Sin manifiesto de copia de seguridad se niega directamente. No lee ninguna configuración del motor más allá de --diagnostics.format.
afterpack audit <url>
Escanea un sitio desplegado en busca de secretos filtrados, código fuente expuesto y JavaScript sin proteger, y transmite los hallazgos a medida que avanza el escaneo. No lee ninguna configuración y no envía nada más que la URL. Consulta Auditoría para la referencia completa del comando.
npx afterpack@latest audit example.comSalida legible por máquina
--diagnostics.format=json escribe exactamente un documento JSON en stdout y nada más; cada línea legible por humanos pasa a stderr. Funciona desde el flag, desde AFTERPACK_diagnostics_format=json o desde diagnostics.format en afterpack.json, y verify y audit también lo respetan. Combínalo con diagnostics.level=none para una ejecución que no imprima nada más que el documento. Esta es la forma que los pasos de CI y los agentes de IA deberían leer en lugar de analizar la salida de texto; el paquete también incluye un SKILL.md que documenta la CLI para un agente que la invoque directamente.
npx afterpack@latest dist/ --diagnostics.format=json --diagnostics.level=noneCódigos de salida
| Código | Significado |
|---|---|
0 | Éxito. Cada archivo recopilado fue ofuscado y escrito. También lo devuelven --help y --version. |
1 | Fallo. No se produjo nada utilizable: una ruta que no existe, ningún JavaScript encontrado bajo ella, cualquier error del motor, un verify fallido, un escaneo audit fallido o un build con clave Pro cuya llamada a la nube falló. |
2 | Parcial. Reservado para un build con la cuota agotada; hoy ningún build lo devuelve. |
3 | Límite de tamaño. inflation.max no pudo alcanzar el objetivo de complejidad (DIAG_SIZE_CAP_REACHED). |
4 | Pro necesario. Una entrada de regions eleva la protección por encima de la configuración del programa y necesita una key (DIAG_PRO_DIRECTIVE_REQUIRES_KEY). La CLI no lee directivas del código fuente, así que solo regions llega a esta salida. |
5 | Reflexión. Se detectó un patrón de reflexión en tiempo de ejecución sin reflection.allow (DIAG_REFLECTION_NOT_ACKNOWLEDGED). |
6 | Actualización necesaria. La nube de AfterPack, o este afterpack, necesita un @afterpack/core más reciente. No se escribió nada. |
64 | Uso incorrecto. Un flag o un comando desconocidos, un valor mal formado o un argumento de ruta duplicado. |
Usa paths.exclude para excluir un archivo que debe publicarse intacto.
Un build Pro con una key resuelta falla de forma segura (fail closed). Si la llamada a la nube falla, el build se detiene en lugar de recurrir a la salida del nivel Free. 4 es la salida de un build Free con una entrada de regions que necesita una key; 5 es la salida de un patrón de reflexión sin reconocer en cualquier build, Free o Pro; 2 está reservado para un futuro build con la cuota agotada y hoy ningún build lo devuelve. Consulta Códigos de salida para el contrato completo.
Siguiente
- Configuración: cada opción y las cuatro formas que pueden establecerla.
- Presets: la escalera de cinco peldaños y lo que cuesta cada peldaño.
- Auditoría: la referencia completa de
afterpack audit. - Diagnósticos: el contrato de salida, la regla fail closed y cada código
DIAG_*. - Frameworks: la vía del plugin, mejor cuando existe uno para tu stack.
- Inicio rápido: el camino más corto desde la instalación hasta un Protection Map.