Los límites de plan, los umbrales de cuota y las reglas de feature flags suelen acabar en el bundle de cliente, donde un competidor o un cliente puede leerlos directamente del archivo.
Tu tabla de precios se lee como una especificación en JavaScript sin ofuscar
Una tabla de precios, un mapa de cuotas y una lista de feature flags se leen como documentación de tu modelo comercial cuando están en JavaScript sin ofuscar. Cualquiera puede abrir el bundle y ver dónde cambian tus niveles, qué dispara una venta adicional y qué flags controlan qué funciones.
Una sola pasada de un agente de programación sobre ese bundle convierte valores sueltos en una especificación organizada. Esa especificación puede copiarse, esgrimirse en un ticket de soporte o usarse para esquivar un límite antes de que te des cuenta.
Valores codificados, estructura reescrita
Los literales de cadena se codifican con cualquier objetivo de complexity positivo, así que las tablas y los umbrales dejan de ser texto legible en el archivo que sirves. La estructura que los rodea también se reescribe. Un lector que analice la salida recupera un cálculo equivalente y tiene que reconstruir a partir de él qué significaban tus reglas.
La rotación es lo que impide que una copia recuperada siga siendo útil. Una semilla nueva en cada versión significa que lo que alguien reconstruyó la última vez describe un build que ya no sirves.
Sube el objetivo en el módulo que contiene tus reglas
Sube todo el bundle un peldaño en la escala de presets, o establece el objetivo directamente cuando la granularidad de un preset no encaje:
{
"preset": "medium",
"complexity": 40
}Para marcar solo el módulo que contiene tus reglas, usa una directiva. Las directivas tienen efecto en los builds Pro.
/* @afterpack preset=extreme */
export function resolveQuota(plan: Plan, usage: Usage): number {
return TIER_LIMITS[plan.tier] - usage.consumed;
}
/* @afterpack end */strings.leaks.max convierte "no ha sobrevivido ningún literal legible" en una puerta del build en lugar de algo que compruebas a ojo. Un fallo nombra DIAG_SURVIVING_READABLE_LITERAL y señala el literal que se coló.
Haz fallar el build cuando sobreviva un literal
Compila con --strings.leaks.max=0 en CI y trata un código de salida distinto de cero como un build fallido. Después abre el Protection Map y comprueba que el módulo de reglas está coloreado al nivel del objetivo que le fijaste.
Qué sigue siendo observable publiques lo que publiques
Rotar tu build hace que una copia extraída de tus reglas quede obsoleta en la siguiente versión, y esa es la parte que vale la pena. Aquí entran los valores que solo existen para leerse dentro del bundle; un precio que muestra tu UI o un límite que devuelve tu API es observable sea cual sea el aspecto del bundle, así que trata como público todo lo que muestra la página y aplica cada límite en el servidor.
Siguiente
- Modelo de amenaza: qué puede y qué no puede recuperar un lector estático.
- Presets: la escala completa y el objetivo de complejidad de cada nivel.
- Protection Map: confirma que el módulo de reglas recibió el tratamiento que configuraste.