# Складність

Єдиний регулятор, що стоїть за кожним пресетом: що зростає разом із числом, єдиний поріг, який перемикається на medium, і які трансформації конфігурація може вимкнути, але не може примусово ввімкнути.

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

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

## Що зростає разом із числом

Складність є бюджетом, а не розкладом. Немає фіксованого списку на кшталт «ця можливість при такому числі». Вище `0` рушій витрачає тим більший бюджет, чим вище значення, і для кожної збірки узгоджує, які трансформації застосувати. Тому дві збірки з однаковою складністю мають різну форму, і жодна окрема трансформація не гарантована на певному рівні. Саме в цій мінливості між збірками і полягає суть: чому фіксована структура була б відбитком, див. у розділі [як працює AfterPack](https://www.afterpack.dev/uk/docs/concepts).

Фіксовані лише три речі:

| `complexity` | Що гарантовано |
|---|---|
| `0` (`minify`) | Без обфускації. Ідентифікатори перейменовано, а код стиснуто; нічого з наведеного нижче не виконується. Рушій 0.2.2 на `0` також переписував синтаксис. |
| `> 0` | Кожен рядковий літерал, який рушій може переписати, проходить через декодер під час виконання: це [мінімум для рядків](https://www.afterpack.dev/uk/docs/presets#the-default-is-light). |
| `≥ 7` (`medium` і вище) | Закодовані рядки й цілі числа прив'язуються до спільного значення під час виконання, а об'єктні літерали перебудовуються в різних формах. |

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

## Вимкнення або ввімкнення трансформації

Будь-який вид трансформації можна вимкнути. Примусово ввімкнути його не можна.

- **Вимкнення надійне.** [`transforms.<kind>.enabled = false`](https://www.afterpack.dev/uk/docs/config) прибирає цей вид за будь-якої складності. Починаючи з рушія 0.2.3, вимкнення `scopeDeepen` на `7` і вище може залишити частину файлу нижче цільового значення, і тоді збірка завершується помилкою [`DIAG_TARGET_NOT_REACHED`](https://www.afterpack.dev/uk/docs/diagnostics#complete-reference) із переліком рядків.
- **Увімкнення є дозволом.** `true` дозволяє рушію використовувати вид; для кожної збірки він усе одно вирішує, чи потребують його складність і бюджет. Поза ділянкою, яку ви підвищили, єдині види, які застосовує збірка на `light`, це кодування рядків і, на Pro, `comparisonHardening`. `objectConstruction` з'являється лише на `7` (`medium`) і вище, а двом видам Pro потрібна збірка [Pro](https://www.afterpack.dev/uk/docs/pro).
- **На `0` нічого з цього не діє.** `minify` не виконує жодних трансформацій, тому кожен прапорець `transforms` не має значення.

Щоб зробити трансформацію ймовірнішою, підвищуйте `complexity`, а не перемикайте прапорець.

## Далі

- [Пресети](https://www.afterpack.dev/uk/docs/presets): іменовані рівні й бюджет розміру, який задає кожен із них.
- [Конфігурація](https://www.afterpack.dev/uk/docs/config): кожен ключ, зокрема прапорці `transforms.<kind>.enabled`.
- [Як працює AfterPack](https://www.afterpack.dev/uk/docs/concepts): чому набір трансформацій змінюється з кожною збіркою.
- [Директиви](https://www.afterpack.dev/uk/docs/directives): інша складність для однієї ділянки (Pro).
