Ofusca JavaScript sin framework

Apunta npx afterpack@latest a cualquier directorio de JavaScript emitido. Sin bundler, sin plugin y sin archivo de configuración.

Sin plugin, sin framework, sin hook de bundler. Dale a la CLI un directorio y ofuscará en el sitio cada .js, .mjs y .cjs que contenga. Úsala para un bundle de CDN montado a mano, un árbol de salida de tsc, ESM puro, una app require.js/AMD o cualquier dist/ de una herramienta que no tenga paquete de AfterPack.

Instalación

No hay nada que instalar: ejecuta la CLI directamente sobre tu directorio de salida.

$ npx afterpack@latest

Build

La ruta es opcional. Sin ella, la CLI elige el más reciente entre dist/, build/, out/, .output/ y .next/ en el directorio de trabajo e indica cuál ha elegido; indica el directorio cuando tu salida esté en otro lugar, y también en CI. Acepta un directorio que recorrer o un único archivo .js/.mjs/.cjs. Si el directorio no existe o no contiene ningún .js/.mjs/.cjs, la CLI lo indica y sale con 1.

Si detecta next, vite, webpack, rollup o esbuild en tu package.json, imprime después de la ejecución una línea que sugiere el plugin correspondiente.

Consulta Configuración para ver cada clave. Por esta vía, las estableces en afterpack.json en la raíz de tu proyecto, con un flag de la CLI o con una variable de entorno. Para complexity, elige una:

npx afterpack@latest dist/ --complexity=40
AFTERPACK_complexity=40 npx afterpack@latest dist/
{ "complexity": 40 }

Los flags con valor usan = (--preset=hard, --seed=git); un flag booleano se escribe solo para true y con =false para desactivarlo (--build.backup, --directives.enabled=false). -h/--help y -v/--version imprimen el uso. La referencia de la CLI tiene la forma completa del comando; Configuración tiene cada clave. El código de salida es 0 si todo va bien y 1 ante cualquier fallo. No hay otros códigos sobre los que ramificar en CI.

La ejecución escribe:

  • .afterpack/protectionMap.html: un único mapa combinado para la ejecución, que se escribe cuando se pudo encontrar un source map y el build no se ejecuta en CI (CI=true o CI=1). El modo de producción no lo desactiva. Incrusta tu código fuente original, así que siempre se guarda en .afterpack/, ignorado por git, y nunca en el directorio que ofuscaste.
  • foo.js.map: un .map junto al archivo, cuando los maps están activados.
  • .afterpack/backup/: tus originales, replicados bajo la raíz del proyecto con un manifiesto, en cada ejecución. --build.backup=false lo desactiva; npx afterpack@latest restore deshace la ejecución a partir de él.

.afterpack/ lleva su propio .gitignore, así que git lo ignora; AfterPack nunca edita el tuyo.

Verificación

Activa un source map en el build que quieras inspeccionar (tsc --sourceMap, un flag del bundler) y abre después .afterpack/protectionMap.html, ignorado por git. Contiene todo tu código fuente. Nunca lo subas al repositorio ni lo sirvas.

Opciones

Cualquier clave de configuración funciona también por esta vía; consulta Configuración para ver cada clave y cada lugar donde puede establecerse.

Directivas

La CLI no lee directivas: se ejecuta sobre la salida del build, donde los comentarios ya no están, y rechaza directives.enabled. Usa un plugin de framework para aplicarlas. Consulta Directivas.

Casos límite

  • Sin source map, hay menos que ver. Sin un map que se pueda encontrar, el Protection Map no tiene código fuente original que mostrar y el informe de la ejecución queda escaso. Si tu build puede emitir maps (tsc --sourceMap, un flag del bundler), actívalos en el build que quieras inspeccionar y mantenlos fuera de tu versión publicada.
  • Nada específico de frameworks. AfterPack ve archivos.

Siguiente