# Як прибрати ліміти планів і правила ціноутворення з публічного бандла

Ліміти планів, пороги квот і правила фіче-флагів у клієнтському JavaScript читаються як специфікація вашої комерційної моделі. Як зробити їх нечитабельними і що однаково залишається видимим.

Source: https://www.afterpack.dev/uk/docs/use-cases/pricing-logic

Ліміти планів, пороги квот і правила фіче-флагів зазвичай потрапляють у клієнтський бандл, де конкурент або клієнт може прочитати їх прямо з файлу.

## У звичайному JavaScript ваша таблиця цін читається як специфікація

Таблиця цін, карта квот і список фіче-флагів у звичайному JavaScript читаються як документація вашої комерційної моделі. Будь-хто може відкрити бандл і побачити, де проходять межі ваших тарифів, що запускає пропозицію апгрейду і які флаги відкривають які функції.

Один прохід AI-агента для програмування по такому бандлу перетворює розрізнені значення на впорядковану специфікацію. Цю специфікацію можна скопіювати, використати як аргумент у зверненні до підтримки або обійти з її допомогою ліміт ще до того, як ви щось помітите.

## Закодовані значення, переписана структура

Рядкові літерали кодуються за будь-якої додатної цілі [`complexity`](https://www.afterpack.dev/uk/docs/config#complexity), тож назви планів, ключі прапорців і повідомлення більше не є читабельним текстом у файлі, який ви віддаєте. Числа на `light` лишаються читабельними: таблиця цін чи поріг квоти читаються як звичайні цифри. Починаючи з `medium`, більшість цілих чисел кодується, а структуру навколо них теж переписано. Читач, який розбере результат, отримає еквівалентне обчислення і муситиме відтворити з нього, що означали ваші правила.

Саме ротація не дає відновленій копії залишатися корисною. Новий [сід](https://www.afterpack.dev/uk/docs/config#seed) на кожному релізі означає, що все, що хтось реконструював минулого разу, описує збірку, яку ви вже не роздаєте.

## Підвищте цільове значення для модуля з вашими правилами

Підніміть увесь бандл за шкалою [пресетів](https://www.afterpack.dev/uk/docs/presets) або задайте цільове значення напряму, коли точність пресету не підходить. Обидва способи в рази збільшують час запуску сторінки ([ціна завантаження](https://www.afterpack.dev/uk/docs/presets#load-cost)), тож спершу виміряйте свої сторінки:

```json
{
  "preset": "medium",
  "complexity": 40
}
```

Щоб позначити лише модуль із вашими правилами, використайте директиву. [Директиви](https://www.afterpack.dev/uk/docs/directives) діють у збірках [Pro](https://www.afterpack.dev/uk/docs/tiers).

```ts
/* @afterpack preset=extreme */
export function resolveQuota(plan: Plan, usage: Usage): number {
  return TIER_LIMITS[plan.tier] - usage.consumed;
}
/* @afterpack end */
```

[`strings.leaks.max`](https://www.afterpack.dev/uk/docs/config#strings-leaks-max) перетворює «жоден читабельний літерал не вцілів» на ворота збірки замість того, що ви перевіряєте на око. Помилка називає [`DIAG_SURVIVING_READABLE_LITERAL`](https://www.afterpack.dev/uk/docs/diagnostics) і вказує на літерал, що проскочив.

## Зупиняйте збірку, коли літерал уцілів

У CI збирайте з [`--strings.leaks.max=0`](https://www.afterpack.dev/uk/docs/config#strings-leaks-max) і вважайте ненульовий код виходу невдалою збіркою. Потім відкрийте [Protection Map](https://www.afterpack.dev/uk/docs/protection-map) і перевірте, що модуль із правилами розфарбовано відповідно до заданого для нього цільового значення.

## Що залишається видимим, хоч би що ви випускали

Ротація збірки робить витягнуту копію ваших правил застарілою з наступним релізом, і саме це варто мати. Тут ідеться про значення, які існують лише для того, щоб їх читали всередині бандла; ціна, яку показує ваш інтерфейс, або ліміт, який повертає ваш API, видимі незалежно від того, як виглядає бандл, тож вважайте все, що показує сторінка, публічним і забезпечуйте кожен ліміт на сервері.

## Далі

- [Модель загроз](https://www.afterpack.dev/uk/docs/threat-model): що статичний читач може і чого не може відновити.
- [Пресети](https://www.afterpack.dev/uk/docs/presets): повна драбина і цільова складність кожного рівня.
- [Protection Map](https://www.afterpack.dev/uk/docs/protection-map): переконайтеся, що модуль із правилами отримав налаштований вами захист.
