# Директиви обфускації за ділянками коду

Коментарі у вихідному коді, які змінюють захист AfterPack для коду, який вони позначають.

Source: https://www.afterpack.dev/uk/docs/directives

Директива — це коментар, який змінює захист AfterPack для коду, який вона позначає. Решта збірки зберігає [конфігурацію](https://www.afterpack.dev/uk/docs/config), задану для всієї програми. Директиви — це можливість тарифу [Pro](https://www.afterpack.dev/uk/docs/pro).

## Як написати директиву

Директива — це блоковий коментар, який починається з `@afterpack`. Якщо вона стоїть окремо на своєму рядку, то діє на все аж до парного `/* @afterpack end */`. Якщо після неї на тому ж рядку йде код, вона діє на решту цього рядка.

```js
/* @afterpack preset=hard */
function checkLicense(token) {
  return verifySignature(token, PUBLIC_KEY);
}
/* @afterpack end */

const apiKey = /* @afterpack preset=extreme */ "YOUR_SECRET";
```

Ключі — це імена з крапками зі сторінки [Конфігурація](https://www.afterpack.dev/uk/docs/config), розділені пробілами: `/* @afterpack preset=hard inflation.max=6 */`. Булевий ключ без значення означає `true`. Директиви діють лише на код, який вони обгортають: не на функції, які з нього викликаються, і не на імпорти.

## Що можна задати

Будь-який параметр, який застосовується до окремої ділянки. Кожен із них веде до свого визначення, а вкладка `directive` там показує точне написання.

- [`skip`](https://www.afterpack.dev/docs/config#skip) — directive only
- [`preset`](https://www.afterpack.dev/docs/config#preset)
- [`complexity`](https://www.afterpack.dev/docs/config#complexity)
- [`inflation.max`](https://www.afterpack.dev/docs/config#inflation-max)
- [`strings.encode`](https://www.afterpack.dev/docs/config#strings-encode)

Будь-який інший параметр у директиві ігнорується, і збірка повідомляє про це на рівні info. Невідомий ключ або некоректно записана директива — це помилка.

## Коли її використовувати

- Позначайте найважливіший код, наприклад перевірки ліцензії, логіку захисту від втручання або секрет, що потрапив у бандл, директивою `preset=extreme`. Решта програми залишається легшою та меншою.
- Позначайте код, який має залишатися читабельним або швидким, наприклад гарячий цикл або сторонній фрагмент, директивою `skip` або нижчим `preset`.

## Що позначати

| Актив | Директива | Навіщо |
| --- | --- | --- |
| Перевірки ліцензії та прав доступу | [`preset=hard`](https://www.afterpack.dev/uk/docs/config#preset) | Одного пропатченого біта досить, щоб віддати ваше програмне забезпечення. Поєднуйте з [`transforms.comparisonHardening.enabled`](https://www.afterpack.dev/uk/docs/best-practices#the-two-anti-tamper-transforms). |
| Валідатори платежів | `preset=hard` | Загрозою тут є втручання в код, а не лише його читання. |
| Логіка проти читів і ботів | `preset=hard` або `preset=extreme` | Підвищує вартість розробки читів і частоту, з якою її доводиться повторювати. У супротивника є час і мотив, тож поєднуйте з валідацією, де останнє слово за сервером. |
| Зашиті в код секрети, які не можна перенести на сервер | [`/* @afterpack preset=extreme */`](https://www.afterpack.dev/uk/docs/config#preset) у тому ж рядку, перед літералом | Найкраще прибрати їх повністю, але якісь завжди прослизають. `preset=extreme` робить відновлення дорогим, однак літерал усе ще присутній у результаті. Літерал, з яким ваш код порівнює значення, можна повністю прибрати з результату за допомогою [`transforms.comparisonHardening.enabled`](https://www.afterpack.dev/uk/docs/config#transforms-kind-enabled). Про секрет, який уже потрапив у реліз, читайте в розділі [Якщо ви випадково випустили секрет](https://www.afterpack.dev/uk/docs/best-practices#if-you-shipped-a-secret-by-accident). |
| Пропрієтарні алгоритми (ціноутворення, маршрутизація, обв'язка ML) | `/* @afterpack preset=extreme */ … /* @afterpack end */` навколо основної функції | Це ваш найцінніший код. Максимальна цільова складність і увімкнений нижній поріг для констант. |

Застосовуйте директиву в найменшій області, яка покриває актив. Позначення файлу на 500 рядків як `preset=extreme` роздуває весь бандл із незначною користю.

## Як перевірити, що було застосовано

[Protection Map](https://www.afterpack.dev/uk/docs/protection-map) показує кожну ділянку, створену директивою, і те, що було застосовано всередині неї. Директива, яку рушій прочитав, але яка не мала ефекту, з'являється в [діагностиці](https://www.afterpack.dev/uk/docs/diagnostics) збірки.

## Збірки Free

Локальна збірка застосовує одну конфігурацію до всієї програми. Директива, яка посилює захист, зупиняє збірку з помилкою, що вимагає ключ Pro ([`DIAG_PRO_DIRECTIVE_REQUIRES_KEY`](https://www.afterpack.dev/uk/docs/diagnostics#complete-reference)): `preset`, вищий за пресет програми, ненульове значення `complexity`, вище за цільове значення програми або на програмі з `light`, `inflation.max`, вищий за бюджет програми, чи `strings.encode=on`, коли floor рядків програми вимкнено. Будь-яка інша директива ігнорується, і її ділянка отримує конфігурацію програми, зокрема `skip`, нижчий `preset` або `complexity`, нижчий `inflation.max` і маски трансформацій (`transforms.only`, `transforms.deny`, `controlFlow.enabled=off`). [CLI](https://www.afterpack.dev/uk/docs/cli) не зчитує жодних директив на жодному з тарифів.
