# Complexity

हर preset के पीछे का एक ही dial: संख्या बढ़ने पर क्या बढ़ता है, वह एक threshold जो medium पर बदलता है, और कौन-से transformations config बंद कर सकती है पर ज़बरदस्ती चालू नहीं।

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

`complexity` वह एक dial है जो तय करता है कि engine कितनी सुरक्षा लागू करे। एक [preset](https://www.afterpack.dev/hi/docs/presets) इस पर एक नामित बिंदु है: `light` का मान `5` है, `hard` का `12`। `light` identifiers को rename करता है, syntax को दोबारा लिखता है और strings को encode करता है, बिना किसी संरचनात्मक layer के; `medium` और ऊपर, और सीधे सेट किए गए किसी भी मान के लिए, हर token को target की ओर ले जाया जाता है। बीच के या उससे आगे के मान के लिए [`complexity`](https://www.afterpack.dev/hi/docs/config#complexity) सीधे सेट करें — यह एक असीमित गैर-ऋणात्मक संख्या है।

## संख्या के साथ क्या बढ़ता है

Complexity एक budget है, कोई schedule नहीं। "इस संख्या पर यह feature" जैसी कोई निश्चित सूची नहीं है। `0` से ऊपर, मान बढ़ने के साथ engine बड़ा budget खर्च करता है और हर build में तय करता है कि कौन-से transformations लागू हों — इसलिए एक ही complexity पर दो builds की संरचना अलग होती है, और किसी दिए गए स्तर पर कोई एक transformation निश्चित नहीं है। हर build का यही अंतर असली मकसद है: निश्चित संरचना एक fingerprint क्यों बन जाती, यह जानने के लिए देखें [AfterPack कैसे काम करता है](https://www.afterpack.dev/hi/docs/concepts)।

तीन चीज़ें निश्चित हैं:

| `complexity` | क्या गारंटीड है |
|---|---|
| `0` (`minify`) | कोई obfuscation नहीं। Identifiers rename किए जाते हैं और code compress किया जाता है; नीचे का कुछ भी नहीं चलता। Engine 0.2.2 `0` पर syntax को भी दोबारा लिखता था। |
| `> 0` | हर string literal जिसे engine फिर से लिख सकता है, एक runtime decoder से होकर जाता है — यही [string floor](https://www.afterpack.dev/hi/docs/presets#the-default-is-light) है। |
| `≥ 7` (`medium` और ऊपर) | Encoded strings और integers एक साझा runtime value से keyed होते हैं, और object literals अलग-अलग आकारों में दोबारा बनाए जाते हैं। |

बाकी सब — control-flow reshaping, opaque predicates, integer-expression interpretation और अन्य — budget बढ़ने के साथ उसी से लिया जाता है, किसी एक रेखा पर चालू नहीं होता। [`inflation.max`](https://www.afterpack.dev/hi/docs/config#inflation-max) यह नहीं बदलता कि इनमें से कौन-से लागू हों: सेट न होने पर केवल target तय करता है, और जो build आपके सेट किए मान से आगे बढ़ती, वह विफल हो जाती है।

## किसी transformation को बंद या चालू करना

आप किसी भी तरह के transformation को बंद कर सकते हैं। किसी को ज़बरदस्ती चालू नहीं कर सकते।

- **बंद करना भरोसेमंद है।** [`transforms.<kind>.enabled = false`](https://www.afterpack.dev/hi/docs/config) उस kind को किसी भी complexity पर हटा देता है। Engine 0.2.3 से, `7` और ऊपर `scopeDeepen` बंद करने से फ़ाइल का कोई हिस्सा अपने target से नीचे रह सकता है, और तब build [`DIAG_TARGET_NOT_REACHED`](https://www.afterpack.dev/hi/docs/diagnostics#complete-reference) के साथ fail होती है और lines का नाम बताती है।
- **चालू करना एक अनुमति है।** `true` engine को एक kind इस्तेमाल करने देता है; फिर भी वह हर build में तय करता है कि complexity और budget को उसकी ज़रूरत है या नहीं। आपके द्वारा बढ़ाए गए region के बाहर, `light` build जो kinds लागू करती है, वे केवल string encoding और, Pro पर, `comparisonHardening` हैं। `objectConstruction` केवल `7` (`medium`) और ऊपर दिखता है, और दो Pro kinds के लिए [Pro](https://www.afterpack.dev/hi/docs/pro) build चाहिए।
- **`0` पर इनमें से कुछ भी लागू नहीं होता।** `minify` कोई transformation नहीं चलाता, इसलिए हर `transforms` flag बेमानी है।

किसी transformation की संभावना बढ़ाने के लिए, कोई flag बदलने के बजाय `complexity` बढ़ाएँ।

## आगे

- [Presets](https://www.afterpack.dev/hi/docs/presets): नामित स्तर और हर एक का तय किया size budget।
- [Configuration](https://www.afterpack.dev/hi/docs/config): हर key, `transforms.<kind>.enabled` flags समेत।
- [AfterPack कैसे काम करता है](https://www.afterpack.dev/hi/docs/concepts): transformations का set हर build में क्यों बदलता है।
- [Directives](https://www.afterpack.dev/hi/docs/directives): किसी एक region के लिए अलग complexity (Pro)।
