[{"data":1,"prerenderedAt":12554},["ShallowReactive",2],{"navigation_docs":3,"-web-development-nestjs-controllers-routing-redirects":5074,"-web-development-nestjs-controllers-routing-redirects-surround":12549},[4,1707,2040,2512,2693,2819,3026,3148,3198,3255,3289,3415,3492,3506,3645,3939,4016,4749,4924,5017,5070],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","\u002Fcsharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1364,1654,1703],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","\u002Fcsharp\u002Ffundamentals","01.csharp\u002F01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","\u002Fcsharp\u002Ffundamentals\u002Fintroduction-to-ecosystem","01.csharp\u002F01.fundamentals\u002F01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","\u002Fcsharp\u002Ffundamentals\u002Fprogram-structure","01.csharp\u002F01.fundamentals\u002F02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","\u002Fcsharp\u002Ffundamentals\u002Fvariables-data-types","01.csharp\u002F01.fundamentals\u002F03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","\u002Fcsharp\u002Ffundamentals\u002Farrays","01.csharp\u002F01.fundamentals\u002F04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","\u002Fcsharp\u002Ffundamentals\u002Fstrings-text-handling","01.csharp\u002F01.fundamentals\u002F05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","\u002Fcsharp\u002Ffundamentals\u002Fdates-time-handling","01.csharp\u002F01.fundamentals\u002F06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","\u002Fcsharp\u002Ffundamentals\u002Fcontrol-flow","01.csharp\u002F01.fundamentals\u002F07.control-flow",{"title":48,"path":49,"stem":50},"Методи","\u002Fcsharp\u002Ffundamentals\u002Fmethods","01.csharp\u002F01.fundamentals\u002F08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","\u002Fcsharp\u002Ffundamentals\u002Fdebugging-basics","01.csharp\u002F01.fundamentals\u002F09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","\u002Fcsharp\u002Ffundamentals\u002Finteractive-console","01.csharp\u002F01.fundamentals\u002F10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","\u002Fcsharp\u002Foop","01.csharp\u002F02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","\u002Fcsharp\u002Foop\u002Fpackage-management","01.csharp\u002F02.oop\u002F01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","\u002Fcsharp\u002Foop\u002Fclasses-objects","01.csharp\u002F02.oop\u002F02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","\u002Fcsharp\u002Foop\u002Fproperties-fields","01.csharp\u002F02.oop\u002F03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","\u002Fcsharp\u002Foop\u002Foop-pillars","01.csharp\u002F02.oop\u002F04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","\u002Fcsharp\u002Foop\u002Fadvanced-types","01.csharp\u002F02.oop\u002F05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","\u002Fcsharp\u002Foop\u002Fnamespaces","01.csharp\u002F02.oop\u002F06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","\u002Fcsharp\u002Fadvanced-core","01.csharp\u002F03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","\u002Fcsharp\u002Fadvanced-core\u002Fgenerics","01.csharp\u002F03.advanced-core\u002F01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","\u002Fcsharp\u002Fadvanced-core\u002Fdelegates-events-lambdas","01.csharp\u002F03.advanced-core\u002F02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","\u002Fcsharp\u002Fadvanced-core\u002Finterfaces-deep-dive","01.csharp\u002F03.advanced-core\u002F03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","\u002Fcsharp\u002Fadvanced-core\u002Fexception-handling","01.csharp\u002F03.advanced-core\u002F04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","\u002Fcsharp\u002Fadvanced-core\u002Fpattern-matching","01.csharp\u002F03.advanced-core\u002F05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","\u002Fcsharp\u002Fadvanced-core\u002Fadditional-features","01.csharp\u002F03.advanced-core\u002F06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","\u002Fcsharp\u002Farchitecture-best-practices","01.csharp\u002F04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fsoftware-design-principles","01.csharp\u002F04.architecture-best-practices\u002F01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fsingleton","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fbuilder","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","\u002Fcsharp\u002Farchitecture-best-practices\u002Fbuilding-professional-clis","01.csharp\u002F04.architecture-best-practices\u002F03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","\u002Fcsharp\u002Farchitecture-best-practices\u002Fvalidation-flow-control","01.csharp\u002F04.architecture-best-practices\u002F04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fmodern-dotnet-host","01.csharp\u002F04.architecture-best-practices\u002F05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part1","01.csharp\u002F04.architecture-best-practices\u002F06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part2","01.csharp\u002F04.architecture-best-practices\u002F07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fthe-dependency-problem","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fbuild-your-own-container","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-locator-pattern","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdependency-injection-patterns","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fmicrosoft-di-deep-dive","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-lifetimes-and-scopes","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdi-anti-patterns-and-best-practices","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","\u002Fcsharp\u002Fstandard-library","01.csharp\u002F05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","\u002Fcsharp\u002Fstandard-library\u002Fcollections","01.csharp\u002F05.standard-library\u002F01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","\u002Fcsharp\u002Fstandard-library\u002Fhigh-performance-types","01.csharp\u002F05.standard-library\u002F02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","\u002Fcsharp\u002Fstandard-library\u002Flinq","01.csharp\u002F05.standard-library\u002F03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","\u002Fcsharp\u002Fsystem-internals-concurrency","01.csharp\u002F06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmemory-management","01.csharp\u002F06.system-internals-concurrency\u002F01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Freflection-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fattributes-dynamic","01.csharp\u002F06.system-internals-concurrency\u002F03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fexpression-trees-compiled","01.csharp\u002F06.system-internals-concurrency\u002F04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsource-generators","01.csharp\u002F06.system-internals-concurrency\u002F05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmultithreading-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsynchronization-primitives","01.csharp\u002F06.system-internals-concurrency\u002F07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","\u002Fcsharp\u002Fsystem-programming-windows","01.csharp\u002F07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","\u002Fcsharp\u002Fsystem-programming-windows\u002Fhow-os-works","01.csharp\u002F07.system-programming-windows\u002F01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","\u002Fcsharp\u002Fsystem-programming-windows\u002Fprocesses-in-dotnet","01.csharp\u002F07.system-programming-windows\u002F02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","\u002Fcsharp\u002Fsystem-programming-windows\u002F02a.processes-ipc","01.csharp\u002F07.system-programming-windows\u002F02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","\u002Fcsharp\u002Fsystem-programming-windows\u002Fappdomains-assemblies","01.csharp\u002F07.system-programming-windows\u002F03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","\u002Fcsharp\u002Fsystem-programming-windows\u002F03a.appdomains-plugin-system","01.csharp\u002F07.system-programming-windows\u002F03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-fundamentals","01.csharp\u002F07.system-programming-windows\u002F04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","\u002Fcsharp\u002Fsystem-programming-windows\u002F04a.thread-lifecycle-priorities","01.csharp\u002F07.system-programming-windows\u002F04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","\u002Fcsharp\u002Fsystem-programming-windows\u002Fshared-state-problems","01.csharp\u002F07.system-programming-windows\u002F05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","\u002Fcsharp\u002Fsystem-programming-windows\u002F05a.shared-state-memory-model","01.csharp\u002F07.system-programming-windows\u002F05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-fundamentals","01.csharp\u002F07.system-programming-windows\u002F06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","\u002Fcsharp\u002Fsystem-programming-windows\u002F06a.synchronization-walkthrough","01.csharp\u002F07.system-programming-windows\u002F06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-advanced","01.csharp\u002F07.system-programming-windows\u002F07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002F07a.synchronization-advanced-walkthrough","01.csharp\u002F07.system-programming-windows\u002F07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002Finterlocked-cas-lockfree","01.csharp\u002F07.system-programming-windows\u002F08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","\u002Fcsharp\u002Fsystem-programming-windows\u002F08a.volatile-memory-model","01.csharp\u002F07.system-programming-windows\u002F08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-pool","01.csharp\u002F07.system-programming-windows\u002F09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","\u002Fcsharp\u002Fsystem-programming-windows\u002F09a.thread-pool-advanced","01.csharp\u002F07.system-programming-windows\u002F09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","\u002Fcsharp\u002Fsystem-programming-windows\u002Fconcurrent-collections","01.csharp\u002F07.system-programming-windows\u002F10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","\u002Fcsharp\u002Fsystem-programming-windows\u002Ftpl-parallel-plinq","01.csharp\u002F07.system-programming-windows\u002F11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","\u002Fcsharp\u002Fsystem-programming-windows\u002F11a.tpl-parallel-plinq-advanced","01.csharp\u002F07.system-programming-windows\u002F11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async\u002FAwait — Фундамент Асинхронного Програмування","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-fundamentals","01.csharp\u002F07.system-programming-windows\u002F12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-context-configureawait","01.csharp\u002F07.system-programming-windows\u002F13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-advanced","01.csharp\u002F07.system-programming-windows\u002F14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","\u002Fcsharp\u002Fsystem-programming-windows\u002Fchannels","01.csharp\u002F07.system-programming-windows\u002F15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-synchronization","01.csharp\u002F07.system-programming-windows\u002F16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","\u002Fcsharp\u002Fsystem-programming-windows\u002Funsafe-code","01.csharp\u002F07.system-programming-windows\u002F17.unsafe-code",{"title":364,"path":365,"stem":366},"P\u002FInvoke та Windows API — Міст між .NET та Native Code","\u002Fcsharp\u002Fsystem-programming-windows\u002Fpinvoke-winapi","01.csharp\u002F07.system-programming-windows\u002F18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-registry","01.csharp\u002F07.system-programming-windows\u002F19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-hooks-services","01.csharp\u002F07.system-programming-windows\u002F20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","\u002Fcsharp\u002Fsystem-programming-windows\u002Fimplementation_plan","01.csharp\u002F07.system-programming-windows\u002Fimplementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","\u002Fcsharp\u002Fio","01.csharp\u002F08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","\u002Fcsharp\u002Fio\u002Ffile-system-basics","01.csharp\u002F08.io\u002F01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","\u002Fcsharp\u002Fio\u002Fstreams-serialization","01.csharp\u002F08.io\u002F02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","\u002Fcsharp\u002Fio\u002Fjson-serialization","01.csharp\u002F08.io\u002F03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","\u002Fcsharp\u002Fio\u002Fxml-serialization","01.csharp\u002F08.io\u002F04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","\u002Fcsharp\u002Fio\u002Fbinary-serialization","01.csharp\u002F08.io\u002F05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","\u002Fcsharp\u002Fado-net","01.csharp\u002F09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","\u002Fcsharp\u002Fado-net\u002Fintroduction-to-adonet","01.csharp\u002F09.ado-net\u002F01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","\u002Fcsharp\u002Fado-net\u002Fconnection","01.csharp\u002F09.ado-net\u002F02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","\u002Fcsharp\u002Fado-net\u002Fcommand-and-queries","01.csharp\u002F09.ado-net\u002F03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","\u002Fcsharp\u002Fado-net\u002Fdatareader","01.csharp\u002F09.ado-net\u002F04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","\u002Fcsharp\u002Fado-net\u002Fparameters-and-sql-injection","01.csharp\u002F09.ado-net\u002F05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","\u002Fcsharp\u002Fado-net\u002Ftransactions","01.csharp\u002F09.ado-net\u002F06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","\u002Fcsharp\u002Fado-net\u002Fprovider-factory","01.csharp\u002F09.ado-net\u002F07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","\u002Fcsharp\u002Fado-net\u002Fasync-data-access","01.csharp\u002F09.ado-net\u002F08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","\u002Fcsharp\u002Fado-net\u002Fdisconnected-mode-dataset","01.csharp\u002F09.ado-net\u002F09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","\u002Fcsharp\u002Fado-net\u002Fdata-adapter","01.csharp\u002F09.ado-net\u002F10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","\u002Fcsharp\u002Fado-net\u002Fdata-mapper-repository","01.csharp\u002F09.ado-net\u002F11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","\u002Fcsharp\u002Fado-net\u002Fadvanced-patterns","01.csharp\u002F09.ado-net\u002F12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","\u002Fcsharp\u002Fef-core","01.csharp\u002F10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","\u002Fcsharp\u002Fef-core\u002Fwhat-is-orm","01.csharp\u002F10.ef-core\u002F01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","\u002Fcsharp\u002Fef-core\u002Ffirst-project","01.csharp\u002F10.ef-core\u002F02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","\u002Fcsharp\u002Fef-core\u002Fdbcontext-deep-dive","01.csharp\u002F10.ef-core\u002F03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","\u002Fcsharp\u002Fef-core\u002Fdatabase-providers","01.csharp\u002F10.ef-core\u002F04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","\u002Fcsharp\u002Fef-core\u002Fconventions","01.csharp\u002F10.ef-core\u002F05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","\u002Fcsharp\u002Fef-core\u002Ffluent-api-vs-annotations","01.csharp\u002F10.ef-core\u002F06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","\u002Fcsharp\u002Fef-core\u002Frelationships-basics","01.csharp\u002F10.ef-core\u002F07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","\u002Fcsharp\u002Fef-core\u002Frelationships-advanced","01.csharp\u002F10.ef-core\u002F08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part1","01.csharp\u002F10.ef-core\u002F09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part2","01.csharp\u002F10.ef-core\u002F09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part1","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part2","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part1","01.csharp\u002F10.ef-core\u002F11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part2","01.csharp\u002F10.ef-core\u002F11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finheritance-part1","01.csharp\u002F10.ef-core\u002F12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finheritance-part2","01.csharp\u002F10.ef-core\u002F12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part1","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part2","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fseeding-part1","01.csharp\u002F10.ef-core\u002F14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fseeding-part2","01.csharp\u002F10.ef-core\u002F14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part1","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part2","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part1","01.csharp\u002F10.ef-core\u002F16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part2","01.csharp\u002F10.ef-core\u002F16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part1","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part2","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part1","01.csharp\u002F10.ef-core\u002F18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part2","01.csharp\u002F10.ef-core\u002F18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part1","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part2","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part1","01.csharp\u002F10.ef-core\u002F20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part2","01.csharp\u002F10.ef-core\u002F20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part1","01.csharp\u002F10.ef-core\u002F21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part2","01.csharp\u002F10.ef-core\u002F21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part1","01.csharp\u002F10.ef-core\u002F22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part2","01.csharp\u002F10.ef-core\u002F22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part1","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part2","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part1","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part2","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part1","01.csharp\u002F10.ef-core\u002F25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part2","01.csharp\u002F10.ef-core\u002F25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fperformance-fundamentals-part1","01.csharp\u002F10.ef-core\u002F26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part1","01.csharp\u002F10.ef-core\u002F29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part2","01.csharp\u002F10.ef-core\u002F29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","\u002Fcsharp\u002Fef-core\u002Fimplementation_plan","01.csharp\u002F10.ef-core\u002Fimplementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","\u002Fcsharp\u002Faspnet","01.csharp\u002F11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289,1346],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","\u002Fcsharp\u002Faspnet\u002Fminimal-api","01.csharp\u002F11.aspnet\u002F01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fintroduction","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Ffirst-application","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fwebapplication-builder","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frequest-pipeline-middleware","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-files","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-assets","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-fundamentals","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-options","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstate-management","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fsession-state","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fproject-structure","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fscalar-openapi-fluent","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger \u002F Swashbuckle у Minimal API: окремий класичний шлях","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fswagger-swashbuckle","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","\u002Fcsharp\u002Faspnet\u002Fapi","01.csharp\u002F11.aspnet\u002F02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fwhat-is-api","01.csharp\u002F11.aspnet\u002F02.api\u002F01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fdata-formats","01.csharp\u002F11.aspnet\u002F02.api\u002F02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-paradigms-rest","01.csharp\u002F11.aspnet\u002F02.api\u002F03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fhttp-methods-status-codes","01.csharp\u002F11.aspnet\u002F02.api\u002F04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Frest-organizing","01.csharp\u002F11.aspnet\u002F02.api\u002F05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","\u002Fcsharp\u002Faspnet\u002Fapi\u002Furl-nomenclature-crud","01.csharp\u002F11.aspnet\u002F02.api\u002F06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-naming","01.csharp\u002F11.aspnet\u002F02.api\u002F07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-validation","01.csharp\u002F11.aspnet\u002F02.api\u002F08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Ferror-handling-http","01.csharp\u002F11.aspnet\u002F02.api\u002F09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fidempotency-sync","01.csharp\u002F11.aspnet\u002F02.api\u002F10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fpagination-lists","01.csharp\u002F11.aspnet\u002F02.api\u002F11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fsecurity-auth","01.csharp\u002F11.aspnet\u002F02.api\u002F12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-process","01.csharp\u002F11.aspnet\u002F02.api\u002F13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fopenapi","01.csharp\u002F11.aspnet\u002F02.api\u002F14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","\u002Fcsharp\u002Faspnet\u002Fauth","01.csharp\u002F11.aspnet\u002F03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauth-fundamentals","01.csharp\u002F11.aspnet\u002F03.auth\u002F01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fjwt-authentication","01.csharp\u002F11.aspnet\u002F03.auth\u002F02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauthorization-policies","01.csharp\u002F11.aspnet\u002F03.auth\u002F03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcookie-auth-identity","01.csharp\u002F11.aspnet\u002F03.auth\u002F04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","\u002Fcsharp\u002Faspnet\u002Fauth\u002F04b.identity-auth-jwt","01.csharp\u002F11.aspnet\u002F03.auth\u002F04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-email-confirmation","01.csharp\u002F11.aspnet\u002F03.auth\u002F05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-two-factor","01.csharp\u002F11.aspnet\u002F03.auth\u002F06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-internals","01.csharp\u002F11.aspnet\u002F03.auth\u002F07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-external-providers","01.csharp\u002F11.aspnet\u002F03.auth\u002F08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fsecurity-hardening","01.csharp\u002F11.aspnet\u002F03.auth\u002F09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-theory","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foidc-keycloak","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fapi-keys","01.csharp\u002F11.aspnet\u002F03.auth\u002F11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frate-limiting","01.csharp\u002F11.aspnet\u002F03.auth\u002F12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frefresh-token-rotation","01.csharp\u002F11.aspnet\u002F03.auth\u002F13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcertificate-auth","01.csharp\u002F11.aspnet\u002F03.auth\u002F14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frbac-abac-rebac","01.csharp\u002F11.aspnet\u002F03.auth\u002F15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fmulti-tenancy","01.csharp\u002F11.aspnet\u002F03.auth\u002F16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","\u002Fcsharp\u002Faspnet\u002Fnotifications","01.csharp\u002F11.aspnet\u002F04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fin-app-database-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fpolling","01.csharp\u002F11.aspnet\u002F04.notifications\u002F02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fserver-sent-events","01.csharp\u002F11.aspnet\u002F04.notifications\u002F03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fwebsockets","01.csharp\u002F11.aspnet\u002F04.notifications\u002F04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fsignalr","01.csharp\u002F11.aspnet\u002F04.notifications\u002F05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fbackground-services","01.csharp\u002F11.aspnet\u002F04.notifications\u002F06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fweb-push","01.csharp\u002F11.aspnet\u002F04.notifications\u002F07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Femail-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fchoosing-the-right-approach","01.csharp\u002F11.aspnet\u002F04.notifications\u002F09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire","01.csharp\u002F11.aspnet\u002F04.notifications\u002F10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-image-webp","01.csharp\u002F11.aspnet\u002F04.notifications\u002F11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-video-hls","01.csharp\u002F11.aspnet\u002F04.notifications\u002F12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Ftelegram-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","\u002Fcsharp\u002Faspnet\u002Fi18n","01.csharp\u002F11.aspnet\u002F05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Finternationalization","01.csharp\u002F11.aspnet\u002F05.i18n\u002F01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Fhumanizer","01.csharp\u002F11.aspnet\u002F05.i18n\u002F02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","\u002Fcsharp\u002Faspnet\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching\u002F01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fmemory-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fdistributed-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fresponse-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Foutput-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","\u002Fcsharp\u002Faspnet\u002Ftesting","01.csharp\u002F11.aspnet\u002F07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-is-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-pyramid","01.csharp\u002F11.aspnet\u002F07.testing\u002F02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-schools","01.csharp\u002F11.aspnet\u002F07.testing\u002F03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftdd-and-bdd","01.csharp\u002F11.aspnet\u002F07.testing\u002F04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-to-test","01.csharp\u002F11.aspnet\u002F07.testing\u002F05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftest-frameworks","01.csharp\u002F11.aspnet\u002F07.testing\u002F06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-basics","01.csharp\u002F11.aspnet\u002F07.testing\u002F07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fmocking-with-moq","01.csharp\u002F11.aspnet\u002F07.testing\u002F09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fdatabase-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","\u002Fcsharp\u002Faspnet\u002Ftesting\u002F11a.integration-testing-practice","01.csharp\u002F11.aspnet\u002F07.testing\u002F11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fpostman-professional","01.csharp\u002F11.aspnet\u002F07.testing\u002F13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fhttpclient-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwiremock-net","01.csharp\u002F11.aspnet\u002F07.testing\u002F15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-patterns","01.csharp\u002F11.aspnet\u002F07.testing\u002F16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fadvanced-testing-tools","01.csharp\u002F11.aspnet\u002F07.testing\u002F17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Farchitecture-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fperformance-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fremaining_plan","01.csharp\u002F11.aspnet\u002F07.testing\u002Fremaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","\u002Fcsharp\u002Faspnet\u002Fpayments","01.csharp\u002F11.aspnet\u002F08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-fundamentals","01.csharp\u002F11.aspnet\u002F08.payments\u002F01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-methods-ukraine","01.csharp\u002F11.aspnet\u002F08.payments\u002F02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpci-dss-security","01.csharp\u002F11.aspnet\u002F08.payments\u002F03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-architecture","01.csharp\u002F11.aspnet\u002F08.payments\u002F04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fliqpay-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fmonobank-acquiring","01.csharp\u002F11.aspnet\u002F08.payments\u002F06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fstripe-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fwebhooks-deep-dive","01.csharp\u002F11.aspnet\u002F08.payments\u002F08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fsubscriptions-recurring","01.csharp\u002F11.aspnet\u002F08.payments\u002F09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Frefunds-disputes","01.csharp\u002F11.aspnet\u002F08.payments\u002F10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Ftesting-payments","01.csharp\u002F11.aspnet\u002F08.payments\u002F11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fproduction-checklist","01.csharp\u002F11.aspnet\u002F08.payments\u002F12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","\u002Fcsharp\u002Faspnet\u002Flibraries","01.csharp\u002F11.aspnet\u002F09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-validation","01.csharp\u002F11.aspnet\u002F09.libraries\u002F01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmapster","01.csharp\u002F11.aspnet\u002F09.libraries\u002F02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ferroror-result-pattern","01.csharp\u002F11.aspnet\u002F09.libraries\u002F03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fserilog","01.csharp\u002F11.aspnet\u002F09.libraries\u002F04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmediatr","01.csharp\u002F11.aspnet\u002F09.libraries\u002F05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fpolly","01.csharp\u002F11.aspnet\u002F09.libraries\u002F06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F09.libraries\u002F07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffeature-management","01.csharp\u002F11.aspnet\u002F09.libraries\u002F08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-email","01.csharp\u002F11.aspnet\u002F09.libraries\u002F09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fquest-pdf","01.csharp\u002F11.aspnet\u002F09.libraries\u002F10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fbogus","01.csharp\u002F11.aspnet\u002F09.libraries\u002F11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhumanizer-guard","01.csharp\u002F11.aspnet\u002F09.libraries\u002F12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fplan","01.csharp\u002F11.aspnet\u002F09.libraries\u002Fplan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","\u002Fcsharp\u002Faspnet\u002Frazor-pages","01.csharp\u002F11.aspnet\u002F10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ffrom-minimal-api","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fpage-model","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Frazor-syntax","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ftag-helpers","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fforms-validation","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fproject-task-manager","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc","01.csharp\u002F11.aspnet\u002F11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-pattern","01.csharp\u002F11.aspnet\u002F11.mvc\u002F01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffrom-razor-pages","01.csharp\u002F11.aspnet\u002F11.mvc\u002F02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fcontrollers-actions","01.csharp\u002F11.aspnet\u002F11.mvc\u002F03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Frouting-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmodel-binding","01.csharp\u002F11.aspnet\u002F11.mvc\u002F05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fviews-viewdata-tempdata","01.csharp\u002F11.aspnet\u002F11.mvc\u002F06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffilters","01.csharp\u002F11.aspnet\u002F11.mvc\u002F07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fareas","01.csharp\u002F11.aspnet\u002F11.mvc\u002F08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fview-components","01.csharp\u002F11.aspnet\u002F11.mvc\u002F09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fdisplay-editor-templates","01.csharp\u002F11.aspnet\u002F11.mvc\u002F10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fvalidation-advanced","01.csharp\u002F11.aspnet\u002F11.mvc\u002F11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx","01.csharp\u002F11.aspnet\u002F11.mvc\u002F12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fajax-htmx-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffile-upload","01.csharp\u002F11.aspnet\u002F11.mvc\u002F15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fglobalization-localization","01.csharp\u002F11.aspnet\u002F11.mvc\u002F16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fplan","01.csharp\u002F11.aspnet\u002F11.mvc\u002Fplan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","\u002Fcsharp\u002Faspnet\u002Fweb-api","01.csharp\u002F11.aspnet\u002F12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffrom-minimal-api-to-controllers","01.csharp\u002F11.aspnet\u002F12.web-api\u002F01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontroller-base-actionresult","01.csharp\u002F11.aspnet\u002F12.web-api\u002F02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontent-negotiation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-versioning","01.csharp\u002F11.aspnet\u002F12.web-api\u002F04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fproblemdetails-error-handling","01.csharp\u002F11.aspnet\u002F12.web-api\u002F05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffilters-for-api","01.csharp\u002F11.aspnet\u002F12.web-api\u002F06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fpagination-filtering-sorting","01.csharp\u002F11.aspnet\u002F12.web-api\u002F07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhateoas-resource-expansion","01.csharp\u002F11.aspnet\u002F12.web-api\u002F08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fminimal-api-vs-controllers-hybrid","01.csharp\u002F11.aspnet\u002F12.web-api\u002F09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-documentation-generation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhealth-checks-monitoring","01.csharp\u002F11.aspnet\u002F12.web-api\u002F11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fweb-api-project","01.csharp\u002F11.aspnet\u002F12.web-api\u002F12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fplan","01.csharp\u002F11.aspnet\u002F12.web-api\u002Fplan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Моніторинг","i-lucide-activity","\u002Fcsharp\u002Faspnet\u002Fmonitoring","01.csharp\u002F11.aspnet\u002F13.monitoring",[1352,1356,1360],{"title":1353,"path":1354,"stem":1355},"Спостережуваність: від console.log до production-систем","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fobservability-intro","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F01.observability-intro",{"title":1357,"path":1358,"stem":1359},"Health Checks: перший рівень observability","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F02.health-checks",{"title":1361,"path":1362,"stem":1363},"Вбудовані метрики .NET 10 та System.Diagnostics.Metrics","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fdotnet-metrics","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F03.dotnet-metrics",{"title":1365,"icon":1366,"path":1367,"stem":1368,"children":1369,"page":59},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1490,1494,1498,1502,1506,1510,1514,1518,1522,1526,1530,1534,1538,1542,1546,1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1650],{"title":1371,"path":1372,"stem":1373},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1375,"path":1376,"stem":1377},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1379,"path":1380,"stem":1381},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1383,"path":1384,"stem":1385},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1387,"path":1388,"stem":1389},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1391,"path":1392,"stem":1393},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1395,"path":1396,"stem":1397},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1399,"path":1400,"stem":1401},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1403,"path":1404,"stem":1405},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1407,"path":1408,"stem":1409},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1411,"path":1412,"stem":1413},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1415,"path":1416,"stem":1417},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1419,"path":1420,"stem":1421},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1423,"path":1424,"stem":1425},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1427,"path":1428,"stem":1429},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1431,"path":1432,"stem":1433},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1435,"path":1436,"stem":1437},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1439,"path":1440,"stem":1441},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1443,"path":1444,"stem":1445},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1447,"path":1448,"stem":1449},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1451,"path":1452,"stem":1453},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1455,"path":1456,"stem":1457},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1459,"path":1460,"stem":1461},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1463,"path":1464,"stem":1465},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1467,"path":1468,"stem":1469},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1471,"path":1472,"stem":1473},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1475,"path":1476,"stem":1477},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1479,"path":1480,"stem":1481},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1483,"path":1484,"stem":1485},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1487,"path":1488,"stem":1489},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1491,"path":1492,"stem":1493},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1495,"path":1496,"stem":1497},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1499,"path":1500,"stem":1501},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1503,"path":1504,"stem":1505},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1507,"path":1508,"stem":1509},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1511,"path":1512,"stem":1513},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1515,"path":1516,"stem":1517},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1519,"path":1520,"stem":1521},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1523,"path":1524,"stem":1525},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1527,"path":1528,"stem":1529},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1531,"path":1532,"stem":1533},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1535,"path":1536,"stem":1537},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1539,"path":1540,"stem":1541},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1543,"path":1544,"stem":1545},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1547,"path":1548,"stem":1549},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1551,"path":1552,"stem":1553},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1555,"path":1556,"stem":1557},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1559,"path":1560,"stem":1561},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1563,"path":1564,"stem":1565},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1567,"path":1568,"stem":1569},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1571,"path":1572,"stem":1573},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1575,"path":1576,"stem":1577},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1579,"path":1580,"stem":1581},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1583,"path":1584,"stem":1585},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1587,"path":1588,"stem":1589},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1591,"path":1592,"stem":1593},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1595,"path":1596,"stem":1597},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1599,"path":1600,"stem":1601},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1603,"path":1604,"stem":1605},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1607,"path":1608,"stem":1609},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1611,"path":1612,"stem":1613},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1615,"path":1616,"stem":1617},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1619,"path":1620,"stem":1621},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1623,"path":1624,"stem":1625},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1627,"path":1628,"stem":1629},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1631,"path":1632,"stem":1633},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1635,"path":1636,"stem":1637},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1639,"path":1640,"stem":1641},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1643,"path":1644,"stem":1645},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1647,"path":1648,"stem":1649},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1651,"path":1652,"stem":1653},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1655,"icon":658,"path":1656,"stem":1657,"children":1658,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699],{"title":1660,"path":1661,"stem":1662},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1664,"path":1665,"stem":1666},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1668,"path":1669,"stem":1670},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1672,"path":1673,"stem":1674},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1676,"path":1677,"stem":1678},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1680,"path":1681,"stem":1682},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1684,"path":1685,"stem":1686},"HttpListener — вбудований HTTP-сервер .NET","\u002Fcsharp\u002Fnetwork-programming\u002F07a.http-listener","01.csharp\u002F13.network-programming\u002F07a.http-listener",{"title":1688,"path":1689,"stem":1690},"HTTP Advanced — cookies, аутентифікація та HTTPS","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-advanced","01.csharp\u002F13.network-programming\u002F08.http-advanced",{"title":1692,"path":1693,"stem":1694},"SMTP та протоколи електронної пошти","\u002Fcsharp\u002Fnetwork-programming\u002Fsmtp","01.csharp\u002F13.network-programming\u002F09.smtp",{"title":1696,"path":1697,"stem":1698},"WebSocket — повнодуплексний протокол реального часу","\u002Fcsharp\u002Fnetwork-programming\u002Fwebsockets","01.csharp\u002F13.network-programming\u002F10.websockets",{"title":1700,"path":1701,"stem":1702},"TLS\u002FSSL — криптографічний захист мережевих з'єднань","\u002Fcsharp\u002Fnetwork-programming\u002Ftls-ssl","01.csharp\u002F13.network-programming\u002F11.tls-ssl",{"title":1704,"path":1705,"stem":1706},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1708,"icon":1709,"path":1710,"stem":1711,"children":1712,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1713,1717,1721,1725,1729,1733,1737,1741,1745,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908,1912,1916,1920,1924,1928,1932,1936,1940,1944,1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000,2004,2008,2012,2016,2020,2024,2028,2032,2036],{"title":1714,"path":1715,"stem":1716},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1718,"path":1719,"stem":1720},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1722,"path":1723,"stem":1724},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1726,"path":1727,"stem":1728},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1730,"path":1731,"stem":1732},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1734,"path":1735,"stem":1736},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1738,"path":1739,"stem":1740},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1742,"path":1743,"stem":1744},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1746,"stem":1747},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1749,"path":1750,"stem":1751},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1753,"path":1754,"stem":1755},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1757,"path":1758,"stem":1759},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1761,"path":1762,"stem":1763},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1765,"path":1766,"stem":1767},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1769,"path":1770,"stem":1771},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1773,"path":1774,"stem":1775},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1777,"path":1778,"stem":1779},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1781,"path":1782,"stem":1783},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1785,"path":1786,"stem":1787},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1789,"path":1790,"stem":1791},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1793,"path":1794,"stem":1795},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1797,"path":1798,"stem":1799},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1801,"path":1802,"stem":1803},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1805,"path":1806,"stem":1807},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1809,"path":1810,"stem":1811},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1813,"path":1814,"stem":1815},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1817,"path":1818,"stem":1819},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1821,"path":1822,"stem":1823},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1825,"path":1826,"stem":1827},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1829,"path":1830,"stem":1831},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1833,"path":1834,"stem":1835},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1837,"path":1838,"stem":1839},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1841,"path":1842,"stem":1843},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1845,"path":1846,"stem":1847},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1849,"path":1850,"stem":1851},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1853,"path":1854,"stem":1855},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1857,"path":1858,"stem":1859},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1861,"path":1862,"stem":1863},"Символи та таблиця ASCII","\u002Fcpp\u002Fascii-characters","02.cpp\u002F37.ascii-characters",{"title":1865,"path":1866,"stem":1867},"Unicode та кодування UTF","\u002Fcpp\u002Funicode-utf","02.cpp\u002F38.unicode-utf",{"title":1869,"path":1870,"stem":1871},"C-style рядки","\u002Fcpp\u002Fc-strings","02.cpp\u002F39.c-strings",{"title":1873,"path":1874,"stem":1875},"Вступ до std::string","\u002Fcpp\u002Fstd-string-intro","02.cpp\u002F40.std-string-intro",{"title":1877,"path":1878,"stem":1879},"Довжина, ємність та доступ до символів std::string","\u002Fcpp\u002Fstd-string-capacity-access","02.cpp\u002F41.std-string-capacity-access",{"title":1881,"path":1882,"stem":1883},"Модифікація std::string: присвоювання, додавання, вставка, видалення та заміна","\u002Fcpp\u002Fstd-string-modification","02.cpp\u002F42.std-string-modification",{"title":1885,"path":1886,"stem":1887},"Пошук у std::string: find, npos та практичні патерни","\u002Fcpp\u002Fstd-string-search","02.cpp\u002F43.std-string-search",{"title":1889,"path":1890,"stem":1891},"std::string_view: невласницький погляд на рядок без копіювання","\u002Fcpp\u002Fstd-string-view","02.cpp\u002F44.std-string-view",{"title":1893,"path":1894,"stem":1895},"Об'єднання (union): один блок пам'яті, кілька інтерпретацій","\u002Fcpp\u002Funion","02.cpp\u002F45.union",{"title":1897,"path":1898,"stem":1899},"Організація коду: файли, препроцесор, простори імен","\u002Fcpp\u002Fmultifile-programs","02.cpp\u002F46.multifile-programs",{"title":1901,"path":1902,"stem":1903},"Робота з файлами: C-стиль (stdio.h)","\u002Fcpp\u002Fc-style-files","02.cpp\u002F47.c-style-files",{"title":1905,"path":1906,"stem":1907},"Робота з файлами: C++-стиль (fstream)","\u002Fcpp\u002Fcpp-style-files","02.cpp\u002F48.cpp-style-files",{"title":1909,"path":1910,"stem":1911},"Введення в ООП: від процедур до об'єктів","\u002Fcpp\u002Foop-intro","02.cpp\u002F49.oop-intro",{"title":1913,"path":1914,"stem":1915},"Класи, об'єкти та методи","\u002Fcpp\u002Fclasses-objects-methods","02.cpp\u002F50.classes-objects-methods",{"title":1917,"path":1918,"stem":1919},"Специфікатори доступу та інкапсуляція","\u002Fcpp\u002Faccess-specifiers-encapsulation","02.cpp\u002F51.access-specifiers-encapsulation",{"title":1921,"path":1922,"stem":1923},"Конструктори: гарантована ініціалізація об'єктів","\u002Fcpp\u002Fconstructors","02.cpp\u002F52.constructors",{"title":1925,"path":1926,"stem":1927},"Списки ініціалізації та делегуючі конструктори","\u002Fcpp\u002Finit-lists-delegating","02.cpp\u002F53.init-lists-delegating",{"title":1929,"path":1930,"stem":1931},"Деструктори та ідіома RAII","\u002Fcpp\u002Fdestructors-raii","02.cpp\u002F54.destructors-raii",{"title":1933,"path":1934,"stem":1935},"Прихований покажчик this","\u002Fcpp\u002Fthis-pointer","02.cpp\u002F55.this-pointer",{"title":1937,"path":1938,"stem":1939},"Розподіл класу на заголовковий файл та файл реалізації","\u002Fcpp\u002Fclass-header-source","02.cpp\u002F56.class-header-source",{"title":1941,"path":1942,"stem":1943},"Класи та const","\u002Fcpp\u002Fconst-classes","02.cpp\u002F57.const-classes",{"title":1945,"path":1946,"stem":1947},"Статичні члени класу","\u002Fcpp\u002Fstatic-members","02.cpp\u002F58.static-members",{"title":1949,"path":1950,"stem":1951},"Конструктор копіювання та запобігання копіюванню","\u002Fcpp\u002Fcopy-constructor","02.cpp\u002F59.copy-constructor",{"title":1953,"path":1954,"stem":1955},"Дружні функції та класи","\u002Fcpp\u002Ffriend-functions-classes","02.cpp\u002F60.friend-functions-classes",{"title":1957,"path":1958,"stem":1959},"Анонімні об'єкти та вкладені типи","\u002Fcpp\u002Fanonymous-objects-nested-types","02.cpp\u002F61.anonymous-objects-nested-types",{"title":1961,"path":1962,"stem":1963},"Вимірювання часу виконання: RAII-таймер","\u002Fcpp\u002Ftiming-raii-timer","02.cpp\u002F62.timing-raii-timer",{"title":1965,"path":1966,"stem":1967},"Перевантаження операторів: основи та арифметика","\u002Fcpp\u002Foperator-overloading-basics","02.cpp\u002F63.operator-overloading-basics",{"title":1969,"path":1970,"stem":1971},"Перевантаження операторів: методи класу та спеціальні оператори","\u002Fcpp\u002Foperator-overloading-methods","02.cpp\u002F64.operator-overloading-methods",{"title":1973,"path":1974,"stem":1975},"Приведення типів, explicit та delete","\u002Fcpp\u002Ftypecast-explicit-delete","02.cpp\u002F65.typecast-explicit-delete",{"title":1977,"path":1978,"stem":1979},"Глибоке копіювання та оператор присвоювання","\u002Fcpp\u002Fdeep-copy-assignment","02.cpp\u002F66.deep-copy-assignment",{"title":1981,"path":1982,"stem":1983},"Зв'язки між об'єктами: композиція та агрегація","\u002Fcpp\u002Fcomposition-aggregation","02.cpp\u002F67.composition-aggregation",{"title":1985,"path":1986,"stem":1987},"Асоціація та залежність між об","\u002Fcpp\u002Fassociation-dependency","02.cpp\u002F68.association-dependency",{"title":1989,"path":1990,"stem":1991},"Контейнерні класи та `std::initializer_list`","\u002Fcpp\u002Fcontainer-classes-initializer-list","02.cpp\u002F69.container-classes-initializer-list",{"title":1993,"path":1994,"stem":1995},"Конструктори, деструктори та порядок ініціалізації в ієрархіях","\u002Fcpp\u002Finheritance-constructors-destructors","02.cpp\u002F71.inheritance-constructors-destructors",{"title":1997,"path":1998,"stem":1999},"Специфікатор `protected` та види наслідування","\u002Fcpp\u002Finheritance-access-specifiers","02.cpp\u002F72.inheritance-access-specifiers",{"title":2001,"path":2002,"stem":2003},"Перевизначення методів та приховування імен","\u002Fcpp\u002Fmethod-overriding-hiding","02.cpp\u002F73.method-overriding-hiding",{"title":2005,"path":2006,"stem":2007},"Множинне наслідування та проблема ромба","\u002Fcpp\u002Fmultiple-inheritance-diamond","02.cpp\u002F74.multiple-inheritance-diamond",{"title":2009,"path":2010,"stem":2011},"Вказівники на базовий клас та віртуальні функції","\u002Fcpp\u002Fvirtual-functions-polymorphism","02.cpp\u002F75.virtual-functions-polymorphism",{"title":2013,"path":2014,"stem":2015},"Специфікатори override, final та віртуальні деструктори","\u002Fcpp\u002Foverride-final-virtual-destructors","02.cpp\u002F76.override-final-virtual-destructors",{"title":2017,"path":2018,"stem":2019},"Внутрішні механізми поліморфізму: vtable, vptr та зв'язування","\u002Fcpp\u002Fvirtual-table-binding","02.cpp\u002F77.virtual-table-binding",{"title":2021,"path":2022,"stem":2023},"Абстрактні класи та чисті віртуальні функції","\u002Fcpp\u002Fabstract-classes-interfaces","02.cpp\u002F78.abstract-classes-interfaces",{"title":2025,"path":2026,"stem":2027},"Зрізка об'єктів, віртуальне наслідування та поліморфний вивід","\u002Fcpp\u002Fslicing-virtual-base-io","02.cpp\u002F79.slicing-virtual-base-io",{"title":2029,"path":2030,"stem":2031},"Динамічне приведення типів (`dynamic_cast`) та RTTI","\u002Fcpp\u002Fdynamic-cast-rtti","02.cpp\u002F80.dynamic-cast-rtti",{"title":2033,"path":2034,"stem":2035},"Шаблони функцій: узагальнене програмування","\u002Fcpp\u002Ffunction-templates","02.cpp\u002F81.function-templates",{"title":2037,"path":2038,"stem":2039},"Шаблони класів та NTTP-параметри","\u002Fcpp\u002Fclass-templates-nttp","02.cpp\u002F82.class-templates-nttp",{"title":2041,"icon":2042,"path":2043,"stem":2044,"children":2045,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[2046,2072,2126,2148,2452,2490,2508],{"title":2047,"icon":2048,"path":2049,"stem":2050,"children":2051,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[2052,2056,2060,2064,2068],{"title":2053,"path":2054,"stem":2055},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":2057,"path":2058,"stem":2059},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":2061,"path":2062,"stem":2063},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":2065,"path":2066,"stem":2067},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":2069,"path":2070,"stem":2071},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":2073,"icon":2074,"path":2075,"stem":2076,"children":2077,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[2078,2082,2086,2090,2094,2098,2102,2106,2110,2114,2118,2122],{"title":2079,"path":2080,"stem":2081},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":2083,"path":2084,"stem":2085},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":2087,"path":2088,"stem":2089},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":2091,"path":2092,"stem":2093},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":2095,"path":2096,"stem":2097},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":2099,"path":2100,"stem":2101},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":2103,"path":2104,"stem":2105},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":2107,"path":2108,"stem":2109},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":2111,"path":2112,"stem":2113},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":2115,"path":2116,"stem":2117},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":2119,"path":2120,"stem":2121},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":2123,"path":2124,"stem":2125},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":2127,"icon":2128,"path":2129,"stem":2130,"children":2131,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[2132,2136,2140,2144],{"title":2133,"path":2134,"stem":2135},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":2137,"path":2138,"stem":2139},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":2141,"path":2142,"stem":2143},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":2145,"path":2146,"stem":2147},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":2149,"icon":2150,"path":2151,"stem":2152,"children":2153},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[2154,2155,2159,2163,2167,2171,2234,2269,2421],{"title":2149,"path":2151,"stem":2152},{"title":2156,"path":2157,"stem":2158},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":2160,"path":2161,"stem":2162},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":2164,"path":2165,"stem":2166},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":2168,"path":2169,"stem":2170},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":2172,"icon":132,"path":2173,"stem":2174,"children":2175},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[2176,2178,2182,2186,2190,2194,2198,2202,2206,2210,2214,2218,2222,2226,2230],{"title":2177,"path":2173,"stem":2174},"TanStack Query: Майстерність Керування Станом Сервера",{"title":2179,"path":2180,"stem":2181},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":2183,"path":2184,"stem":2185},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":2187,"path":2188,"stem":2189},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":2191,"path":2192,"stem":2193},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":2195,"path":2196,"stem":2197},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":2199,"path":2200,"stem":2201},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":2203,"path":2204,"stem":2205},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":2207,"path":2208,"stem":2209},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":2211,"path":2212,"stem":2213},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2215,"path":2216,"stem":2217},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2219,"path":2220,"stem":2221},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2223,"path":2224,"stem":2225},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2227,"path":2228,"stem":2229},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2231,"path":2232,"stem":2233},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2235,"icon":2150,"path":2236,"stem":2237,"children":2238},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2239,2241,2245,2249,2253,2257,2261,2265],{"title":2240,"path":2236,"stem":2237},"React Router: Навігаційна система сучасного вебу",{"title":2242,"path":2243,"stem":2244},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2246,"path":2247,"stem":2248},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2250,"path":2251,"stem":2252},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2254,"path":2255,"stem":2256},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2258,"path":2259,"stem":2260},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2262,"path":2263,"stem":2264},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2266,"path":2267,"stem":2268},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2270,"icon":132,"path":2271,"stem":2272,"children":2273},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2274,2276,2292,2321,2330,2351,2367,2396],{"title":2275,"path":2271,"stem":2272},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2277,"stem":2278,"children":2279,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2280,2284,2288],{"title":2281,"path":2282,"stem":2283},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2285,"path":2286,"stem":2287},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2289,"path":2290,"stem":2291},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2293,"icon":132,"path":2294,"stem":2295,"children":2296,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2297,2301,2305,2309,2313,2317],{"title":2298,"path":2299,"stem":2300},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2302,"path":2303,"stem":2304},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2306,"path":2307,"stem":2308},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2310,"path":2311,"stem":2312},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2314,"path":2315,"stem":2316},"Підключення до React (React-Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freact-redux-connection","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F05.react-redux-connection",{"title":2318,"path":2319,"stem":2320},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2322,"icon":132,"path":2323,"stem":2324,"children":2325,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2326],{"title":2327,"path":2328,"stem":2329},"Проблеми класичного Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk\u002Fproblems-with-classic","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk\u002F01.problems-with-classic",{"title":2331,"icon":132,"path":2332,"stem":2333,"children":2334,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2335,2339,2343,2347],{"title":2336,"path":2337,"stem":2338},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2340,"path":2341,"stem":2342},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2344,"path":2345,"stem":2346},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2348,"path":2349,"stem":2350},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2352,"icon":92,"path":2353,"stem":2354,"children":2355,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2356,2360,2364],{"title":2357,"path":2358,"stem":2359},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2361,"path":2362,"stem":2363},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":2211,"path":2365,"stem":2366},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2368,"icon":132,"path":2369,"stem":2370,"children":2371,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2372,2376,2380,2384,2388,2392],{"title":2373,"path":2374,"stem":2375},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2377,"path":2378,"stem":2379},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2381,"path":2382,"stem":2383},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2385,"path":2386,"stem":2387},"Логіка Drag & Drop","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fdrag-and-drop-logic","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F04.drag-and-drop-logic",{"title":2389,"path":2390,"stem":2391},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2393,"path":2394,"stem":2395},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2397,"icon":132,"path":2398,"stem":2399,"children":2400,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2401,2405,2409,2413,2417],{"title":2402,"path":2403,"stem":2404},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2406,"path":2407,"stem":2408},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2410,"path":2411,"stem":2412},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2414,"path":2415,"stem":2416},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2418,"path":2419,"stem":2420},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2422,"icon":132,"path":2423,"stem":2424,"children":2425},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2426,2428,2432,2436,2440,2444,2448],{"title":2427,"path":2423,"stem":2424},"UI Бібліотеки в React",{"title":2429,"path":2430,"stem":2431},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2433,"path":2434,"stem":2435},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2437,"path":2438,"stem":2439},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2441,"path":2442,"stem":2443},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2445,"path":2446,"stem":2447},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2449,"path":2450,"stem":2451},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2453,"icon":2454,"path":2455,"stem":2456,"children":2457,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2458,2462,2466,2470,2474,2478,2482,2486],{"title":2459,"path":2460,"stem":2461},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2463,"path":2464,"stem":2465},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2467,"path":2468,"stem":2469},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2471,"path":2472,"stem":2473},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2475,"path":2476,"stem":2477},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2479,"path":2480,"stem":2481},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2483,"path":2484,"stem":2485},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2487,"path":2488,"stem":2489},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2491,"icon":2492,"path":2493,"stem":2494,"children":2495,"page":59},"Асинхронність","i-lucide-refresh-cw","\u002Fjavascript\u002Fasync-programming","03.javascript\u002F06.async-programming",[2496,2500,2504],{"title":2497,"path":2498,"stem":2499},"Event Loop: серце асинхронності в JavaScript","\u002Fjavascript\u002Fasync-programming\u002Fevent-loop-fundamentals","03.javascript\u002F06.async-programming\u002F01.event-loop-fundamentals",{"title":2501,"path":2502,"stem":2503},"Task Queue та Microtask Queue: пріоритети виконання","\u002Fjavascript\u002Fasync-programming\u002Ftask-queues","03.javascript\u002F06.async-programming\u002F02.task-queues",{"title":2505,"path":2506,"stem":2507},"Асинхронні патерни: від Callbacks до Async\u002FAwait","\u002Fjavascript\u002Fasync-programming\u002Fasync-patterns","03.javascript\u002F06.async-programming\u002F03.async-patterns",{"title":2509,"path":2510,"stem":2511},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2513,"icon":2514,"path":2515,"stem":2516,"children":2517,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2518,2521,2524,2528,2532,2536,2540],{"title":162,"path":2519,"stem":2520},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2522,"stem":2523},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2525,"path":2526,"stem":2527},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2529,"path":2530,"stem":2531},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2533,"path":2534,"stem":2535},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2537,"path":2538,"stem":2539},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2541,"path":2542,"stem":2543,"children":2544,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2545,2549,2553,2557,2561,2565,2569,2573,2577,2581,2585,2589,2593,2597,2601,2605,2609,2613,2617,2621,2625,2629,2633,2637,2641,2645,2649,2653,2657,2661,2665,2669,2673,2677,2681,2685,2689],{"title":2546,"path":2547,"stem":2548},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2550,"path":2551,"stem":2552},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2554,"path":2555,"stem":2556},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2558,"path":2559,"stem":2560},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2562,"path":2563,"stem":2564},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2566,"path":2567,"stem":2568},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2570,"path":2571,"stem":2572},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2574,"path":2575,"stem":2576},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2578,"path":2579,"stem":2580},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2582,"path":2583,"stem":2584},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2586,"path":2587,"stem":2588},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2590,"path":2591,"stem":2592},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2594,"path":2595,"stem":2596},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2598,"path":2599,"stem":2600},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2602,"path":2603,"stem":2604},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2606,"path":2607,"stem":2608},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2610,"path":2611,"stem":2612},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2614,"path":2615,"stem":2616},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2618,"path":2619,"stem":2620},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2622,"path":2623,"stem":2624},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2626,"path":2627,"stem":2628},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2630,"path":2631,"stem":2632},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2634,"path":2635,"stem":2636},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2638,"path":2639,"stem":2640},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2642,"path":2643,"stem":2644},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2646,"path":2647,"stem":2648},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2650,"path":2651,"stem":2652},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2654,"path":2655,"stem":2656},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2658,"path":2659,"stem":2660},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2662,"path":2663,"stem":2664},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2666,"path":2667,"stem":2668},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2670,"path":2671,"stem":2672},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2674,"path":2675,"stem":2676},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2678,"path":2679,"stem":2680},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2682,"path":2683,"stem":2684},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2686,"path":2687,"stem":2688},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2690,"path":2691,"stem":2692},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2694,"icon":2695,"path":2696,"stem":2697,"children":2698,"page":59},"Python","i-devicon-python","\u002Fpython","05.python",[2699,2703,2706,2710,2714,2718,2722,2726,2730,2734,2738,2742,2746,2750,2754,2815],{"title":2700,"path":2701,"stem":2702},"Модулі, Пакети та Віртуальні Середовища","\u002Fpython\u002Fmodules-packages-venv","05.python\u002F00.modules-packages-venv",{"title":71,"path":2704,"stem":2705},"\u002Fpython\u002Fclasses-objects","05.python\u002F01.classes-objects",{"title":2707,"path":2708,"stem":2709},"Інкапсуляція, Керування Доступом та Властивості","\u002Fpython\u002Fencapsulation","05.python\u002F02.encapsulation",{"title":2711,"path":2712,"stem":2713},"Наслідування, MRO та суперсила super()","\u002Fpython\u002Finheritance-mro","05.python\u002F03.inheritance-mro",{"title":2715,"path":2716,"stem":2717},"Абстракція — ABC проти Статичних Протоколів (PEP 544)","\u002Fpython\u002Fabstraction-protocols","05.python\u002F04.abstraction-protocols",{"title":2719,"path":2720,"stem":2721},"Магічні методи (Dunder) та Емуляція протоколів","\u002Fpython\u002Fdunder-methods","05.python\u002F05.dunder-methods",{"title":2723,"path":2724,"stem":2725},"Декоратори та Керування життєвим циклом методів","\u002Fpython\u002Fdecorators-static-class","05.python\u002F06.decorators-static-class",{"title":2727,"path":2728,"stem":2729},"Дескриптори — Магія доступу до атрибутів","\u002Fpython\u002Fdescriptors","05.python\u002F07.descriptors",{"title":2731,"path":2732,"stem":2733},"Метакласи — Динамічне створення класів під капотом CPython","\u002Fpython\u002Fmetaclasses","05.python\u002F08.metaclasses",{"title":2735,"path":2736,"stem":2737},"Dataclasses, NamedTuple та сучасні контейнери Python","\u002Fpython\u002Fmodern-containers","05.python\u002F09.modern-containers",{"title":2739,"path":2740,"stem":2741},"GIL та модель конкурентності CPython — фундамент перед потоками і процесами","\u002Fpython\u002Fgil-concurrency-intro","05.python\u002F11.gil-concurrency-intro",{"title":2743,"path":2744,"stem":2745},"Threading — конкурентність для I\u002FO-bound задач","\u002Fpython\u002Fthreading","05.python\u002F12.threading",{"title":2747,"path":2748,"stem":2749},"Multiprocessing — справжній паралелізм для CPU-bound задач","\u002Fpython\u002Fmultiprocessing","05.python\u002F13.multiprocessing",{"title":2751,"path":2752,"stem":2753},"asyncio — кооперативна конкурентність та event loop","\u002Fpython\u002Fasyncio","05.python\u002F14.asyncio",{"title":2755,"icon":92,"path":2756,"stem":2757,"children":2758,"page":59},"FastAPI","\u002Fpython\u002Ffastapi","05.python\u002Ffastapi",[2759,2763,2767,2771,2775,2779,2783,2787,2791,2795,2799,2803,2807,2811],{"title":2760,"path":2761,"stem":2762},"Глибокий Typing та Pydantic v2 — від анотацій до валідації","\u002Fpython\u002Ffastapi\u002Ftyping-pydantic","05.python\u002Ffastapi\u002F15.typing-pydantic",{"title":2764,"path":2765,"stem":2766},"WSGI, ASGI та Python Web-екосистема","\u002Fpython\u002Ffastapi\u002Fwsgi-asgi-ecosystem","05.python\u002Ffastapi\u002F16.wsgi-asgi-ecosystem",{"title":2768,"path":2769,"stem":2770},"FastAPI: Перший додаток, Uvicorn та OpenAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-intro","05.python\u002Ffastapi\u002F17.fastapi-intro",{"title":2772,"path":2773,"stem":2774},"Маршрутизація, параметри запитів та APIRouter","\u002Fpython\u002Ffastapi\u002Ffastapi-routing-params","05.python\u002Ffastapi\u002F18.fastapi-routing-params",{"title":2776,"path":2777,"stem":2778},"Pydantic v2 у FastAPI — схеми, валідація та серіалізація","\u002Fpython\u002Ffastapi\u002Ffastapi-pydantic-schemas","05.python\u002Ffastapi\u002F19.fastapi-pydantic-schemas",{"title":2780,"path":2781,"stem":2782},"Dependency Injection — серце архітектури FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-dependency-injection","05.python\u002Ffastapi\u002F20.fastapi-dependency-injection",{"title":2784,"path":2785,"stem":2786},"Обробка помилок, Middleware та CORS у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-errors-middleware","05.python\u002Ffastapi\u002F21.fastapi-errors-middleware",{"title":2788,"path":2789,"stem":2790},"SQLAlchemy 2.0 — ORM, Core та Async Engine","\u002Fpython\u002Ffastapi\u002Fsqlalchemy-orm","05.python\u002Ffastapi\u002F22.sqlalchemy-orm",{"title":2792,"path":2793,"stem":2794},"Alembic — міграції бази даних","\u002Fpython\u002Ffastapi\u002Falembic-migrations","05.python\u002Ffastapi\u002F23.alembic-migrations",{"title":2796,"path":2797,"stem":2798},"Repository Pattern та Clean Architecture у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-repository-clean-arch","05.python\u002Ffastapi\u002F24.fastapi-repository-clean-arch",{"title":2800,"path":2801,"stem":2802},"Автентифікація та авторизація — JWT, OAuth2, RBAC","\u002Fpython\u002Ffastapi\u002Ffastapi-auth-security","05.python\u002Ffastapi\u002F25.fastapi-auth-security",{"title":2804,"path":2805,"stem":2806},"Тестування FastAPI — pytest, httpx, fixtures","\u002Fpython\u002Ffastapi\u002Ffastapi-testing","05.python\u002Ffastapi\u002F26.fastapi-testing",{"title":2808,"path":2809,"stem":2810},"Async на повну — Background Tasks, WebSockets, SSE та Celery","\u002Fpython\u002Ffastapi\u002Ffastapi-async-advanced","05.python\u002Ffastapi\u002F27.fastapi-async-advanced",{"title":2812,"path":2813,"stem":2814},"Deployment — Docker, CI\u002FCD, Monitoring","\u002Fpython\u002Ffastapi\u002Ffastapi-deployment","05.python\u002Ffastapi\u002F28.fastapi-deployment",{"title":2816,"path":2817,"stem":2818},"[object Object]","\u002Fpython\u002Foop-plan","05.python\u002Foop-plan",{"title":2820,"icon":2821,"path":2822,"stem":2823,"children":2824,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2825,2855,2878,2915,2944,2962,2996,3008,3017],{"title":2826,"icon":2827,"path":2828,"stem":2829,"children":2830,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2831,2835,2839,2843,2847,2851],{"title":2832,"path":2833,"stem":2834},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2836,"path":2837,"stem":2838},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2840,"path":2841,"stem":2842},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2844,"path":2845,"stem":2846},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2848,"path":2849,"stem":2850},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2852,"path":2853,"stem":2854},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2856,"icon":2821,"path":2857,"stem":2858,"children":2859,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2860,2864,2870,2874],{"title":2861,"path":2862,"stem":2863},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2865,"path":2866,"stem":2867,"children":2868},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2869],{"title":2865,"path":2866,"stem":2867},{"title":2871,"path":2872,"stem":2873},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2875,"path":2876,"stem":2877},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2879,"icon":2821,"path":2880,"stem":2881,"children":2882,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2883,2887,2891,2895,2899,2903,2907,2911],{"title":2884,"path":2885,"stem":2886},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2888,"path":2889,"stem":2890},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2892,"path":2893,"stem":2894},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2896,"path":2897,"stem":2898},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2900,"path":2901,"stem":2902},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2904,"path":2905,"stem":2906},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2908,"path":2909,"stem":2910},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2912,"path":2913,"stem":2914},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2916,"icon":2821,"path":2917,"stem":2918,"children":2919,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2920,2924,2928,2932,2936,2940],{"title":2921,"path":2922,"stem":2923},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2925,"path":2926,"stem":2927},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2929,"path":2930,"stem":2931},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2933,"path":2934,"stem":2935},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2937,"path":2938,"stem":2939},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":2941,"path":2942,"stem":2943},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":2945,"icon":2946,"path":2947,"stem":2948,"children":2949,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[2950,2954,2958],{"title":2951,"path":2952,"stem":2953},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":2955,"path":2956,"stem":2957},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":2959,"path":2960,"stem":2961},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":2963,"icon":2964,"path":2965,"stem":2966,"children":2967,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[2968,2972,2976,2980,2984,2988,2992],{"title":2969,"path":2970,"stem":2971},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":2973,"path":2974,"stem":2975},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":2977,"path":2978,"stem":2979},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":2981,"path":2982,"stem":2983},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":2985,"path":2986,"stem":2987},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":2989,"path":2990,"stem":2991},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":2993,"path":2994,"stem":2995},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":2993,"icon":793,"path":2997,"stem":2998,"children":2999,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[3000,3004],{"title":3001,"path":3002,"stem":3003},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":3005,"path":3006,"stem":3007},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":3009,"icon":3010,"path":3011,"stem":3012,"children":3013,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[3014],{"title":3009,"path":3015,"stem":3016},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":3018,"icon":3019,"path":3020,"stem":3021,"children":3022,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[3023],{"title":3018,"path":3024,"stem":3025},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":3027,"icon":3028,"path":3029,"stem":3030,"children":3031,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[3032,3108],{"title":3033,"icon":3034,"path":3035,"stem":3036,"children":3037},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[3038,3040,3044,3048,3052,3056,3060,3064,3068,3072,3076,3080,3084,3088,3092,3096,3100,3104],{"title":3039,"path":3035,"stem":3036},"Docker: від нуля до production",{"title":3041,"path":3042,"stem":3043},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":3045,"path":3046,"stem":3047},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":3049,"path":3050,"stem":3051},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":3053,"path":3054,"stem":3055},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":3057,"path":3058,"stem":3059},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":3061,"path":3062,"stem":3063},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":3065,"path":3066,"stem":3067},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":3069,"path":3070,"stem":3071},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":3073,"path":3074,"stem":3075},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":3077,"path":3078,"stem":3079},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":3081,"path":3082,"stem":3083},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":3085,"path":3086,"stem":3087},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":3089,"path":3090,"stem":3091},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":3093,"path":3094,"stem":3095},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":3097,"path":3098,"stem":3099},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":3101,"path":3102,"stem":3103},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":3105,"path":3106,"stem":3107},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":3109,"icon":3110,"path":3111,"stem":3112,"children":3113},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[3114,3116,3120,3124,3128,3132,3136,3140,3144],{"title":3115,"path":3111,"stem":3112},"Kubernetes: від розробки до production",{"title":3117,"path":3118,"stem":3119},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":3121,"path":3122,"stem":3123},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":3125,"path":3126,"stem":3127},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":3129,"path":3130,"stem":3131},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":3133,"path":3134,"stem":3135},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":3137,"path":3138,"stem":3139},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":3141,"path":3142,"stem":3143},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":3145,"path":3146,"stem":3147},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":3149,"icon":3150,"path":3151,"stem":3152,"children":3153,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[3154,3158,3162,3166,3170,3174,3178,3182,3186,3190,3194],{"title":3155,"path":3156,"stem":3157},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":3159,"path":3160,"stem":3161},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":3163,"path":3164,"stem":3165},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":3167,"path":3168,"stem":3169},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":3171,"path":3172,"stem":3173},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":3175,"path":3176,"stem":3177},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":3179,"path":3180,"stem":3181},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":3183,"path":3184,"stem":3185},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":3187,"path":3188,"stem":3189},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":3191,"path":3192,"stem":3193},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":3195,"path":3196,"stem":3197},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":3199,"icon":943,"path":3200,"stem":3201,"children":3202,"page":59},"DDD","\u002Fddd","10.ddd",[3203,3207,3211,3215,3219,3223,3227,3231,3235,3239,3243,3247,3251],{"title":3204,"path":3205,"stem":3206},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":3208,"path":3209,"stem":3210},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":3212,"path":3213,"stem":3214},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":3216,"path":3217,"stem":3218},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":3220,"path":3221,"stem":3222},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":3224,"path":3225,"stem":3226},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":3228,"path":3229,"stem":3230},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":3232,"path":3233,"stem":3234},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":3236,"path":3237,"stem":3238},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":3240,"path":3241,"stem":3242},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":3244,"path":3245,"stem":3246},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":3248,"path":3249,"stem":3250},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":3252,"path":3253,"stem":3254},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":3256,"icon":3257,"path":3258,"stem":3259,"children":3260,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[3261,3265,3269,3273,3277,3281,3285],{"title":3262,"path":3263,"stem":3264},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":3266,"path":3267,"stem":3268},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":3270,"path":3271,"stem":3272},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":3274,"path":3275,"stem":3276},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":3278,"path":3279,"stem":3280},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":3282,"path":3283,"stem":3284},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":3286,"path":3287,"stem":3288},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":3290,"icon":3291,"path":3292,"stem":3293,"children":3294,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[3295,3299,3303,3307,3311,3315,3319,3323,3327,3331,3335,3339,3343,3347,3351,3355,3359,3363,3367,3371,3375,3379,3383,3387,3391,3395,3399,3403,3407,3411],{"title":3296,"path":3297,"stem":3298},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":3300,"path":3301,"stem":3302},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":3304,"path":3305,"stem":3306},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":3308,"path":3309,"stem":3310},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":3312,"path":3313,"stem":3314},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":3316,"path":3317,"stem":3318},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":3320,"path":3321,"stem":3322},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":3324,"path":3325,"stem":3326},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":3328,"path":3329,"stem":3330},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":3332,"path":3333,"stem":3334},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":3336,"path":3337,"stem":3338},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":3340,"path":3341,"stem":3342},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":3344,"path":3345,"stem":3346},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":3348,"path":3349,"stem":3350},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":3352,"path":3353,"stem":3354},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":3356,"path":3357,"stem":3358},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3360,"path":3361,"stem":3362},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3364,"path":3365,"stem":3366},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3368,"path":3369,"stem":3370},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3372,"path":3373,"stem":3374},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3376,"path":3377,"stem":3378},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3380,"path":3381,"stem":3382},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3384,"path":3385,"stem":3386},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3388,"path":3389,"stem":3390},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3392,"path":3393,"stem":3394},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3396,"path":3397,"stem":3398},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3400,"path":3401,"stem":3402},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3404,"path":3405,"stem":3406},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3408,"path":3409,"stem":3410},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3412,"path":3413,"stem":3414},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3416,"path":3417,"stem":3418,"children":3419,"page":59},"AWS","\u002Faws","13.aws",[3420,3424,3428,3432,3436,3440,3444,3448,3452,3456,3460,3464,3468,3472,3476,3480,3484,3488],{"title":3421,"path":3422,"stem":3423},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3425,"path":3426,"stem":3427},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3429,"path":3430,"stem":3431},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3433,"path":3434,"stem":3435},"AWS IAM CLI — Довідник команд","\u002Faws\u002F02a.iam-doc","13.aws\u002F02a.iam-doc",{"title":3437,"path":3438,"stem":3439},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3441,"path":3442,"stem":3443},"AWS ECR \u002F ECS CLI — Довідник команд","\u002Faws\u002F03a.docker-ecs-doc","13.aws\u002F03a.docker-ecs-doc",{"title":3445,"path":3446,"stem":3447},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3449,"path":3450,"stem":3451},"AWS EC2 CLI — Довідник команд","\u002Faws\u002F04a.ec2-doc","13.aws\u002F04a.ec2-doc",{"title":3453,"path":3454,"stem":3455},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3457,"path":3458,"stem":3459},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3461,"path":3462,"stem":3463},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3465,"path":3466,"stem":3467},"Amazon RDS — Relational Database Service","\u002Faws\u002Frds","13.aws\u002F08.rds",{"title":3469,"path":3470,"stem":3471},"Amazon DynamoDB — NoSQL Database","\u002Faws\u002Fdynamodb","13.aws\u002F09.dynamodb",{"title":3473,"path":3474,"stem":3475},"AWS Lambda та Serverless Compute","\u002Faws\u002Flambda","13.aws\u002F10.lambda",{"title":3477,"path":3478,"stem":3479},"Amazon Bedrock - Foundation Models, RAG та Agents","\u002Faws\u002Fbedrock","13.aws\u002F22.bedrock",{"title":3481,"path":3482,"stem":3483},"Amazon Rekognition - Комп'ютерний зір","\u002Faws\u002Frekognition","13.aws\u002F23.rekognition",{"title":3485,"path":3486,"stem":3487},"Amazon Textract - Інтелектуальний аналіз документів","\u002Faws\u002Ftextract","13.aws\u002F24.textract",{"title":3489,"path":3490,"stem":3491},"Amazon Polly, Transcribe, Comprehend та Translate","\u002Faws\u002Faudio-nlp-services","13.aws\u002F25.audio-nlp-services",{"title":3493,"path":3494,"stem":3495,"children":3496,"page":59},"Ai Development","\u002Fai-development","14.ai-development",[3497],{"title":3498,"path":3499,"stem":3500,"children":3501,"page":59},"Foundations","\u002Fai-development\u002Ffoundations","14.ai-development\u002F00.foundations",[3502],{"title":3503,"path":3504,"stem":3505},"Модуль 0.1. Що таке Large Language Model (LLM)","\u002Fai-development\u002Ffoundations\u002Fwhat-is-llm","14.ai-development\u002F00.foundations\u002F01.what-is-llm",{"title":3507,"path":3508,"stem":3509,"children":3510,"page":59},"React Native","\u002Freact-native","15.react-native",[3511,3532],{"title":3512,"path":3513,"stem":3514,"children":3515,"page":59},"Version1","\u002Freact-native\u002Fversion1","15.react-native\u002Fversion1",[3516,3520,3524,3528],{"title":3517,"path":3518,"stem":3519},"Що таке React Native","\u002Freact-native\u002Fversion1\u002Fwhat-is-react-native","15.react-native\u002Fversion1\u002F01.what-is-react-native",{"title":3521,"path":3522,"stem":3523},"Як влаштований React Native «під капотом»","\u002Freact-native\u002Fversion1\u002Freact-native-architecture","15.react-native\u002Fversion1\u002F02.react-native-architecture",{"title":3525,"path":3526,"stem":3527},"Від React до React Native: ключові відмінності","\u002Freact-native\u002Fversion1\u002Freact-native-vs-react","15.react-native\u002Fversion1\u002F03.react-native-vs-react",{"title":3529,"path":3530,"stem":3531},"View та Text — фундаментальні будівельні блоки","\u002Freact-native\u002Fversion1\u002Fview-and-text","15.react-native\u002Fversion1\u002F04.view-and-text",{"title":3533,"path":3534,"stem":3535,"children":3536,"page":59},"Version2","\u002Freact-native\u002Fversion2","15.react-native\u002Fversion2",[3537,3541,3545,3549,3553,3557,3561,3565,3569,3573,3577,3581,3585,3589,3593,3597,3601,3605,3609,3613,3617,3621,3625,3629,3633,3637,3641],{"title":3538,"path":3539,"stem":3540},"React Native — навіщо він потрібен","\u002Freact-native\u002Fversion2\u002Fwhy-react-native","15.react-native\u002Fversion2\u002F01.why-react-native",{"title":3542,"path":3543,"stem":3544},"Налаштування середовища розробки","\u002Freact-native\u002Fversion2\u002Fenvironment-setup","15.react-native\u002Fversion2\u002F02.environment-setup",{"title":3546,"path":3547,"stem":3548},"Expo і класичний React Native — два шляхи одного фреймворку","\u002Freact-native\u002Fversion2\u002Fexpo-vs-cli-landscape","15.react-native\u002Fversion2\u002F03.expo-vs-cli-landscape",{"title":3550,"path":3551,"stem":3552},"Середовище Expo — перший запуск","\u002Freact-native\u002Fversion2\u002Fexpo-setup-and-tooling","15.react-native\u002Fversion2\u002F04.expo-setup-and-tooling",{"title":3554,"path":3555,"stem":3556},"Структура проєкту та перші UI-примітиви","\u002Freact-native\u002Fversion2\u002Fproject-structure-and-conventions","15.react-native\u002Fversion2\u002F05.project-structure-and-conventions",{"title":3558,"path":3559,"stem":3560},"Базові компоненти React Native","\u002Freact-native\u002Fversion2\u002Fcore-components","15.react-native\u002Fversion2\u002F06.core-components",{"title":3562,"path":3563,"stem":3564},"Flexbox і layout у React Native","\u002Freact-native\u002Fversion2\u002Fflexbox-and-layout","15.react-native\u002Fversion2\u002F07.flexbox-and-layout",{"title":3566,"path":3567,"stem":3568},"StyleSheet і теми (light \u002F dark)","\u002Freact-native\u002Fversion2\u002Fstylesheet-and-theming","15.react-native\u002Fversion2\u002F08.stylesheet-and-theming",{"title":3570,"path":3571,"stem":3572},"Списки та віртуалізація","\u002Freact-native\u002Fversion2\u002Flists-and-virtualization","15.react-native\u002Fversion2\u002F09.lists-and-virtualization",{"title":3574,"path":3575,"stem":3576},"Форми, ввід і валідація","\u002Freact-native\u002Fversion2\u002Fforms-input-validation","15.react-native\u002Fversion2\u002F10.forms-input-validation",{"title":3578,"path":3579,"stem":3580},"Основи Expo Router","\u002Freact-native\u002Fversion2\u002Fexpo-router-basics","15.react-native\u002Fversion2\u002F11.expo-router-basics",{"title":3582,"path":3583,"stem":3584},"Вкладені навігатори та модалки","\u002Freact-native\u002Fversion2\u002Fnested-navigators-and-modals","15.react-native\u002Fversion2\u002F12.nested-navigators-and-modals",{"title":3586,"path":3587,"stem":3588},"Deep linking і параметри маршрутів","\u002Freact-native\u002Fversion2\u002Fdeep-linking-and-params","15.react-native\u002Fversion2\u002F13.deep-linking-and-params",{"title":3590,"path":3591,"stem":3592},"Робота з мережею та життєвий цикл застосунку","\u002Freact-native\u002Fversion2\u002Fnetworking-and-app-lifecycle","15.react-native\u002Fversion2\u002F14.networking-and-app-lifecycle",{"title":3594,"path":3595,"stem":3596},"Redux Toolkit на мобільних платформах","\u002Freact-native\u002Fversion2\u002Fredux-toolkit-on-mobile","15.react-native\u002Fversion2\u002F15.redux-toolkit-on-mobile",{"title":3598,"path":3599,"stem":3600},"RTK Query на мобільних платформах","\u002Freact-native\u002Fversion2\u002Frtk-query-mobile","15.react-native\u002Fversion2\u002F16.rtk-query-mobile",{"title":3602,"path":3603,"stem":3604},"Автентифікація та Безпечне Зберігання","\u002Freact-native\u002Fversion2\u002Fauth-secure-storage","15.react-native\u002Fversion2\u002F18.auth-secure-storage",{"title":3606,"path":3607,"stem":3608},"Локальне сховище — AsyncStorage, MMKV, SQLite","\u002Freact-native\u002Fversion2\u002Flocal-storage-mmkv-sqlite","15.react-native\u002Fversion2\u002F19.local-storage-mmkv-sqlite",{"title":3610,"path":3611,"stem":3612},"Офлайн-First і синхронізація","\u002Freact-native\u002Fversion2\u002Foffline-first-sync","15.react-native\u002Fversion2\u002F20.offline-first-sync",{"title":3614,"path":3615,"stem":3616},"Камера, медіа та файлова система","\u002Freact-native\u002Fversion2\u002Fcamera-media-filesystem","15.react-native\u002Fversion2\u002F21.camera-media-filesystem",{"title":3618,"path":3619,"stem":3620},"Карти та геолокація","\u002Freact-native\u002Fversion2\u002Fmaps-and-location","15.react-native\u002Fversion2\u002F22.maps-and-location",{"title":3622,"path":3623,"stem":3624},"Жести та дотики","\u002Freact-native\u002Fversion2\u002Fgestures-and-touch","15.react-native\u002Fversion2\u002F23.gestures-and-touch",{"title":3626,"path":3627,"stem":3628},"Анімації з Reanimated","\u002Freact-native\u002Fversion2\u002Freanimated-animations","15.react-native\u002Fversion2\u002F24.reanimated-animations",{"title":3630,"path":3631,"stem":3632},"Push і локальні сповіщення","\u002Freact-native\u002Fversion2\u002Fpush-and-local-notifications","15.react-native\u002Fversion2\u002F25.push-and-local-notifications",{"title":3634,"path":3635,"stem":3636},"Інтернаціоналізація та доступність","\u002Freact-native\u002Fversion2\u002Faccessibility-and-i18n","15.react-native\u002Fversion2\u002F26.accessibility-and-i18n",{"title":3638,"path":3639,"stem":3640},"EAS Build та профілі збірки","\u002Freact-native\u002Fversion2\u002Feas-build-and-profiles","15.react-native\u002Fversion2\u002F29.eas-build-and-profiles",{"title":3642,"path":3643,"stem":3644},"Публікація в App Store та Google Play","\u002Freact-native\u002Fversion2\u002Fapp-store-play-release","15.react-native\u002Fversion2\u002F30.app-store-play-release",{"title":3646,"path":3647,"stem":3648,"children":3649,"page":59},"Ai Python","\u002Fai-python","16.ai-python",[3650,3659,3668,3677,3706,3732,3757,3790,3807,3820,3829,3842,3851,3872,3885,3906],{"title":3651,"path":3652,"stem":3653,"children":3654,"page":59},"Intro To Ai","\u002Fai-python\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai",[3655],{"title":3656,"path":3657,"stem":3658},"Вступ до штучного інтелекту та машинного навчання","\u002Fai-python\u002Fintro-to-ai\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai\u002F01.intro-to-ai",{"title":3660,"path":3661,"stem":3662,"children":3663,"page":59},"Jupyter Notebook","\u002Fai-python\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook",[3664],{"title":3665,"path":3666,"stem":3667},"Знайомство з Jupyter Notebook та JupyterLab","\u002Fai-python\u002Fjupyter-notebook\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook\u002F02.jupyter-notebook",{"title":3669,"path":3670,"stem":3671,"children":3672,"page":59},"Numpy Pandas","\u002Fai-python\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas",[3673],{"title":3674,"path":3675,"stem":3676},"Робота з даними з використанням NumPy і pandas","\u002Fai-python\u002Fnumpy-pandas\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas\u002F03.numpy-pandas",{"title":3678,"path":3679,"stem":3680,"children":3681,"page":59},"Statistics Basics","\u002Fai-python\u002Fstatistics-basics","16.ai-python\u002F04.statistics-basics",[3682,3686,3690,3694,3698,3702],{"title":3683,"path":3684,"stem":3685},"Випадкові величини та їх типи","\u002Fai-python\u002Fstatistics-basics\u002Frandom-variables","16.ai-python\u002F04.statistics-basics\u002F01.random-variables",{"title":3687,"path":3688,"stem":3689},"Міри центральної тенденції","\u002Fai-python\u002Fstatistics-basics\u002Fcentral-tendency","16.ai-python\u002F04.statistics-basics\u002F02.central-tendency",{"title":3691,"path":3692,"stem":3693},"Міри варіації (розсіювання)","\u002Fai-python\u002Fstatistics-basics\u002Fvariability","16.ai-python\u002F04.statistics-basics\u002F03.variability",{"title":3695,"path":3696,"stem":3697},"Розподіли випадкових величин","\u002Fai-python\u002Fstatistics-basics\u002Fdistributions","16.ai-python\u002F04.statistics-basics\u002F04.distributions",{"title":3699,"path":3700,"stem":3701},"Кореляція та взаємозв'язки","\u002Fai-python\u002Fstatistics-basics\u002Fcorrelation","16.ai-python\u002F04.statistics-basics\u002F05.correlation",{"title":3703,"path":3704,"stem":3705},"Викиди та аномалії","\u002Fai-python\u002Fstatistics-basics\u002Foutliers","16.ai-python\u002F04.statistics-basics\u002F06.outliers",{"title":3707,"path":3708,"stem":3709,"children":3710},"Візуалізація даних за допомогою matplotlib","\u002Fai-python\u002Fdata-visualization","16.ai-python\u002F05.data-visualization\u002Findex",[3711,3712,3716,3720,3724,3728],{"title":3707,"path":3708,"stem":3709},{"title":3713,"path":3714,"stem":3715},"Основи matplotlib — Figure, Axes та перший графік","\u002Fai-python\u002Fdata-visualization\u002Fmatplotlib-basics","16.ai-python\u002F05.data-visualization\u002F01.matplotlib-basics",{"title":3717,"path":3718,"stem":3719},"Візуалізація розподілів — гістограми та box plots","\u002Fai-python\u002Fdata-visualization\u002Fdistributions","16.ai-python\u002F05.data-visualization\u002F02.distributions",{"title":3721,"path":3722,"stem":3723},"Візуалізація залежностей — scatter plots та кореляція","\u002Fai-python\u002Fdata-visualization\u002Frelationships","16.ai-python\u002F05.data-visualization\u002F03.relationships",{"title":3725,"path":3726,"stem":3727},"Візуалізація категоріальних даних — bar charts та pie charts","\u002Fai-python\u002Fdata-visualization\u002Fcategorical","16.ai-python\u002F05.data-visualization\u002F04.categorical",{"title":3729,"path":3730,"stem":3731},"Композиції та стилізація — subplots та багатопанельні дашборди","\u002Fai-python\u002Fdata-visualization\u002Fsubplots-styling","16.ai-python\u002F05.data-visualization\u002F05.subplots-styling",{"title":3733,"path":3734,"stem":3735,"children":3736,"page":59},"Linear Regression","\u002Fai-python\u002Flinear-regression","16.ai-python\u002F06.linear-regression",[3737,3741,3745,3749,3753],{"title":3738,"path":3739,"stem":3740},"Регресійна задача та лінійна регресія з однією змінною","\u002Fai-python\u002Flinear-regression\u002Fregression-task","16.ai-python\u002F06.linear-regression\u002F01.regression-task",{"title":3742,"path":3743,"stem":3744},"Метрики якості регресії — як оцінити модель","\u002Fai-python\u002Flinear-regression\u002Fquality-metrics","16.ai-python\u002F06.linear-regression\u002F02.quality-metrics",{"title":3746,"path":3747,"stem":3748},"Градієнтний спуск — як модель навчається","\u002Fai-python\u002Flinear-regression\u002Fgradient-descent","16.ai-python\u002F06.linear-regression\u002F03.gradient-descent",{"title":3750,"path":3751,"stem":3752},"Множинна лінійна регресія — модель з багатьма ознаками","\u002Fai-python\u002Flinear-regression\u002Fmultiple-regression","16.ai-python\u002F06.linear-regression\u002F04.multiple-regression",{"title":3754,"path":3755,"stem":3756},"Практичні завдання та резюме модуля","\u002Fai-python\u002Flinear-regression\u002Fpractice","16.ai-python\u002F06.linear-regression\u002F05.practice",{"title":3758,"path":3759,"stem":3760,"children":3761,"page":59},"Practical Regression","\u002Fai-python\u002Fpractical-regression","16.ai-python\u002F07.practical-regression",[3762,3766,3770,3774,3778,3782,3786],{"title":3763,"path":3764,"stem":3765},"Знайомство з scikit-learn","\u002Fai-python\u002Fpractical-regression\u002Fintro-scikit-learn","16.ai-python\u002F07.practical-regression\u002F01.intro-scikit-learn",{"title":3767,"path":3768,"stem":3769},"Exploratory Data Analysis датасету Housing Prices","\u002Fai-python\u002Fpractical-regression\u002Fhousing-dataset-eda","16.ai-python\u002F07.practical-regression\u002F02.housing-dataset-eda",{"title":3771,"path":3772,"stem":3773},"Попередня обробка даних (Data Preprocessing)","\u002Fai-python\u002Fpractical-regression\u002Fdata-preprocessing","16.ai-python\u002F07.practical-regression\u002F03.data-preprocessing",{"title":3775,"path":3776,"stem":3777},"Train\u002FTest Split та перша повноцінна модель","\u002Fai-python\u002Fpractical-regression\u002Ftrain-test-split","16.ai-python\u002F07.practical-regression\u002F04.train-test-split",{"title":3779,"path":3780,"stem":3781},"Перенавчання та недонавчання","\u002Fai-python\u002Fpractical-regression\u002Foverfitting-underfitting","16.ai-python\u002F07.practical-regression\u002F05.overfitting-underfitting",{"title":3783,"path":3784,"stem":3785},"Крос-валідація (Cross-Validation)","\u002Fai-python\u002Fpractical-regression\u002Fcross-validation","16.ai-python\u002F07.practical-regression\u002F06.cross-validation",{"title":3787,"path":3788,"stem":3789},"Гіперпараметри та їх оптимізація","\u002Fai-python\u002Fpractical-regression\u002Fhyperparameter-tuning","16.ai-python\u002F07.practical-regression\u002F07.hyperparameter-tuning",{"title":3791,"path":3792,"stem":3793,"children":3794,"page":59},"Polynomial Regression","\u002Fai-python\u002Fpolynomial-regression","16.ai-python\u002F08.polynomial-regression",[3795,3799,3803],{"title":3796,"path":3797,"stem":3798},"Нелінійні залежності та поліноміальна регресія","\u002Fai-python\u002Fpolynomial-regression\u002Fnonlinear-patterns","16.ai-python\u002F08.polynomial-regression\u002F01.nonlinear-patterns",{"title":3800,"path":3801,"stem":3802},"Регуляризація в регресії — Ridge та Lasso","\u002Fai-python\u002Fpolynomial-regression\u002Fregularization-methods","16.ai-python\u002F08.polynomial-regression\u002F02.regularization-methods",{"title":3804,"path":3805,"stem":3806},"Практика — поліноміальна регресія та регуляризація на Housing Prices","\u002Fai-python\u002Fpolynomial-regression\u002Fhousing-prices-practice","16.ai-python\u002F08.polynomial-regression\u002F03.housing-prices-practice",{"title":3808,"path":3809,"stem":3810,"children":3811,"page":59},"Decision Trees Random Forest","\u002Fai-python\u002Fdecision-trees-random-forest","16.ai-python\u002F09.decision-trees-random-forest",[3812,3816],{"title":3813,"path":3814,"stem":3815},"Дерева рішень — інтерпретабельні моделі машинного навчання","\u002Fai-python\u002Fdecision-trees-random-forest\u002Fdecision-trees","16.ai-python\u002F09.decision-trees-random-forest\u002F01.decision-trees",{"title":3817,"path":3818,"stem":3819},"Random Forest — ансамблі дерев рішень","\u002Fai-python\u002Fdecision-trees-random-forest\u002Frandom-forest","16.ai-python\u002F09.decision-trees-random-forest\u002F02.random-forest",{"title":3821,"path":3822,"stem":3823,"children":3824,"page":59},"Gradient Boosting","\u002Fai-python\u002Fgradient-boosting","16.ai-python\u002F10.gradient-boosting",[3825],{"title":3826,"path":3827,"stem":3828},"Градієнтний бустинг та XGBoost — послідовне виправлення помилок","\u002Fai-python\u002Fgradient-boosting\u002Fgradient-boosting-xgboost","16.ai-python\u002F10.gradient-boosting\u002F01.gradient-boosting-xgboost",{"title":3830,"path":3831,"stem":3832,"children":3833,"page":59},"Logistic Regression Classification","\u002Fai-python\u002Flogistic-regression-classification","16.ai-python\u002F11.logistic-regression-classification",[3834,3838],{"title":3835,"path":3836,"stem":3837},"Вступ до класифікації та логістична регресія","\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-basics","16.ai-python\u002F11.logistic-regression-classification\u002F01.classification-basics",{"title":3839,"path":3840,"stem":3841},"Метрики якості класифікації — Confusion Matrix, Precision, Recall, F1","\u002Fai-python\u002Flogistic-regression-classification\u002Fclassification-metrics","16.ai-python\u002F11.logistic-regression-classification\u002F02.classification-metrics",{"title":3843,"path":3844,"stem":3845,"children":3846,"page":59},"Neural Networks Basics","\u002Fai-python\u002Fneural-networks-basics","16.ai-python\u002F12.neural-networks-basics",[3847],{"title":3848,"path":3849,"stem":3850},"Вступ до нейронних мереж — від персептрона до багатошарових мереж","\u002Fai-python\u002Fneural-networks-basics\u002Fperceptron-to-mlp","16.ai-python\u002F12.neural-networks-basics\u002F01.perceptron-to-mlp",{"title":3852,"path":3853,"stem":3854,"children":3855,"page":59},"Pytorch Intro","\u002Fai-python\u002Fpytorch-intro","16.ai-python\u002F13.pytorch-intro",[3856,3860,3864,3868],{"title":3857,"path":3858,"stem":3859},"Тензори та автоматичне диференціювання в PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Ftensors-and-autograd","16.ai-python\u002F13.pytorch-intro\u002F01.tensors-and-autograd",{"title":3861,"path":3862,"stem":3863},"Побудова та тренування нейронних мереж у PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Fbuilding-and-training","16.ai-python\u002F13.pytorch-intro\u002F02.building-and-training",{"title":3865,"path":3866,"stem":3867},"Робота з даними та регуляризація в PyTorch","\u002Fai-python\u002Fpytorch-intro\u002Fdata-and-regularization","16.ai-python\u002F13.pytorch-intro\u002F03.data-and-regularization",{"title":3869,"path":3870,"stem":3871},"Просунуті теми PyTorch — GPU, оптимізація та deployment","\u002Fai-python\u002Fpytorch-intro\u002Fadvanced-topics","16.ai-python\u002F13.pytorch-intro\u002F04.advanced-topics",{"title":3873,"path":3874,"stem":3875,"children":3876,"page":59},"Activation Functions Heart Disease","\u002Fai-python\u002Factivation-functions-heart-disease","16.ai-python\u002F14.activation-functions-heart-disease",[3877,3881],{"title":3878,"path":3879,"stem":3880},"Функції активації та побудова нейронної мережі для передбачення вад серця","\u002Fai-python\u002Factivation-functions-heart-disease\u002Fheart-disease-prediction","16.ai-python\u002F14.activation-functions-heart-disease\u002F01.heart-disease-prediction",{"title":3882,"path":3883,"stem":3884},"Бонус — Повний приклад Student Performance Prediction","\u002Fai-python\u002Factivation-functions-heart-disease\u002Fstudent-performance-bonus","16.ai-python\u002F14.activation-functions-heart-disease\u002F02.student-performance-bonus",{"title":3886,"path":3887,"stem":3888,"children":3889,"page":59},"Cnn Image Classification","\u002Fai-python\u002Fcnn-image-classification","16.ai-python\u002F15.cnn-image-classification",[3890,3894,3898,3902],{"title":3891,"path":3892,"stem":3893},"Основи згорткових нейронних мереж — чому не MLP?","\u002Fai-python\u002Fcnn-image-classification\u002Fcnn-fundamentals","16.ai-python\u002F15.cnn-image-classification\u002F01.cnn-fundamentals",{"title":3895,"path":3896,"stem":3897},"Практична імплементація CNN для класифікації MNIST","\u002Fai-python\u002Fcnn-image-classification\u002Fmnist-classification","16.ai-python\u002F15.cnn-image-classification\u002F02.mnist-classification",{"title":3899,"path":3900,"stem":3901},"Глибші CNN та аугментація даних для CIFAR-10","\u002Fai-python\u002Fcnn-image-classification\u002Fcifar10-and-data-augmentation","16.ai-python\u002F15.cnn-image-classification\u002F03.cifar10-and-data-augmentation",{"title":3903,"path":3904,"stem":3905},"Transfer Learning та візуалізація внутрішніх представлень CNN","\u002Fai-python\u002Fcnn-image-classification\u002Ftransfer-learning-and-visualization","16.ai-python\u002F15.cnn-image-classification\u002F04.transfer-learning-and-visualization",{"title":3907,"path":3908,"stem":3909,"children":3910,"page":59},"Batching Normalization Deep Networks","\u002Fai-python\u002Fbatching-normalization-deep-networks","16.ai-python\u002F16.batching-normalization-deep-networks",[3911,3915,3919,3923,3927,3931,3935],{"title":3912,"path":3913,"stem":3914},"Mini-batch Gradient Descent та ефективна обробка даних","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fmini-batch-gradient-descent","16.ai-python\u002F16.batching-normalization-deep-networks\u002F01.mini-batch-gradient-descent",{"title":3916,"path":3917,"stem":3918},"Ініціалізація ваг — фундамент стабільного навчання","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fweight-initialization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F02.weight-initialization",{"title":3920,"path":3921,"stem":3922},"Batch Normalization — прорив у глибокому навчанні","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fbatch-normalization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F03.batch-normalization",{"title":3924,"path":3925,"stem":3926},"Dropout та комбіновані стратегії регуляризації","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fdropout-and-regularization","16.ai-python\u002F16.batching-normalization-deep-networks\u002F04.dropout-and-regularization",{"title":3928,"path":3929,"stem":3930},"Проєктування глибоких мереж — від теорії до практики","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Fdeep-networks-architectures","16.ai-python\u002F16.batching-normalization-deep-networks\u002F05.deep-networks-architectures",{"title":3932,"path":3933,"stem":3934},"Планування learning rate — коли та як зменшувати крок навчання","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Flearning-rate-scheduling","16.ai-python\u002F16.batching-normalization-deep-networks\u002F06.learning-rate-scheduling",{"title":3936,"path":3937,"stem":3938},"Підсумковий проєкт — побудова сучасного класифікатора зображень","\u002Fai-python\u002Fbatching-normalization-deep-networks\u002Ffinal-project-deep-classifier","16.ai-python\u002F16.batching-normalization-deep-networks\u002F07.final-project-deep-classifier",{"title":3940,"icon":658,"path":3941,"stem":3942,"children":3943,"page":59},"Клієнт-серверна архітектура","\u002Fclient-server-architecture","17.client-server-architecture",[3944,3948,3952,3956,3960,3964,3968,3972,3976,3980,3984,3988,3992,3996,4000,4004,4008,4012],{"title":3945,"path":3946,"stem":3947},"Архітектура клієнт-серверних систем та основи Go","\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go","17.client-server-architecture\u002F01.client-server-architecture-and-go",{"title":3949,"path":3950,"stem":3951},"Система типів та модель пам’яті мови Go","\u002Fclient-server-architecture\u002Ftype-system-and-memory-model","17.client-server-architecture\u002F02.type-system-and-memory-model",{"title":3953,"path":3954,"stem":3955},"Інтерфейси та модель конкурентності мови Go","\u002Fclient-server-architecture\u002Finterfaces-and-concurrency-model","17.client-server-architecture\u002F03.interfaces-and-concurrency-model",{"title":3957,"path":3958,"stem":3959},"Сокетне програмування та протокол TCP у Go","\u002Fclient-server-architecture\u002Ftcp-socket-programming","17.client-server-architecture\u002F04.tcp-socket-programming",{"title":3961,"path":3962,"stem":3963},"Протокол UDP та датаграмна передача даних","\u002Fclient-server-architecture\u002Fudp-datagram-transmission","17.client-server-architecture\u002F05.udp-datagram-transmission",{"title":3965,"path":3966,"stem":3967},"Криптографічний захист каналів зв","\u002Fclient-server-architecture\u002Ftls-cryptographic-channel-protection","17.client-server-architecture\u002F06.tls-cryptographic-channel-protection",{"title":3969,"path":3970,"stem":3971},"Прикладні мережеві протоколи DNS та SMTP","\u002Fclient-server-architecture\u002Fdns-smtp-application-protocols","17.client-server-architecture\u002F07.dns-smtp-application-protocols",{"title":3973,"path":3974,"stem":3975},"Протокол HTTP та стандартний вебсервер Go","\u002Fclient-server-architecture\u002Fhttp-protocol-and-web-server","17.client-server-architecture\u002F08.http-protocol-and-web-server",{"title":3977,"path":3978,"stem":3979},"Проєктування REST API та маршрутизація засобами Chi","\u002Fclient-server-architecture\u002Frest-api-design-and-chi-routing","17.client-server-architecture\u002F09.rest-api-design-and-chi-routing",{"title":3981,"path":3982,"stem":3983},"Лекція 10. Шарувата архітектура та конвеєри обробки запитів","\u002Fclient-server-architecture\u002Flayered-architecture-and-middleware-pipelines","17.client-server-architecture\u002F10.layered-architecture-and-middleware-pipelines",{"title":3985,"path":3986,"stem":3987},"Лекція 11. Архітектура та маршрутизація фреймворку Gin","\u002Fclient-server-architecture\u002Fgin-framework-architecture-and-routing","17.client-server-architecture\u002F11.gin-framework-architecture-and-routing",{"title":3989,"path":3990,"stem":3991},"Лекція 12. Валідація даних, безпека та документування у Gin","\u002Fclient-server-architecture\u002Fdata-validation-security-and-documentation-in-gin","17.client-server-architecture\u002F12.data-validation-security-and-documentation-in-gin",{"title":3993,"path":3994,"stem":3995},"Лекція 13. Взаємодія з реляційними СУБД та технології ORM","\u002Fclient-server-architecture\u002Frelational-databases-and-orm","17.client-server-architecture\u002F13.relational-databases-and-orm",{"title":3997,"path":3998,"stem":3999},"Потокова передача даних та протокол WebSocket","\u002Fclient-server-architecture\u002Fstreaming-data-and-websockets","17.client-server-architecture\u002F14.streaming-data-and-websockets",{"title":4001,"path":4002,"stem":4003},"Міжсервісна взаємодія на основі протоколу gRPC","\u002Fclient-server-architecture\u002Fgrpc-inter-service-communication","17.client-server-architecture\u002F15.grpc-inter-service-communication",{"title":4005,"path":4006,"stem":4007},"Асинхронний обмін повідомленнями та протоколи черг","\u002Fclient-server-architecture\u002Fasynchronous-message-exchange-and-queue-protocols","17.client-server-architecture\u002F16.asynchronous-message-exchange-and-queue-protocols",{"title":4009,"path":4010,"stem":4011},"Протоколи потокового медіа та технологія WebRTC","\u002Fclient-server-architecture\u002Fstreaming-media-protocols-and-webrtc","17.client-server-architecture\u002F17.streaming-media-protocols-and-webrtc",{"title":4013,"path":4014,"stem":4015},"Моніторинг, безпека та контейнеризація застосунків","\u002Fclient-server-architecture\u002Fmonitoring-security-and-containerization","17.client-server-architecture\u002F18.monitoring-security-and-containerization",{"title":4017,"icon":2074,"path":4018,"stem":4019,"children":4020,"page":59},"Розробка WEB-застосувань","\u002Fweb-development","18.web-development",[4021,4066,4104,4133,4162,4219,4269,4363,4429,4511,4544,4572,4614,4660,4703],{"title":4022,"icon":658,"path":4023,"stem":4024,"children":4025,"page":59},"Архітектура комп'ютерних мереж та мережеві протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols","18.web-development\u002F01.network-architecture-and-protocols",[4026,4030,4034,4038,4042,4046,4050,4054,4058,4062],{"title":4027,"path":4028,"stem":4029},"Еволюція веброзробки та модель клієнт-сервер","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fweb-evolution-client-server","18.web-development\u002F01.network-architecture-and-protocols\u002F01.web-evolution-client-server",{"title":4031,"path":4032,"stem":4033},"Еталонна модель OSI","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fosi-model","18.web-development\u002F01.network-architecture-and-protocols\u002F02.osi-model",{"title":4035,"path":4036,"stem":4037},"Стек протоколів TCP\u002FIP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-ip-stack","18.web-development\u002F01.network-architecture-and-protocols\u002F03.tcp-ip-stack",{"title":4039,"path":4040,"stem":4041},"IP-адресація, порти та сокети","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets","18.web-development\u002F01.network-architecture-and-protocols\u002F04.ip-addressing-ports-sockets",{"title":4043,"path":4044,"stem":4045},"Протоколи TCP та UDP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-udp-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F05.tcp-udp-protocols",{"title":4047,"path":4048,"stem":4049},"Система доменних імен DNS","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fdns-system","18.web-development\u002F01.network-architecture-and-protocols\u002F06.dns-system",{"title":4051,"path":4052,"stem":4053},"Протокол SMTP та поштові протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fsmtp-email-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F07.smtp-email-protocols",{"title":4055,"path":4056,"stem":4057},"Протокол WebSocket","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fwebsocket-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F08.websocket-protocol",{"title":4059,"path":4060,"stem":4061},"Протокол SSH","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fssh-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F09.ssh-protocol",{"title":4063,"path":4064,"stem":4065},"Огляд сучасних серверних технологій","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fmodern-backend-technologies","18.web-development\u002F01.network-architecture-and-protocols\u002F10.modern-backend-technologies",{"title":4067,"icon":4068,"path":4069,"stem":4070,"children":4071,"page":59},"Протокол HTTP та захищена передача даних HTTPS","i-lucide-lock","\u002Fweb-development\u002Fhttp-and-https","18.web-development\u002F02.http-and-https",[4072,4076,4080,4084,4088,4092,4096,4100],{"title":4073,"path":4074,"stem":4075},"Вступ до протоколу HTTP та еволюція веб-технологій","\u002Fweb-development\u002Fhttp-and-https\u002Fintroduction-and-evolution","18.web-development\u002F02.http-and-https\u002F01.introduction-and-evolution",{"title":4077,"path":4078,"stem":4079},"Анатомія HTTP-запиту","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-request-structure","18.web-development\u002F02.http-and-https\u002F02.http-request-structure",{"title":4081,"path":4082,"stem":4083},"Анатомія HTTP-відповіді","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-response-structure","18.web-development\u002F02.http-and-https\u002F03.http-response-structure",{"title":4085,"path":4086,"stem":4087},"Методи HTTP та їхня семантика","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-methods","18.web-development\u002F02.http-and-https\u002F04.http-methods",{"title":4089,"path":4090,"stem":4091},"Коди статусу HTTP та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-status-codes","18.web-development\u002F02.http-and-https\u002F05.http-status-codes",{"title":4093,"path":4094,"stem":4095},"HTTP-заголовки та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-headers","18.web-development\u002F02.http-and-https\u002F06.http-headers",{"title":4097,"path":4098,"stem":4099},"CORS та механізми безпеки HTTP","\u002Fweb-development\u002Fhttp-and-https\u002Fcors-and-security","18.web-development\u002F02.http-and-https\u002F07.cors-and-security",{"title":4101,"path":4102,"stem":4103},"HTTPS та криптографічні основи TLS","\u002Fweb-development\u002Fhttp-and-https\u002Fhttps-and-tls","18.web-development\u002F02.http-and-https\u002F08.https-and-tls",{"title":4105,"icon":2454,"path":4106,"stem":4107,"children":4108,"page":59},"Система типів мови TypeScript","\u002Fweb-development\u002Ftypescript-type-system","18.web-development\u002F03.typescript-type-system",[4109,4113,4117,4121,4125,4129],{"title":4110,"path":4111,"stem":4112},"Знайомство з TypeScript Compiler","\u002Fweb-development\u002Ftypescript-type-system\u002Fintroduction-compiler-config","18.web-development\u002F03.typescript-type-system\u002F01.introduction-compiler-config",{"title":4114,"path":4115,"stem":4116},"Примітивні типи даних: string, number, boolean","\u002Fweb-development\u002Ftypescript-type-system\u002Fprimitive-special-types","18.web-development\u002F03.typescript-type-system\u002F02.primitive-special-types",{"title":4118,"path":4119,"stem":4120},"Масиви, кортежі та об","\u002Fweb-development\u002Ftypescript-type-system\u002Farrays-tuples-objects","18.web-development\u002F03.typescript-type-system\u002F03.arrays-tuples-objects",{"title":4122,"path":4123,"stem":4124},"Псевдоніми типів, Union типи, Intersection типи та літеральні типи","\u002Fweb-development\u002Ftypescript-type-system\u002Funion-intersection-literals","18.web-development\u002F03.typescript-type-system\u002F04.union-intersection-literals",{"title":4126,"path":4127,"stem":4128},"Type Narrowing (звуження типів)","\u002Fweb-development\u002Ftypescript-type-system\u002Ftype-narrowing","18.web-development\u002F03.typescript-type-system\u002F05.type-narrowing",{"title":4130,"path":4131,"stem":4132},"Типізація функцій","\u002Fweb-development\u002Ftypescript-type-system\u002Ffunctions-typing","18.web-development\u002F03.typescript-type-system\u002F06.functions-typing",{"title":4134,"icon":2454,"path":4135,"stem":4136,"children":4137,"page":59},"Розширені засоби мови TypeScript","\u002Fweb-development\u002Ftypescript-advanced","18.web-development\u002F04.typescript-advanced",[4138,4142,4146,4150,4154,4158],{"title":4139,"path":4140,"stem":4141},"Interfaces та Classes","\u002Fweb-development\u002Ftypescript-advanced\u002Finterfaces-classes","18.web-development\u002F04.typescript-advanced\u002F01.interfaces-classes",{"title":4143,"path":4144,"stem":4145},"Основи Generic типів","\u002Fweb-development\u002Ftypescript-advanced\u002Fgenerics-fundamentals","18.web-development\u002F04.typescript-advanced\u002F02.generics-fundamentals",{"title":4147,"path":4148,"stem":4149},"Enums та Decorators","\u002Fweb-development\u002Ftypescript-advanced\u002Fenums-decorators","18.web-development\u002F04.typescript-advanced\u002F03.enums-decorators",{"title":4151,"path":4152,"stem":4153},"Utility Types","\u002Fweb-development\u002Ftypescript-advanced\u002Futility-types","18.web-development\u002F04.typescript-advanced\u002F04.utility-types",{"title":4155,"path":4156,"stem":4157},"Mapped та Conditional Types","\u002Fweb-development\u002Ftypescript-advanced\u002Fmapped-conditional-types","18.web-development\u002F04.typescript-advanced\u002F05.mapped-conditional-types",{"title":4159,"path":4160,"stem":4161},"Модулі та Strict Mode","\u002Fweb-development\u002Ftypescript-advanced\u002Fmodules-strict-mode","18.web-development\u002F04.typescript-advanced\u002F06.modules-strict-mode",{"title":4163,"icon":4164,"path":4165,"stem":4166,"children":4167,"page":59},"Платформа Node.js як середовище виконання","i-devicon-nodejs","\u002Fweb-development\u002Fnodejs-platform","18.web-development\u002F05.nodejs-platform",[4168,4172,4176,4180,4184,4188,4192,4196,4200,4204,4208,4211,4215],{"title":4169,"path":4170,"stem":4171},"Що таке Node.js та його архітектура","\u002Fweb-development\u002Fnodejs-platform\u002Fwhat-is-nodejs","18.web-development\u002F05.nodejs-platform\u002F01.what-is-nodejs",{"title":4173,"path":4174,"stem":4175},"Event Loop — серце Node.js","\u002Fweb-development\u002Fnodejs-platform\u002Fevent-loop","18.web-development\u002F05.nodejs-platform\u002F02.event-loop",{"title":4177,"path":4178,"stem":4179},"Модульні системи: CommonJS vs ES Modules","\u002Fweb-development\u002Fnodejs-platform\u002Fmodule-systems","18.web-development\u002F05.nodejs-platform\u002F03.module-systems",{"title":4181,"path":4182,"stem":4183},"npm та package.json","\u002Fweb-development\u002Fnodejs-platform\u002Fnpm-package-json","18.web-development\u002F05.nodejs-platform\u002F04.npm-package-json",{"title":4185,"path":4186,"stem":4187},"Глобальні об\\","\u002Fweb-development\u002Fnodejs-platform\u002Fglobal-objects","18.web-development\u002F05.nodejs-platform\u002F05.global-objects",{"title":4189,"path":4190,"stem":4191},"Вбудований модуль fs (File System)","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-fs","18.web-development\u002F05.nodejs-platform\u002F06.built-in-modules-fs",{"title":4193,"path":4194,"stem":4195},"Вбудований модуль path","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-path","18.web-development\u002F05.nodejs-platform\u002F07.built-in-modules-path",{"title":4197,"path":4198,"stem":4199},"Вбудований модуль http","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-http","18.web-development\u002F05.nodejs-platform\u002F08.built-in-modules-http",{"title":4201,"path":4202,"stem":4203},"Streams — потоки даних у Node.js","\u002Fweb-development\u002Fnodejs-platform\u002Fstreams","18.web-development\u002F05.nodejs-platform\u002F09.streams",{"title":4205,"path":4206,"stem":4207},"Вбудований модуль util (Utilities)","\u002Fweb-development\u002Fnodejs-platform\u002Fbuilt-in-modules-util","18.web-development\u002F05.nodejs-platform\u002F10.built-in-modules-util",{"title":3097,"path":4209,"stem":4210},"\u002Fweb-development\u002Fnodejs-platform\u002Fenvironment-variables","18.web-development\u002F05.nodejs-platform\u002F11.environment-variables",{"title":4212,"path":4213,"stem":4214},"Інструменти налагодження та розробки","\u002Fweb-development\u002Fnodejs-platform\u002Fdebugging-tools","18.web-development\u002F05.nodejs-platform\u002F12.debugging-tools",{"title":4216,"path":4217,"stem":4218},"Продуктивність та Best Practices","\u002Fweb-development\u002Fnodejs-platform\u002Fperformance-best-practices","18.web-development\u002F05.nodejs-platform\u002F13.performance-best-practices",{"title":4220,"icon":4221,"path":4222,"stem":4223,"children":4224,"page":59},"Асинхронне програмування у Node.js","i-lucide-clock","\u002Fweb-development\u002Fasync-programming-nodejs","18.web-development\u002F06.async-programming-nodejs",[4225,4229,4233,4237,4241,4245,4249,4253,4257,4261,4265],{"title":4226,"path":4227,"stem":4228},"Синхронний vs асинхронний код","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fsync-vs-async","18.web-development\u002F06.async-programming-nodejs\u002F01.sync-vs-async",{"title":4230,"path":4231,"stem":4232},"Callbacks — перша парадигма асинхронності","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fcallbacks","18.web-development\u002F06.async-programming-nodejs\u002F02.callbacks",{"title":4234,"path":4235,"stem":4236},"Promises — стандарт асинхронності","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fpromises","18.web-development\u002F06.async-programming-nodejs\u002F03.promises",{"title":4238,"path":4239,"stem":4240},"Promise комбінатори","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fpromise-combinators","18.web-development\u002F06.async-programming-nodejs\u002F04.promise-combinators",{"title":4242,"path":4243,"stem":4244},"Async\u002FAwait — синтаксичний цукор над Promises","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fasync-await","18.web-development\u002F06.async-programming-nodejs\u002F05.async-await",{"title":4246,"path":4247,"stem":4248},"Паралельне vs послідовне виконання","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fparallel-vs-sequential","18.web-development\u002F06.async-programming-nodejs\u002F06.parallel-vs-sequential",{"title":4250,"path":4251,"stem":4252},"EventEmitter — подієва модель Node.js","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fevent-emitter","18.web-development\u002F06.async-programming-nodejs\u002F07.event-emitter",{"title":4254,"path":4255,"stem":4256},"Worker Threads — багатопотоковість у Node.js","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fworker-threads","18.web-development\u002F06.async-programming-nodejs\u002F08.worker-threads",{"title":4258,"path":4259,"stem":4260},"Child Processes — запуск зовнішніх процесів","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fchild-processes","18.web-development\u002F06.async-programming-nodejs\u002F09.child-processes",{"title":4262,"path":4263,"stem":4264},"Обробка помилок у асинхронному коді","\u002Fweb-development\u002Fasync-programming-nodejs\u002Ferror-handling","18.web-development\u002F06.async-programming-nodejs\u002F10.error-handling",{"title":4266,"path":4267,"stem":4268},"Порівняння Node.js фреймворків","\u002Fweb-development\u002Fasync-programming-nodejs\u002Fnodejs-frameworks","18.web-development\u002F06.async-programming-nodejs\u002F11.nodejs-frameworks",{"title":4270,"icon":4271,"path":4272,"stem":4273,"children":4274,"page":59},"Тема 7. Фреймворк NestJS. Контролери та маршрутизація","i-lucide-route","\u002Fweb-development\u002Fnestjs-controllers-routing","18.web-development\u002F07.nestjs-controllers-routing",[4275,4279,4283,4287,4291,4295,4299,4303,4307,4311,4315,4319,4323,4327,4331,4335,4339,4343,4347,4351,4355,4359],{"title":4276,"path":4277,"stem":4278},"Філософія та архітектура NestJS","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-philosophy","18.web-development\u002F07.nestjs-controllers-routing\u002F01.nestjs-philosophy",{"title":4280,"path":4281,"stem":4282},"Три стовпи архітектури: модулі, контролери, провайдери","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fthree-pillars","18.web-development\u002F07.nestjs-controllers-routing\u002F02.three-pillars",{"title":4284,"path":4285,"stem":4286},"Інверсія керування (IoC) та ін","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fioc-and-di","18.web-development\u002F07.nestjs-controllers-routing\u002F03.ioc-and-di",{"title":4288,"path":4289,"stem":4290},"Встановлення NestJS CLI та створення проєкту","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-cli-setup","18.web-development\u002F07.nestjs-controllers-routing\u002F04.nestjs-cli-setup",{"title":4292,"path":4293,"stem":4294},"Структура проєкту NestJS та конвенції","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fproject-structure","18.web-development\u002F07.nestjs-controllers-routing\u002F05.project-structure",{"title":4296,"path":4297,"stem":4298},"Контролери: основи маршрутизації","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcontrollers-basics","18.web-development\u002F07.nestjs-controllers-routing\u002F06.controllers-basics",{"title":4300,"path":4301,"stem":4302},"Декоратори маршрутизації HTTP-методів","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Froute-decorators","18.web-development\u002F07.nestjs-controllers-routing\u002F07.route-decorators",{"title":4304,"path":4305,"stem":4306},"Параметри маршруту та декоратор @Param","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Froute-parameters","18.web-development\u002F07.nestjs-controllers-routing\u002F08.route-parameters",{"title":4308,"path":4309,"stem":4310},"Query-параметри та декоратор @Query","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fquery-parameters","18.web-development\u002F07.nestjs-controllers-routing\u002F09.query-parameters",{"title":4312,"path":4313,"stem":4314},"Тіло запиту та декоратор @Body","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Frequest-body","18.web-development\u002F07.nestjs-controllers-routing\u002F10.request-body",{"title":4316,"path":4317,"stem":4318},"Робота з заголовками запиту та відповіді","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fheaders-decorators","18.web-development\u002F07.nestjs-controllers-routing\u002F11.headers-decorators",{"title":4320,"path":4321,"stem":4322},"Data Transfer Objects (DTO): визначення та призначення","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fdto-introduction","18.web-development\u002F07.nestjs-controllers-routing\u002F12.dto-introduction",{"title":4324,"path":4325,"stem":4326},"Об'єкти Request та Response","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Frequest-response-objects","18.web-development\u002F07.nestjs-controllers-routing\u002F13.request-response-objects",{"title":4328,"path":4329,"stem":4330},"HTTP-статус коди та декоратор @HttpCode","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fhttp-status-codes","18.web-development\u002F07.nestjs-controllers-routing\u002F14.http-status-codes",{"title":4332,"path":4333,"stem":4334},"Перенаправлення (Redirects) та декоратор @Redirect","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fredirects","18.web-development\u002F07.nestjs-controllers-routing\u002F15.redirects",{"title":4336,"path":4337,"stem":4338},"Асинхронні обробники та Observables","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fasync-handlers","18.web-development\u002F07.nestjs-controllers-routing\u002F16.async-handlers",{"title":4340,"path":4341,"stem":4342},"Маршрутизація за піддоменами та версіонування API","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fsub-domain-routing","18.web-development\u002F07.nestjs-controllers-routing\u002F17.sub-domain-routing",{"title":4344,"path":4345,"stem":4346},"Області видимості контролерів (Scopes)","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcontroller-scopes","18.web-development\u002F07.nestjs-controllers-routing\u002F18.controller-scopes",{"title":4348,"path":4349,"stem":4350},"Основні команди NestJS CLI","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fnestjs-cli-commands","18.web-development\u002F07.nestjs-controllers-routing\u002F19.nestjs-cli-commands",{"title":4352,"path":4353,"stem":4354},"Практичний приклад: створення CRUD-контролера","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fcrud-example","18.web-development\u002F07.nestjs-controllers-routing\u002F20.crud-example",{"title":4356,"path":4357,"stem":4358},"Тестування контролерів","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Ftesting-controllers","18.web-development\u002F07.nestjs-controllers-routing\u002F21.testing-controllers",{"title":4360,"path":4361,"stem":4362},"Best Practices для контролерів та маршрутизації","\u002Fweb-development\u002Fnestjs-controllers-routing\u002Fbest-practices","18.web-development\u002F07.nestjs-controllers-routing\u002F22.best-practices",{"title":4364,"icon":4365,"path":4366,"stem":4367,"children":4368,"page":59},"Тема 8. Провайдери, сервіси та модульна система NestJS","i-lucide-package","\u002Fweb-development\u002Fnestjs-providers-modules","18.web-development\u002F08.nestjs-providers-modules",[4369,4373,4377,4381,4385,4389,4393,4397,4401,4405,4409,4413,4417,4421,4425],{"title":4370,"path":4371,"stem":4372},"Концепція провайдерів у NestJS","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fproviders-concept","18.web-development\u002F08.nestjs-providers-modules\u002F01.providers-concept",{"title":4374,"path":4375,"stem":4376},"Сервіси: інкапсуляція бізнес-логіки","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fservices-business-logic","18.web-development\u002F08.nestjs-providers-modules\u002F02.services-business-logic",{"title":4378,"path":4379,"stem":4380},"Практика ін","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fdependency-injection-practice","18.web-development\u002F08.nestjs-providers-modules\u002F03.dependency-injection-practice",{"title":4382,"path":4383,"stem":4384},"Custom Providers: useValue, useClass, useFactory, useExisting","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fcustom-providers","18.web-development\u002F08.nestjs-providers-modules\u002F04.custom-providers",{"title":4386,"path":4387,"stem":4388},"Injection Tokens: рядкові та символьні токени","\u002Fweb-development\u002Fnestjs-providers-modules\u002Finjection-tokens","18.web-development\u002F08.nestjs-providers-modules\u002F05.injection-tokens",{"title":4390,"path":4391,"stem":4392},"Опціональні провайдери та декоратор @Optional","\u002Fweb-development\u002Fnestjs-providers-modules\u002Foptional-providers","18.web-development\u002F08.nestjs-providers-modules\u002F07.optional-providers",{"title":4394,"path":4395,"stem":4396},"Структура модулів: imports, controllers, providers, exports","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fmodules-structure","18.web-development\u002F08.nestjs-providers-modules\u002F08.modules-structure",{"title":4398,"path":4399,"stem":4400},"Feature Modules: ізоляція функціональності","\u002Fweb-development\u002Fnestjs-providers-modules\u002Ffeature-modules","18.web-development\u002F08.nestjs-providers-modules\u002F09.feature-modules",{"title":4402,"path":4403,"stem":4404},"Shared Modules: перевикористання провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fshared-modules","18.web-development\u002F08.nestjs-providers-modules\u002F10.shared-modules",{"title":4406,"path":4407,"stem":4408},"Global Modules та декоратор @Global","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fglobal-modules","18.web-development\u002F08.nestjs-providers-modules\u002F11.global-modules",{"title":4410,"path":4411,"stem":4412},"Dynamic Modules: конфігурація під час виконання","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fdynamic-modules","18.web-development\u002F08.nestjs-providers-modules\u002F12.dynamic-modules",{"title":4414,"path":4415,"stem":4416},"Циклічні залежності та forwardRef","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fcircular-dependencies","18.web-development\u002F08.nestjs-providers-modules\u002F13.circular-dependencies",{"title":4418,"path":4419,"stem":4420},"Lifecycle Hooks: хуки життєвого циклу","\u002Fweb-development\u002Fnestjs-providers-modules\u002Flifecycle-hooks","18.web-development\u002F08.nestjs-providers-modules\u002F14.lifecycle-hooks",{"title":4422,"path":4423,"stem":4424},"ModuleRef: динамічний доступ до провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Fmodule-reference","18.web-development\u002F08.nestjs-providers-modules\u002F15.module-reference",{"title":4426,"path":4427,"stem":4428},"Тестування сервісів та провайдерів","\u002Fweb-development\u002Fnestjs-providers-modules\u002Ftesting-services","18.web-development\u002F08.nestjs-providers-modules\u002F16.testing-services",{"title":4430,"icon":4431,"path":4432,"stem":4433,"children":4434,"page":59},"Тема 9. Валідація даних та конвеєр обробки запитів у NestJS","i-lucide-filter","\u002Fweb-development\u002Fnestjs-validation-pipeline","18.web-development\u002F09.nestjs-validation-pipeline",[4435,4439,4443,4447,4451,4455,4459,4463,4467,4471,4475,4479,4483,4487,4491,4495,4499,4503,4507],{"title":4436,"path":4437,"stem":4438},"Request Pipeline: конвеєр обробки запитів","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Frequest-pipeline","18.web-development\u002F09.nestjs-validation-pipeline\u002F01.request-pipeline",{"title":4440,"path":4441,"stem":4442},"Pipes: концепція трансформації та валідації","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fpipes-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F02.pipes-concept",{"title":4444,"path":4445,"stem":4446},"Вбудовані pipes: ParseIntPipe, ParseBoolPipe, ParseUUIDPipe","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fbuilt-in-pipes","18.web-development\u002F09.nestjs-validation-pipeline\u002F03.built-in-pipes",{"title":4448,"path":4449,"stem":4450},"ValidationPipe: автоматична валідація DTO","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fvalidation-pipe","18.web-development\u002F09.nestjs-validation-pipeline\u002F04.validation-pipe",{"title":4452,"path":4453,"stem":4454},"Декоратори class-validator для DTO","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fclass-validator-decorators","18.web-development\u002F09.nestjs-validation-pipeline\u002F05.class-validator-decorators",{"title":4456,"path":4457,"stem":4458},"Створення кастомних валідаторів","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-validators","18.web-development\u002F09.nestjs-validation-pipeline\u002F06.custom-validators",{"title":4460,"path":4461,"stem":4462},"Створення власних Pipes","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-pipes","18.web-development\u002F09.nestjs-validation-pipeline\u002F07.custom-pipes",{"title":4464,"path":4465,"stem":4466},"Основи Middleware","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fmiddleware-basics","18.web-development\u002F09.nestjs-validation-pipeline\u002F08.middleware-basics",{"title":4468,"path":4469,"stem":4470},"Практичні приклади Middleware","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fmiddleware-examples","18.web-development\u002F09.nestjs-validation-pipeline\u002F09.middleware-examples",{"title":4472,"path":4473,"stem":4474},"Guards: захисні перехоплювачі доступу","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fguards-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F10.guards-concept",{"title":4476,"path":4477,"stem":4478},"Створення кастомних Guards","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-guards","18.web-development\u002F09.nestjs-validation-pipeline\u002F11.custom-guards",{"title":4480,"path":4481,"stem":4482},"Interceptors: перехоплення та трансформація відповідей","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Finterceptors-concept","18.web-development\u002F09.nestjs-validation-pipeline\u002F12.interceptors-concept",{"title":4484,"path":4485,"stem":4486},"Практичні приклади Interceptors","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Finterceptor-examples","18.web-development\u002F09.nestjs-validation-pipeline\u002F13.interceptor-examples",{"title":4488,"path":4489,"stem":4490},"Exception Filters: обробка виключень","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fexception-filters","18.web-development\u002F09.nestjs-validation-pipeline\u002F14.exception-filters",{"title":4492,"path":4493,"stem":4494},"Custom Exception Filters: спеціалізовані фільтри","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-exception-filters","18.web-development\u002F09.nestjs-validation-pipeline\u002F15.custom-exception-filters",{"title":4496,"path":4497,"stem":4498},"Execution Context: контекст виконання","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fexecution-context","18.web-development\u002F09.nestjs-validation-pipeline\u002F16.execution-context",{"title":4500,"path":4501,"stem":4502},"Custom Decorators: власні декоратори","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fcustom-decorators","18.web-development\u002F09.nestjs-validation-pipeline\u002F17.custom-decorators",{"title":4504,"path":4505,"stem":4506},"Global Components: глобальні компоненти","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fglobal-components","18.web-development\u002F09.nestjs-validation-pipeline\u002F18.global-components",{"title":4508,"path":4509,"stem":4510},"Pipeline Best Practices: найкращі практики","\u002Fweb-development\u002Fnestjs-validation-pipeline\u002Fpipeline-best-practices","18.web-development\u002F09.nestjs-validation-pipeline\u002F19.pipeline-best-practices",{"title":4512,"icon":2821,"path":4513,"stem":4514,"children":4515,"page":59},"Інтеграція реляційних баз даних засобами TypeORM","\u002Fweb-development\u002Ftypeorm-integration","18.web-development\u002F10.typeorm-integration",[4516,4520,4524,4528,4532,4536,4540],{"title":4517,"path":4518,"stem":4519},"Робота з базами даних у Node.js через нативні драйвери","\u002Fweb-development\u002Ftypeorm-integration\u002F01-nodejs-database-drivers","18.web-development\u002F10.typeorm-integration\u002F01-nodejs-database-drivers",{"title":4521,"path":4522,"stem":4523},"ORM та знайомство з TypeORM","\u002Fweb-development\u002Ftypeorm-integration\u002F02-orm-and-typeorm-intro","18.web-development\u002F10.typeorm-integration\u002F02-orm-and-typeorm-intro",{"title":4525,"path":4526,"stem":4527},"Налаштування TypeORM у NestJS проєкті","\u002Fweb-development\u002Ftypeorm-integration\u002F03-typeorm-setup-nestjs","18.web-development\u002F10.typeorm-integration\u002F03-typeorm-setup-nestjs",{"title":4529,"path":4530,"stem":4531},"Entity класи та декоратори TypeORM","\u002Fweb-development\u002Ftypeorm-integration\u002F04-entities-and-decorators","18.web-development\u002F10.typeorm-integration\u002F04-entities-and-decorators",{"title":4533,"path":4534,"stem":4535},"Repository Pattern та CRUD операції","\u002Fweb-development\u002Ftypeorm-integration\u002F05-repository-pattern-crud","18.web-development\u002F10.typeorm-integration\u002F05-repository-pattern-crud",{"title":4537,"path":4538,"stem":4539},"Пагінація та фільтрація даних","\u002Fweb-development\u002Ftypeorm-integration\u002F06-pagination-filtering","18.web-development\u002F10.typeorm-integration\u002F06-pagination-filtering",{"title":4541,"path":4542,"stem":4543},"QueryBuilder для складних запитів","\u002Fweb-development\u002Ftypeorm-integration\u002F07-query-builder","18.web-development\u002F10.typeorm-integration\u002F07-query-builder",{"title":4545,"icon":4546,"path":4547,"stem":4548,"children":4549,"page":59},"Зв'язки між сутностями, міграції та оптимізація запитів","i-lucide-git-branch","\u002Fweb-development\u002Fentity-relations-migrations","18.web-development\u002F11.entity-relations-migrations",[4550,4554,4558,4562,4566],{"title":4551,"path":4552,"stem":4553},"Зв'язки One-to-Many та Many-to-One","\u002Fweb-development\u002Fentity-relations-migrations\u002F01-one-to-many-many-to-one","18.web-development\u002F11.entity-relations-migrations\u002F01-one-to-many-many-to-one",{"title":4555,"path":4556,"stem":4557},"Зв'язки One-to-One та Many-to-Many","\u002Fweb-development\u002Fentity-relations-migrations\u002F02-one-to-one-many-to-many","18.web-development\u002F11.entity-relations-migrations\u002F02-one-to-one-many-to-many",{"title":4559,"path":4560,"stem":4561},"Керування міграціями бази даних","\u002Fweb-development\u002Fentity-relations-migrations\u002F03-migrations-management","18.web-development\u002F11.entity-relations-migrations\u002F03-migrations-management",{"title":4563,"path":4564,"stem":4565},"Транзакції у TypeORM","\u002Fweb-development\u002Fentity-relations-migrations\u002F04-transactions","18.web-development\u002F11.entity-relations-migrations\u002F04-transactions",{"title":4567,"path":4568,"stem":4569,"children":4570},"Індекси та оптимізація запитів","\u002Fweb-development\u002Fentity-relations-migrations\u002F05-indexes-optimization","18.web-development\u002F11.entity-relations-migrations\u002F05-indexes-optimization",[4571],{"title":4567,"path":4568,"stem":4569},{"title":4573,"icon":4574,"path":4575,"stem":4576,"children":4577,"page":59},"Механізми автентифікації у вебзастосунках","i-lucide-key","\u002Fweb-development\u002Fauthentication","18.web-development\u002F12.authentication",[4578,4582,4586,4590,4594,4598,4602,4606,4610],{"title":4579,"path":4580,"stem":4581},"Автентифікація vs Авторизація","\u002Fweb-development\u002Fauthentication\u002F01-authentication-vs-authorization","18.web-development\u002F12.authentication\u002F01-authentication-vs-authorization",{"title":4583,"path":4584,"stem":4585},"Стратегії автентифікації","\u002Fweb-development\u002Fauthentication\u002F02-authentication-strategies","18.web-development\u002F12.authentication\u002F02-authentication-strategies",{"title":4587,"path":4588,"stem":4589},"Автентифікація на основі сесій","\u002Fweb-development\u002Fauthentication\u002F03-session-based-authentication","18.web-development\u002F12.authentication\u002F03-session-based-authentication",{"title":4591,"path":4592,"stem":4593},"Структура JSON Web Token (JWT)","\u002Fweb-development\u002Fauthentication\u002F04-jwt-structure","18.web-development\u002F12.authentication\u002F04-jwt-structure",{"title":4595,"path":4596,"stem":4597},"Інтеграція JWT у NestJS","\u002Fweb-development\u002Fauthentication\u002F05-nestjs-jwt-integration","18.web-development\u002F12.authentication\u002F05-nestjs-jwt-integration",{"title":4599,"path":4600,"stem":4601},"Passport.js стратегії у NestJS","\u002Fweb-development\u002Fauthentication\u002F06-passport-strategies","18.web-development\u002F12.authentication\u002F06-passport-strategies",{"title":4603,"path":4604,"stem":4605},"Безпечне зберігання паролів: хешування та криптографічний захист","\u002Fweb-development\u002Fauthentication\u002F07-password-hashing","18.web-development\u002F12.authentication\u002F07-password-hashing",{"title":4607,"path":4608,"stem":4609},"Refresh Token та безпечне оновлення доступу","\u002Fweb-development\u002Fauthentication\u002F08-refresh-tokens","18.web-development\u002F12.authentication\u002F08-refresh-tokens",{"title":4611,"path":4612,"stem":4613},"OAuth 2.0 та OpenID Connect: делегована автентифікація","\u002Fweb-development\u002Fauthentication\u002F09-oauth2-openid","18.web-development\u002F12.authentication\u002F09-oauth2-openid",{"title":4615,"icon":4616,"path":4617,"stem":4618,"children":4619,"page":59},"Авторизація та безпека серверних застосунків","i-lucide-shield","\u002Fweb-development\u002Fauthorization-security","18.web-development\u002F13.authorization-security",[4620,4624,4628,4632,4636,4640,4644,4648,4652,4656],{"title":4621,"path":4622,"stem":4623},"Моделі авторизації","\u002Fweb-development\u002Fauthorization-security\u002F01-authorization-models","18.web-development\u002F13.authorization-security\u002F01-authorization-models",{"title":4625,"path":4626,"stem":4627},"Реалізація RBAC у NestJS","\u002Fweb-development\u002Fauthorization-security\u002F02-rbac-implementation","18.web-development\u002F13.authorization-security\u002F02-rbac-implementation",{"title":4629,"path":4630,"stem":4631},"Permission-Based Access Control","\u002Fweb-development\u002Fauthorization-security\u002F03-permission-based-access","18.web-development\u002F13.authorization-security\u002F03-permission-based-access",{"title":4633,"path":4634,"stem":4635},"ABAC та бібліотека CASL","\u002Fweb-development\u002Fauthorization-security\u002F04-abac-casl","18.web-development\u002F13.authorization-security\u002F04-abac-casl",{"title":4637,"path":4638,"stem":4639},"Кастомні декоратори та метадані","\u002Fweb-development\u002Fauthorization-security\u002F05-custom-decorators-metadata","18.web-development\u002F13.authorization-security\u002F05-custom-decorators-metadata",{"title":4641,"path":4642,"stem":4643},"Конфігурація CORS","\u002Fweb-development\u002Fauthorization-security\u002F06-cors-configuration","18.web-development\u002F13.authorization-security\u002F06-cors-configuration",{"title":4645,"path":4646,"stem":4647},"Захист через HTTP Security Headers (Helmet)","\u002Fweb-development\u002Fauthorization-security\u002F07-helmet-security-headers","18.web-development\u002F13.authorization-security\u002F07-helmet-security-headers",{"title":4649,"path":4650,"stem":4651},"Rate Limiting та Throttling","\u002Fweb-development\u002Fauthorization-security\u002F08-rate-limiting-throttling","18.web-development\u002F13.authorization-security\u002F08-rate-limiting-throttling",{"title":4653,"path":4654,"stem":4655},"Захист від поширених атак","\u002Fweb-development\u002Fauthorization-security\u002F09-common-attacks-protection","18.web-development\u002F13.authorization-security\u002F09-common-attacks-protection",{"title":4657,"path":4658,"stem":4659},"HTTPS у продакшені","\u002Fweb-development\u002Fauthorization-security\u002F10-https-production","18.web-development\u002F13.authorization-security\u002F10-https-production",{"title":4661,"icon":871,"path":4662,"stem":4663,"children":4664,"page":59},"Комунікація у реальному часі, нотифікації та фонові задачі","\u002Fweb-development\u002Frealtime-notifications-jobs","18.web-development\u002F14.realtime-notifications-jobs",[4665,4669,4673,4677,4681,4685,4688,4691,4695,4699],{"title":4666,"path":4667,"stem":4668},"Методи комунікації у реальному часі","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F01-realtime-communication-methods","18.web-development\u002F14.realtime-notifications-jobs\u002F01-realtime-communication-methods",{"title":4670,"path":4671,"stem":4672},"WebSocket Gateway у NestJS","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F02-websocket-gateway","18.web-development\u002F14.realtime-notifications-jobs\u002F02-websocket-gateway",{"title":4674,"path":4675,"stem":4676},"Lifecycle та Rooms у WebSocket","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F03-websocket-lifecycle-rooms","18.web-development\u002F14.realtime-notifications-jobs\u002F03-websocket-lifecycle-rooms",{"title":4678,"path":4679,"stem":4680},"Server-Sent Events (SSE)","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F04-server-sent-events","18.web-development\u002F14.realtime-notifications-jobs\u002F04-server-sent-events",{"title":4682,"path":4683,"stem":4684},"Архітектура системи нотифікацій","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F05-notification-system","18.web-development\u002F14.realtime-notifications-jobs\u002F05-notification-system",{"title":904,"path":4686,"stem":4687},"\u002Fweb-development\u002Frealtime-notifications-jobs\u002F06-email-notifications","18.web-development\u002F14.realtime-notifications-jobs\u002F06-email-notifications",{"title":900,"path":4689,"stem":4690},"\u002Fweb-development\u002Frealtime-notifications-jobs\u002F07-web-push-notifications","18.web-development\u002F14.realtime-notifications-jobs\u002F07-web-push-notifications",{"title":4692,"path":4693,"stem":4694},"Фонові задачі та черги","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F08-background-jobs-queues","18.web-development\u002F14.realtime-notifications-jobs\u002F08-background-jobs-queues",{"title":4696,"path":4697,"stem":4698},"Планувальники та Cron jobs","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F09-schedulers-cron","18.web-development\u002F14.realtime-notifications-jobs\u002F09-schedulers-cron",{"title":4700,"path":4701,"stem":4702},"Практичні сценарії застосування","\u002Fweb-development\u002Frealtime-notifications-jobs\u002F10-practical-scenarios","18.web-development\u002F14.realtime-notifications-jobs\u002F10-practical-scenarios",{"title":4704,"icon":4705,"path":4706,"stem":4707,"children":4708,"page":59},"Тестування, документування та розгортання застосунків","i-lucide-rocket","\u002Fweb-development\u002Ftesting-documentation-deployment","18.web-development\u002F15.testing-documentation-deployment",[4709,4713,4717,4721,4725,4729,4733,4737,4741,4745],{"title":4710,"path":4711,"stem":4712},"Піраміда тестування та стратегія","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F01-testing-pyramid-strategy","18.web-development\u002F15.testing-documentation-deployment\u002F01-testing-pyramid-strategy",{"title":4714,"path":4715,"stem":4716},"Основи Jest у NestJS","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F02-jest-nestjs-basics","18.web-development\u002F15.testing-documentation-deployment\u002F02-jest-nestjs-basics",{"title":4718,"path":4719,"stem":4720},"Unit-тестування сервісів","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F03-unit-testing-services","18.web-development\u002F15.testing-documentation-deployment\u002F03-unit-testing-services",{"title":4722,"path":4723,"stem":4724},"E2E тестування та покриття коду","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F04-e2e-testing-coverage","18.web-development\u002F15.testing-documentation-deployment\u002F04-e2e-testing-coverage",{"title":4726,"path":4727,"stem":4728},"Swagger, OpenAPI, Scalar та Arazzo","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F05-swagger-openapi","18.web-development\u002F15.testing-documentation-deployment\u002F05-swagger-openapi",{"title":4730,"path":4731,"stem":4732},"Керування конфігурацією","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F06-configuration-management","18.web-development\u002F15.testing-documentation-deployment\u002F06-configuration-management",{"title":4734,"path":4735,"stem":4736},"Docker та контейнеризація","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F07-docker-containerization","18.web-development\u002F15.testing-documentation-deployment\u002F07-docker-containerization",{"title":4738,"path":4739,"stem":4740},"CI\u002FCD Pipelines","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F08-cicd-pipelines","18.web-development\u002F15.testing-documentation-deployment\u002F08-cicd-pipelines",{"title":4742,"path":4743,"stem":4744},"Логування та моніторинг","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F09-logging-monitoring","18.web-development\u002F15.testing-documentation-deployment\u002F09-logging-monitoring",{"title":4746,"path":4747,"stem":4748},"Серіалізація та компресія","\u002Fweb-development\u002Ftesting-documentation-deployment\u002F10-serialization-compression","18.web-development\u002F15.testing-documentation-deployment\u002F10-serialization-compression",{"title":4750,"icon":4751,"path":4752,"stem":4753,"children":4754,"page":59},"AI Core: мислення AI","i-lucide-brain","\u002Fai-core","19.ai-core",[4755,4796,4845,4883],{"title":4756,"icon":4705,"path":4757,"stem":4758,"children":4759,"page":59},"Вхід у професію AI Native Developer","\u002Fai-core\u002Fai-native-developer","19.ai-core\u002F01.ai-native-developer",[4760,4764,4768,4772,4776,4780,4784,4788,4792],{"title":4761,"path":4762,"stem":4763},"Вступ до професії розробника цифрових продуктів","\u002Fai-core\u002Fai-native-developer\u002Fdigital-products","19.ai-core\u002F01.ai-native-developer\u002F01.digital-products",{"title":4765,"path":4766,"stem":4767},"Професія розробника програмного забезпечення","\u002Fai-core\u002Fai-native-developer\u002Fsoftware-developer","19.ai-core\u002F01.ai-native-developer\u002F02.software-developer",{"title":4769,"path":4770,"stem":4771},"Професія AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fai-native-developer","19.ai-core\u002F01.ai-native-developer\u002F03.ai-native-developer",{"title":4773,"path":4774,"stem":4775},"Вплив AI на розробку програмного забезпечення","\u002Fai-core\u002Fai-native-developer\u002Fai-impact-on-development","19.ai-core\u002F01.ai-native-developer\u002F04.ai-impact-on-development",{"title":4777,"path":4778,"stem":4779},"Життєвий цикл цифрового продукту","\u002Fai-core\u002Fai-native-developer\u002Fproduct-lifecycle","19.ai-core\u002F01.ai-native-developer\u002F05.product-lifecycle",{"title":4781,"path":4782,"stem":4783},"Застосування AI на етапах створення цифрового продукту","\u002Fai-core\u002Fai-native-developer\u002Fai-in-product-creation","19.ai-core\u002F01.ai-native-developer\u002F06.ai-in-product-creation",{"title":4785,"path":4786,"stem":4787},"Розподіл завдань між людиною та AI","\u002Fai-core\u002Fai-native-developer\u002Fhuman-vs-ai-tasks","19.ai-core\u002F01.ai-native-developer\u002F07.human-vs-ai-tasks",{"title":4789,"path":4790,"stem":4791},"Компетенції AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fcompetencies","19.ai-core\u002F01.ai-native-developer\u002F08.competencies",{"title":4793,"path":4794,"stem":4795},"Карта професійного розвитку AI Native Developer","\u002Fai-core\u002Fai-native-developer\u002Fcareer-roadmap","19.ai-core\u002F01.ai-native-developer\u002F09.career-roadmap",{"title":4797,"icon":255,"path":4798,"stem":4799,"children":4800,"page":59},"Штучний інтелект і машинне навчання","\u002Fai-core\u002Fai-and-machine-learning","19.ai-core\u002F02.ai-and-machine-learning",[4801,4805,4809,4813,4817,4821,4825,4829,4833,4837,4841],{"title":4802,"path":4803,"stem":4804},"Штучний інтелект","\u002Fai-core\u002Fai-and-machine-learning\u002Fwhat-is-ai","19.ai-core\u002F02.ai-and-machine-learning\u002F01.what-is-ai",{"title":4806,"path":4807,"stem":4808},"Відмінність AI від інших програмних систем","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-vs-automation","19.ai-core\u002F02.ai-and-machine-learning\u002F02.ai-vs-automation",{"title":4810,"path":4811,"stem":4812},"Завдання штучного інтелекту","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-tasks","19.ai-core\u002F02.ai-and-machine-learning\u002F03.ai-tasks",{"title":4814,"path":4815,"stem":4816},"Machine Learning","\u002Fai-core\u002Fai-and-machine-learning\u002Fmachine-learning","19.ai-core\u002F02.ai-and-machine-learning\u002F04.machine-learning",{"title":4818,"path":4819,"stem":4820},"Machine Learning Workflow","\u002Fai-core\u002Fai-and-machine-learning\u002Fml-workflow","19.ai-core\u002F02.ai-and-machine-learning\u002F05.ml-workflow",{"title":4822,"path":4823,"stem":4824},"Типи машинного навчання","\u002Fai-core\u002Fai-and-machine-learning\u002Fml-types","19.ai-core\u002F02.ai-and-machine-learning\u002F06.ml-types",{"title":4826,"path":4827,"stem":4828},"Generative AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fgenerative-ai","19.ai-core\u002F02.ai-and-machine-learning\u002F07.generative-ai",{"title":4830,"path":4831,"stem":4832},"Типи контенту, створюваного AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fai-content-types","19.ai-core\u002F02.ai-and-machine-learning\u002F08.ai-content-types",{"title":4834,"path":4835,"stem":4836},"Великі мовні моделі","\u002Fai-core\u002Fai-and-machine-learning\u002Flarge-language-models","19.ai-core\u002F02.ai-and-machine-learning\u002F09.large-language-models",{"title":4838,"path":4839,"stem":4840},"Можливості та обмеження Generative AI","\u002Fai-core\u002Fai-and-machine-learning\u002Fcapabilities-and-limitations","19.ai-core\u002F02.ai-and-machine-learning\u002F10.capabilities-and-limitations",{"title":4842,"path":4843,"stem":4844},"Сучасні AI-асистенти","\u002Fai-core\u002Fai-and-machine-learning\u002Fmodern-ai-assistants","19.ai-core\u002F02.ai-and-machine-learning\u002F11.modern-ai-assistants",{"title":4846,"icon":4847,"path":4848,"stem":4849,"children":4850,"page":59},"Постановка завдань для AI: принципи створення промптів","i-lucide-message-square-text","\u002Fai-core\u002Fprompt-engineering","19.ai-core\u002F03.prompt-engineering",[4851,4855,4859,4863,4867,4871,4875,4879],{"title":4852,"path":4853,"stem":4854},"Промпт як інструмент","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-as-tool","19.ai-core\u002F03.prompt-engineering\u002F01.prompt-as-tool",{"title":4856,"path":4857,"stem":4858},"Принципи створення промптів","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-principles","19.ai-core\u002F03.prompt-engineering\u002F02.prompt-principles",{"title":4860,"path":4861,"stem":4862},"Структура промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-structure","19.ai-core\u002F03.prompt-engineering\u002F03.prompt-structure",{"title":4864,"path":4865,"stem":4866},"Види промптів за типом задачі","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-types","19.ai-core\u002F03.prompt-engineering\u002F04.prompt-types",{"title":4868,"path":4869,"stem":4870},"Прийоми посилення промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-enhancement","19.ai-core\u002F03.prompt-engineering\u002F05.prompt-enhancement",{"title":4872,"path":4873,"stem":4874},"Розбір і покращення промпта","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-analysis","19.ai-core\u002F03.prompt-engineering\u002F06.prompt-analysis",{"title":4876,"path":4877,"stem":4878},"Типові помилки під час створення промптів","\u002Fai-core\u002Fprompt-engineering\u002Fcommon-mistakes","19.ai-core\u002F03.prompt-engineering\u002F07.common-mistakes",{"title":4880,"path":4881,"stem":4882},"Практикум: особиста бібліотека промптів","\u002Fai-core\u002Fprompt-engineering\u002Fprompt-library","19.ai-core\u002F03.prompt-engineering\u002F08.prompt-library",{"title":4884,"icon":793,"path":4885,"stem":4886,"children":4887,"page":59},"Перевірка результатів, безпека та AI Native Workflow","\u002Fai-core\u002Fverification-security-workflow","19.ai-core\u002F04.verification-security-workflow",[4888,4892,4896,4900,4904,4908,4912,4916,4920],{"title":4889,"path":4890,"stem":4891},"Межі можливостей AI","\u002Fai-core\u002Fverification-security-workflow\u002Fai-limitations","19.ai-core\u002F04.verification-security-workflow\u002F01.ai-limitations",{"title":4893,"path":4894,"stem":4895},"Галюцинації AI","\u002Fai-core\u002Fverification-security-workflow\u002Fai-hallucinations","19.ai-core\u002F04.verification-security-workflow\u002F02.ai-hallucinations",{"title":4897,"path":4898,"stem":4899},"Критичне мислення під час роботи з AI","\u002Fai-core\u002Fverification-security-workflow\u002Fcritical-thinking","19.ai-core\u002F04.verification-security-workflow\u002F03.critical-thinking",{"title":4901,"path":4902,"stem":4903},"Перевірка результатів роботи AI","\u002Fai-core\u002Fverification-security-workflow\u002Fresult-verification","19.ai-core\u002F04.verification-security-workflow\u002F04.result-verification",{"title":4905,"path":4906,"stem":4907},"Захист даних під час роботи з AI","\u002Fai-core\u002Fverification-security-workflow\u002Fdata-protection","19.ai-core\u002F04.verification-security-workflow\u002F05.data-protection",{"title":4909,"path":4910,"stem":4911},"Авторське право та навчальна доброчесність","\u002Fai-core\u002Fverification-security-workflow\u002Fcopyright-integrity","19.ai-core\u002F04.verification-security-workflow\u002F06.copyright-integrity",{"title":4913,"path":4914,"stem":4915},"Відповідальне використання AI","\u002Fai-core\u002Fverification-security-workflow\u002Fresponsible-use","19.ai-core\u002F04.verification-security-workflow\u002F07.responsible-use",{"title":4917,"path":4918,"stem":4919},"AI Native Workflow","\u002Fai-core\u002Fverification-security-workflow\u002Fai-native-workflow","19.ai-core\u002F04.verification-security-workflow\u002F08.ai-native-workflow",{"title":4921,"path":4922,"stem":4923},"Застосування AI Native Workflow під час створення цифрового продукту","\u002Fai-core\u002Fverification-security-workflow\u002Fworkflow-in-practice","19.ai-core\u002F04.verification-security-workflow\u002F09.workflow-in-practice",{"title":4925,"icon":4926,"path":4927,"stem":4928,"children":4929,"page":59},"AI Developer: Vibe Coding Sprint","i-lucide-code-xml","\u002Fai-developer","20.ai-developer",[4930,4956,4978,4999],{"title":4931,"icon":4932,"path":4933,"stem":4934,"children":4935,"page":59},"Проєктування і чорнова версія","i-lucide-pencil-ruler","\u002Fai-developer\u002Fdraft-creation","20.ai-developer\u002F01.draft-creation",[4936,4940,4944,4948,4952],{"title":4937,"path":4938,"stem":4939},"Парадигма Vibe Coding Workflow","\u002Fai-developer\u002Fdraft-creation\u002Fvibe-coding-workflow","20.ai-developer\u002F01.draft-creation\u002F01.vibe-coding-workflow",{"title":4941,"path":4942,"stem":4943},"AI-середовище швидкої розробки","\u002Fai-developer\u002Fdraft-creation\u002Fai-ide-environment","20.ai-developer\u002F01.draft-creation\u002F02.ai-ide-environment",{"title":4945,"path":4946,"stem":4947},"Користувацьке завдання та межі першої версії","\u002Fai-developer\u002Fdraft-creation\u002Fproduct-scope-and-mvp","20.ai-developer\u002F01.draft-creation\u002F03.product-scope-and-mvp",{"title":4949,"path":4950,"stem":4951},"Архітектура інтерфейсу та стани застосунку","\u002Fai-developer\u002Fdraft-creation\u002Fapplication-architecture-and-states","20.ai-developer\u002F01.draft-creation\u002F04.application-architecture-and-states",{"title":4953,"path":4954,"stem":4955},"Генерація та фіксація чорнової версії","\u002Fai-developer\u002Fdraft-creation\u002Fgenerating-draft-version","20.ai-developer\u002F01.draft-creation\u002F05.generating-draft-version",{"title":4957,"icon":4958,"path":4959,"stem":4960,"children":4961,"page":59},"Перша робоча версія","i-lucide-play-circle","\u002Fai-developer\u002Ffirst-working-version","20.ai-developer\u002F02.first-working-version",[4962,4966,4970,4974],{"title":4963,"path":4964,"stem":4965},"Уточнення контексту проєкту для AI","\u002Fai-developer\u002Ffirst-working-version\u002Frefining-project-context","20.ai-developer\u002F02.first-working-version\u002F01.refining-project-context",{"title":4967,"path":4968,"stem":4969},"Стратегія завдань для AI-розробки","\u002Fai-developer\u002Ffirst-working-version\u002Fai-prompting-strategy","20.ai-developer\u002F02.first-working-version\u002F02.ai-prompting-strategy",{"title":4971,"path":4972,"stem":4973},"Доопрацювання до першої робочої версії","\u002Fai-developer\u002Ffirst-working-version\u002Frefining-to-working-version","20.ai-developer\u002F02.first-working-version\u002F03.refining-to-working-version",{"title":4975,"path":4976,"stem":4977},"Перевірка першої робочої версії","\u002Fai-developer\u002Ffirst-working-version\u002Ftesting-first-working-version","20.ai-developer\u002F02.first-working-version\u002F04.testing-first-working-version",{"title":4979,"icon":3028,"path":4980,"stem":4981,"children":4982,"page":59},"Ітерації, дебагінг та відновлення","\u002Fai-developer\u002Fiteration-debugging-recovery","20.ai-developer\u002F03.iteration-debugging-recovery",[4983,4987,4991,4995],{"title":4984,"path":4985,"stem":4986},"Управління точковими змінами продукту","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fchange-management","20.ai-developer\u002F03.iteration-debugging-recovery\u002F01.change-management",{"title":4988,"path":4989,"stem":4990},"Надійність інтерфейсу та обробка помилок","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fscenario-reliability-and-errors","20.ai-developer\u002F03.iteration-debugging-recovery\u002F02.scenario-reliability-and-errors",{"title":4992,"path":4993,"stem":4994},"Керування контекстом і збереження версій","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fproject-context-and-versions","20.ai-developer\u002F03.iteration-debugging-recovery\u002F03.project-context-and-versions",{"title":4996,"path":4997,"stem":4998},"Збої AI-розробки, ліміти та аварійне відновлення","\u002Fai-developer\u002Fiteration-debugging-recovery\u002Fai-breakdowns-and-recovery","20.ai-developer\u002F03.iteration-debugging-recovery\u002F04.ai-breakdowns-and-recovery",{"title":5000,"icon":5001,"path":5002,"stem":5003,"children":5004,"page":59},"Перевірка та завершення продукту","i-lucide-check-check","\u002Fai-developer\u002Fverification-and-completion","20.ai-developer\u002F04.verification-and-completion",[5005,5009,5013],{"title":5006,"path":5007,"stem":5008},"Комплексний аудит та підсумкове тестування","\u002Fai-developer\u002Fverification-and-completion\u002Ffinal-product-testing","20.ai-developer\u002F04.verification-and-completion\u002F01.final-product-testing",{"title":5010,"path":5011,"stem":5012},"Підготовка підсумкової версії коду","\u002Fai-developer\u002Fverification-and-completion\u002Fpreparing-release-version","20.ai-developer\u002F04.verification-and-completion\u002F02.preparing-release-version",{"title":5014,"path":5015,"stem":5016},"Демонстрація, публікація та критерії оцінювання","\u002Fai-developer\u002Fverification-and-completion\u002Fproduct-showcase-and-publishing","20.ai-developer\u002F04.verification-and-completion\u002F03.product-showcase-and-publishing",{"title":5018,"path":5019,"stem":5020,"children":5021,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[5022,5026,5030,5034,5038,5042,5046,5050,5054,5058,5062,5066],{"title":5023,"path":5024,"stem":5025},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":5027,"path":5028,"stem":5029},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":5031,"path":5032,"stem":5033},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":5035,"path":5036,"stem":5037},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":5039,"path":5040,"stem":5041},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":5043,"path":5044,"stem":5045},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":5047,"path":5048,"stem":5049},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":5051,"path":5052,"stem":5053},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":5055,"path":5056,"stem":5057},"Темна тема та система дизайн-токенів у Tailwind v4","\u002Ftailwind\u002Ftailwind-dark-mode-theming","21.tailwind\u002F09.tailwind-dark-mode-theming",{"title":5059,"path":5060,"stem":5061},"Довільні значення та контейнерні запити у Tailwind v4","\u002Ftailwind\u002Ftailwind-arbitrary-container-queries","21.tailwind\u002F10.tailwind-arbitrary-container-queries",{"title":5063,"path":5064,"stem":5065},"Анімації, трансформації та 3D у Tailwind v4","\u002Ftailwind\u002Ftailwind-animations-transforms","21.tailwind\u002F11.tailwind-animations-transforms",{"title":5067,"path":5068,"stem":5069},"Tailwind CLI, PostCSS та інтеграція з фреймворками","\u002Ftailwind\u002Ftailwind-cli-tooling","21.tailwind\u002F12.tailwind-cli-tooling",{"title":5071,"path":5072,"stem":5073},"Тестування компонентів діаграм","\u002Ftest-components","98.test-components",{"id":5075,"title":4332,"body":5076,"description":12543,"extension":12544,"links":12545,"meta":12546,"navigation":5258,"path":4333,"seo":12547,"stem":4334,"__hash__":12548},"docs\u002F18.web-development\u002F07.nestjs-controllers-routing\u002F15.redirects.md",{"type":5077,"value":5078,"toc":12497},"minimark",[5079,5083,5190,5195,5203,5214,5219,5459,5464,5504,5512,5516,5519,5527,5532,5552,5556,5560,5563,5568,5574,5577,5582,5588,5591,5596,5602,5605,5616,5620,5623,5772,5776,5786,5791,5805,5810,5842,5847,5853,5867,5871,5879,5885,5899,5904,5910,5913,5917,5926,5936,5940,5948,5952,5960,5964,5970,5977,5983,5987,6000,6004,6014,6018,6029,6033,6039,6046,6050,6059,6069,6073,6083,6087,6101,6105,6111,6114,6118,6246,6345,6349,6356,6360,6499,6504,6520,6558,6562,6690,6792,6796,7124,7135,7139,7273,7277,7283,7386,7407,7411,7426,7430,7669,7674,7721,7731,7735,7738,8483,8488,9107,9300,9304,9307,9618,9623,9649,9655,9659,10081,10085,10100,10104,10309,10362,10366,10373,10657,10661,10664,10668,10738,10742,10892,10896,10901,10915,10920,10934,10939,10947,10953,10957,11506,11510,11520,11754,11760,11904,11908,12188,12312,12341,12345,12452,12456,12459,12490,12493],[5080,5081,4332],"h1",{"id":5082},"перенаправлення-redirects-та-декоратор-redirect",[5084,5085,5086,5119],"card-group",{},[5087,5088,5091],"card",{"icon":5089,"title":5090},"i-lucide-target","🎯 Мета лекції",[5092,5093,5094,5098,5101,5104,5107,5110,5113,5116],"ul",{},[5095,5096,5097],"li",{},"Зрозуміти механізм HTTP-перенаправлень та їх роль у веб-застосунках",[5095,5099,5100],{},"Опанувати використання декоратора @Redirect для статичних перенаправлень",[5095,5102,5103],{},"Вивчити семантику кодів 3xx: 301, 302, 303, 307, 308 та їх відмінності",[5095,5105,5106],{},"Навчитися реалізовувати динамічні перенаправлення через повернення об'єкта",[5095,5108,5109],{},"Засвоїти різницю між постійним (301) та тимчасовим (302\u002F307) редиректом",[5095,5111,5112],{},"Практикувати створення скорочувачів URL та систем переадресації",[5095,5114,5115],{},"Зрозуміти вплив перенаправлень на SEO та поведінку браузерів",[5095,5117,5118],{},"Навчитися вибирати правильний код перенаправлення для різних сценаріїв",[5087,5120,5122],{"icon":4574,"title":5121},"🔑 Ключові терміни",[5092,5123,5124,5136,5145,5154,5163,5172,5181],{},[5095,5125,5126,5130,5131,5135],{},[5127,5128,5129],"strong",{},"HTTP Redirect"," (",[5132,5133,5134],"em",{},"HTTP-перенаправлення","): відповідь сервера, що вказує клієнту перейти на інший URL",[5095,5137,5138,5130,5141,5144],{},[5127,5139,5140],{},"Location Header",[5132,5142,5143],{},"заголовок Location","): HTTP-заголовок, що містить цільовий URL перенаправлення",[5095,5146,5147,5130,5150,5153],{},[5127,5148,5149],{},"3xx Status Codes",[5132,5151,5152],{},"коди 3xx","): клас HTTP-статус кодів для перенаправлень",[5095,5155,5156,5130,5159,5162],{},[5127,5157,5158],{},"Permanent Redirect",[5132,5160,5161],{},"постійне перенаправлення","): ресурс остаточно переміщено (301, 308)",[5095,5164,5165,5130,5168,5171],{},[5127,5166,5167],{},"Temporary Redirect",[5132,5169,5170],{},"тимчасове перенаправлення","): ресурс тимчасово доступний за іншим URL (302, 307)",[5095,5173,5174,5130,5177,5180],{},[5127,5175,5176],{},"Method Preservation",[5132,5178,5179],{},"збереження методу","): поведінка редиректу щодо HTTP-методу запиту",[5095,5182,5183,5130,5186,5189],{},[5127,5184,5185],{},"URL Shortener",[5132,5187,5188],{},"скорочувач URL","): сервіс перетворення довгих URL на короткі посилання",[5191,5192,5194],"h2",{"id":5193},"http-перенаправлення-механізм-переадресації","HTTP-перенаправлення: механізм переадресації",[5196,5197,5198,5199,5202],"p",{},"HTTP-перенаправлення (",[5132,5200,5201],{},"redirect",") є фундаментальним механізмом протоколу HTTP, що дозволяє серверу інструктувати клієнта (браузер, HTTP-клієнт) автоматично перейти на інший URL замість відображення вмісту поточного запиту. Перенаправлення використовується у безлічі сценаріїв: міграція контенту на нову адресу, скорочувачі URL, переадресація після успішної форми, канонізація URL для SEO, автентифікація та багато іншого.",[5196,5204,5205,5206,5209,5210,5213],{},"Технічно перенаправлення реалізується через ",[5127,5207,5208],{},"статус коди класу 3xx"," та HTTP-заголовок ",[5127,5211,5212],{},"Location",", що містить цільовий URL. Коли браузер отримує відповідь з кодом 3xx, він автоматично виконує новий запит до URL з заголовка Location, не вимагаючи втручання користувача. Цей процес може відбутися кілька разів послідовно (ланцюжок редиректів), але браузери зазвичай обмежують глибину такого ланцюжка для захисту від нескінченних циклів.",[5215,5216,5218],"h3",{"id":5217},"анатомія-http-перенаправлення","Анатомія HTTP-перенаправлення",[5220,5221,5223],"plant-uml",{"alt":5222},"Процес HTTP-перенаправлення між клієнтом та сервером",[5224,5225,5230],"pre",{"className":5226,"code":5227,"language":5228,"meta":5229,"style":5229},"language-plantuml shiki shiki-themes light-plus dark-plus dark-plus","@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nactor \"Браузер\" as Browser #DBEAFE\nparticipant \"Сервер (old-url)\" as OldServer #F59E0B\nparticipant \"Сервер (new-url)\" as NewServer #22c55e\n\nBrowser -> OldServer : GET \u002Fold-path HTTP\u002F1.1\nnote right\n  Користувач переходить\n  на старий URL\nend note\n\nOldServer --> Browser : HTTP\u002F1.1 301 Moved Permanently\\nLocation: \u002Fnew-path\nnote left #FEF3C7\n  Сервер повертає 301\n  з новою адресою\nend note\n\nBrowser -> NewServer : GET \u002Fnew-path HTTP\u002F1.1\nnote right\n  Браузер автоматично\n  виконує запит на новий URL\nend note\n\nNewServer --> Browser : HTTP\u002F1.1 200 OK\\nContent: ...\nnote left #DCFCE7\n  Сервер повертає\n  вміст сторінки\nend note\n\nnote over Browser\n  Користувач бачить вміст \u002Fnew-path.\n  Адресна стрічка показує \u002Fnew-path.\n  Історія браузера містить обидва URL.\nend note\n\n@enduml\n","plantuml","",[5231,5232,5233,5241,5247,5253,5260,5266,5272,5278,5283,5289,5295,5301,5307,5313,5318,5324,5330,5336,5342,5347,5352,5358,5363,5369,5375,5380,5385,5391,5397,5403,5409,5414,5419,5425,5431,5437,5443,5448,5453],"code",{"__ignoreMap":5229},[5234,5235,5238],"span",{"class":5236,"line":5237},"line",1,[5234,5239,5240],{},"@startuml\n",[5234,5242,5244],{"class":5236,"line":5243},2,[5234,5245,5246],{},"skinparam style plain\n",[5234,5248,5250],{"class":5236,"line":5249},3,[5234,5251,5252],{},"skinparam backgroundColor #FFFFFF\n",[5234,5254,5256],{"class":5236,"line":5255},4,[5234,5257,5259],{"emptyLinePlaceholder":5258},true,"\n",[5234,5261,5263],{"class":5236,"line":5262},5,[5234,5264,5265],{},"actor \"Браузер\" as Browser #DBEAFE\n",[5234,5267,5269],{"class":5236,"line":5268},6,[5234,5270,5271],{},"participant \"Сервер (old-url)\" as OldServer #F59E0B\n",[5234,5273,5275],{"class":5236,"line":5274},7,[5234,5276,5277],{},"participant \"Сервер (new-url)\" as NewServer #22c55e\n",[5234,5279,5281],{"class":5236,"line":5280},8,[5234,5282,5259],{"emptyLinePlaceholder":5258},[5234,5284,5286],{"class":5236,"line":5285},9,[5234,5287,5288],{},"Browser -> OldServer : GET \u002Fold-path HTTP\u002F1.1\n",[5234,5290,5292],{"class":5236,"line":5291},10,[5234,5293,5294],{},"note right\n",[5234,5296,5298],{"class":5236,"line":5297},11,[5234,5299,5300],{},"  Користувач переходить\n",[5234,5302,5304],{"class":5236,"line":5303},12,[5234,5305,5306],{},"  на старий URL\n",[5234,5308,5310],{"class":5236,"line":5309},13,[5234,5311,5312],{},"end note\n",[5234,5314,5316],{"class":5236,"line":5315},14,[5234,5317,5259],{"emptyLinePlaceholder":5258},[5234,5319,5321],{"class":5236,"line":5320},15,[5234,5322,5323],{},"OldServer --> Browser : HTTP\u002F1.1 301 Moved Permanently\\nLocation: \u002Fnew-path\n",[5234,5325,5327],{"class":5236,"line":5326},16,[5234,5328,5329],{},"note left #FEF3C7\n",[5234,5331,5333],{"class":5236,"line":5332},17,[5234,5334,5335],{},"  Сервер повертає 301\n",[5234,5337,5339],{"class":5236,"line":5338},18,[5234,5340,5341],{},"  з новою адресою\n",[5234,5343,5345],{"class":5236,"line":5344},19,[5234,5346,5312],{},[5234,5348,5350],{"class":5236,"line":5349},20,[5234,5351,5259],{"emptyLinePlaceholder":5258},[5234,5353,5355],{"class":5236,"line":5354},21,[5234,5356,5357],{},"Browser -> NewServer : GET \u002Fnew-path HTTP\u002F1.1\n",[5234,5359,5361],{"class":5236,"line":5360},22,[5234,5362,5294],{},[5234,5364,5366],{"class":5236,"line":5365},23,[5234,5367,5368],{},"  Браузер автоматично\n",[5234,5370,5372],{"class":5236,"line":5371},24,[5234,5373,5374],{},"  виконує запит на новий URL\n",[5234,5376,5378],{"class":5236,"line":5377},25,[5234,5379,5312],{},[5234,5381,5383],{"class":5236,"line":5382},26,[5234,5384,5259],{"emptyLinePlaceholder":5258},[5234,5386,5388],{"class":5236,"line":5387},27,[5234,5389,5390],{},"NewServer --> Browser : HTTP\u002F1.1 200 OK\\nContent: ...\n",[5234,5392,5394],{"class":5236,"line":5393},28,[5234,5395,5396],{},"note left #DCFCE7\n",[5234,5398,5400],{"class":5236,"line":5399},29,[5234,5401,5402],{},"  Сервер повертає\n",[5234,5404,5406],{"class":5236,"line":5405},30,[5234,5407,5408],{},"  вміст сторінки\n",[5234,5410,5412],{"class":5236,"line":5411},31,[5234,5413,5312],{},[5234,5415,5417],{"class":5236,"line":5416},32,[5234,5418,5259],{"emptyLinePlaceholder":5258},[5234,5420,5422],{"class":5236,"line":5421},33,[5234,5423,5424],{},"note over Browser\n",[5234,5426,5428],{"class":5236,"line":5427},34,[5234,5429,5430],{},"  Користувач бачить вміст \u002Fnew-path.\n",[5234,5432,5434],{"class":5236,"line":5433},35,[5234,5435,5436],{},"  Адресна стрічка показує \u002Fnew-path.\n",[5234,5438,5440],{"class":5236,"line":5439},36,[5234,5441,5442],{},"  Історія браузера містить обидва URL.\n",[5234,5444,5446],{"class":5236,"line":5445},37,[5234,5447,5312],{},[5234,5449,5451],{"class":5236,"line":5450},38,[5234,5452,5259],{"emptyLinePlaceholder":5258},[5234,5454,5456],{"class":5236,"line":5455},39,[5234,5457,5458],{},"@enduml\n",[5196,5460,5461],{},[5127,5462,5463],{},"Етапи процесу перенаправлення:",[5465,5466,5467,5477,5486,5492,5498],"ol",{},[5095,5468,5469,5472,5473,5476],{},[5127,5470,5471],{},"Клієнт надсилає запит"," на оригінальний URL (наприклад, ",[5231,5474,5475],{},"GET \u002Fold-path",")",[5095,5478,5479,5482,5483],{},[5127,5480,5481],{},"Сервер повертає відповідь 3xx"," з заголовком ",[5231,5484,5485],{},"Location: \u002Fnew-path",[5095,5487,5488,5491],{},[5127,5489,5490],{},"Клієнт автоматично виконує новий запит"," до URL з Location",[5095,5493,5494,5497],{},[5127,5495,5496],{},"Сервер за новим URL повертає 200 OK"," з вмістом сторінки",[5095,5499,5500,5503],{},[5127,5501,5502],{},"Браузер відображає вміст"," та оновлює адресну стрічку",[5505,5506,5507,5508,5511],"note",{},"Важливо розуміти, що перенаправлення — це ",[5127,5509,5510],{},"два окремі HTTP-запити",". Перший запит повертає лише заголовки без значущого тіла (хоча технічно тіло може бути присутнім для старих браузерів), а другий запит отримує фактичний вміст. Це має наслідки для продуктивності, логування та безпеки.",[5215,5513,5515],{"id":5514},"структура-http-відповіді-з-перенаправленням","Структура HTTP-відповіді з перенаправленням",[5196,5517,5518],{},"Типова відповідь з перенаправленням виглядає наступним чином:",[5224,5520,5525],{"className":5521,"code":5523,"language":5524},[5522],"language-text","HTTP\u002F1.1 301 Moved Permanently\nLocation: https:\u002F\u002Fexample.com\u002Fnew-path\nContent-Type: text\u002Fhtml\nContent-Length: 185\n\n\u003Chtml>\n\u003Chead>\u003Ctitle>301 Moved Permanently\u003C\u002Ftitle>\u003C\u002Fhead>\n\u003Cbody>\n\u003Ch1>Moved Permanently\u003C\u002Fh1>\n\u003Cp>The document has moved \u003Ca href=\"https:\u002F\u002Fexample.com\u002Fnew-path\">here\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","text",[5231,5526,5523],{"__ignoreMap":5229},[5196,5528,5529],{},[5127,5530,5531],{},"Ключові елементи:",[5092,5533,5534,5540,5546],{},[5095,5535,5536,5539],{},[5127,5537,5538],{},"Статус код 301"," — вказує тип перенаправлення (постійне)",[5095,5541,5542,5545],{},[5127,5543,5544],{},"Location заголовок"," — містить цільовий URL (може бути відносним або абсолютним)",[5095,5547,5548,5551],{},[5127,5549,5550],{},"HTML-тіло"," — опціональне, призначене для старих браузерів або ботів, що не виконують автоматичне перенаправлення",[5553,5554,5555],"tip",{},"Сучасні HTTP-клієнти (браузери, бібліотеки) автоматично слідують перенаправленням, ігноруючи HTML-тіло відповіді. Проте надання HTML-тіла з посиланням вважається хорошою практикою для сумісності зі старими клієнтами та пошуковими ботами.",[5215,5557,5559],{"id":5558},"типи-url-у-заголовку-location","Типи URL у заголовку Location",[5196,5561,5562],{},"Заголовок Location може містити три типи URL:",[5196,5564,5565],{},[5127,5566,5567],{},"Абсолютний URL (рекомендовано):",[5224,5569,5572],{"className":5570,"code":5571,"language":5524},[5522],"Location: https:\u002F\u002Fexample.com\u002Fnew-path\n",[5231,5573,5571],{"__ignoreMap":5229},[5196,5575,5576],{},"Містить повну адресу з протоколом, доменом та шляхом. Найнадійніший варіант, працює у всіх сценаріях.",[5196,5578,5579],{},[5127,5580,5581],{},"Абсолютний шлях (відносно домену):",[5224,5583,5586],{"className":5584,"code":5585,"language":5524},[5522],"Location: \u002Fnew-path\n",[5231,5587,5585],{"__ignoreMap":5229},[5196,5589,5590],{},"Клієнт додає поточний протокол та домен. Працює для перенаправлень всередині одного сайту.",[5196,5592,5593],{},[5127,5594,5595],{},"Відносний шлях:",[5224,5597,5600],{"className":5598,"code":5599,"language":5524},[5522],"Location: ..\u002Fnew-path\nLocation: subdir\u002Fpage\n",[5231,5601,5599],{"__ignoreMap":5229},[5196,5603,5604],{},"Розраховується відносно поточного URL. Рідко використовується через складність обчислення та потенційні проблеми.",[5606,5607,5608,5611,5612,5615],"warning",{},[5127,5609,5610],{},"RFC 7231"," рекомендує використовувати ",[5127,5613,5614],{},"абсолютні URL"," у заголовку Location для уникнення неоднозначностей та забезпечення сумісності. Хоча більшість браузерів коректно обробляють відносні шляхи, деякі проксі-сервери та застарілі клієнти можуть зазнати проблем.",[5191,5617,5619],{"id":5618},"класифікація-кодів-перенаправлення-3xx","Класифікація кодів перенаправлення 3xx",[5196,5621,5622],{},"HTTP-специфікація визначає п'ять основних кодів перенаправлення, кожен з яких має специфічну семантику щодо постійності редиректу та збереження HTTP-методу запиту:",[5624,5625,5626],"mermaid",{},[5224,5627,5630],{"className":5628,"code":5629,"language":5624,"meta":5229,"style":5229},"language-mermaid shiki shiki-themes light-plus dark-plus dark-plus","graph TB\n    subgraph \"3xx Redirection Codes\"\n        C301[\"301 Moved Permanently\u003Cbr\u002F>Постійне перенаправлення\"]\n        C302[\"302 Found\u003Cbr\u002F>Тимчасове (може змінити метод)\"]\n        C303[\"303 See Other\u003Cbr\u002F>Завжди змінює метод на GET\"]\n        C307[\"307 Temporary Redirect\u003Cbr\u002F>Тимчасове (зберігає метод)\"]\n        C308[\"308 Permanent Redirect\u003Cbr\u002F>Постійне (зберігає метод)\"]\n    end\n    \n    C301 --> |\"Постійно\"| PERMANENT[\"Ресурс переміщено назавжди\u003Cbr\u002F>Браузер кешує редирект\"]\n    C308 --> |\"Постійно\"| PERMANENT\n    \n    C302 --> |\"Тимчасово\"| TEMPORARY[\"Ресурс тимчасово в іншому місці\u003Cbr\u002F>Браузер не кешує\"]\n    C307 --> |\"Тимчасово\"| TEMPORARY\n    C303 --> |\"Тимчасово\"| TEMPORARY\n    \n    C301 --> |\"Може змінити метод\"| METHOD_CHANGE[\"POST → GET\u003Cbr\u002F>(історична поведінка)\"]\n    C302 --> |\"Може змінити метод\"| METHOD_CHANGE\n    \n    C307 --> |\"Зберігає метод\"| METHOD_PRESERVE[\"POST залишається POST\u003Cbr\u002F>PUT залишається PUT\"]\n    C308 --> |\"Зберігає метод\"| METHOD_PRESERVE\n    \n    C303 --> |\"Завжди GET\"| METHOD_GET[\"Будь-який метод → GET\u003Cbr\u002F>(після POST форми)\"]\n    \n    style C301 fill:#f59e0b,stroke:#b45309,color:#ffffff\n    style C308 fill:#f59e0b,stroke:#b45309,color:#ffffff\n    style C302 fill:#3b82f6,stroke:#1d4ed8,color:#ffffff\n    style C307 fill:#3b82f6,stroke:#1d4ed8,color:#ffffff\n    style C303 fill:#22c55e,stroke:#15803d,color:#ffffff\n",[5231,5631,5632,5637,5642,5647,5652,5657,5662,5667,5672,5677,5682,5687,5691,5696,5701,5706,5710,5715,5720,5724,5729,5734,5738,5743,5747,5752,5757,5762,5767],{"__ignoreMap":5229},[5234,5633,5634],{"class":5236,"line":5237},[5234,5635,5636],{},"graph TB\n",[5234,5638,5639],{"class":5236,"line":5243},[5234,5640,5641],{},"    subgraph \"3xx Redirection Codes\"\n",[5234,5643,5644],{"class":5236,"line":5249},[5234,5645,5646],{},"        C301[\"301 Moved Permanently\u003Cbr\u002F>Постійне перенаправлення\"]\n",[5234,5648,5649],{"class":5236,"line":5255},[5234,5650,5651],{},"        C302[\"302 Found\u003Cbr\u002F>Тимчасове (може змінити метод)\"]\n",[5234,5653,5654],{"class":5236,"line":5262},[5234,5655,5656],{},"        C303[\"303 See Other\u003Cbr\u002F>Завжди змінює метод на GET\"]\n",[5234,5658,5659],{"class":5236,"line":5268},[5234,5660,5661],{},"        C307[\"307 Temporary Redirect\u003Cbr\u002F>Тимчасове (зберігає метод)\"]\n",[5234,5663,5664],{"class":5236,"line":5274},[5234,5665,5666],{},"        C308[\"308 Permanent Redirect\u003Cbr\u002F>Постійне (зберігає метод)\"]\n",[5234,5668,5669],{"class":5236,"line":5280},[5234,5670,5671],{},"    end\n",[5234,5673,5674],{"class":5236,"line":5285},[5234,5675,5676],{},"    \n",[5234,5678,5679],{"class":5236,"line":5291},[5234,5680,5681],{},"    C301 --> |\"Постійно\"| PERMANENT[\"Ресурс переміщено назавжди\u003Cbr\u002F>Браузер кешує редирект\"]\n",[5234,5683,5684],{"class":5236,"line":5297},[5234,5685,5686],{},"    C308 --> |\"Постійно\"| PERMANENT\n",[5234,5688,5689],{"class":5236,"line":5303},[5234,5690,5676],{},[5234,5692,5693],{"class":5236,"line":5309},[5234,5694,5695],{},"    C302 --> |\"Тимчасово\"| TEMPORARY[\"Ресурс тимчасово в іншому місці\u003Cbr\u002F>Браузер не кешує\"]\n",[5234,5697,5698],{"class":5236,"line":5315},[5234,5699,5700],{},"    C307 --> |\"Тимчасово\"| TEMPORARY\n",[5234,5702,5703],{"class":5236,"line":5320},[5234,5704,5705],{},"    C303 --> |\"Тимчасово\"| TEMPORARY\n",[5234,5707,5708],{"class":5236,"line":5326},[5234,5709,5676],{},[5234,5711,5712],{"class":5236,"line":5332},[5234,5713,5714],{},"    C301 --> |\"Може змінити метод\"| METHOD_CHANGE[\"POST → GET\u003Cbr\u002F>(історична поведінка)\"]\n",[5234,5716,5717],{"class":5236,"line":5338},[5234,5718,5719],{},"    C302 --> |\"Може змінити метод\"| METHOD_CHANGE\n",[5234,5721,5722],{"class":5236,"line":5344},[5234,5723,5676],{},[5234,5725,5726],{"class":5236,"line":5349},[5234,5727,5728],{},"    C307 --> |\"Зберігає метод\"| METHOD_PRESERVE[\"POST залишається POST\u003Cbr\u002F>PUT залишається PUT\"]\n",[5234,5730,5731],{"class":5236,"line":5354},[5234,5732,5733],{},"    C308 --> |\"Зберігає метод\"| METHOD_PRESERVE\n",[5234,5735,5736],{"class":5236,"line":5360},[5234,5737,5676],{},[5234,5739,5740],{"class":5236,"line":5365},[5234,5741,5742],{},"    C303 --> |\"Завжди GET\"| METHOD_GET[\"Будь-який метод → GET\u003Cbr\u002F>(після POST форми)\"]\n",[5234,5744,5745],{"class":5236,"line":5371},[5234,5746,5676],{},[5234,5748,5749],{"class":5236,"line":5377},[5234,5750,5751],{},"    style C301 fill:#f59e0b,stroke:#b45309,color:#ffffff\n",[5234,5753,5754],{"class":5236,"line":5382},[5234,5755,5756],{},"    style C308 fill:#f59e0b,stroke:#b45309,color:#ffffff\n",[5234,5758,5759],{"class":5236,"line":5387},[5234,5760,5761],{},"    style C302 fill:#3b82f6,stroke:#1d4ed8,color:#ffffff\n",[5234,5763,5764],{"class":5236,"line":5393},[5234,5765,5766],{},"    style C307 fill:#3b82f6,stroke:#1d4ed8,color:#ffffff\n",[5234,5768,5769],{"class":5236,"line":5399},[5234,5770,5771],{},"    style C303 fill:#22c55e,stroke:#15803d,color:#ffffff\n",[5215,5773,5775],{"id":5774},"_301-moved-permanently-постійне-перенаправлення","301 Moved Permanently — Постійне перенаправлення",[5196,5777,5778,5781,5782,5785],{},[5127,5779,5780],{},"Семантика:"," Ресурс ",[5127,5783,5784],{},"остаточно"," переміщено на новий URL. Усі майбутні запити до старого URL повинні автоматично перенаправлятися на новий.",[5196,5787,5788],{},[5127,5789,5790],{},"Поведінка браузера:",[5092,5792,5793,5796,5802],{},[5095,5794,5795],{},"Автоматично виконує запит на новий URL",[5095,5797,5798,5801],{},[5127,5799,5800],{},"Кешує перенаправлення"," — наступні запити можуть йти відразу на новий URL без звернення до старого",[5095,5803,5804],{},"Може змінити метод запиту з POST на GET (історична особливість, не рекомендовано)",[5196,5806,5807],{},[5127,5808,5809],{},"Використання:",[5092,5811,5812,5822,5831,5839],{},[5095,5813,5814,5815,5818,5819,5476],{},"Міграція сайту на новий домен (",[5231,5816,5817],{},"example.com"," → ",[5231,5820,5821],{},"newdomain.com",[5095,5823,5824,5825,5818,5828,5476],{},"Реструктуризація URL (",[5231,5826,5827],{},"\u002Fblog\u002Fpost-name",[5231,5829,5830],{},"\u002Farticles\u002Fpost-name",[5095,5832,5833,5834,5818,5837,5476],{},"Канонізація URL для SEO (",[5231,5835,5836],{},"www.example.com",[5231,5838,5817],{},[5095,5840,5841],{},"Переміщення сторінки в нову локацію назавжди",[5196,5843,5844],{},[5127,5845,5846],{},"Приклад:",[5224,5848,5851],{"className":5849,"code":5850,"language":5524},[5522],"GET \u002Fold-blog\u002Farticle HTTP\u002F1.1\nHost: example.com\n\nHTTP\u002F1.1 301 Moved Permanently\nLocation: https:\u002F\u002Fexample.com\u002Farticles\u002Farticle\nCache-Control: max-age=31536000\n",[5231,5852,5850],{"__ignoreMap":5229},[5606,5854,5855,5858,5859,5862,5863,5866],{},[5127,5856,5857],{},"SEO-наслідки:"," Пошукові системи передають ",[5127,5860,5861],{},"всі SEO-сигнали"," (PageRank, авторитет) зі старого URL на новий при 301 редиректі. Проте якщо редирект не є постійним, використання 301 може призвести до втрати індексації старого URL. Використовуйте 301 лише коли ви ",[5127,5864,5865],{},"дійсно"," не повернете контент за старою адресою.",[5215,5868,5870],{"id":5869},"_302-found-тимчасове-перенаправлення-застаріле","302 Found — Тимчасове перенаправлення (застаріле)",[5196,5872,5873,5781,5875,5878],{},[5127,5874,5780],{},[5127,5876,5877],{},"тимчасово"," доступний за іншим URL. Клієнт повинен продовжувати використовувати оригінальний URL для майбутніх запитів.",[5196,5880,5881,5884],{},[5127,5882,5883],{},"Історична проблема:"," Оригінальна специфікація HTTP\u002F1.0 визначала 302 як \"Moved Temporarily\", але не вказувала, чи слід зберігати метод запиту. Це призвело до того, що більшість браузерів змінювали POST на GET при 302 редиректі, що є семантично некоректним.",[5196,5886,5887,5890,5891,5894,5895,5898],{},[5127,5888,5889],{},"Сучасна рекомендація:"," Використовуйте ",[5127,5892,5893],{},"303"," (для зміни методу на GET) або ",[5127,5896,5897],{},"307"," (для збереження методу) замість 302 для однозначної поведінки.",[5196,5900,5901],{},[5127,5902,5903],{},"Приклад (застарілий):",[5224,5905,5908],{"className":5906,"code":5907,"language":5524},[5522],"POST \u002Fsubmit-form HTTP\u002F1.1\n\nHTTP\u002F1.1 302 Found\nLocation: \u002Fthank-you\n",[5231,5909,5907],{"__ignoreMap":5229},[5505,5911,5912],{},"Код 302 підтримується всіма браузерами та широко використовується у legacy-системах, проте для нових проєктів рекомендується використовувати більш точні коди 303 та 307.",[5215,5914,5916],{"id":5915},"_303-see-other-перенаправлення-з-зміною-методу-на-get","303 See Other — Перенаправлення з зміною методу на GET",[5196,5918,5919,5921,5922,5925],{},[5127,5920,5780],{}," Відповідь на запит можна знайти за іншим URL, який слід запитати методом ",[5127,5923,5924],{},"GET",", незалежно від оригінального методу.",[5196,5927,5928,5931,5932,5935],{},[5127,5929,5930],{},"Типовий сценарій:"," Перенаправлення після успішної POST-форми (Pattern ",[5127,5933,5934],{},"POST-Redirect-GET",").",[5196,5937,5938],{},[5127,5939,5790],{},[5092,5941,5942,5945],{},[5095,5943,5944],{},"Завжди змінює метод на GET при перенаправленні",[5095,5946,5947],{},"Не кешує редирект (тимчасовий)",[5196,5949,5950],{},[5127,5951,5809],{},[5092,5953,5954,5957],{},[5095,5955,5956],{},"Після успішного POST\u002FPUT\u002FDELETE перенаправити на сторінку перегляду",[5095,5958,5959],{},"Уникнення повторної відправки форми при оновленні сторінки (F5)",[5196,5961,5962],{},[5127,5963,5846],{},[5224,5965,5968],{"className":5966,"code":5967,"language":5524},[5522],"POST \u002Fusers HTTP\u002F1.1\nContent-Type: application\u002Fjson\n{ \"name\": \"Alice\" }\n\nHTTP\u002F1.1 303 See Other\nLocation: \u002Fusers\u002F456\n",[5231,5969,5967],{"__ignoreMap":5229},[5196,5971,5972,5973,5976],{},"Браузер виконає: ",[5231,5974,5975],{},"GET \u002Fusers\u002F456"," (не POST!)",[5553,5978,5979,5982],{},[5127,5980,5981],{},"POST-Redirect-GET Pattern:"," Після успішної POST-операції завжди повертайте 303 See Other з перенаправленням на GET-ендпоінт. Це запобігає випадковому повторному відправленню форми при оновленні сторінки користувачем.",[5215,5984,5986],{"id":5985},"_307-temporary-redirect-тимчасове-перенаправлення-зі-збереженням-методу","307 Temporary Redirect — Тимчасове перенаправлення зі збереженням методу",[5196,5988,5989,5991,5992,5995,5996,5999],{},[5127,5990,5780],{}," Ресурс тимчасово доступний за іншим URL. Клієнт ",[5127,5993,5994],{},"повинен"," виконати запит на новий URL з ",[5127,5997,5998],{},"тим самим методом"," та тілом.",[5196,6001,6002],{},[5127,6003,5790],{},[5092,6005,6006,6009,6011],{},[5095,6007,6008],{},"Зберігає HTTP-метод (POST залишається POST, PUT залишається PUT)",[5095,6010,5947],{},[5095,6012,6013],{},"Може запитати дозвіл користувача перед повторним відправленням POST\u002FPUT",[5196,6015,6016],{},[5127,6017,5809],{},[5092,6019,6020,6023,6026],{},[5095,6021,6022],{},"Тимчасова технічна недоступність ресурсу (maintenance)",[5095,6024,6025],{},"Балансування навантаження (перенаправлення на інший сервер)",[5095,6027,6028],{},"A\u002FB тестування (тимчасове перенаправлення на альтернативний варіант)",[5196,6030,6031],{},[5127,6032,5846],{},[5224,6034,6037],{"className":6035,"code":6036,"language":5524},[5522],"POST \u002Fapi\u002Fprocess HTTP\u002F1.1\nContent-Type: application\u002Fjson\n{ \"data\": \"...\" }\n\nHTTP\u002F1.1 307 Temporary Redirect\nLocation: https:\u002F\u002Fbackup-server.example.com\u002Fapi\u002Fprocess\n",[5231,6038,6036],{"__ignoreMap":5229},[5196,6040,6041,6042,6045],{},"Браузер повторить: ",[5231,6043,6044],{},"POST https:\u002F\u002Fbackup-server.example.com\u002Fapi\u002Fprocess"," з тим самим тілом.",[5215,6047,6049],{"id":6048},"_308-permanent-redirect-постійне-перенаправлення-зі-збереженням-методу","308 Permanent Redirect — Постійне перенаправлення зі збереженням методу",[5196,6051,6052,6054,6055,6058],{},[5127,6053,5780],{}," Ресурс остаточно переміщено на новий URL. Усі майбутні запити повинні використовувати новий URL з ",[5127,6056,6057],{},"збереженням методу",".",[5196,6060,6061,6064,6065,6068],{},[5127,6062,6063],{},"Відмінність від 301:"," 308 ",[5127,6066,6067],{},"гарантує"," збереження методу, тоді як 301 може змінити POST на GET у старих браузерах.",[5196,6070,6071],{},[5127,6072,5790],{},[5092,6074,6075,6078,6080],{},[5095,6076,6077],{},"Зберігає HTTP-метод",[5095,6079,5800],{},[5095,6081,6082],{},"Передає SEO-сигнали на новий URL",[5196,6084,6085],{},[5127,6086,5809],{},[5092,6088,6089,6098],{},[5095,6090,6091,6092,5818,6095,5476],{},"Остаточна міграція API-ендпоінтів (",[5231,6093,6094],{},"\u002Fapi\u002Fv1\u002Fusers",[5231,6096,6097],{},"\u002Fapi\u002Fv2\u002Fusers",[5095,6099,6100],{},"Перенесення форм POST на новий URL зі збереженням методу",[5196,6102,6103],{},[5127,6104,5846],{},[5224,6106,6109],{"className":6107,"code":6108,"language":5524},[5522],"POST \u002Fapi\u002Fv1\u002Fusers HTTP\u002F1.1\n\nHTTP\u002F1.1 308 Permanent Redirect\nLocation: \u002Fapi\u002Fv2\u002Fusers\n",[5231,6110,6108],{"__ignoreMap":5229},[5606,6112,6113],{},"Код 308 є відносно новим (RFC 7538, 2015) та може не підтримуватися дуже старими браузерами. Для максимальної сумісності з legacy-клієнтами використовуйте 301, але майте на увазі можливу зміну методу.",[5215,6115,6117],{"id":6116},"порівняльна-таблиця-кодів-перенаправлення","Порівняльна таблиця кодів перенаправлення",[6119,6120,6121,6145],"table",{},[6122,6123,6124],"thead",{},[6125,6126,6127,6131,6134,6137,6140,6142],"tr",{},[6128,6129,6130],"th",{},"Код",[6128,6132,6133],{},"Назва",[6128,6135,6136],{},"Постійність",[6128,6138,6139],{},"Метод",[6128,6141,942],{},[6128,6143,6144],{},"Використання",[6146,6147,6148,6171,6192,6210,6228],"tbody",{},[6125,6149,6150,6156,6159,6162,6165,6168],{},[6151,6152,6153],"td",{},[5127,6154,6155],{},"301",[6151,6157,6158],{},"Moved Permanently",[6151,6160,6161],{},"Постійне",[6151,6163,6164],{},"Може змінитися",[6151,6166,6167],{},"✅ Так",[6151,6169,6170],{},"Міграція сайтів, SEO",[6125,6172,6173,6178,6181,6184,6186,6189],{},[6151,6174,6175],{},[5127,6176,6177],{},"302",[6151,6179,6180],{},"Found",[6151,6182,6183],{},"Тимчасове",[6151,6185,6164],{},[6151,6187,6188],{},"❌ Ні",[6151,6190,6191],{},"Застарілий, уникати",[6125,6193,6194,6198,6201,6203,6206,6208],{},[6151,6195,6196],{},[5127,6197,5893],{},[6151,6199,6200],{},"See Other",[6151,6202,6183],{},[6151,6204,6205],{},"Завжди GET",[6151,6207,6188],{},[6151,6209,5934],{},[6125,6211,6212,6216,6218,6220,6223,6225],{},[6151,6213,6214],{},[5127,6215,5897],{},[6151,6217,5167],{},[6151,6219,6183],{},[6151,6221,6222],{},"Зберігається",[6151,6224,6188],{},[6151,6226,6227],{},"Тимчасова переадресація",[6125,6229,6230,6235,6237,6239,6241,6243],{},[6151,6231,6232],{},[5127,6233,6234],{},"308",[6151,6236,5158],{},[6151,6238,6161],{},[6151,6240,6222],{},[6151,6242,6167],{},[6151,6244,6245],{},"Міграція API",[6247,6248,6249,6274,6313],"accordion",{},[6250,6251,6254,6257,6271],"accordion-item",{"icon":6252,"label":6253},"i-lucide-help-circle","❓ Чому 302 вважається застарілим?",[5196,6255,6256],{},"Історично браузери по-різному інтерпретували код 302: одні зберігали метод запиту, інші змінювали POST на GET. Це призводило до непередбачуваної поведінки. HTTP\u002F1.1 вирішив цю проблему, додавши два чіткі коди:",[5092,6258,6259,6265],{},[5095,6260,6261,6264],{},[5127,6262,6263],{},"303 See Other"," — явно вказує на зміну методу на GET",[5095,6266,6267,6270],{},[5127,6268,6269],{},"307 Temporary Redirect"," — явно вказує на збереження методу",[5196,6272,6273],{},"Код 302 залишився для зворотної сумісності, але для нових проєктів рекомендується використовувати 303 або 307 залежно від бажаної поведінки.",[6250,6275,6277,6283,6294,6299,6310],{"icon":6252,"label":6276},"❓ Коли використовувати 301 замість 308?",[5196,6278,6279,6282],{},[5127,6280,6281],{},"Використовуйте 301"," коли:",[5092,6284,6285,6288,6291],{},[5095,6286,6287],{},"Перенаправляєте GET-запити (сторінки, статичні ресурси)",[5095,6289,6290],{},"Потрібна максимальна сумісність зі старими браузерами",[5095,6292,6293],{},"Виконуєте SEO-міграцію веб-сайту",[5196,6295,6296,6282],{},[5127,6297,6298],{},"Використовуйте 308",[5092,6300,6301,6304,6307],{},[5095,6302,6303],{},"Перенаправляєте POST\u002FPUT\u002FDELETE запити API",[5095,6305,6306],{},"Критично важливо зберегти метод запиту",[5095,6308,6309],{},"Працюєте з сучасними клієнтами (після 2015 року)",[5196,6311,6312],{},"У більшості випадків 301 достатньо, оскільки перенаправлення зазвичай застосовується до GET-запитів.",[6250,6314,6316,6322,6325,6330],{"icon":6252,"label":6315},"❓ Чи можуть перенаправлення утворити нескінченний цикл?",[5196,6317,6318,6319,6058],{},"Так, якщо URL A перенаправляє на URL B, а URL B перенаправляє назад на URL A, утворюється ",[5127,6320,6321],{},"нескінченний цикл редиректів",[5196,6323,6324],{},"Браузери захищаються від цього, обмежуючи кількість послідовних перенаправлень (зазвичай 20-30). При перевищенні ліміту браузер відображає помилку \"Too many redirects\" або \"ERR_TOO_MANY_REDIRECTS\".",[5196,6326,6327],{},[5127,6328,6329],{},"Як уникнути:",[5092,6331,6332,6335,6338],{},[5095,6333,6334],{},"Ретельно перевіряйте логіку перенаправлень",[5095,6336,6337],{},"Логуйте ланцюжки редиректів під час розробки",[5095,6339,6340,6341,6344],{},"Використовуйте інструменти перевірки (curl з ",[5231,6342,6343],{},"-L",", browser DevTools Network tab)",[5191,6346,6348],{"id":6347},"декоратор-redirect-статичне-перенаправлення","Декоратор @Redirect: статичне перенаправлення",[5196,6350,6351,6352,6355],{},"NestJS надає декоратор ",[5231,6353,6354],{},"@Redirect()"," для оголошення статичних перенаправлень безпосередньо у метаданих обробника. Це найпростіший спосіб реалізувати перенаправлення, коли URL та статус код відомі на етапі компіляції.",[5215,6357,6359],{"id":6358},"базовий-синтаксис","Базовий синтаксис",[5224,6361,6365],{"className":6362,"code":6363,"language":6364,"meta":5229,"style":5229},"language-typescript shiki shiki-themes light-plus dark-plus dark-plus","import { Controller, Get, Redirect } from '@nestjs\u002Fcommon';\n\n@Controller()\nexport class AppController {\n  @Get('old-path')\n  @Redirect('https:\u002F\u002Fexample.com\u002Fnew-path', 301)\n  oldPath() {\n    \u002F\u002F Метод може бути порожнім або повертати дані,\n    \u002F\u002F які будуть проігноровані через редирект\n  }\n}\n","typescript",[5231,6366,6367,6405,6409,6420,6436,6452,6470,6478,6484,6489,6494],{"__ignoreMap":5229},[5234,6368,6369,6373,6377,6381,6384,6387,6389,6392,6395,6398,6402],{"class":5236,"line":5237},[5234,6370,6372],{"class":6371},"s8xlr","import",[5234,6374,6376],{"class":6375},"sHH4Y"," { ",[5234,6378,6380],{"class":6379},"siwwj","Controller",[5234,6382,6383],{"class":6375},", ",[5234,6385,6386],{"class":6379},"Get",[5234,6388,6383],{"class":6375},[5234,6390,6391],{"class":6379},"Redirect",[5234,6393,6394],{"class":6375}," } ",[5234,6396,6397],{"class":6371},"from",[5234,6399,6401],{"class":6400},"sbdoH"," '@nestjs\u002Fcommon'",[5234,6403,6404],{"class":6375},";\n",[5234,6406,6407],{"class":5236,"line":5243},[5234,6408,5259],{"emptyLinePlaceholder":5258},[5234,6410,6411,6414,6417],{"class":5236,"line":5249},[5234,6412,6413],{"class":6375},"@",[5234,6415,6380],{"class":6416},"s8Opu",[5234,6418,6419],{"class":6375},"()\n",[5234,6421,6422,6425,6429,6433],{"class":5236,"line":5255},[5234,6423,6424],{"class":6371},"export",[5234,6426,6428],{"class":6427},"su1O8"," class",[5234,6430,6432],{"class":6431},"sN1BT"," AppController",[5234,6434,6435],{"class":6375}," {\n",[5234,6437,6438,6441,6443,6446,6449],{"class":5236,"line":5262},[5234,6439,6440],{"class":6375},"  @",[5234,6442,6386],{"class":6416},[5234,6444,6445],{"class":6375},"(",[5234,6447,6448],{"class":6400},"'old-path'",[5234,6450,6451],{"class":6375},")\n",[5234,6453,6454,6456,6458,6460,6463,6465,6468],{"class":5236,"line":5268},[5234,6455,6440],{"class":6375},[5234,6457,6391],{"class":6416},[5234,6459,6445],{"class":6375},[5234,6461,6462],{"class":6400},"'https:\u002F\u002Fexample.com\u002Fnew-path'",[5234,6464,6383],{"class":6375},[5234,6466,6155],{"class":6467},"sJj4R",[5234,6469,6451],{"class":6375},[5234,6471,6472,6475],{"class":5236,"line":5274},[5234,6473,6474],{"class":6416},"  oldPath",[5234,6476,6477],{"class":6375},"() {\n",[5234,6479,6480],{"class":5236,"line":5280},[5234,6481,6483],{"class":6482},"spJ8K","    \u002F\u002F Метод може бути порожнім або повертати дані,\n",[5234,6485,6486],{"class":5236,"line":5285},[5234,6487,6488],{"class":6482},"    \u002F\u002F які будуть проігноровані через редирект\n",[5234,6490,6491],{"class":5236,"line":5291},[5234,6492,6493],{"class":6375},"  }\n",[5234,6495,6496],{"class":5236,"line":5297},[5234,6497,6498],{"class":6375},"}\n",[5196,6500,6501],{},[5127,6502,6503],{},"Параметри декоратора:",[5092,6505,6506,6512],{},[5095,6507,6508,6511],{},[5127,6509,6510],{},"url"," (перший аргумент): цільовий URL перенаправлення (абсолютний або відносний)",[5095,6513,6514,6517,6518,5476],{},[5127,6515,6516],{},"statusCode"," (другий аргумент, опціональний): HTTP-статус код (за замовчуванням ",[5127,6519,6177],{},[5606,6521,6522,6532],{},[5196,6523,6524,6525,6527,6528,6531],{},"Зверніть увагу, що за замовчуванням ",[5231,6526,6354],{}," використовує код ",[5127,6529,6530],{},"302 Found",", а не 301 Moved Permanently. Для постійних редиректів явно вказуйте код 301:",[5224,6533,6535],{"className":6362,"code":6534,"language":6364,"meta":5229,"style":5229},"@Redirect('\u002Fnew-path', 301) \u002F\u002F Постійне перенаправлення\n",[5231,6536,6537],{"__ignoreMap":5229},[5234,6538,6539,6541,6543,6545,6548,6550,6552,6555],{"class":5236,"line":5237},[5234,6540,6413],{"class":6375},[5234,6542,6391],{"class":6416},[5234,6544,6445],{"class":6375},[5234,6546,6547],{"class":6400},"'\u002Fnew-path'",[5234,6549,6383],{"class":6375},[5234,6551,6155],{"class":6467},[5234,6553,6554],{"class":6375},") ",[5234,6556,6557],{"class":6482},"\u002F\u002F Постійне перенаправлення\n",[5215,6559,6561],{"id":6560},"приклад-міграція-старого-url-на-новий","Приклад: Міграція старого URL на новий",[5224,6563,6565],{"className":6362,"code":6564,"language":6364,"meta":5229,"style":5229},"import { Controller, Get, Redirect, HttpStatus } from '@nestjs\u002Fcommon';\n\n@Controller('blog')\nexport class BlogController {\n  \u002F\u002F Стара структура URL: \u002Fblog\u002Fpost-123\n  @Get('post-:id')\n  @Redirect('\u002Farticles\u002Fpost-:id', HttpStatus.MOVED_PERMANENTLY)\n  legacyPost() {\n    \u002F\u002F Користувачі, що мають закладки на старі URL,\n    \u002F\u002F автоматично перенаправляться на нові\n  }\n}\n",[5231,6566,6567,6596,6600,6613,6624,6629,6642,6665,6672,6677,6682,6686],{"__ignoreMap":5229},[5234,6568,6569,6571,6573,6575,6577,6579,6581,6583,6585,6588,6590,6592,6594],{"class":5236,"line":5237},[5234,6570,6372],{"class":6371},[5234,6572,6376],{"class":6375},[5234,6574,6380],{"class":6379},[5234,6576,6383],{"class":6375},[5234,6578,6386],{"class":6379},[5234,6580,6383],{"class":6375},[5234,6582,6391],{"class":6379},[5234,6584,6383],{"class":6375},[5234,6586,6587],{"class":6379},"HttpStatus",[5234,6589,6394],{"class":6375},[5234,6591,6397],{"class":6371},[5234,6593,6401],{"class":6400},[5234,6595,6404],{"class":6375},[5234,6597,6598],{"class":5236,"line":5243},[5234,6599,5259],{"emptyLinePlaceholder":5258},[5234,6601,6602,6604,6606,6608,6611],{"class":5236,"line":5249},[5234,6603,6413],{"class":6375},[5234,6605,6380],{"class":6416},[5234,6607,6445],{"class":6375},[5234,6609,6610],{"class":6400},"'blog'",[5234,6612,6451],{"class":6375},[5234,6614,6615,6617,6619,6622],{"class":5236,"line":5255},[5234,6616,6424],{"class":6371},[5234,6618,6428],{"class":6427},[5234,6620,6621],{"class":6431}," BlogController",[5234,6623,6435],{"class":6375},[5234,6625,6626],{"class":5236,"line":5262},[5234,6627,6628],{"class":6482},"  \u002F\u002F Стара структура URL: \u002Fblog\u002Fpost-123\n",[5234,6630,6631,6633,6635,6637,6640],{"class":5236,"line":5268},[5234,6632,6440],{"class":6375},[5234,6634,6386],{"class":6416},[5234,6636,6445],{"class":6375},[5234,6638,6639],{"class":6400},"'post-:id'",[5234,6641,6451],{"class":6375},[5234,6643,6644,6646,6648,6650,6653,6655,6657,6659,6663],{"class":5236,"line":5274},[5234,6645,6440],{"class":6375},[5234,6647,6391],{"class":6416},[5234,6649,6445],{"class":6375},[5234,6651,6652],{"class":6400},"'\u002Farticles\u002Fpost-:id'",[5234,6654,6383],{"class":6375},[5234,6656,6587],{"class":6379},[5234,6658,6058],{"class":6375},[5234,6660,6662],{"class":6661},"s-QsJ","MOVED_PERMANENTLY",[5234,6664,6451],{"class":6375},[5234,6666,6667,6670],{"class":5236,"line":5280},[5234,6668,6669],{"class":6416},"  legacyPost",[5234,6671,6477],{"class":6375},[5234,6673,6674],{"class":5236,"line":5285},[5234,6675,6676],{"class":6482},"    \u002F\u002F Користувачі, що мають закладки на старі URL,\n",[5234,6678,6679],{"class":5236,"line":5291},[5234,6680,6681],{"class":6482},"    \u002F\u002F автоматично перенаправляться на нові\n",[5234,6683,6684],{"class":5236,"line":5297},[5234,6685,6493],{"class":6375},[5234,6687,6688],{"class":5236,"line":5303},[5234,6689,6498],{"class":6375},[6691,6692,6695,6710,6718,6725,6728,6736,6744,6751,6754,6761,6771,6778],"terminal-preview",{":cursor":6693,"title":6694},"false","Перенаправлення старого URL",[6696,6697,6699,6704,6705],"div",{"className":6698},[5236],[5234,6700,6703],{"className":6701},[6702],"opacity-40","$"," ",[5127,6706,6709],{"className":6707},[6708],"font-bold","curl -v http:\u002F\u002Flocalhost:3000\u002Fblog\u002Fpost-123",[6696,6711,6713],{"className":6712},[5236],[5234,6714,6717],{"className":6715},[6716,6708],"text-blue-400","GET \u002Fblog\u002Fpost-123 HTTP\u002F1.1",[6696,6719,6721],{"className":6720},[5236],[5234,6722,6724],{"className":6723},[6702],"Host: localhost:3000",[6696,6726],{"className":6727},[5236],[6696,6729,6731],{"className":6730},[5236],[5234,6732,6735],{"className":6733},[6734,6708],"text-yellow-400","HTTP\u002F1.1 301 Moved Permanently",[6696,6737,6739],{"className":6738},[5236],[5234,6740,6743],{"className":6741},[6742],"text-green-400","Location: \u002Farticles\u002Fpost-123",[6696,6745,6747],{"className":6746},[5236],[5234,6748,6750],{"className":6749},[6702],"Content-Length: 0",[6696,6752],{"className":6753},[5236],[6696,6755,6757],{"className":6756},[5236],[5234,6758,6760],{"className":6759},[6702],"# Браузер автоматично виконує:",[6696,6762,6764,6704,6767],{"className":6763},[5236],[5234,6765,6703],{"className":6766},[6702],[5127,6768,6770],{"className":6769},[6708],"curl http:\u002F\u002Flocalhost:3000\u002Farticles\u002Fpost-123",[6696,6772,6774],{"className":6773},[5236],[5234,6775,6777],{"className":6776},[6742,6708],"HTTP\u002F1.1 200 OK",[6696,6779,6781,6782,6786,6787,6791],{"className":6780},[5236],"{ ",[5234,6783,6785],{"className":6784},[6742],"\"title\"",": ",[5234,6788,6790],{"className":6789},[6716],"\"Article Title\"",", ... }",[5215,6793,6795],{"id":6794},"приклад-канонізація-url-з-www-на-без-www","Приклад: Канонізація URL (з www на без www)",[5224,6797,6799],{"className":6362,"code":6798,"language":6364,"meta":5229,"style":5229},"import { Controller, Get, Req, Redirect } from '@nestjs\u002Fcommon';\nimport { Request } from 'express';\n\n@Controller()\nexport class RedirectController {\n  @Get('*')\n  @Redirect()\n  canonicalRedirect(@Req() req: Request) {\n    const host = req.get('host');\n    \n    \u002F\u002F Якщо запит прийшов на www.example.com, перенаправляємо на example.com\n    if (host && host.startsWith('www.')) {\n      const canonicalHost = host.replace('www.', '');\n      const canonicalUrl = `${req.protocol}:\u002F\u002F${canonicalHost}${req.originalUrl}`;\n      \n      return {\n        url: canonicalUrl,\n        statusCode: HttpStatus.MOVED_PERMANENTLY,\n      };\n    }\n    \n    \u002F\u002F Якщо домен коректний, продовжуємо нормальну обробку\n    \u002F\u002F (тут слід делегувати іншим обробникам)\n  }\n}\n",[5231,6800,6801,6830,6848,6852,6860,6871,6884,6892,6915,6941,6945,6950,6978,7006,7056,7061,7068,7078,7092,7097,7102,7106,7111,7116,7120],{"__ignoreMap":5229},[5234,6802,6803,6805,6807,6809,6811,6813,6815,6818,6820,6822,6824,6826,6828],{"class":5236,"line":5237},[5234,6804,6372],{"class":6371},[5234,6806,6376],{"class":6375},[5234,6808,6380],{"class":6379},[5234,6810,6383],{"class":6375},[5234,6812,6386],{"class":6379},[5234,6814,6383],{"class":6375},[5234,6816,6817],{"class":6379},"Req",[5234,6819,6383],{"class":6375},[5234,6821,6391],{"class":6379},[5234,6823,6394],{"class":6375},[5234,6825,6397],{"class":6371},[5234,6827,6401],{"class":6400},[5234,6829,6404],{"class":6375},[5234,6831,6832,6834,6836,6839,6841,6843,6846],{"class":5236,"line":5243},[5234,6833,6372],{"class":6371},[5234,6835,6376],{"class":6375},[5234,6837,6838],{"class":6379},"Request",[5234,6840,6394],{"class":6375},[5234,6842,6397],{"class":6371},[5234,6844,6845],{"class":6400}," 'express'",[5234,6847,6404],{"class":6375},[5234,6849,6850],{"class":5236,"line":5249},[5234,6851,5259],{"emptyLinePlaceholder":5258},[5234,6853,6854,6856,6858],{"class":5236,"line":5255},[5234,6855,6413],{"class":6375},[5234,6857,6380],{"class":6416},[5234,6859,6419],{"class":6375},[5234,6861,6862,6864,6866,6869],{"class":5236,"line":5262},[5234,6863,6424],{"class":6371},[5234,6865,6428],{"class":6427},[5234,6867,6868],{"class":6431}," RedirectController",[5234,6870,6435],{"class":6375},[5234,6872,6873,6875,6877,6879,6882],{"class":5236,"line":5268},[5234,6874,6440],{"class":6375},[5234,6876,6386],{"class":6416},[5234,6878,6445],{"class":6375},[5234,6880,6881],{"class":6400},"'*'",[5234,6883,6451],{"class":6375},[5234,6885,6886,6888,6890],{"class":5236,"line":5274},[5234,6887,6440],{"class":6375},[5234,6889,6391],{"class":6416},[5234,6891,6419],{"class":6375},[5234,6893,6894,6897,6900,6902,6905,6908,6910,6912],{"class":5236,"line":5280},[5234,6895,6896],{"class":6416},"  canonicalRedirect",[5234,6898,6899],{"class":6375},"(@",[5234,6901,6817],{"class":6416},[5234,6903,6904],{"class":6375},"() ",[5234,6906,6907],{"class":6379},"req",[5234,6909,6786],{"class":6375},[5234,6911,6838],{"class":6431},[5234,6913,6914],{"class":6375},") {\n",[5234,6916,6917,6920,6923,6926,6928,6930,6933,6935,6938],{"class":5236,"line":5285},[5234,6918,6919],{"class":6427},"    const",[5234,6921,6922],{"class":6661}," host",[5234,6924,6925],{"class":6375}," = ",[5234,6927,6907],{"class":6379},[5234,6929,6058],{"class":6375},[5234,6931,6932],{"class":6416},"get",[5234,6934,6445],{"class":6375},[5234,6936,6937],{"class":6400},"'host'",[5234,6939,6940],{"class":6375},");\n",[5234,6942,6943],{"class":5236,"line":5291},[5234,6944,5676],{"class":6375},[5234,6946,6947],{"class":5236,"line":5297},[5234,6948,6949],{"class":6482},"    \u002F\u002F Якщо запит прийшов на www.example.com, перенаправляємо на example.com\n",[5234,6951,6952,6955,6957,6960,6963,6965,6967,6970,6972,6975],{"class":5236,"line":5303},[5234,6953,6954],{"class":6371},"    if",[5234,6956,5130],{"class":6375},[5234,6958,6959],{"class":6379},"host",[5234,6961,6962],{"class":6375}," && ",[5234,6964,6959],{"class":6379},[5234,6966,6058],{"class":6375},[5234,6968,6969],{"class":6416},"startsWith",[5234,6971,6445],{"class":6375},[5234,6973,6974],{"class":6400},"'www.'",[5234,6976,6977],{"class":6375},")) {\n",[5234,6979,6980,6983,6986,6988,6990,6992,6995,6997,6999,7001,7004],{"class":5236,"line":5309},[5234,6981,6982],{"class":6427},"      const",[5234,6984,6985],{"class":6661}," canonicalHost",[5234,6987,6925],{"class":6375},[5234,6989,6959],{"class":6379},[5234,6991,6058],{"class":6375},[5234,6993,6994],{"class":6416},"replace",[5234,6996,6445],{"class":6375},[5234,6998,6974],{"class":6400},[5234,7000,6383],{"class":6375},[5234,7002,7003],{"class":6400},"''",[5234,7005,6940],{"class":6375},[5234,7007,7008,7010,7013,7015,7018,7021,7023,7026,7029,7032,7035,7037,7040,7043,7045,7047,7050,7052,7054],{"class":5236,"line":5315},[5234,7009,6982],{"class":6427},[5234,7011,7012],{"class":6661}," canonicalUrl",[5234,7014,6925],{"class":6375},[5234,7016,7017],{"class":6400},"`",[5234,7019,7020],{"class":6427},"${",[5234,7022,6907],{"class":6379},[5234,7024,6058],{"class":7025},"sD7JJ",[5234,7027,7028],{"class":6379},"protocol",[5234,7030,7031],{"class":6427},"}",[5234,7033,7034],{"class":6400},":\u002F\u002F",[5234,7036,7020],{"class":6427},[5234,7038,7039],{"class":6379},"canonicalHost",[5234,7041,7042],{"class":6427},"}${",[5234,7044,6907],{"class":6379},[5234,7046,6058],{"class":7025},[5234,7048,7049],{"class":6379},"originalUrl",[5234,7051,7031],{"class":6427},[5234,7053,7017],{"class":6400},[5234,7055,6404],{"class":6375},[5234,7057,7058],{"class":5236,"line":5320},[5234,7059,7060],{"class":6375},"      \n",[5234,7062,7063,7066],{"class":5236,"line":5326},[5234,7064,7065],{"class":6371},"      return",[5234,7067,6435],{"class":6375},[5234,7069,7070,7073,7075],{"class":5236,"line":5332},[5234,7071,7072],{"class":6379},"        url:",[5234,7074,7012],{"class":6379},[5234,7076,7077],{"class":6375},",\n",[5234,7079,7080,7083,7086,7088,7090],{"class":5236,"line":5338},[5234,7081,7082],{"class":6379},"        statusCode:",[5234,7084,7085],{"class":6379}," HttpStatus",[5234,7087,6058],{"class":6375},[5234,7089,6662],{"class":6661},[5234,7091,7077],{"class":6375},[5234,7093,7094],{"class":5236,"line":5344},[5234,7095,7096],{"class":6375},"      };\n",[5234,7098,7099],{"class":5236,"line":5349},[5234,7100,7101],{"class":6375},"    }\n",[5234,7103,7104],{"class":5236,"line":5354},[5234,7105,5676],{"class":6375},[5234,7107,7108],{"class":5236,"line":5360},[5234,7109,7110],{"class":6482},"    \u002F\u002F Якщо домен коректний, продовжуємо нормальну обробку\n",[5234,7112,7113],{"class":5236,"line":5365},[5234,7114,7115],{"class":6482},"    \u002F\u002F (тут слід делегувати іншим обробникам)\n",[5234,7117,7118],{"class":5236,"line":5371},[5234,7119,6493],{"class":6375},[5234,7121,7122],{"class":5236,"line":5377},[5234,7123,6498],{"class":6375},[5505,7125,7126,7127,7130,7131,7134],{},"У реальних проєктах канонізація домену зазвичай виконується на рівні ",[5127,7128,7129],{},"веб-сервера"," (Nginx, Apache) або ",[5127,7132,7133],{},"CDN"," (Cloudflare), а не у коді застосунку. Проте розуміння механізму важливе для складних сценаріїв.",[5215,7136,7138],{"id":7137},"приклад-перенаправлення-на-зовнішній-сервіс","Приклад: Перенаправлення на зовнішній сервіс",[5224,7140,7142],{"className":6362,"code":7141,"language":6364,"meta":5229,"style":5229},"@Controller('auth')\nexport class AuthController {\n  @Get('google')\n  @Redirect('https:\u002F\u002Faccounts.google.com\u002Fo\u002Foauth2\u002Fv2\u002Fauth?client_id=...', 302)\n  googleAuth() {\n    \u002F\u002F Перенаправлення на сторінку автентифікації Google OAuth\n    \u002F\u002F Після успішної автентифікації Google перенаправить назад на наш callback URL\n  }\n\n  @Get('github')\n  @Redirect('https:\u002F\u002Fgithub.com\u002Flogin\u002Foauth\u002Fauthorize?client_id=...', 302)\n  githubAuth() {\n    \u002F\u002F Перенаправлення на сторінку автентифікації GitHub OAuth\n  }\n}\n",[5231,7143,7144,7157,7168,7181,7198,7205,7210,7215,7219,7223,7236,7253,7260,7265,7269],{"__ignoreMap":5229},[5234,7145,7146,7148,7150,7152,7155],{"class":5236,"line":5237},[5234,7147,6413],{"class":6375},[5234,7149,6380],{"class":6416},[5234,7151,6445],{"class":6375},[5234,7153,7154],{"class":6400},"'auth'",[5234,7156,6451],{"class":6375},[5234,7158,7159,7161,7163,7166],{"class":5236,"line":5243},[5234,7160,6424],{"class":6371},[5234,7162,6428],{"class":6427},[5234,7164,7165],{"class":6431}," AuthController",[5234,7167,6435],{"class":6375},[5234,7169,7170,7172,7174,7176,7179],{"class":5236,"line":5249},[5234,7171,6440],{"class":6375},[5234,7173,6386],{"class":6416},[5234,7175,6445],{"class":6375},[5234,7177,7178],{"class":6400},"'google'",[5234,7180,6451],{"class":6375},[5234,7182,7183,7185,7187,7189,7192,7194,7196],{"class":5236,"line":5255},[5234,7184,6440],{"class":6375},[5234,7186,6391],{"class":6416},[5234,7188,6445],{"class":6375},[5234,7190,7191],{"class":6400},"'https:\u002F\u002Faccounts.google.com\u002Fo\u002Foauth2\u002Fv2\u002Fauth?client_id=...'",[5234,7193,6383],{"class":6375},[5234,7195,6177],{"class":6467},[5234,7197,6451],{"class":6375},[5234,7199,7200,7203],{"class":5236,"line":5262},[5234,7201,7202],{"class":6416},"  googleAuth",[5234,7204,6477],{"class":6375},[5234,7206,7207],{"class":5236,"line":5268},[5234,7208,7209],{"class":6482},"    \u002F\u002F Перенаправлення на сторінку автентифікації Google OAuth\n",[5234,7211,7212],{"class":5236,"line":5274},[5234,7213,7214],{"class":6482},"    \u002F\u002F Після успішної автентифікації Google перенаправить назад на наш callback URL\n",[5234,7216,7217],{"class":5236,"line":5280},[5234,7218,6493],{"class":6375},[5234,7220,7221],{"class":5236,"line":5285},[5234,7222,5259],{"emptyLinePlaceholder":5258},[5234,7224,7225,7227,7229,7231,7234],{"class":5236,"line":5291},[5234,7226,6440],{"class":6375},[5234,7228,6386],{"class":6416},[5234,7230,6445],{"class":6375},[5234,7232,7233],{"class":6400},"'github'",[5234,7235,6451],{"class":6375},[5234,7237,7238,7240,7242,7244,7247,7249,7251],{"class":5236,"line":5297},[5234,7239,6440],{"class":6375},[5234,7241,6391],{"class":6416},[5234,7243,6445],{"class":6375},[5234,7245,7246],{"class":6400},"'https:\u002F\u002Fgithub.com\u002Flogin\u002Foauth\u002Fauthorize?client_id=...'",[5234,7248,6383],{"class":6375},[5234,7250,6177],{"class":6467},[5234,7252,6451],{"class":6375},[5234,7254,7255,7258],{"class":5236,"line":5303},[5234,7256,7257],{"class":6416},"  githubAuth",[5234,7259,6477],{"class":6375},[5234,7261,7262],{"class":5236,"line":5309},[5234,7263,7264],{"class":6482},"    \u002F\u002F Перенаправлення на сторінку автентифікації GitHub OAuth\n",[5234,7266,7267],{"class":5236,"line":5315},[5234,7268,6493],{"class":6375},[5234,7270,7271],{"class":5236,"line":5320},[5234,7272,6498],{"class":6375},[5215,7274,7276],{"id":7275},"відносні-та-абсолютні-url","Відносні та абсолютні URL",[5196,7278,7279,7280,7282],{},"Декоратор ",[5231,7281,6354],{}," підтримує як відносні, так і абсолютні URL:",[5224,7284,7286],{"className":6362,"code":7285,"language":6364,"meta":5229,"style":5229},"\u002F\u002F Абсолютний URL з протоколом та доменом\n@Redirect('https:\u002F\u002Fexample.com\u002Fnew-path', 301)\n\n\u002F\u002F Абсолютний шлях (відносно кореня домену)\n@Redirect('\u002Fnew-path', 301)\n\n\u002F\u002F Відносний шлях (відносно поточного маршруту)\n@Redirect('..\u002Fnew-path', 302)\n\n\u002F\u002F Якір на поточній сторінці\n@Redirect('#section', 302)\n",[5231,7287,7288,7293,7309,7313,7318,7334,7338,7343,7360,7364,7369],{"__ignoreMap":5229},[5234,7289,7290],{"class":5236,"line":5237},[5234,7291,7292],{"class":6482},"\u002F\u002F Абсолютний URL з протоколом та доменом\n",[5234,7294,7295,7297,7299,7301,7303,7305,7307],{"class":5236,"line":5243},[5234,7296,6413],{"class":6375},[5234,7298,6391],{"class":6416},[5234,7300,6445],{"class":6375},[5234,7302,6462],{"class":6400},[5234,7304,6383],{"class":6375},[5234,7306,6155],{"class":6467},[5234,7308,6451],{"class":6375},[5234,7310,7311],{"class":5236,"line":5249},[5234,7312,5259],{"emptyLinePlaceholder":5258},[5234,7314,7315],{"class":5236,"line":5255},[5234,7316,7317],{"class":6482},"\u002F\u002F Абсолютний шлях (відносно кореня домену)\n",[5234,7319,7320,7322,7324,7326,7328,7330,7332],{"class":5236,"line":5262},[5234,7321,6413],{"class":6375},[5234,7323,6391],{"class":6416},[5234,7325,6445],{"class":6375},[5234,7327,6547],{"class":6400},[5234,7329,6383],{"class":6375},[5234,7331,6155],{"class":6467},[5234,7333,6451],{"class":6375},[5234,7335,7336],{"class":5236,"line":5268},[5234,7337,5259],{"emptyLinePlaceholder":5258},[5234,7339,7340],{"class":5236,"line":5274},[5234,7341,7342],{"class":6482},"\u002F\u002F Відносний шлях (відносно поточного маршруту)\n",[5234,7344,7345,7347,7349,7351,7354,7356,7358],{"class":5236,"line":5280},[5234,7346,6413],{"class":6375},[5234,7348,6391],{"class":6416},[5234,7350,6445],{"class":6375},[5234,7352,7353],{"class":6400},"'..\u002Fnew-path'",[5234,7355,6383],{"class":6375},[5234,7357,6177],{"class":6467},[5234,7359,6451],{"class":6375},[5234,7361,7362],{"class":5236,"line":5285},[5234,7363,5259],{"emptyLinePlaceholder":5258},[5234,7365,7366],{"class":5236,"line":5291},[5234,7367,7368],{"class":6482},"\u002F\u002F Якір на поточній сторінці\n",[5234,7370,7371,7373,7375,7377,7380,7382,7384],{"class":5236,"line":5297},[5234,7372,6413],{"class":6375},[5234,7374,6391],{"class":6416},[5234,7376,6445],{"class":6375},[5234,7378,7379],{"class":6400},"'#section'",[5234,7381,6383],{"class":6375},[5234,7383,6177],{"class":6467},[5234,7385,6451],{"class":6375},[5553,7387,7388,7391,7392,7395,7396,7399,7400,5130,7403,7406],{},[5127,7389,7390],{},"Рекомендація:"," Для перенаправлень на інший домен завжди використовуйте ",[5127,7393,7394],{},"повні абсолютні URL"," з протоколом (",[5231,7397,7398],{},"https:\u002F\u002F...","). Для перенаправлень всередині того самого застосунку використовуйте ",[5127,7401,7402],{},"абсолютні шляхи",[5231,7404,7405],{},"\u002Fpath","), що забезпечує незалежність від поточного маршруту.",[5191,7408,7410],{"id":7409},"динамічне-перенаправлення-повернення-обєкта","Динамічне перенаправлення: повернення об'єкта",[5196,7412,7279,7413,7415,7416,7419,7420,7422,7423,7425],{},[5231,7414,6354],{}," зручний для статичних перенаправлень, але часто URL або статус код потрібно визначити ",[5127,7417,7418],{},"динамічно"," на основі параметрів запиту, даних з бази або бізнес-логіки. NestJS дозволяє перевизначити параметри редиректу, повернувши об'єкт з властивостями ",[5231,7421,6510],{}," та ",[5231,7424,6516],{}," з обробника.",[5215,7427,7429],{"id":7428},"синтаксис-динамічного-перенаправлення","Синтаксис динамічного перенаправлення",[5224,7431,7433],{"className":6362,"code":7432,"language":6364,"meta":5229,"style":5229},"import { Controller, Get, Param, Redirect } from '@nestjs\u002Fcommon';\n\n@Controller('links')\nexport class LinksController {\n  @Get(':code')\n  @Redirect() \u002F\u002F Декоратор без аргументів\n  async resolveShortLink(@Param('code') code: string) {\n    \u002F\u002F Бізнес-логіка для визначення цільового URL\n    const targetUrl = await this.linksService.findUrlByCode(code);\n    \n    if (!targetUrl) {\n      throw new NotFoundException('Short link not found');\n    }\n    \n    \u002F\u002F Повертаємо об'єкт з url та statusCode\n    return {\n      url: targetUrl,\n      statusCode: HttpStatus.MOVED_PERMANENTLY,\n    };\n  }\n}\n",[5231,7434,7435,7464,7468,7481,7492,7505,7516,7544,7549,7580,7584,7596,7614,7618,7622,7627,7634,7643,7656,7661,7665],{"__ignoreMap":5229},[5234,7436,7437,7439,7441,7443,7445,7447,7449,7452,7454,7456,7458,7460,7462],{"class":5236,"line":5237},[5234,7438,6372],{"class":6371},[5234,7440,6376],{"class":6375},[5234,7442,6380],{"class":6379},[5234,7444,6383],{"class":6375},[5234,7446,6386],{"class":6379},[5234,7448,6383],{"class":6375},[5234,7450,7451],{"class":6379},"Param",[5234,7453,6383],{"class":6375},[5234,7455,6391],{"class":6379},[5234,7457,6394],{"class":6375},[5234,7459,6397],{"class":6371},[5234,7461,6401],{"class":6400},[5234,7463,6404],{"class":6375},[5234,7465,7466],{"class":5236,"line":5243},[5234,7467,5259],{"emptyLinePlaceholder":5258},[5234,7469,7470,7472,7474,7476,7479],{"class":5236,"line":5249},[5234,7471,6413],{"class":6375},[5234,7473,6380],{"class":6416},[5234,7475,6445],{"class":6375},[5234,7477,7478],{"class":6400},"'links'",[5234,7480,6451],{"class":6375},[5234,7482,7483,7485,7487,7490],{"class":5236,"line":5255},[5234,7484,6424],{"class":6371},[5234,7486,6428],{"class":6427},[5234,7488,7489],{"class":6431}," LinksController",[5234,7491,6435],{"class":6375},[5234,7493,7494,7496,7498,7500,7503],{"class":5236,"line":5262},[5234,7495,6440],{"class":6375},[5234,7497,6386],{"class":6416},[5234,7499,6445],{"class":6375},[5234,7501,7502],{"class":6400},"':code'",[5234,7504,6451],{"class":6375},[5234,7506,7507,7509,7511,7513],{"class":5236,"line":5268},[5234,7508,6440],{"class":6375},[5234,7510,6391],{"class":6416},[5234,7512,6904],{"class":6375},[5234,7514,7515],{"class":6482},"\u002F\u002F Декоратор без аргументів\n",[5234,7517,7518,7521,7524,7526,7528,7530,7533,7535,7537,7539,7542],{"class":5236,"line":5274},[5234,7519,7520],{"class":6427},"  async",[5234,7522,7523],{"class":6416}," resolveShortLink",[5234,7525,6899],{"class":6375},[5234,7527,7451],{"class":6416},[5234,7529,6445],{"class":6375},[5234,7531,7532],{"class":6400},"'code'",[5234,7534,6554],{"class":6375},[5234,7536,5231],{"class":6379},[5234,7538,6786],{"class":6375},[5234,7540,7541],{"class":6431},"string",[5234,7543,6914],{"class":6375},[5234,7545,7546],{"class":5236,"line":5280},[5234,7547,7548],{"class":6482},"    \u002F\u002F Бізнес-логіка для визначення цільового URL\n",[5234,7550,7551,7553,7556,7558,7561,7564,7566,7569,7571,7574,7576,7578],{"class":5236,"line":5285},[5234,7552,6919],{"class":6427},[5234,7554,7555],{"class":6661}," targetUrl",[5234,7557,6925],{"class":6375},[5234,7559,7560],{"class":6371},"await",[5234,7562,7563],{"class":6427}," this",[5234,7565,6058],{"class":6375},[5234,7567,7568],{"class":6379},"linksService",[5234,7570,6058],{"class":6375},[5234,7572,7573],{"class":6416},"findUrlByCode",[5234,7575,6445],{"class":6375},[5234,7577,5231],{"class":6379},[5234,7579,6940],{"class":6375},[5234,7581,7582],{"class":5236,"line":5291},[5234,7583,5676],{"class":6375},[5234,7585,7586,7588,7591,7594],{"class":5236,"line":5297},[5234,7587,6954],{"class":6371},[5234,7589,7590],{"class":6375}," (!",[5234,7592,7593],{"class":6379},"targetUrl",[5234,7595,6914],{"class":6375},[5234,7597,7598,7601,7604,7607,7609,7612],{"class":5236,"line":5303},[5234,7599,7600],{"class":6371},"      throw",[5234,7602,7603],{"class":6427}," new",[5234,7605,7606],{"class":6416}," NotFoundException",[5234,7608,6445],{"class":6375},[5234,7610,7611],{"class":6400},"'Short link not found'",[5234,7613,6940],{"class":6375},[5234,7615,7616],{"class":5236,"line":5309},[5234,7617,7101],{"class":6375},[5234,7619,7620],{"class":5236,"line":5315},[5234,7621,5676],{"class":6375},[5234,7623,7624],{"class":5236,"line":5320},[5234,7625,7626],{"class":6482},"    \u002F\u002F Повертаємо об'єкт з url та statusCode\n",[5234,7628,7629,7632],{"class":5236,"line":5326},[5234,7630,7631],{"class":6371},"    return",[5234,7633,6435],{"class":6375},[5234,7635,7636,7639,7641],{"class":5236,"line":5332},[5234,7637,7638],{"class":6379},"      url:",[5234,7640,7555],{"class":6379},[5234,7642,7077],{"class":6375},[5234,7644,7645,7648,7650,7652,7654],{"class":5236,"line":5338},[5234,7646,7647],{"class":6379},"      statusCode:",[5234,7649,7085],{"class":6379},[5234,7651,6058],{"class":6375},[5234,7653,6662],{"class":6661},[5234,7655,7077],{"class":6375},[5234,7657,7658],{"class":5236,"line":5344},[5234,7659,7660],{"class":6375},"    };\n",[5234,7662,7663],{"class":5236,"line":5349},[5234,7664,6493],{"class":6375},[5234,7666,7667],{"class":5236,"line":5354},[5234,7668,6498],{"class":6375},[5196,7670,7671],{},[5127,7672,7673],{},"Об'єкт, що повертається:",[5224,7675,7677],{"className":6362,"code":7676,"language":6364,"meta":5229,"style":5229},"{\n  url: string;         \u002F\u002F Цільовий URL перенаправлення\n  statusCode?: number; \u002F\u002F HTTP-статус код (опціонально, за замовчуванням 302)\n}\n",[5231,7678,7679,7684,7700,7717],{"__ignoreMap":5229},[5234,7680,7681],{"class":5236,"line":5237},[5234,7682,7683],{"class":6375},"{\n",[5234,7685,7686,7690,7692,7694,7697],{"class":5236,"line":5243},[5234,7687,7689],{"class":7688},"s5IvJ","  url",[5234,7691,6786],{"class":6375},[5234,7693,7541],{"class":6379},[5234,7695,7696],{"class":6375},";         ",[5234,7698,7699],{"class":6482},"\u002F\u002F Цільовий URL перенаправлення\n",[5234,7701,7702,7705,7708,7711,7714],{"class":5236,"line":5249},[5234,7703,7704],{"class":6379},"  statusCode",[5234,7706,7707],{"class":6375},"?: ",[5234,7709,7710],{"class":6379},"number",[5234,7712,7713],{"class":6375},"; ",[5234,7715,7716],{"class":6482},"\u002F\u002F HTTP-статус код (опціонально, за замовчуванням 302)\n",[5234,7718,7719],{"class":5236,"line":5255},[5234,7720,6498],{"class":6375},[5505,7722,7723,7724,7726,7727,7730],{},"Якщо метод повертає об'єкт з властивістю ",[5231,7725,6510],{},", NestJS автоматично інтерпретує це як перенаправлення, ",[5127,7728,7729],{},"навіть якщо декоратор @Redirect не застосовано",". Проте явне використання декоратора покращує читабельність коду.",[5215,7732,7734],{"id":7733},"приклад-скорочувач-url-url-shortener","Приклад: Скорочувач URL (URL Shortener)",[5196,7736,7737],{},"Розглянемо реалізацію повнофункціонального сервісу скорочувачів URL:",[5224,7739,7741],{"className":6362,"code":7740,"language":6364,"meta":5229,"style":5229},"import {\n  Controller,\n  Get,\n  Post,\n  Param,\n  Body,\n  Redirect,\n  HttpStatus,\n  NotFoundException,\n} from '@nestjs\u002Fcommon';\nimport { LinksService } from '.\u002Flinks.service';\nimport { CreateShortLinkDto } from '.\u002Fdto\u002Fcreate-short-link.dto';\n\n@Controller()\nexport class LinksController {\n  constructor(private readonly linksService: LinksService) {}\n\n  \u002F\u002F POST \u002Fshorten — Створення короткого посилання\n  @Post('shorten')\n  async createShortLink(@Body() dto: CreateShortLinkDto) {\n    const shortCode = await this.linksService.createShortLink(dto.url);\n    \n    return {\n      originalUrl: dto.url,\n      shortUrl: `https:\u002F\u002Fshort.link\u002F${shortCode}`,\n      shortCode,\n      createdAt: new Date(),\n    };\n  }\n\n  \u002F\u002F GET \u002F:code — Перенаправлення на оригінальний URL\n  @Get(':code')\n  @Redirect()\n  async redirect(@Param('code') code: string) {\n    const link = await this.linksService.findByCode(code);\n    \n    if (!link) {\n      throw new NotFoundException(`Short link \"${code}\" not found`);\n    }\n\n    \u002F\u002F Інкрементуємо лічильник переходів (асинхронно, без очікування)\n    this.linksService.incrementClicks(code).catch(err => {\n      console.error('Failed to increment clicks:', err);\n    });\n\n    \u002F\u002F Повертаємо динамічне перенаправлення\n    return {\n      url: link.originalUrl,\n      statusCode: link.isPermanent \n        ? HttpStatus.MOVED_PERMANENTLY  \u002F\u002F 301 для постійних скорочень\n        : HttpStatus.FOUND,              \u002F\u002F 302 для тимчасових\n    };\n  }\n\n  \u002F\u002F GET \u002Fstats\u002F:code — Статистика переходів\n  @Get('stats\u002F:code')\n  async getStats(@Param('code') code: string) {\n    const stats = await this.linksService.getStats(code);\n    \n    if (!stats) {\n      throw new NotFoundException(`Short link \"${code}\" not found`);\n    }\n    \n    return stats;\n  }\n}\n",[5231,7742,7743,7749,7756,7763,7770,7777,7784,7791,7798,7805,7816,7834,7852,7856,7864,7874,7897,7901,7906,7920,7943,7975,7979,7985,7999,8018,8025,8038,8042,8046,8050,8055,8067,8075,8100,8128,8132,8143,8167,8171,8176,8182,8216,8238,8244,8249,8255,8262,8275,8290,8305,8324,8329,8334,8339,8345,8359,8385,8414,8419,8431,8454,8459,8464,8473,8478],{"__ignoreMap":5229},[5234,7744,7745,7747],{"class":5236,"line":5237},[5234,7746,6372],{"class":6371},[5234,7748,6435],{"class":6375},[5234,7750,7751,7754],{"class":5236,"line":5243},[5234,7752,7753],{"class":6379},"  Controller",[5234,7755,7077],{"class":6375},[5234,7757,7758,7761],{"class":5236,"line":5249},[5234,7759,7760],{"class":6379},"  Get",[5234,7762,7077],{"class":6375},[5234,7764,7765,7768],{"class":5236,"line":5255},[5234,7766,7767],{"class":6379},"  Post",[5234,7769,7077],{"class":6375},[5234,7771,7772,7775],{"class":5236,"line":5262},[5234,7773,7774],{"class":6379},"  Param",[5234,7776,7077],{"class":6375},[5234,7778,7779,7782],{"class":5236,"line":5268},[5234,7780,7781],{"class":6379},"  Body",[5234,7783,7077],{"class":6375},[5234,7785,7786,7789],{"class":5236,"line":5274},[5234,7787,7788],{"class":6379},"  Redirect",[5234,7790,7077],{"class":6375},[5234,7792,7793,7796],{"class":5236,"line":5280},[5234,7794,7795],{"class":6379},"  HttpStatus",[5234,7797,7077],{"class":6375},[5234,7799,7800,7803],{"class":5236,"line":5285},[5234,7801,7802],{"class":6379},"  NotFoundException",[5234,7804,7077],{"class":6375},[5234,7806,7807,7810,7812,7814],{"class":5236,"line":5291},[5234,7808,7809],{"class":6375},"} ",[5234,7811,6397],{"class":6371},[5234,7813,6401],{"class":6400},[5234,7815,6404],{"class":6375},[5234,7817,7818,7820,7822,7825,7827,7829,7832],{"class":5236,"line":5297},[5234,7819,6372],{"class":6371},[5234,7821,6376],{"class":6375},[5234,7823,7824],{"class":6379},"LinksService",[5234,7826,6394],{"class":6375},[5234,7828,6397],{"class":6371},[5234,7830,7831],{"class":6400}," '.\u002Flinks.service'",[5234,7833,6404],{"class":6375},[5234,7835,7836,7838,7840,7843,7845,7847,7850],{"class":5236,"line":5303},[5234,7837,6372],{"class":6371},[5234,7839,6376],{"class":6375},[5234,7841,7842],{"class":6379},"CreateShortLinkDto",[5234,7844,6394],{"class":6375},[5234,7846,6397],{"class":6371},[5234,7848,7849],{"class":6400}," '.\u002Fdto\u002Fcreate-short-link.dto'",[5234,7851,6404],{"class":6375},[5234,7853,7854],{"class":5236,"line":5309},[5234,7855,5259],{"emptyLinePlaceholder":5258},[5234,7857,7858,7860,7862],{"class":5236,"line":5315},[5234,7859,6413],{"class":6375},[5234,7861,6380],{"class":6416},[5234,7863,6419],{"class":6375},[5234,7865,7866,7868,7870,7872],{"class":5236,"line":5320},[5234,7867,6424],{"class":6371},[5234,7869,6428],{"class":6427},[5234,7871,7489],{"class":6431},[5234,7873,6435],{"class":6375},[5234,7875,7876,7879,7881,7884,7887,7890,7892,7894],{"class":5236,"line":5326},[5234,7877,7878],{"class":6427},"  constructor",[5234,7880,6445],{"class":6375},[5234,7882,7883],{"class":6427},"private",[5234,7885,7886],{"class":6427}," readonly",[5234,7888,7889],{"class":6379}," linksService",[5234,7891,6786],{"class":6375},[5234,7893,7824],{"class":6431},[5234,7895,7896],{"class":6375},") {}\n",[5234,7898,7899],{"class":5236,"line":5332},[5234,7900,5259],{"emptyLinePlaceholder":5258},[5234,7902,7903],{"class":5236,"line":5338},[5234,7904,7905],{"class":6482},"  \u002F\u002F POST \u002Fshorten — Створення короткого посилання\n",[5234,7907,7908,7910,7913,7915,7918],{"class":5236,"line":5344},[5234,7909,6440],{"class":6375},[5234,7911,7912],{"class":6416},"Post",[5234,7914,6445],{"class":6375},[5234,7916,7917],{"class":6400},"'shorten'",[5234,7919,6451],{"class":6375},[5234,7921,7922,7924,7927,7929,7932,7934,7937,7939,7941],{"class":5236,"line":5349},[5234,7923,7520],{"class":6427},[5234,7925,7926],{"class":6416}," createShortLink",[5234,7928,6899],{"class":6375},[5234,7930,7931],{"class":6416},"Body",[5234,7933,6904],{"class":6375},[5234,7935,7936],{"class":6379},"dto",[5234,7938,6786],{"class":6375},[5234,7940,7842],{"class":6431},[5234,7942,6914],{"class":6375},[5234,7944,7945,7947,7950,7952,7954,7956,7958,7960,7962,7965,7967,7969,7971,7973],{"class":5236,"line":5354},[5234,7946,6919],{"class":6427},[5234,7948,7949],{"class":6661}," shortCode",[5234,7951,6925],{"class":6375},[5234,7953,7560],{"class":6371},[5234,7955,7563],{"class":6427},[5234,7957,6058],{"class":6375},[5234,7959,7568],{"class":6379},[5234,7961,6058],{"class":6375},[5234,7963,7964],{"class":6416},"createShortLink",[5234,7966,6445],{"class":6375},[5234,7968,7936],{"class":6379},[5234,7970,6058],{"class":6375},[5234,7972,6510],{"class":6379},[5234,7974,6940],{"class":6375},[5234,7976,7977],{"class":5236,"line":5360},[5234,7978,5676],{"class":6375},[5234,7980,7981,7983],{"class":5236,"line":5365},[5234,7982,7631],{"class":6371},[5234,7984,6435],{"class":6375},[5234,7986,7987,7990,7993,7995,7997],{"class":5236,"line":5371},[5234,7988,7989],{"class":6379},"      originalUrl:",[5234,7991,7992],{"class":6379}," dto",[5234,7994,6058],{"class":6375},[5234,7996,6510],{"class":6379},[5234,7998,7077],{"class":6375},[5234,8000,8001,8004,8007,8009,8012,8014,8016],{"class":5236,"line":5377},[5234,8002,8003],{"class":6379},"      shortUrl:",[5234,8005,8006],{"class":6400}," `https:\u002F\u002Fshort.link\u002F",[5234,8008,7020],{"class":6427},[5234,8010,8011],{"class":6379},"shortCode",[5234,8013,7031],{"class":6427},[5234,8015,7017],{"class":6400},[5234,8017,7077],{"class":6375},[5234,8019,8020,8023],{"class":5236,"line":5382},[5234,8021,8022],{"class":6379},"      shortCode",[5234,8024,7077],{"class":6375},[5234,8026,8027,8030,8032,8035],{"class":5236,"line":5387},[5234,8028,8029],{"class":6379},"      createdAt:",[5234,8031,7603],{"class":6427},[5234,8033,8034],{"class":6416}," Date",[5234,8036,8037],{"class":6375},"(),\n",[5234,8039,8040],{"class":5236,"line":5393},[5234,8041,7660],{"class":6375},[5234,8043,8044],{"class":5236,"line":5399},[5234,8045,6493],{"class":6375},[5234,8047,8048],{"class":5236,"line":5405},[5234,8049,5259],{"emptyLinePlaceholder":5258},[5234,8051,8052],{"class":5236,"line":5411},[5234,8053,8054],{"class":6482},"  \u002F\u002F GET \u002F:code — Перенаправлення на оригінальний URL\n",[5234,8056,8057,8059,8061,8063,8065],{"class":5236,"line":5416},[5234,8058,6440],{"class":6375},[5234,8060,6386],{"class":6416},[5234,8062,6445],{"class":6375},[5234,8064,7502],{"class":6400},[5234,8066,6451],{"class":6375},[5234,8068,8069,8071,8073],{"class":5236,"line":5421},[5234,8070,6440],{"class":6375},[5234,8072,6391],{"class":6416},[5234,8074,6419],{"class":6375},[5234,8076,8077,8079,8082,8084,8086,8088,8090,8092,8094,8096,8098],{"class":5236,"line":5427},[5234,8078,7520],{"class":6427},[5234,8080,8081],{"class":6416}," redirect",[5234,8083,6899],{"class":6375},[5234,8085,7451],{"class":6416},[5234,8087,6445],{"class":6375},[5234,8089,7532],{"class":6400},[5234,8091,6554],{"class":6375},[5234,8093,5231],{"class":6379},[5234,8095,6786],{"class":6375},[5234,8097,7541],{"class":6431},[5234,8099,6914],{"class":6375},[5234,8101,8102,8104,8107,8109,8111,8113,8115,8117,8119,8122,8124,8126],{"class":5236,"line":5433},[5234,8103,6919],{"class":6427},[5234,8105,8106],{"class":6661}," link",[5234,8108,6925],{"class":6375},[5234,8110,7560],{"class":6371},[5234,8112,7563],{"class":6427},[5234,8114,6058],{"class":6375},[5234,8116,7568],{"class":6379},[5234,8118,6058],{"class":6375},[5234,8120,8121],{"class":6416},"findByCode",[5234,8123,6445],{"class":6375},[5234,8125,5231],{"class":6379},[5234,8127,6940],{"class":6375},[5234,8129,8130],{"class":5236,"line":5439},[5234,8131,5676],{"class":6375},[5234,8133,8134,8136,8138,8141],{"class":5236,"line":5445},[5234,8135,6954],{"class":6371},[5234,8137,7590],{"class":6375},[5234,8139,8140],{"class":6379},"link",[5234,8142,6914],{"class":6375},[5234,8144,8145,8147,8149,8151,8153,8156,8158,8160,8162,8165],{"class":5236,"line":5450},[5234,8146,7600],{"class":6371},[5234,8148,7603],{"class":6427},[5234,8150,7606],{"class":6416},[5234,8152,6445],{"class":6375},[5234,8154,8155],{"class":6400},"`Short link \"",[5234,8157,7020],{"class":6427},[5234,8159,5231],{"class":6379},[5234,8161,7031],{"class":6427},[5234,8163,8164],{"class":6400},"\" not found`",[5234,8166,6940],{"class":6375},[5234,8168,8169],{"class":5236,"line":5455},[5234,8170,7101],{"class":6375},[5234,8172,8174],{"class":5236,"line":8173},40,[5234,8175,5259],{"emptyLinePlaceholder":5258},[5234,8177,8179],{"class":5236,"line":8178},41,[5234,8180,8181],{"class":6482},"    \u002F\u002F Інкрементуємо лічильник переходів (асинхронно, без очікування)\n",[5234,8183,8185,8188,8190,8192,8194,8197,8199,8201,8203,8206,8208,8211,8214],{"class":5236,"line":8184},42,[5234,8186,8187],{"class":6427},"    this",[5234,8189,6058],{"class":6375},[5234,8191,7568],{"class":6379},[5234,8193,6058],{"class":6375},[5234,8195,8196],{"class":6416},"incrementClicks",[5234,8198,6445],{"class":6375},[5234,8200,5231],{"class":6379},[5234,8202,5935],{"class":6375},[5234,8204,8205],{"class":6416},"catch",[5234,8207,6445],{"class":6375},[5234,8209,8210],{"class":6379},"err",[5234,8212,8213],{"class":6427}," =>",[5234,8215,6435],{"class":6375},[5234,8217,8219,8222,8224,8227,8229,8232,8234,8236],{"class":5236,"line":8218},43,[5234,8220,8221],{"class":6379},"      console",[5234,8223,6058],{"class":6375},[5234,8225,8226],{"class":6416},"error",[5234,8228,6445],{"class":6375},[5234,8230,8231],{"class":6400},"'Failed to increment clicks:'",[5234,8233,6383],{"class":6375},[5234,8235,8210],{"class":6379},[5234,8237,6940],{"class":6375},[5234,8239,8241],{"class":5236,"line":8240},44,[5234,8242,8243],{"class":6375},"    });\n",[5234,8245,8247],{"class":5236,"line":8246},45,[5234,8248,5259],{"emptyLinePlaceholder":5258},[5234,8250,8252],{"class":5236,"line":8251},46,[5234,8253,8254],{"class":6482},"    \u002F\u002F Повертаємо динамічне перенаправлення\n",[5234,8256,8258,8260],{"class":5236,"line":8257},47,[5234,8259,7631],{"class":6371},[5234,8261,6435],{"class":6375},[5234,8263,8265,8267,8269,8271,8273],{"class":5236,"line":8264},48,[5234,8266,7638],{"class":6379},[5234,8268,8106],{"class":6379},[5234,8270,6058],{"class":6375},[5234,8272,7049],{"class":6379},[5234,8274,7077],{"class":6375},[5234,8276,8278,8280,8282,8284,8287],{"class":5236,"line":8277},49,[5234,8279,7647],{"class":6379},[5234,8281,8106],{"class":6379},[5234,8283,6058],{"class":6375},[5234,8285,8286],{"class":6379},"isPermanent",[5234,8288,8289],{"class":6375}," \n",[5234,8291,8293,8296,8298,8300,8302],{"class":5236,"line":8292},50,[5234,8294,8295],{"class":6375},"        ? ",[5234,8297,6587],{"class":6379},[5234,8299,6058],{"class":6375},[5234,8301,6662],{"class":6661},[5234,8303,8304],{"class":6482},"  \u002F\u002F 301 для постійних скорочень\n",[5234,8306,8308,8311,8313,8315,8318,8321],{"class":5236,"line":8307},51,[5234,8309,8310],{"class":6375},"        : ",[5234,8312,6587],{"class":6379},[5234,8314,6058],{"class":6375},[5234,8316,8317],{"class":6661},"FOUND",[5234,8319,8320],{"class":6375},",              ",[5234,8322,8323],{"class":6482},"\u002F\u002F 302 для тимчасових\n",[5234,8325,8327],{"class":5236,"line":8326},52,[5234,8328,7660],{"class":6375},[5234,8330,8332],{"class":5236,"line":8331},53,[5234,8333,6493],{"class":6375},[5234,8335,8337],{"class":5236,"line":8336},54,[5234,8338,5259],{"emptyLinePlaceholder":5258},[5234,8340,8342],{"class":5236,"line":8341},55,[5234,8343,8344],{"class":6482},"  \u002F\u002F GET \u002Fstats\u002F:code — Статистика переходів\n",[5234,8346,8348,8350,8352,8354,8357],{"class":5236,"line":8347},56,[5234,8349,6440],{"class":6375},[5234,8351,6386],{"class":6416},[5234,8353,6445],{"class":6375},[5234,8355,8356],{"class":6400},"'stats\u002F:code'",[5234,8358,6451],{"class":6375},[5234,8360,8362,8364,8367,8369,8371,8373,8375,8377,8379,8381,8383],{"class":5236,"line":8361},57,[5234,8363,7520],{"class":6427},[5234,8365,8366],{"class":6416}," getStats",[5234,8368,6899],{"class":6375},[5234,8370,7451],{"class":6416},[5234,8372,6445],{"class":6375},[5234,8374,7532],{"class":6400},[5234,8376,6554],{"class":6375},[5234,8378,5231],{"class":6379},[5234,8380,6786],{"class":6375},[5234,8382,7541],{"class":6431},[5234,8384,6914],{"class":6375},[5234,8386,8388,8390,8393,8395,8397,8399,8401,8403,8405,8408,8410,8412],{"class":5236,"line":8387},58,[5234,8389,6919],{"class":6427},[5234,8391,8392],{"class":6661}," stats",[5234,8394,6925],{"class":6375},[5234,8396,7560],{"class":6371},[5234,8398,7563],{"class":6427},[5234,8400,6058],{"class":6375},[5234,8402,7568],{"class":6379},[5234,8404,6058],{"class":6375},[5234,8406,8407],{"class":6416},"getStats",[5234,8409,6445],{"class":6375},[5234,8411,5231],{"class":6379},[5234,8413,6940],{"class":6375},[5234,8415,8417],{"class":5236,"line":8416},59,[5234,8418,5676],{"class":6375},[5234,8420,8422,8424,8426,8429],{"class":5236,"line":8421},60,[5234,8423,6954],{"class":6371},[5234,8425,7590],{"class":6375},[5234,8427,8428],{"class":6379},"stats",[5234,8430,6914],{"class":6375},[5234,8432,8434,8436,8438,8440,8442,8444,8446,8448,8450,8452],{"class":5236,"line":8433},61,[5234,8435,7600],{"class":6371},[5234,8437,7603],{"class":6427},[5234,8439,7606],{"class":6416},[5234,8441,6445],{"class":6375},[5234,8443,8155],{"class":6400},[5234,8445,7020],{"class":6427},[5234,8447,5231],{"class":6379},[5234,8449,7031],{"class":6427},[5234,8451,8164],{"class":6400},[5234,8453,6940],{"class":6375},[5234,8455,8457],{"class":5236,"line":8456},62,[5234,8458,7101],{"class":6375},[5234,8460,8462],{"class":5236,"line":8461},63,[5234,8463,5676],{"class":6375},[5234,8465,8467,8469,8471],{"class":5236,"line":8466},64,[5234,8468,7631],{"class":6371},[5234,8470,8392],{"class":6379},[5234,8472,6404],{"class":6375},[5234,8474,8476],{"class":5236,"line":8475},65,[5234,8477,6493],{"class":6375},[5234,8479,8481],{"class":5236,"line":8480},66,[5234,8482,6498],{"class":6375},[5196,8484,8485],{},[5127,8486,8487],{},"Сервіс для роботи з посиланнями:",[5224,8489,8491],{"className":6362,"code":8490,"language":6364,"meta":5229,"style":5229},"import { Injectable } from '@nestjs\u002Fcommon';\nimport { InjectRepository } from '@nestjs\u002Ftypeorm';\nimport { Repository } from 'typeorm';\nimport { ShortLink } from '.\u002Fentities\u002Fshort-link.entity';\nimport { nanoid } from 'nanoid';\n\n@Injectable()\nexport class LinksService {\n  constructor(\n    @InjectRepository(ShortLink)\n    private readonly linksRepository: Repository\u003CShortLink>,\n  ) {}\n\n  async createShortLink(originalUrl: string, isPermanent = false): Promise\u003Cstring> {\n    \u002F\u002F Генеруємо унікальний код (7 символів, URL-safe)\n    const code = nanoid(7);\n    \n    const link = this.linksRepository.create({\n      code,\n      originalUrl,\n      isPermanent,\n      clicks: 0,\n    });\n    \n    await this.linksRepository.save(link);\n    \n    return code;\n  }\n\n  async findByCode(code: string): Promise\u003CShortLink | null> {\n    return this.linksRepository.findOne({ where: { code } });\n  }\n\n  async incrementClicks(code: string): Promise\u003Cvoid> {\n    await this.linksRepository.increment({ code }, 'clicks', 1);\n  }\n\n  async getStats(code: string) {\n    const link = await this.findByCode(code);\n    \n    if (!link) {\n      return null;\n    }\n    \n    return {\n      code: link.code,\n      originalUrl: link.originalUrl,\n      clicks: link.clicks,\n      createdAt: link.createdAt,\n      isPermanent: link.isPermanent,\n    };\n  }\n}\n",[5231,8492,8493,8510,8528,8546,8564,8582,8586,8594,8605,8612,8625,8647,8652,8656,8691,8696,8714,8718,8742,8749,8756,8763,8773,8777,8781,8803,8807,8815,8819,8823,8854,8882,8886,8890,8916,8948,8952,8956,8972,8994,8998,9008,9017,9021,9025,9031,9044,9056,9069,9082,9095,9099,9103],{"__ignoreMap":5229},[5234,8494,8495,8497,8499,8502,8504,8506,8508],{"class":5236,"line":5237},[5234,8496,6372],{"class":6371},[5234,8498,6376],{"class":6375},[5234,8500,8501],{"class":6379},"Injectable",[5234,8503,6394],{"class":6375},[5234,8505,6397],{"class":6371},[5234,8507,6401],{"class":6400},[5234,8509,6404],{"class":6375},[5234,8511,8512,8514,8516,8519,8521,8523,8526],{"class":5236,"line":5243},[5234,8513,6372],{"class":6371},[5234,8515,6376],{"class":6375},[5234,8517,8518],{"class":6379},"InjectRepository",[5234,8520,6394],{"class":6375},[5234,8522,6397],{"class":6371},[5234,8524,8525],{"class":6400}," '@nestjs\u002Ftypeorm'",[5234,8527,6404],{"class":6375},[5234,8529,8530,8532,8534,8537,8539,8541,8544],{"class":5236,"line":5249},[5234,8531,6372],{"class":6371},[5234,8533,6376],{"class":6375},[5234,8535,8536],{"class":6379},"Repository",[5234,8538,6394],{"class":6375},[5234,8540,6397],{"class":6371},[5234,8542,8543],{"class":6400}," 'typeorm'",[5234,8545,6404],{"class":6375},[5234,8547,8548,8550,8552,8555,8557,8559,8562],{"class":5236,"line":5255},[5234,8549,6372],{"class":6371},[5234,8551,6376],{"class":6375},[5234,8553,8554],{"class":6379},"ShortLink",[5234,8556,6394],{"class":6375},[5234,8558,6397],{"class":6371},[5234,8560,8561],{"class":6400}," '.\u002Fentities\u002Fshort-link.entity'",[5234,8563,6404],{"class":6375},[5234,8565,8566,8568,8570,8573,8575,8577,8580],{"class":5236,"line":5262},[5234,8567,6372],{"class":6371},[5234,8569,6376],{"class":6375},[5234,8571,8572],{"class":6379},"nanoid",[5234,8574,6394],{"class":6375},[5234,8576,6397],{"class":6371},[5234,8578,8579],{"class":6400}," 'nanoid'",[5234,8581,6404],{"class":6375},[5234,8583,8584],{"class":5236,"line":5268},[5234,8585,5259],{"emptyLinePlaceholder":5258},[5234,8587,8588,8590,8592],{"class":5236,"line":5274},[5234,8589,6413],{"class":6375},[5234,8591,8501],{"class":6416},[5234,8593,6419],{"class":6375},[5234,8595,8596,8598,8600,8603],{"class":5236,"line":5280},[5234,8597,6424],{"class":6371},[5234,8599,6428],{"class":6427},[5234,8601,8602],{"class":6431}," LinksService",[5234,8604,6435],{"class":6375},[5234,8606,8607,8609],{"class":5236,"line":5285},[5234,8608,7878],{"class":6427},[5234,8610,8611],{"class":6375},"(\n",[5234,8613,8614,8617,8619,8621,8623],{"class":5236,"line":5291},[5234,8615,8616],{"class":6375},"    @",[5234,8618,8518],{"class":6416},[5234,8620,6445],{"class":6375},[5234,8622,8554],{"class":6379},[5234,8624,6451],{"class":6375},[5234,8626,8627,8630,8632,8635,8637,8639,8642,8644],{"class":5236,"line":5297},[5234,8628,8629],{"class":6427},"    private",[5234,8631,7886],{"class":6427},[5234,8633,8634],{"class":6379}," linksRepository",[5234,8636,6786],{"class":6375},[5234,8638,8536],{"class":6431},[5234,8640,8641],{"class":6375},"\u003C",[5234,8643,8554],{"class":6431},[5234,8645,8646],{"class":6375},">,\n",[5234,8648,8649],{"class":5236,"line":5303},[5234,8650,8651],{"class":6375},"  ) {}\n",[5234,8653,8654],{"class":5236,"line":5309},[5234,8655,5259],{"emptyLinePlaceholder":5258},[5234,8657,8658,8660,8662,8664,8666,8668,8670,8672,8674,8676,8678,8681,8684,8686,8688],{"class":5236,"line":5315},[5234,8659,7520],{"class":6427},[5234,8661,7926],{"class":6416},[5234,8663,6445],{"class":6375},[5234,8665,7049],{"class":6379},[5234,8667,6786],{"class":6375},[5234,8669,7541],{"class":6431},[5234,8671,6383],{"class":6375},[5234,8673,8286],{"class":6379},[5234,8675,6925],{"class":6375},[5234,8677,6693],{"class":6427},[5234,8679,8680],{"class":6375},"): ",[5234,8682,8683],{"class":6431},"Promise",[5234,8685,8641],{"class":6375},[5234,8687,7541],{"class":6431},[5234,8689,8690],{"class":6375},"> {\n",[5234,8692,8693],{"class":5236,"line":5320},[5234,8694,8695],{"class":6482},"    \u002F\u002F Генеруємо унікальний код (7 символів, URL-safe)\n",[5234,8697,8698,8700,8703,8705,8707,8709,8712],{"class":5236,"line":5326},[5234,8699,6919],{"class":6427},[5234,8701,8702],{"class":6661}," code",[5234,8704,6925],{"class":6375},[5234,8706,8572],{"class":6416},[5234,8708,6445],{"class":6375},[5234,8710,8711],{"class":6467},"7",[5234,8713,6940],{"class":6375},[5234,8715,8716],{"class":5236,"line":5332},[5234,8717,5676],{"class":6375},[5234,8719,8720,8722,8724,8726,8729,8731,8734,8736,8739],{"class":5236,"line":5338},[5234,8721,6919],{"class":6427},[5234,8723,8106],{"class":6661},[5234,8725,6925],{"class":6375},[5234,8727,8728],{"class":6427},"this",[5234,8730,6058],{"class":6375},[5234,8732,8733],{"class":6379},"linksRepository",[5234,8735,6058],{"class":6375},[5234,8737,8738],{"class":6416},"create",[5234,8740,8741],{"class":6375},"({\n",[5234,8743,8744,8747],{"class":5236,"line":5344},[5234,8745,8746],{"class":6379},"      code",[5234,8748,7077],{"class":6375},[5234,8750,8751,8754],{"class":5236,"line":5349},[5234,8752,8753],{"class":6379},"      originalUrl",[5234,8755,7077],{"class":6375},[5234,8757,8758,8761],{"class":5236,"line":5354},[5234,8759,8760],{"class":6379},"      isPermanent",[5234,8762,7077],{"class":6375},[5234,8764,8765,8768,8771],{"class":5236,"line":5360},[5234,8766,8767],{"class":6379},"      clicks:",[5234,8769,8770],{"class":6467}," 0",[5234,8772,7077],{"class":6375},[5234,8774,8775],{"class":5236,"line":5365},[5234,8776,8243],{"class":6375},[5234,8778,8779],{"class":5236,"line":5371},[5234,8780,5676],{"class":6375},[5234,8782,8783,8786,8788,8790,8792,8794,8797,8799,8801],{"class":5236,"line":5377},[5234,8784,8785],{"class":6371},"    await",[5234,8787,7563],{"class":6427},[5234,8789,6058],{"class":6375},[5234,8791,8733],{"class":6379},[5234,8793,6058],{"class":6375},[5234,8795,8796],{"class":6416},"save",[5234,8798,6445],{"class":6375},[5234,8800,8140],{"class":6379},[5234,8802,6940],{"class":6375},[5234,8804,8805],{"class":5236,"line":5382},[5234,8806,5676],{"class":6375},[5234,8808,8809,8811,8813],{"class":5236,"line":5387},[5234,8810,7631],{"class":6371},[5234,8812,8702],{"class":6379},[5234,8814,6404],{"class":6375},[5234,8816,8817],{"class":5236,"line":5393},[5234,8818,6493],{"class":6375},[5234,8820,8821],{"class":5236,"line":5399},[5234,8822,5259],{"emptyLinePlaceholder":5258},[5234,8824,8825,8827,8830,8832,8834,8836,8838,8840,8842,8844,8846,8849,8852],{"class":5236,"line":5405},[5234,8826,7520],{"class":6427},[5234,8828,8829],{"class":6416}," findByCode",[5234,8831,6445],{"class":6375},[5234,8833,5231],{"class":6379},[5234,8835,6786],{"class":6375},[5234,8837,7541],{"class":6431},[5234,8839,8680],{"class":6375},[5234,8841,8683],{"class":6431},[5234,8843,8641],{"class":6375},[5234,8845,8554],{"class":6431},[5234,8847,8848],{"class":6375}," | ",[5234,8850,8851],{"class":6431},"null",[5234,8853,8690],{"class":6375},[5234,8855,8856,8858,8860,8862,8864,8866,8869,8872,8875,8877,8879],{"class":5236,"line":5411},[5234,8857,7631],{"class":6371},[5234,8859,7563],{"class":6427},[5234,8861,6058],{"class":6375},[5234,8863,8733],{"class":6379},[5234,8865,6058],{"class":6375},[5234,8867,8868],{"class":6416},"findOne",[5234,8870,8871],{"class":6375},"({ ",[5234,8873,8874],{"class":6379},"where:",[5234,8876,6376],{"class":6375},[5234,8878,5231],{"class":6379},[5234,8880,8881],{"class":6375}," } });\n",[5234,8883,8884],{"class":5236,"line":5416},[5234,8885,6493],{"class":6375},[5234,8887,8888],{"class":5236,"line":5421},[5234,8889,5259],{"emptyLinePlaceholder":5258},[5234,8891,8892,8894,8897,8899,8901,8903,8905,8907,8909,8911,8914],{"class":5236,"line":5427},[5234,8893,7520],{"class":6427},[5234,8895,8896],{"class":6416}," incrementClicks",[5234,8898,6445],{"class":6375},[5234,8900,5231],{"class":6379},[5234,8902,6786],{"class":6375},[5234,8904,7541],{"class":6431},[5234,8906,8680],{"class":6375},[5234,8908,8683],{"class":6431},[5234,8910,8641],{"class":6375},[5234,8912,8913],{"class":6431},"void",[5234,8915,8690],{"class":6375},[5234,8917,8918,8920,8922,8924,8926,8928,8931,8933,8935,8938,8941,8943,8946],{"class":5236,"line":5433},[5234,8919,8785],{"class":6371},[5234,8921,7563],{"class":6427},[5234,8923,6058],{"class":6375},[5234,8925,8733],{"class":6379},[5234,8927,6058],{"class":6375},[5234,8929,8930],{"class":6416},"increment",[5234,8932,8871],{"class":6375},[5234,8934,5231],{"class":6379},[5234,8936,8937],{"class":6375}," }, ",[5234,8939,8940],{"class":6400},"'clicks'",[5234,8942,6383],{"class":6375},[5234,8944,8945],{"class":6467},"1",[5234,8947,6940],{"class":6375},[5234,8949,8950],{"class":5236,"line":5439},[5234,8951,6493],{"class":6375},[5234,8953,8954],{"class":5236,"line":5445},[5234,8955,5259],{"emptyLinePlaceholder":5258},[5234,8957,8958,8960,8962,8964,8966,8968,8970],{"class":5236,"line":5450},[5234,8959,7520],{"class":6427},[5234,8961,8366],{"class":6416},[5234,8963,6445],{"class":6375},[5234,8965,5231],{"class":6379},[5234,8967,6786],{"class":6375},[5234,8969,7541],{"class":6431},[5234,8971,6914],{"class":6375},[5234,8973,8974,8976,8978,8980,8982,8984,8986,8988,8990,8992],{"class":5236,"line":5455},[5234,8975,6919],{"class":6427},[5234,8977,8106],{"class":6661},[5234,8979,6925],{"class":6375},[5234,8981,7560],{"class":6371},[5234,8983,7563],{"class":6427},[5234,8985,6058],{"class":6375},[5234,8987,8121],{"class":6416},[5234,8989,6445],{"class":6375},[5234,8991,5231],{"class":6379},[5234,8993,6940],{"class":6375},[5234,8995,8996],{"class":5236,"line":8173},[5234,8997,5676],{"class":6375},[5234,8999,9000,9002,9004,9006],{"class":5236,"line":8178},[5234,9001,6954],{"class":6371},[5234,9003,7590],{"class":6375},[5234,9005,8140],{"class":6379},[5234,9007,6914],{"class":6375},[5234,9009,9010,9012,9015],{"class":5236,"line":8184},[5234,9011,7065],{"class":6371},[5234,9013,9014],{"class":6427}," null",[5234,9016,6404],{"class":6375},[5234,9018,9019],{"class":5236,"line":8218},[5234,9020,7101],{"class":6375},[5234,9022,9023],{"class":5236,"line":8240},[5234,9024,5676],{"class":6375},[5234,9026,9027,9029],{"class":5236,"line":8246},[5234,9028,7631],{"class":6371},[5234,9030,6435],{"class":6375},[5234,9032,9033,9036,9038,9040,9042],{"class":5236,"line":8251},[5234,9034,9035],{"class":6379},"      code:",[5234,9037,8106],{"class":6379},[5234,9039,6058],{"class":6375},[5234,9041,5231],{"class":6379},[5234,9043,7077],{"class":6375},[5234,9045,9046,9048,9050,9052,9054],{"class":5236,"line":8257},[5234,9047,7989],{"class":6379},[5234,9049,8106],{"class":6379},[5234,9051,6058],{"class":6375},[5234,9053,7049],{"class":6379},[5234,9055,7077],{"class":6375},[5234,9057,9058,9060,9062,9064,9067],{"class":5236,"line":8264},[5234,9059,8767],{"class":6379},[5234,9061,8106],{"class":6379},[5234,9063,6058],{"class":6375},[5234,9065,9066],{"class":6379},"clicks",[5234,9068,7077],{"class":6375},[5234,9070,9071,9073,9075,9077,9080],{"class":5236,"line":8277},[5234,9072,8029],{"class":6379},[5234,9074,8106],{"class":6379},[5234,9076,6058],{"class":6375},[5234,9078,9079],{"class":6379},"createdAt",[5234,9081,7077],{"class":6375},[5234,9083,9084,9087,9089,9091,9093],{"class":5236,"line":8292},[5234,9085,9086],{"class":6379},"      isPermanent:",[5234,9088,8106],{"class":6379},[5234,9090,6058],{"class":6375},[5234,9092,8286],{"class":6379},[5234,9094,7077],{"class":6375},[5234,9096,9097],{"class":5236,"line":8307},[5234,9098,7660],{"class":6375},[5234,9100,9101],{"class":5236,"line":8326},[5234,9102,6493],{"class":6375},[5234,9104,9105],{"class":5236,"line":8331},[5234,9106,6498],{"class":6375},[6691,9108,9110,9117,9127,9131,9135,9138,9145,9149,9162,9173,9184,9187,9190,9197,9207,9210,9217,9224,9227,9234,9244,9247,9253,9256,9266,9276,9287,9297],{":cursor":6693,"title":9109},"Використання скорочувача URL",[6696,9111,9113],{"className":9112},[5236],[5234,9114,9116],{"className":9115},[6702],"# Створення короткого посилання",[6696,9118,9120,6704,9123],{"className":9119},[5236],[5234,9121,6703],{"className":9122},[6702],[5127,9124,9126],{"className":9125},[6708],"curl -X POST http:\u002F\u002Flocalhost:3000\u002Fshorten \\",[6696,9128,9130],{"className":9129},[5236],"  -H \"Content-Type: application\u002Fjson\" \\",[6696,9132,9134],{"className":9133},[5236],"  -d '{\"url\":\"https:\u002F\u002Fexample.com\u002Fvery\u002Flong\u002Furl\u002Fwith\u002Fmany\u002Fsegments\"}'",[6696,9136],{"className":9137},[5236],[6696,9139,9141],{"className":9140},[5236],[5234,9142,9144],{"className":9143},[6742,6708],"HTTP\u002F1.1 201 Created",[6696,9146,9148],{"className":9147},[5236],"{",[6696,9150,9152,9153,6786,9157,9161],{"className":9151},[5236],"  ",[5234,9154,9156],{"className":9155},[6742],"\"originalUrl\"",[5234,9158,9160],{"className":9159},[6716],"\"https:\u002F\u002Fexample.com\u002Fvery\u002Flong\u002Furl\u002Fwith\u002Fmany\u002Fsegments\"",",",[6696,9163,9152,9165,6786,9169,9161],{"className":9164},[5236],[5234,9166,9168],{"className":9167},[6742],"\"shortUrl\"",[5234,9170,9172],{"className":9171},[6716],"\"https:\u002F\u002Fshort.link\u002FaB3dEf7\"",[6696,9174,9152,9176,6786,9180],{"className":9175},[5236],[5234,9177,9179],{"className":9178},[6742],"\"shortCode\"",[5234,9181,9183],{"className":9182},[6716],"\"aB3dEf7\"",[6696,9185,7031],{"className":9186},[5236],[6696,9188],{"className":9189},[5236],[6696,9191,9193],{"className":9192},[5236],[5234,9194,9196],{"className":9195},[6702],"# Використання короткого посилання",[6696,9198,9200,6704,9203],{"className":9199},[5236],[5234,9201,6703],{"className":9202},[6702],[5127,9204,9206],{"className":9205},[6708],"curl -v http:\u002F\u002Flocalhost:3000\u002FaB3dEf7",[6696,9208],{"className":9209},[5236],[6696,9211,9213],{"className":9212},[5236],[5234,9214,9216],{"className":9215},[6734,6708],"HTTP\u002F1.1 302 Found",[6696,9218,9220],{"className":9219},[5236],[5234,9221,9223],{"className":9222},[6742],"Location: https:\u002F\u002Fexample.com\u002Fvery\u002Flong\u002Furl\u002Fwith\u002Fmany\u002Fsegments",[6696,9225],{"className":9226},[5236],[6696,9228,9230],{"className":9229},[5236],[5234,9231,9233],{"className":9232},[6702],"# Перегляд статистики",[6696,9235,9237,6704,9240],{"className":9236},[5236],[5234,9238,6703],{"className":9239},[6702],[5127,9241,9243],{"className":9242},[6708],"curl http:\u002F\u002Flocalhost:3000\u002Fstats\u002FaB3dEf7",[6696,9245],{"className":9246},[5236],[6696,9248,9250],{"className":9249},[5236],[5234,9251,6777],{"className":9252},[6742,6708],[6696,9254,9148],{"className":9255},[5236],[6696,9257,9152,9259,6786,9263,9161],{"className":9258},[5236],[5234,9260,9262],{"className":9261},[6742],"\"code\"",[5234,9264,9183],{"className":9265},[6716],[6696,9267,9152,9269,6786,9272,9161],{"className":9268},[5236],[5234,9270,9156],{"className":9271},[6742],[5234,9273,9275],{"className":9274},[6716],"\"https:\u002F\u002Fexample.com\u002F...\"",[6696,9277,9152,9279,6786,9283,9161],{"className":9278},[5236],[5234,9280,9282],{"className":9281},[6742],"\"clicks\"",[5234,9284,9286],{"className":9285},[6734],"42",[6696,9288,9152,9290,6786,9294],{"className":9289},[5236],[5234,9291,9293],{"className":9292},[6742],"\"isPermanent\"",[5234,9295,6693],{"className":9296},[6734],[6696,9298,7031],{"className":9299},[5236],[5215,9301,9303],{"id":9302},"приклад-post-redirect-get-pattern","Приклад: POST-Redirect-GET Pattern",[5196,9305,9306],{},"Класичний патерн для уникнення повторної відправки форми при оновленні сторінки:",[5224,9308,9310],{"className":6362,"code":9309,"language":6364,"meta":5229,"style":5229},"import { Controller, Post, Get, Body, Param, Redirect, HttpStatus } from '@nestjs\u002Fcommon';\n\n@Controller('articles')\nexport class ArticlesController {\n  constructor(private readonly articlesService: ArticlesService) {}\n\n  \u002F\u002F POST \u002Farticles — Створення статті\n  @Post()\n  @Redirect() \u002F\u002F Без аргументів — динамічний редирект\n  async create(@Body() createArticleDto: CreateArticleDto) {\n    const article = await this.articlesService.create(createArticleDto);\n    \n    \u002F\u002F Після успішного створення перенаправляємо на сторінку перегляду\n    return {\n      url: `\u002Farticles\u002F${article.id}`,\n      statusCode: HttpStatus.SEE_OTHER, \u002F\u002F 303 — завжди змінює метод на GET\n    };\n  }\n\n  \u002F\u002F GET \u002Farticles\u002F:id — Перегляд статті\n  @Get(':id')\n  async findOne(@Param('id') id: string) {\n    return this.articlesService.findById(id);\n  }\n}\n",[5231,9311,9312,9352,9356,9369,9380,9400,9404,9409,9417,9428,9451,9479,9483,9488,9494,9517,9533,9537,9541,9545,9550,9563,9589,9610,9614],{"__ignoreMap":5229},[5234,9313,9314,9316,9318,9320,9322,9324,9326,9328,9330,9332,9334,9336,9338,9340,9342,9344,9346,9348,9350],{"class":5236,"line":5237},[5234,9315,6372],{"class":6371},[5234,9317,6376],{"class":6375},[5234,9319,6380],{"class":6379},[5234,9321,6383],{"class":6375},[5234,9323,7912],{"class":6379},[5234,9325,6383],{"class":6375},[5234,9327,6386],{"class":6379},[5234,9329,6383],{"class":6375},[5234,9331,7931],{"class":6379},[5234,9333,6383],{"class":6375},[5234,9335,7451],{"class":6379},[5234,9337,6383],{"class":6375},[5234,9339,6391],{"class":6379},[5234,9341,6383],{"class":6375},[5234,9343,6587],{"class":6379},[5234,9345,6394],{"class":6375},[5234,9347,6397],{"class":6371},[5234,9349,6401],{"class":6400},[5234,9351,6404],{"class":6375},[5234,9353,9354],{"class":5236,"line":5243},[5234,9355,5259],{"emptyLinePlaceholder":5258},[5234,9357,9358,9360,9362,9364,9367],{"class":5236,"line":5249},[5234,9359,6413],{"class":6375},[5234,9361,6380],{"class":6416},[5234,9363,6445],{"class":6375},[5234,9365,9366],{"class":6400},"'articles'",[5234,9368,6451],{"class":6375},[5234,9370,9371,9373,9375,9378],{"class":5236,"line":5255},[5234,9372,6424],{"class":6371},[5234,9374,6428],{"class":6427},[5234,9376,9377],{"class":6431}," ArticlesController",[5234,9379,6435],{"class":6375},[5234,9381,9382,9384,9386,9388,9390,9393,9395,9398],{"class":5236,"line":5262},[5234,9383,7878],{"class":6427},[5234,9385,6445],{"class":6375},[5234,9387,7883],{"class":6427},[5234,9389,7886],{"class":6427},[5234,9391,9392],{"class":6379}," articlesService",[5234,9394,6786],{"class":6375},[5234,9396,9397],{"class":6431},"ArticlesService",[5234,9399,7896],{"class":6375},[5234,9401,9402],{"class":5236,"line":5268},[5234,9403,5259],{"emptyLinePlaceholder":5258},[5234,9405,9406],{"class":5236,"line":5274},[5234,9407,9408],{"class":6482},"  \u002F\u002F POST \u002Farticles — Створення статті\n",[5234,9410,9411,9413,9415],{"class":5236,"line":5280},[5234,9412,6440],{"class":6375},[5234,9414,7912],{"class":6416},[5234,9416,6419],{"class":6375},[5234,9418,9419,9421,9423,9425],{"class":5236,"line":5285},[5234,9420,6440],{"class":6375},[5234,9422,6391],{"class":6416},[5234,9424,6904],{"class":6375},[5234,9426,9427],{"class":6482},"\u002F\u002F Без аргументів — динамічний редирект\n",[5234,9429,9430,9432,9435,9437,9439,9441,9444,9446,9449],{"class":5236,"line":5291},[5234,9431,7520],{"class":6427},[5234,9433,9434],{"class":6416}," create",[5234,9436,6899],{"class":6375},[5234,9438,7931],{"class":6416},[5234,9440,6904],{"class":6375},[5234,9442,9443],{"class":6379},"createArticleDto",[5234,9445,6786],{"class":6375},[5234,9447,9448],{"class":6431},"CreateArticleDto",[5234,9450,6914],{"class":6375},[5234,9452,9453,9455,9458,9460,9462,9464,9466,9469,9471,9473,9475,9477],{"class":5236,"line":5297},[5234,9454,6919],{"class":6427},[5234,9456,9457],{"class":6661}," article",[5234,9459,6925],{"class":6375},[5234,9461,7560],{"class":6371},[5234,9463,7563],{"class":6427},[5234,9465,6058],{"class":6375},[5234,9467,9468],{"class":6379},"articlesService",[5234,9470,6058],{"class":6375},[5234,9472,8738],{"class":6416},[5234,9474,6445],{"class":6375},[5234,9476,9443],{"class":6379},[5234,9478,6940],{"class":6375},[5234,9480,9481],{"class":5236,"line":5303},[5234,9482,5676],{"class":6375},[5234,9484,9485],{"class":5236,"line":5309},[5234,9486,9487],{"class":6482},"    \u002F\u002F Після успішного створення перенаправляємо на сторінку перегляду\n",[5234,9489,9490,9492],{"class":5236,"line":5315},[5234,9491,7631],{"class":6371},[5234,9493,6435],{"class":6375},[5234,9495,9496,9498,9501,9503,9506,9508,9511,9513,9515],{"class":5236,"line":5320},[5234,9497,7638],{"class":6379},[5234,9499,9500],{"class":6400}," `\u002Farticles\u002F",[5234,9502,7020],{"class":6427},[5234,9504,9505],{"class":6379},"article",[5234,9507,6058],{"class":7025},[5234,9509,9510],{"class":6379},"id",[5234,9512,7031],{"class":6427},[5234,9514,7017],{"class":6400},[5234,9516,7077],{"class":6375},[5234,9518,9519,9521,9523,9525,9528,9530],{"class":5236,"line":5326},[5234,9520,7647],{"class":6379},[5234,9522,7085],{"class":6379},[5234,9524,6058],{"class":6375},[5234,9526,9527],{"class":6661},"SEE_OTHER",[5234,9529,6383],{"class":6375},[5234,9531,9532],{"class":6482},"\u002F\u002F 303 — завжди змінює метод на GET\n",[5234,9534,9535],{"class":5236,"line":5332},[5234,9536,7660],{"class":6375},[5234,9538,9539],{"class":5236,"line":5338},[5234,9540,6493],{"class":6375},[5234,9542,9543],{"class":5236,"line":5344},[5234,9544,5259],{"emptyLinePlaceholder":5258},[5234,9546,9547],{"class":5236,"line":5349},[5234,9548,9549],{"class":6482},"  \u002F\u002F GET \u002Farticles\u002F:id — Перегляд статті\n",[5234,9551,9552,9554,9556,9558,9561],{"class":5236,"line":5354},[5234,9553,6440],{"class":6375},[5234,9555,6386],{"class":6416},[5234,9557,6445],{"class":6375},[5234,9559,9560],{"class":6400},"':id'",[5234,9562,6451],{"class":6375},[5234,9564,9565,9567,9570,9572,9574,9576,9579,9581,9583,9585,9587],{"class":5236,"line":5360},[5234,9566,7520],{"class":6427},[5234,9568,9569],{"class":6416}," findOne",[5234,9571,6899],{"class":6375},[5234,9573,7451],{"class":6416},[5234,9575,6445],{"class":6375},[5234,9577,9578],{"class":6400},"'id'",[5234,9580,6554],{"class":6375},[5234,9582,9510],{"class":6379},[5234,9584,6786],{"class":6375},[5234,9586,7541],{"class":6431},[5234,9588,6914],{"class":6375},[5234,9590,9591,9593,9595,9597,9599,9601,9604,9606,9608],{"class":5236,"line":5365},[5234,9592,7631],{"class":6371},[5234,9594,7563],{"class":6427},[5234,9596,6058],{"class":6375},[5234,9598,9468],{"class":6379},[5234,9600,6058],{"class":6375},[5234,9602,9603],{"class":6416},"findById",[5234,9605,6445],{"class":6375},[5234,9607,9510],{"class":6379},[5234,9609,6940],{"class":6375},[5234,9611,9612],{"class":5236,"line":5371},[5234,9613,6493],{"class":6375},[5234,9615,9616],{"class":5236,"line":5377},[5234,9617,6498],{"class":6375},[5196,9619,9620],{},[5127,9621,9622],{},"Переваги POST-Redirect-GET:",[5465,9624,9625,9631,9637,9643],{},[5095,9626,9627,9630],{},[5127,9628,9629],{},"Уникнення дублювання:"," Користувач не може випадково створити кілька статей, натиснувши F5",[5095,9632,9633,9636],{},[5127,9634,9635],{},"Чиста адресна стрічка:"," URL відображає GET-ендпоінт, а не POST",[5095,9638,9639,9642],{},[5127,9640,9641],{},"Підтримка закладок:"," Користувач може зберегти закладку на результуючу сторінку",[5095,9644,9645,9648],{},[5127,9646,9647],{},"Історія браузера:"," Кнопка \"Назад\" працює коректно",[5553,9650,9651,9652,9654],{},"Завжди використовуйте ",[5127,9653,6263],{}," для POST-Redirect-GET, а не 302 чи 307. Код 303 явно сигналізує браузеру змінити метод на GET, що запобігає випадковому повторному відправленню POST-запиту.",[5215,9656,9658],{"id":9657},"умовне-перенаправлення-на-основі-параметрів","Умовне перенаправлення на основі параметрів",[5224,9660,9662],{"className":6362,"code":9661,"language":6364,"meta":5229,"style":5229},"import { Controller, Get, Query, Redirect, HttpStatus } from '@nestjs\u002Fcommon';\n\n@Controller('download')\nexport class DownloadController {\n  @Get()\n  @Redirect()\n  downloadFile(\n    @Query('platform') platform: string,\n    @Query('version') version: string,\n  ) {\n    \u002F\u002F Перенаправлення на різні CDN залежно від платформи\n    const baseUrl = 'https:\u002F\u002Fcdn.example.com\u002Fdownloads';\n    \n    switch (platform) {\n      case 'windows':\n        return {\n          url: `${baseUrl}\u002Fapp-${version}-win.exe`,\n          statusCode: HttpStatus.FOUND, \u002F\u002F 302 для динамічних посилань\n        };\n      \n      case 'macos':\n        return {\n          url: `${baseUrl}\u002Fapp-${version}-mac.dmg`,\n          statusCode: HttpStatus.FOUND,\n        };\n      \n      case 'linux':\n        return {\n          url: `${baseUrl}\u002Fapp-${version}-linux.tar.gz`,\n          statusCode: HttpStatus.FOUND,\n        };\n      \n      default:\n        \u002F\u002F За замовчуванням перенаправляємо на сторінку вибору платформи\n        return {\n          url: '\u002Fdownloads',\n          statusCode: HttpStatus.SEE_OTHER, \u002F\u002F 303\n        };\n    }\n  }\n}\n",[5231,9663,9664,9697,9701,9714,9725,9733,9741,9748,9770,9792,9797,9802,9816,9820,9831,9842,9849,9878,9894,9899,9903,9912,9918,9943,9955,9959,9963,9972,9978,10003,10015,10019,10023,10030,10035,10041,10050,10065,10069,10073,10077],{"__ignoreMap":5229},[5234,9665,9666,9668,9670,9672,9674,9676,9678,9681,9683,9685,9687,9689,9691,9693,9695],{"class":5236,"line":5237},[5234,9667,6372],{"class":6371},[5234,9669,6376],{"class":6375},[5234,9671,6380],{"class":6379},[5234,9673,6383],{"class":6375},[5234,9675,6386],{"class":6379},[5234,9677,6383],{"class":6375},[5234,9679,9680],{"class":6379},"Query",[5234,9682,6383],{"class":6375},[5234,9684,6391],{"class":6379},[5234,9686,6383],{"class":6375},[5234,9688,6587],{"class":6379},[5234,9690,6394],{"class":6375},[5234,9692,6397],{"class":6371},[5234,9694,6401],{"class":6400},[5234,9696,6404],{"class":6375},[5234,9698,9699],{"class":5236,"line":5243},[5234,9700,5259],{"emptyLinePlaceholder":5258},[5234,9702,9703,9705,9707,9709,9712],{"class":5236,"line":5249},[5234,9704,6413],{"class":6375},[5234,9706,6380],{"class":6416},[5234,9708,6445],{"class":6375},[5234,9710,9711],{"class":6400},"'download'",[5234,9713,6451],{"class":6375},[5234,9715,9716,9718,9720,9723],{"class":5236,"line":5255},[5234,9717,6424],{"class":6371},[5234,9719,6428],{"class":6427},[5234,9721,9722],{"class":6431}," DownloadController",[5234,9724,6435],{"class":6375},[5234,9726,9727,9729,9731],{"class":5236,"line":5262},[5234,9728,6440],{"class":6375},[5234,9730,6386],{"class":6416},[5234,9732,6419],{"class":6375},[5234,9734,9735,9737,9739],{"class":5236,"line":5268},[5234,9736,6440],{"class":6375},[5234,9738,6391],{"class":6416},[5234,9740,6419],{"class":6375},[5234,9742,9743,9746],{"class":5236,"line":5274},[5234,9744,9745],{"class":6416},"  downloadFile",[5234,9747,8611],{"class":6375},[5234,9749,9750,9752,9754,9756,9759,9761,9764,9766,9768],{"class":5236,"line":5280},[5234,9751,8616],{"class":6375},[5234,9753,9680],{"class":6416},[5234,9755,6445],{"class":6375},[5234,9757,9758],{"class":6400},"'platform'",[5234,9760,6554],{"class":6375},[5234,9762,9763],{"class":6379},"platform",[5234,9765,6786],{"class":6375},[5234,9767,7541],{"class":6431},[5234,9769,7077],{"class":6375},[5234,9771,9772,9774,9776,9778,9781,9783,9786,9788,9790],{"class":5236,"line":5285},[5234,9773,8616],{"class":6375},[5234,9775,9680],{"class":6416},[5234,9777,6445],{"class":6375},[5234,9779,9780],{"class":6400},"'version'",[5234,9782,6554],{"class":6375},[5234,9784,9785],{"class":6379},"version",[5234,9787,6786],{"class":6375},[5234,9789,7541],{"class":6431},[5234,9791,7077],{"class":6375},[5234,9793,9794],{"class":5236,"line":5291},[5234,9795,9796],{"class":6375},"  ) {\n",[5234,9798,9799],{"class":5236,"line":5297},[5234,9800,9801],{"class":6482},"    \u002F\u002F Перенаправлення на різні CDN залежно від платформи\n",[5234,9803,9804,9806,9809,9811,9814],{"class":5236,"line":5303},[5234,9805,6919],{"class":6427},[5234,9807,9808],{"class":6661}," baseUrl",[5234,9810,6925],{"class":6375},[5234,9812,9813],{"class":6400},"'https:\u002F\u002Fcdn.example.com\u002Fdownloads'",[5234,9815,6404],{"class":6375},[5234,9817,9818],{"class":5236,"line":5309},[5234,9819,5676],{"class":6375},[5234,9821,9822,9825,9827,9829],{"class":5236,"line":5315},[5234,9823,9824],{"class":6371},"    switch",[5234,9826,5130],{"class":6375},[5234,9828,9763],{"class":6379},[5234,9830,6914],{"class":6375},[5234,9832,9833,9836,9839],{"class":5236,"line":5320},[5234,9834,9835],{"class":6371},"      case",[5234,9837,9838],{"class":6400}," 'windows'",[5234,9840,9841],{"class":6375},":\n",[5234,9843,9844,9847],{"class":5236,"line":5326},[5234,9845,9846],{"class":6371},"        return",[5234,9848,6435],{"class":6375},[5234,9850,9851,9854,9857,9859,9862,9864,9867,9869,9871,9873,9876],{"class":5236,"line":5332},[5234,9852,9853],{"class":6379},"          url:",[5234,9855,9856],{"class":6400}," `",[5234,9858,7020],{"class":6427},[5234,9860,9861],{"class":6379},"baseUrl",[5234,9863,7031],{"class":6427},[5234,9865,9866],{"class":6400},"\u002Fapp-",[5234,9868,7020],{"class":6427},[5234,9870,9785],{"class":6379},[5234,9872,7031],{"class":6427},[5234,9874,9875],{"class":6400},"-win.exe`",[5234,9877,7077],{"class":6375},[5234,9879,9880,9883,9885,9887,9889,9891],{"class":5236,"line":5338},[5234,9881,9882],{"class":6379},"          statusCode:",[5234,9884,7085],{"class":6379},[5234,9886,6058],{"class":6375},[5234,9888,8317],{"class":6661},[5234,9890,6383],{"class":6375},[5234,9892,9893],{"class":6482},"\u002F\u002F 302 для динамічних посилань\n",[5234,9895,9896],{"class":5236,"line":5344},[5234,9897,9898],{"class":6375},"        };\n",[5234,9900,9901],{"class":5236,"line":5349},[5234,9902,7060],{"class":6375},[5234,9904,9905,9907,9910],{"class":5236,"line":5354},[5234,9906,9835],{"class":6371},[5234,9908,9909],{"class":6400}," 'macos'",[5234,9911,9841],{"class":6375},[5234,9913,9914,9916],{"class":5236,"line":5360},[5234,9915,9846],{"class":6371},[5234,9917,6435],{"class":6375},[5234,9919,9920,9922,9924,9926,9928,9930,9932,9934,9936,9938,9941],{"class":5236,"line":5365},[5234,9921,9853],{"class":6379},[5234,9923,9856],{"class":6400},[5234,9925,7020],{"class":6427},[5234,9927,9861],{"class":6379},[5234,9929,7031],{"class":6427},[5234,9931,9866],{"class":6400},[5234,9933,7020],{"class":6427},[5234,9935,9785],{"class":6379},[5234,9937,7031],{"class":6427},[5234,9939,9940],{"class":6400},"-mac.dmg`",[5234,9942,7077],{"class":6375},[5234,9944,9945,9947,9949,9951,9953],{"class":5236,"line":5371},[5234,9946,9882],{"class":6379},[5234,9948,7085],{"class":6379},[5234,9950,6058],{"class":6375},[5234,9952,8317],{"class":6661},[5234,9954,7077],{"class":6375},[5234,9956,9957],{"class":5236,"line":5377},[5234,9958,9898],{"class":6375},[5234,9960,9961],{"class":5236,"line":5382},[5234,9962,7060],{"class":6375},[5234,9964,9965,9967,9970],{"class":5236,"line":5387},[5234,9966,9835],{"class":6371},[5234,9968,9969],{"class":6400}," 'linux'",[5234,9971,9841],{"class":6375},[5234,9973,9974,9976],{"class":5236,"line":5393},[5234,9975,9846],{"class":6371},[5234,9977,6435],{"class":6375},[5234,9979,9980,9982,9984,9986,9988,9990,9992,9994,9996,9998,10001],{"class":5236,"line":5399},[5234,9981,9853],{"class":6379},[5234,9983,9856],{"class":6400},[5234,9985,7020],{"class":6427},[5234,9987,9861],{"class":6379},[5234,9989,7031],{"class":6427},[5234,9991,9866],{"class":6400},[5234,9993,7020],{"class":6427},[5234,9995,9785],{"class":6379},[5234,9997,7031],{"class":6427},[5234,9999,10000],{"class":6400},"-linux.tar.gz`",[5234,10002,7077],{"class":6375},[5234,10004,10005,10007,10009,10011,10013],{"class":5236,"line":5405},[5234,10006,9882],{"class":6379},[5234,10008,7085],{"class":6379},[5234,10010,6058],{"class":6375},[5234,10012,8317],{"class":6661},[5234,10014,7077],{"class":6375},[5234,10016,10017],{"class":5236,"line":5411},[5234,10018,9898],{"class":6375},[5234,10020,10021],{"class":5236,"line":5416},[5234,10022,7060],{"class":6375},[5234,10024,10025,10028],{"class":5236,"line":5421},[5234,10026,10027],{"class":6371},"      default",[5234,10029,9841],{"class":6375},[5234,10031,10032],{"class":5236,"line":5427},[5234,10033,10034],{"class":6482},"        \u002F\u002F За замовчуванням перенаправляємо на сторінку вибору платформи\n",[5234,10036,10037,10039],{"class":5236,"line":5433},[5234,10038,9846],{"class":6371},[5234,10040,6435],{"class":6375},[5234,10042,10043,10045,10048],{"class":5236,"line":5439},[5234,10044,9853],{"class":6379},[5234,10046,10047],{"class":6400}," '\u002Fdownloads'",[5234,10049,7077],{"class":6375},[5234,10051,10052,10054,10056,10058,10060,10062],{"class":5236,"line":5445},[5234,10053,9882],{"class":6379},[5234,10055,7085],{"class":6379},[5234,10057,6058],{"class":6375},[5234,10059,9527],{"class":6661},[5234,10061,6383],{"class":6375},[5234,10063,10064],{"class":6482},"\u002F\u002F 303\n",[5234,10066,10067],{"class":5236,"line":5450},[5234,10068,9898],{"class":6375},[5234,10070,10071],{"class":5236,"line":5455},[5234,10072,7101],{"class":6375},[5234,10074,10075],{"class":5236,"line":8173},[5234,10076,6493],{"class":6375},[5234,10078,10079],{"class":5236,"line":8178},[5234,10080,6498],{"class":6375},[5191,10082,10084],{"id":10083},"перенаправлення-через-res-альтернативний-підхід","Перенаправлення через @Res: альтернативний підхід",[5196,10086,10087,10088,10091,10092,10095,10096,10099],{},"Як ми вивчали у попередніх лекціях, NestJS надає прямий доступ до об'єкта ",[5231,10089,10090],{},"Response"," через декоратор ",[5231,10093,10094],{},"@Res()",". Цей підхід можна використовувати для перенаправлень, проте він ",[5127,10097,10098],{},"не рекомендується"," для більшості сценаріїв.",[5215,10101,10103],{"id":10102},"перенаправлення-через-resredirect","Перенаправлення через res.redirect()",[5224,10105,10107],{"className":6362,"code":10106,"language":6364,"meta":5229,"style":5229},"import { Controller, Get, Res } from '@nestjs\u002Fcommon';\nimport { Response } from 'express';\n\n@Controller('old')\nexport class OldController {\n  @Get('path')\n  redirect(@Res() res: Response) {\n    \u002F\u002F Метод 1: Лише URL (статус 302 за замовчуванням)\n    res.redirect('\u002Fnew\u002Fpath');\n    \n    \u002F\u002F Метод 2: URL + статус\n    res.redirect(301, '\u002Fnew\u002Fpath');\n    \n    \u002F\u002F Метод 3: Відносне перенаправлення\n    res.redirect('back'); \u002F\u002F Повернутися на попередню сторінку\n    \n    \u002F\u002F ВАЖЛИВО: Не повертайте значення з методу!\n    \u002F\u002F res.redirect() автоматично завершує відповідь\n  }\n}\n",[5231,10108,10109,10134,10150,10154,10167,10178,10191,10211,10216,10232,10236,10241,10259,10263,10268,10287,10291,10296,10301,10305],{"__ignoreMap":5229},[5234,10110,10111,10113,10115,10117,10119,10121,10123,10126,10128,10130,10132],{"class":5236,"line":5237},[5234,10112,6372],{"class":6371},[5234,10114,6376],{"class":6375},[5234,10116,6380],{"class":6379},[5234,10118,6383],{"class":6375},[5234,10120,6386],{"class":6379},[5234,10122,6383],{"class":6375},[5234,10124,10125],{"class":6379},"Res",[5234,10127,6394],{"class":6375},[5234,10129,6397],{"class":6371},[5234,10131,6401],{"class":6400},[5234,10133,6404],{"class":6375},[5234,10135,10136,10138,10140,10142,10144,10146,10148],{"class":5236,"line":5243},[5234,10137,6372],{"class":6371},[5234,10139,6376],{"class":6375},[5234,10141,10090],{"class":6379},[5234,10143,6394],{"class":6375},[5234,10145,6397],{"class":6371},[5234,10147,6845],{"class":6400},[5234,10149,6404],{"class":6375},[5234,10151,10152],{"class":5236,"line":5249},[5234,10153,5259],{"emptyLinePlaceholder":5258},[5234,10155,10156,10158,10160,10162,10165],{"class":5236,"line":5255},[5234,10157,6413],{"class":6375},[5234,10159,6380],{"class":6416},[5234,10161,6445],{"class":6375},[5234,10163,10164],{"class":6400},"'old'",[5234,10166,6451],{"class":6375},[5234,10168,10169,10171,10173,10176],{"class":5236,"line":5262},[5234,10170,6424],{"class":6371},[5234,10172,6428],{"class":6427},[5234,10174,10175],{"class":6431}," OldController",[5234,10177,6435],{"class":6375},[5234,10179,10180,10182,10184,10186,10189],{"class":5236,"line":5268},[5234,10181,6440],{"class":6375},[5234,10183,6386],{"class":6416},[5234,10185,6445],{"class":6375},[5234,10187,10188],{"class":6400},"'path'",[5234,10190,6451],{"class":6375},[5234,10192,10193,10196,10198,10200,10202,10205,10207,10209],{"class":5236,"line":5274},[5234,10194,10195],{"class":6416},"  redirect",[5234,10197,6899],{"class":6375},[5234,10199,10125],{"class":6416},[5234,10201,6904],{"class":6375},[5234,10203,10204],{"class":6379},"res",[5234,10206,6786],{"class":6375},[5234,10208,10090],{"class":6431},[5234,10210,6914],{"class":6375},[5234,10212,10213],{"class":5236,"line":5280},[5234,10214,10215],{"class":6482},"    \u002F\u002F Метод 1: Лише URL (статус 302 за замовчуванням)\n",[5234,10217,10218,10221,10223,10225,10227,10230],{"class":5236,"line":5285},[5234,10219,10220],{"class":6379},"    res",[5234,10222,6058],{"class":6375},[5234,10224,5201],{"class":6416},[5234,10226,6445],{"class":6375},[5234,10228,10229],{"class":6400},"'\u002Fnew\u002Fpath'",[5234,10231,6940],{"class":6375},[5234,10233,10234],{"class":5236,"line":5291},[5234,10235,5676],{"class":6375},[5234,10237,10238],{"class":5236,"line":5297},[5234,10239,10240],{"class":6482},"    \u002F\u002F Метод 2: URL + статус\n",[5234,10242,10243,10245,10247,10249,10251,10253,10255,10257],{"class":5236,"line":5303},[5234,10244,10220],{"class":6379},[5234,10246,6058],{"class":6375},[5234,10248,5201],{"class":6416},[5234,10250,6445],{"class":6375},[5234,10252,6155],{"class":6467},[5234,10254,6383],{"class":6375},[5234,10256,10229],{"class":6400},[5234,10258,6940],{"class":6375},[5234,10260,10261],{"class":5236,"line":5309},[5234,10262,5676],{"class":6375},[5234,10264,10265],{"class":5236,"line":5315},[5234,10266,10267],{"class":6482},"    \u002F\u002F Метод 3: Відносне перенаправлення\n",[5234,10269,10270,10272,10274,10276,10278,10281,10284],{"class":5236,"line":5320},[5234,10271,10220],{"class":6379},[5234,10273,6058],{"class":6375},[5234,10275,5201],{"class":6416},[5234,10277,6445],{"class":6375},[5234,10279,10280],{"class":6400},"'back'",[5234,10282,10283],{"class":6375},"); ",[5234,10285,10286],{"class":6482},"\u002F\u002F Повернутися на попередню сторінку\n",[5234,10288,10289],{"class":5236,"line":5326},[5234,10290,5676],{"class":6375},[5234,10292,10293],{"class":5236,"line":5332},[5234,10294,10295],{"class":6482},"    \u002F\u002F ВАЖЛИВО: Не повертайте значення з методу!\n",[5234,10297,10298],{"class":5236,"line":5338},[5234,10299,10300],{"class":6482},"    \u002F\u002F res.redirect() автоматично завершує відповідь\n",[5234,10302,10303],{"class":5236,"line":5344},[5234,10304,6493],{"class":6375},[5234,10306,10307],{"class":5236,"line":5349},[5234,10308,6498],{"class":6375},[5606,10310,10311,10316,10348],{},[5196,10312,10313],{},[5127,10314,10315],{},"Проблеми підходу через @Res:",[5465,10317,10318,10324,10330,10336,10342],{},[5095,10319,10320,10323],{},[5127,10321,10322],{},"Прив'язка до Express\u002FFastify:"," Код не буде працювати при зміні платформи",[5095,10325,10326,10329],{},[5127,10327,10328],{},"Втрата автоматичної обробки:"," Interceptors можуть не спрацювати",[5095,10331,10332,10335],{},[5127,10333,10334],{},"Менша читабельність:"," Метадані перенаправлення не видно в декораторах",[5095,10337,10338,10341],{},[5127,10339,10340],{},"Складніше тестувати:"," Потрібні mock об'єкти Response",[5095,10343,10344,10347],{},[5127,10345,10346],{},"Можливість помилок:"," Легко забути про відсутність return після redirect()",[5196,10349,10350,5890,10352,10354,10355,10358,10359,6058],{},[5127,10351,7390],{},[5231,10353,6354],{}," або динамічне повернення ",[5231,10356,10357],{},"{ url, statusCode }"," замість прямого доступу до ",[5231,10360,10361],{},"res.redirect()",[5215,10363,10365],{"id":10364},"коли-використовувати-res-для-перенаправлень","Коли використовувати @Res для перенаправлень",[5196,10367,10368,10369,10372],{},"Єдиний виправданий сценарій — коли потрібен ",[5127,10370,10371],{},"максимальний контроль"," над заголовками перенаправлення:",[5224,10374,10376],{"className":6362,"code":10375,"language":6364,"meta":5229,"style":5229},"import { Controller, Get, Res } from '@nestjs\u002Fcommon';\nimport { Response } from 'express';\n\n@Controller('tracking')\nexport class TrackingController {\n  @Get('click\u002F:id')\n  async trackClick(\n    @Param('id') id: string,\n    @Res() res: Response,\n  ) {\n    \u002F\u002F Логування кліку\n    await this.analyticsService.logClick(id);\n    \n    const targetUrl = await this.linksService.getTargetUrl(id);\n    \n    \u002F\u002F Додавання кастомних заголовків до редиректу\n    res.set({\n      'X-Redirect-Reason': 'tracking',\n      'X-Click-ID': id,\n      'Cache-Control': 'no-cache, no-store, must-revalidate',\n    });\n    \n    res.redirect(302, targetUrl);\n  }\n}\n",[5231,10377,10378,10402,10418,10422,10435,10446,10459,10468,10488,10504,10508,10513,10535,10539,10566,10570,10575,10586,10599,10611,10623,10627,10631,10649,10653],{"__ignoreMap":5229},[5234,10379,10380,10382,10384,10386,10388,10390,10392,10394,10396,10398,10400],{"class":5236,"line":5237},[5234,10381,6372],{"class":6371},[5234,10383,6376],{"class":6375},[5234,10385,6380],{"class":6379},[5234,10387,6383],{"class":6375},[5234,10389,6386],{"class":6379},[5234,10391,6383],{"class":6375},[5234,10393,10125],{"class":6379},[5234,10395,6394],{"class":6375},[5234,10397,6397],{"class":6371},[5234,10399,6401],{"class":6400},[5234,10401,6404],{"class":6375},[5234,10403,10404,10406,10408,10410,10412,10414,10416],{"class":5236,"line":5243},[5234,10405,6372],{"class":6371},[5234,10407,6376],{"class":6375},[5234,10409,10090],{"class":6379},[5234,10411,6394],{"class":6375},[5234,10413,6397],{"class":6371},[5234,10415,6845],{"class":6400},[5234,10417,6404],{"class":6375},[5234,10419,10420],{"class":5236,"line":5249},[5234,10421,5259],{"emptyLinePlaceholder":5258},[5234,10423,10424,10426,10428,10430,10433],{"class":5236,"line":5255},[5234,10425,6413],{"class":6375},[5234,10427,6380],{"class":6416},[5234,10429,6445],{"class":6375},[5234,10431,10432],{"class":6400},"'tracking'",[5234,10434,6451],{"class":6375},[5234,10436,10437,10439,10441,10444],{"class":5236,"line":5262},[5234,10438,6424],{"class":6371},[5234,10440,6428],{"class":6427},[5234,10442,10443],{"class":6431}," TrackingController",[5234,10445,6435],{"class":6375},[5234,10447,10448,10450,10452,10454,10457],{"class":5236,"line":5268},[5234,10449,6440],{"class":6375},[5234,10451,6386],{"class":6416},[5234,10453,6445],{"class":6375},[5234,10455,10456],{"class":6400},"'click\u002F:id'",[5234,10458,6451],{"class":6375},[5234,10460,10461,10463,10466],{"class":5236,"line":5274},[5234,10462,7520],{"class":6427},[5234,10464,10465],{"class":6416}," trackClick",[5234,10467,8611],{"class":6375},[5234,10469,10470,10472,10474,10476,10478,10480,10482,10484,10486],{"class":5236,"line":5280},[5234,10471,8616],{"class":6375},[5234,10473,7451],{"class":6416},[5234,10475,6445],{"class":6375},[5234,10477,9578],{"class":6400},[5234,10479,6554],{"class":6375},[5234,10481,9510],{"class":6379},[5234,10483,6786],{"class":6375},[5234,10485,7541],{"class":6431},[5234,10487,7077],{"class":6375},[5234,10489,10490,10492,10494,10496,10498,10500,10502],{"class":5236,"line":5285},[5234,10491,8616],{"class":6375},[5234,10493,10125],{"class":6416},[5234,10495,6904],{"class":6375},[5234,10497,10204],{"class":6379},[5234,10499,6786],{"class":6375},[5234,10501,10090],{"class":6431},[5234,10503,7077],{"class":6375},[5234,10505,10506],{"class":5236,"line":5291},[5234,10507,9796],{"class":6375},[5234,10509,10510],{"class":5236,"line":5297},[5234,10511,10512],{"class":6482},"    \u002F\u002F Логування кліку\n",[5234,10514,10515,10517,10519,10521,10524,10526,10529,10531,10533],{"class":5236,"line":5303},[5234,10516,8785],{"class":6371},[5234,10518,7563],{"class":6427},[5234,10520,6058],{"class":6375},[5234,10522,10523],{"class":6379},"analyticsService",[5234,10525,6058],{"class":6375},[5234,10527,10528],{"class":6416},"logClick",[5234,10530,6445],{"class":6375},[5234,10532,9510],{"class":6379},[5234,10534,6940],{"class":6375},[5234,10536,10537],{"class":5236,"line":5309},[5234,10538,5676],{"class":6375},[5234,10540,10541,10543,10545,10547,10549,10551,10553,10555,10557,10560,10562,10564],{"class":5236,"line":5315},[5234,10542,6919],{"class":6427},[5234,10544,7555],{"class":6661},[5234,10546,6925],{"class":6375},[5234,10548,7560],{"class":6371},[5234,10550,7563],{"class":6427},[5234,10552,6058],{"class":6375},[5234,10554,7568],{"class":6379},[5234,10556,6058],{"class":6375},[5234,10558,10559],{"class":6416},"getTargetUrl",[5234,10561,6445],{"class":6375},[5234,10563,9510],{"class":6379},[5234,10565,6940],{"class":6375},[5234,10567,10568],{"class":5236,"line":5320},[5234,10569,5676],{"class":6375},[5234,10571,10572],{"class":5236,"line":5326},[5234,10573,10574],{"class":6482},"    \u002F\u002F Додавання кастомних заголовків до редиректу\n",[5234,10576,10577,10579,10581,10584],{"class":5236,"line":5332},[5234,10578,10220],{"class":6379},[5234,10580,6058],{"class":6375},[5234,10582,10583],{"class":6416},"set",[5234,10585,8741],{"class":6375},[5234,10587,10588,10591,10594,10597],{"class":5236,"line":5338},[5234,10589,10590],{"class":6400},"      'X-Redirect-Reason'",[5234,10592,10593],{"class":6379},":",[5234,10595,10596],{"class":6400}," 'tracking'",[5234,10598,7077],{"class":6375},[5234,10600,10601,10604,10606,10609],{"class":5236,"line":5344},[5234,10602,10603],{"class":6400},"      'X-Click-ID'",[5234,10605,10593],{"class":6379},[5234,10607,10608],{"class":6379}," id",[5234,10610,7077],{"class":6375},[5234,10612,10613,10616,10618,10621],{"class":5236,"line":5349},[5234,10614,10615],{"class":6400},"      'Cache-Control'",[5234,10617,10593],{"class":6379},[5234,10619,10620],{"class":6400}," 'no-cache, no-store, must-revalidate'",[5234,10622,7077],{"class":6375},[5234,10624,10625],{"class":5236,"line":5354},[5234,10626,8243],{"class":6375},[5234,10628,10629],{"class":5236,"line":5360},[5234,10630,5676],{"class":6375},[5234,10632,10633,10635,10637,10639,10641,10643,10645,10647],{"class":5236,"line":5365},[5234,10634,10220],{"class":6379},[5234,10636,6058],{"class":6375},[5234,10638,5201],{"class":6416},[5234,10640,6445],{"class":6375},[5234,10642,6177],{"class":6467},[5234,10644,6383],{"class":6375},[5234,10646,7593],{"class":6379},[5234,10648,6940],{"class":6375},[5234,10650,10651],{"class":5236,"line":5371},[5234,10652,6493],{"class":6375},[5234,10654,10655],{"class":5236,"line":5377},[5234,10656,6498],{"class":6375},[5191,10658,10660],{"id":10659},"best-practices-вибір-правильного-коду-перенаправлення","Best Practices: вибір правильного коду перенаправлення",[5196,10662,10663],{},"Правильний вибір статус коду перенаправлення впливає на поведінку браузерів, SEO та користувацький досвід. Розглянемо практичні рекомендації для різних сценаріїв.",[5215,10665,10667],{"id":10666},"правила-вибору-коду-перенаправлення","Правила вибору коду перенаправлення",[10669,10670,10671,10675,10681,10695,10699,10704,10717,10721,10726],"steps",{},[5215,10672,10674],{"id":10673},"крок-1-визначте-постійність","Крок 1. Визначте постійність",[5196,10676,10677,10680],{},[5127,10678,10679],{},"Питання:"," Чи повернеться контент на старий URL?",[5092,10682,10683,10689],{},[5095,10684,10685,10688],{},[5127,10686,10687],{},"Так"," (контент повернеться) → Тимчасове перенаправлення (302, 303, 307)",[5095,10690,10691,10694],{},[5127,10692,10693],{},"Ні"," (контент ніколи не повернеться) → Постійне перенаправлення (301, 308)",[5215,10696,10698],{"id":10697},"крок-2-визначте-тип-запиту","Крок 2. Визначте тип запиту",[5196,10700,10701,10703],{},[5127,10702,10679],{}," Який HTTP-метод використовується?",[5092,10705,10706,10711],{},[5095,10707,10708,10710],{},[5127,10709,5924],{}," — код методу не критичний, використовуйте 301 (постійне) або 302 (тимчасове)",[5095,10712,10713,10716],{},[5127,10714,10715],{},"POST\u002FPUT\u002FDELETE"," — критично важливо зберегти метод",[5215,10718,10720],{"id":10719},"крок-3-визначте-поведінку-методу-для-postputdelete","Крок 3. Визначте поведінку методу (для POST\u002FPUT\u002FDELETE)",[5196,10722,10723,10725],{},[5127,10724,10679],{}," Чи потрібно зберегти метод запиту?",[5092,10727,10728,10733],{},[5095,10729,10730,10732],{},[5127,10731,10687],{}," (зберегти POST як POST) → 307 (тимчасове) або 308 (постійне)",[5095,10734,10735,10737],{},[5127,10736,10693],{}," (змінити на GET) → 303 See Other",[5215,10739,10741],{"id":10740},"матриця-вибору-коду-перенаправлення","Матриця вибору коду перенаправлення",[6119,10743,10744,10760],{},[6122,10745,10746],{},[6125,10747,10748,10751,10753,10755,10757],{},[6128,10749,10750],{},"Сценарій",[6128,10752,6136],{},[6128,10754,6139],{},[6128,10756,6130],{},[6128,10758,10759],{},"Приклад",[6146,10761,10762,10783,10804,10823,10839,10859,10876],{},[6125,10763,10764,10767,10769,10771,10775],{},[6151,10765,10766],{},"Міграція сторінки",[6151,10768,6161],{},[6151,10770,5924],{},[6151,10772,10773],{},[5127,10774,6155],{},[6151,10776,10777,5818,10780],{},[5231,10778,10779],{},"\u002Fold-page",[5231,10781,10782],{},"\u002Fnew-page",[6125,10784,10785,10788,10790,10792,10796],{},[6151,10786,10787],{},"Канонізація URL",[6151,10789,6161],{},[6151,10791,5924],{},[6151,10793,10794],{},[5127,10795,6155],{},[6151,10797,10798,5818,10801],{},[5231,10799,10800],{},"www.site.com",[5231,10802,10803],{},"site.com",[6125,10805,10806,10809,10811,10813,10820],{},[6151,10807,10808],{},"Тимчасова недоступність",[6151,10810,6183],{},[6151,10812,5924],{},[6151,10814,10815,10817,10818],{},[5127,10816,6177],{}," або ",[5127,10819,5897],{},[6151,10821,10822],{},"Maintenance mode",[6125,10824,10825,10827,10829,10832,10836],{},[6151,10826,5934],{},[6151,10828,6183],{},[6151,10830,10831],{},"POST→GET",[6151,10833,10834],{},[5127,10835,5893],{},[6151,10837,10838],{},"Після форми на сторінку успіху",[6125,10840,10841,10844,10846,10849,10853],{},[6151,10842,10843],{},"Міграція API ендпоінту",[6151,10845,6161],{},[6151,10847,10848],{},"POST\u002FPUT",[6151,10850,10851],{},[5127,10852,6234],{},[6151,10854,10855,5818,10857],{},[5231,10856,6094],{},[5231,10858,6097],{},[6125,10860,10861,10864,10866,10869,10873],{},[6151,10862,10863],{},"Балансування навантаження",[6151,10865,6183],{},[6151,10867,10868],{},"Будь-який",[6151,10870,10871],{},[5127,10872,5897],{},[6151,10874,10875],{},"Переадресація на інший сервер",[6125,10877,10878,10881,10883,10885,10889],{},[6151,10879,10880],{},"OAuth автентифікація",[6151,10882,6183],{},[6151,10884,5924],{},[6151,10886,10887],{},[5127,10888,6177],{},[6151,10890,10891],{},"На сторінку провайдера",[5215,10893,10895],{"id":10894},"seo-наслідки-перенаправлень","SEO-наслідки перенаправлень",[5196,10897,10898],{},[5127,10899,10900],{},"301 Moved Permanently:",[5092,10902,10903,10906,10909,10912],{},[5095,10904,10905],{},"✅ Передає 90-99% PageRank на новий URL",[5095,10907,10908],{},"✅ Пошукові системи видаляють старий URL з індексу",[5095,10910,10911],{},"✅ Оновлюють внутрішні посилання на новий URL",[5095,10913,10914],{},"⚠️ Процес може зайняти від кількох днів до кількох тижнів",[5196,10916,10917],{},[5127,10918,10919],{},"302\u002F307 Temporary Redirect:",[5092,10921,10922,10925,10928,10931],{},[5095,10923,10924],{},"⚠️ Зберігає старий URL в індексі",[5095,10926,10927],{},"⚠️ НЕ передає повний PageRank на новий URL",[5095,10929,10930],{},"⚠️ Пошукові системи індексують обидва URL",[5095,10932,10933],{},"✅ Використовуйте для A\u002FB тестування без втрати SEO",[5196,10935,10936],{},[5127,10937,10938],{},"303 See Other:",[5092,10940,10941,10944],{},[5095,10942,10943],{},"Подібний до 302, використовується для POST-Redirect-GET",[5095,10945,10946],{},"Не має прямого впливу на SEO (не застосовується до контенту)",[5606,10948,10949,10952],{},[5127,10950,10951],{},"SEO-помилка:"," Використання 302 замість 301 для постійної міграції може призвести до втрати позицій у пошуку, оскільки Google продовжуватиме індексувати старий URL та не передасть повний авторитет на новий.",[5215,10954,10956],{"id":10955},"практичні-приклади-для-типових-сценаріїв","Практичні приклади для типових сценаріїв",[10958,10959,10960,11039,11192,11336],"code-group",{},[5224,10961,10964],{"className":6362,"code":10962,"filename":10963,"language":6364,"meta":5229,"style":5229},"@Controller()\nexport class MigrationController {\n  @Get('*')\n  @Redirect('https:\u002F\u002Fnew-domain.com', 301)\n  migrateToNewDomain() {\n    \u002F\u002F Постійна міграція всього сайту\n    \u002F\u002F SEO-сигнали передадуться на новий домен\n  }\n}\n","Міграція сайту",[5231,10965,10966,10974,10985,10997,11014,11021,11026,11031,11035],{"__ignoreMap":5229},[5234,10967,10968,10970,10972],{"class":5236,"line":5237},[5234,10969,6413],{"class":6375},[5234,10971,6380],{"class":6416},[5234,10973,6419],{"class":6375},[5234,10975,10976,10978,10980,10983],{"class":5236,"line":5243},[5234,10977,6424],{"class":6371},[5234,10979,6428],{"class":6427},[5234,10981,10982],{"class":6431}," MigrationController",[5234,10984,6435],{"class":6375},[5234,10986,10987,10989,10991,10993,10995],{"class":5236,"line":5249},[5234,10988,6440],{"class":6375},[5234,10990,6386],{"class":6416},[5234,10992,6445],{"class":6375},[5234,10994,6881],{"class":6400},[5234,10996,6451],{"class":6375},[5234,10998,10999,11001,11003,11005,11008,11010,11012],{"class":5236,"line":5255},[5234,11000,6440],{"class":6375},[5234,11002,6391],{"class":6416},[5234,11004,6445],{"class":6375},[5234,11006,11007],{"class":6400},"'https:\u002F\u002Fnew-domain.com'",[5234,11009,6383],{"class":6375},[5234,11011,6155],{"class":6467},[5234,11013,6451],{"class":6375},[5234,11015,11016,11019],{"class":5236,"line":5262},[5234,11017,11018],{"class":6416},"  migrateToNewDomain",[5234,11020,6477],{"class":6375},[5234,11022,11023],{"class":5236,"line":5268},[5234,11024,11025],{"class":6482},"    \u002F\u002F Постійна міграція всього сайту\n",[5234,11027,11028],{"class":5236,"line":5274},[5234,11029,11030],{"class":6482},"    \u002F\u002F SEO-сигнали передадуться на новий домен\n",[5234,11032,11033],{"class":5236,"line":5280},[5234,11034,6493],{"class":6375},[5234,11036,11037],{"class":5236,"line":5285},[5234,11038,6498],{"class":6375},[5224,11040,11042],{"className":6362,"code":11041,"filename":5934,"language":6364,"meta":5229,"style":5229},"@Controller('orders')\nexport class OrdersController {\n  @Post()\n  @Redirect()\n  async createOrder(@Body() dto: CreateOrderDto) {\n    const order = await this.ordersService.create(dto);\n    \n    return {\n      url: `\u002Forders\u002F${order.id}`,\n      statusCode: HttpStatus.SEE_OTHER, \u002F\u002F 303\n    };\n  }\n}\n",[5231,11043,11044,11057,11068,11076,11084,11106,11134,11138,11144,11166,11180,11184,11188],{"__ignoreMap":5229},[5234,11045,11046,11048,11050,11052,11055],{"class":5236,"line":5237},[5234,11047,6413],{"class":6375},[5234,11049,6380],{"class":6416},[5234,11051,6445],{"class":6375},[5234,11053,11054],{"class":6400},"'orders'",[5234,11056,6451],{"class":6375},[5234,11058,11059,11061,11063,11066],{"class":5236,"line":5243},[5234,11060,6424],{"class":6371},[5234,11062,6428],{"class":6427},[5234,11064,11065],{"class":6431}," OrdersController",[5234,11067,6435],{"class":6375},[5234,11069,11070,11072,11074],{"class":5236,"line":5249},[5234,11071,6440],{"class":6375},[5234,11073,7912],{"class":6416},[5234,11075,6419],{"class":6375},[5234,11077,11078,11080,11082],{"class":5236,"line":5255},[5234,11079,6440],{"class":6375},[5234,11081,6391],{"class":6416},[5234,11083,6419],{"class":6375},[5234,11085,11086,11088,11091,11093,11095,11097,11099,11101,11104],{"class":5236,"line":5262},[5234,11087,7520],{"class":6427},[5234,11089,11090],{"class":6416}," createOrder",[5234,11092,6899],{"class":6375},[5234,11094,7931],{"class":6416},[5234,11096,6904],{"class":6375},[5234,11098,7936],{"class":6379},[5234,11100,6786],{"class":6375},[5234,11102,11103],{"class":6431},"CreateOrderDto",[5234,11105,6914],{"class":6375},[5234,11107,11108,11110,11113,11115,11117,11119,11121,11124,11126,11128,11130,11132],{"class":5236,"line":5268},[5234,11109,6919],{"class":6427},[5234,11111,11112],{"class":6661}," order",[5234,11114,6925],{"class":6375},[5234,11116,7560],{"class":6371},[5234,11118,7563],{"class":6427},[5234,11120,6058],{"class":6375},[5234,11122,11123],{"class":6379},"ordersService",[5234,11125,6058],{"class":6375},[5234,11127,8738],{"class":6416},[5234,11129,6445],{"class":6375},[5234,11131,7936],{"class":6379},[5234,11133,6940],{"class":6375},[5234,11135,11136],{"class":5236,"line":5274},[5234,11137,5676],{"class":6375},[5234,11139,11140,11142],{"class":5236,"line":5280},[5234,11141,7631],{"class":6371},[5234,11143,6435],{"class":6375},[5234,11145,11146,11148,11151,11153,11156,11158,11160,11162,11164],{"class":5236,"line":5285},[5234,11147,7638],{"class":6379},[5234,11149,11150],{"class":6400}," `\u002Forders\u002F",[5234,11152,7020],{"class":6427},[5234,11154,11155],{"class":6379},"order",[5234,11157,6058],{"class":7025},[5234,11159,9510],{"class":6379},[5234,11161,7031],{"class":6427},[5234,11163,7017],{"class":6400},[5234,11165,7077],{"class":6375},[5234,11167,11168,11170,11172,11174,11176,11178],{"class":5236,"line":5291},[5234,11169,7647],{"class":6379},[5234,11171,7085],{"class":6379},[5234,11173,6058],{"class":6375},[5234,11175,9527],{"class":6661},[5234,11177,6383],{"class":6375},[5234,11179,10064],{"class":6482},[5234,11181,11182],{"class":5236,"line":5297},[5234,11183,7660],{"class":6375},[5234,11185,11186],{"class":5236,"line":5303},[5234,11187,6493],{"class":6375},[5234,11189,11190],{"class":5236,"line":5309},[5234,11191,6498],{"class":6375},[5224,11193,11196],{"className":6362,"code":11194,"filename":11195,"language":6364,"meta":5229,"style":5229},"@Controller()\nexport class ShortLinksController {\n  @Get(':code')\n  @Redirect()\n  async resolve(@Param('code') code: string) {\n    const link = await this.linksService.findByCode(code);\n    \n    return {\n      url: link.targetUrl,\n      statusCode: HttpStatus.FOUND, \u002F\u002F 302 для динамічних посилань\n    };\n  }\n}\n","Скорочувач URL",[5231,11197,11198,11206,11217,11229,11237,11262,11288,11292,11298,11310,11324,11328,11332],{"__ignoreMap":5229},[5234,11199,11200,11202,11204],{"class":5236,"line":5237},[5234,11201,6413],{"class":6375},[5234,11203,6380],{"class":6416},[5234,11205,6419],{"class":6375},[5234,11207,11208,11210,11212,11215],{"class":5236,"line":5243},[5234,11209,6424],{"class":6371},[5234,11211,6428],{"class":6427},[5234,11213,11214],{"class":6431}," ShortLinksController",[5234,11216,6435],{"class":6375},[5234,11218,11219,11221,11223,11225,11227],{"class":5236,"line":5249},[5234,11220,6440],{"class":6375},[5234,11222,6386],{"class":6416},[5234,11224,6445],{"class":6375},[5234,11226,7502],{"class":6400},[5234,11228,6451],{"class":6375},[5234,11230,11231,11233,11235],{"class":5236,"line":5255},[5234,11232,6440],{"class":6375},[5234,11234,6391],{"class":6416},[5234,11236,6419],{"class":6375},[5234,11238,11239,11241,11244,11246,11248,11250,11252,11254,11256,11258,11260],{"class":5236,"line":5262},[5234,11240,7520],{"class":6427},[5234,11242,11243],{"class":6416}," resolve",[5234,11245,6899],{"class":6375},[5234,11247,7451],{"class":6416},[5234,11249,6445],{"class":6375},[5234,11251,7532],{"class":6400},[5234,11253,6554],{"class":6375},[5234,11255,5231],{"class":6379},[5234,11257,6786],{"class":6375},[5234,11259,7541],{"class":6431},[5234,11261,6914],{"class":6375},[5234,11263,11264,11266,11268,11270,11272,11274,11276,11278,11280,11282,11284,11286],{"class":5236,"line":5268},[5234,11265,6919],{"class":6427},[5234,11267,8106],{"class":6661},[5234,11269,6925],{"class":6375},[5234,11271,7560],{"class":6371},[5234,11273,7563],{"class":6427},[5234,11275,6058],{"class":6375},[5234,11277,7568],{"class":6379},[5234,11279,6058],{"class":6375},[5234,11281,8121],{"class":6416},[5234,11283,6445],{"class":6375},[5234,11285,5231],{"class":6379},[5234,11287,6940],{"class":6375},[5234,11289,11290],{"class":5236,"line":5274},[5234,11291,5676],{"class":6375},[5234,11293,11294,11296],{"class":5236,"line":5280},[5234,11295,7631],{"class":6371},[5234,11297,6435],{"class":6375},[5234,11299,11300,11302,11304,11306,11308],{"class":5236,"line":5285},[5234,11301,7638],{"class":6379},[5234,11303,8106],{"class":6379},[5234,11305,6058],{"class":6375},[5234,11307,7593],{"class":6379},[5234,11309,7077],{"class":6375},[5234,11311,11312,11314,11316,11318,11320,11322],{"class":5236,"line":5291},[5234,11313,7647],{"class":6379},[5234,11315,7085],{"class":6379},[5234,11317,6058],{"class":6375},[5234,11319,8317],{"class":6661},[5234,11321,6383],{"class":6375},[5234,11323,9893],{"class":6482},[5234,11325,11326],{"class":5236,"line":5297},[5234,11327,7660],{"class":6375},[5234,11329,11330],{"class":5236,"line":5303},[5234,11331,6493],{"class":6375},[5234,11333,11334],{"class":5236,"line":5309},[5234,11335,6498],{"class":6375},[5224,11337,11340],{"className":6362,"code":11338,"filename":11339,"language":6364,"meta":5229,"style":5229},"@Controller('landing')\nexport class LandingController {\n  @Get()\n  @Redirect()\n  async abTest(@Headers('x-user-id') userId: string) {\n    \u002F\u002F Розподіляємо користувачів між варіантами\n    const variant = this.abTestService.getVariant(userId);\n    \n    return {\n      url: variant === 'A' ? '\u002Flanding-a' : '\u002Flanding-b',\n      statusCode: HttpStatus.TEMPORARY_REDIRECT, \u002F\u002F 307\n    };\n  }\n}\n","A\u002FB Testing",[5231,11341,11342,11355,11366,11374,11382,11410,11415,11442,11446,11452,11478,11494,11498,11502],{"__ignoreMap":5229},[5234,11343,11344,11346,11348,11350,11353],{"class":5236,"line":5237},[5234,11345,6413],{"class":6375},[5234,11347,6380],{"class":6416},[5234,11349,6445],{"class":6375},[5234,11351,11352],{"class":6400},"'landing'",[5234,11354,6451],{"class":6375},[5234,11356,11357,11359,11361,11364],{"class":5236,"line":5243},[5234,11358,6424],{"class":6371},[5234,11360,6428],{"class":6427},[5234,11362,11363],{"class":6431}," LandingController",[5234,11365,6435],{"class":6375},[5234,11367,11368,11370,11372],{"class":5236,"line":5249},[5234,11369,6440],{"class":6375},[5234,11371,6386],{"class":6416},[5234,11373,6419],{"class":6375},[5234,11375,11376,11378,11380],{"class":5236,"line":5255},[5234,11377,6440],{"class":6375},[5234,11379,6391],{"class":6416},[5234,11381,6419],{"class":6375},[5234,11383,11384,11386,11389,11391,11394,11396,11399,11401,11404,11406,11408],{"class":5236,"line":5262},[5234,11385,7520],{"class":6427},[5234,11387,11388],{"class":6416}," abTest",[5234,11390,6899],{"class":6375},[5234,11392,11393],{"class":6416},"Headers",[5234,11395,6445],{"class":6375},[5234,11397,11398],{"class":6400},"'x-user-id'",[5234,11400,6554],{"class":6375},[5234,11402,11403],{"class":6379},"userId",[5234,11405,6786],{"class":6375},[5234,11407,7541],{"class":6431},[5234,11409,6914],{"class":6375},[5234,11411,11412],{"class":5236,"line":5268},[5234,11413,11414],{"class":6482},"    \u002F\u002F Розподіляємо користувачів між варіантами\n",[5234,11416,11417,11419,11422,11424,11426,11428,11431,11433,11436,11438,11440],{"class":5236,"line":5274},[5234,11418,6919],{"class":6427},[5234,11420,11421],{"class":6661}," variant",[5234,11423,6925],{"class":6375},[5234,11425,8728],{"class":6427},[5234,11427,6058],{"class":6375},[5234,11429,11430],{"class":6379},"abTestService",[5234,11432,6058],{"class":6375},[5234,11434,11435],{"class":6416},"getVariant",[5234,11437,6445],{"class":6375},[5234,11439,11403],{"class":6379},[5234,11441,6940],{"class":6375},[5234,11443,11444],{"class":5236,"line":5280},[5234,11445,5676],{"class":6375},[5234,11447,11448,11450],{"class":5236,"line":5285},[5234,11449,7631],{"class":6371},[5234,11451,6435],{"class":6375},[5234,11453,11454,11456,11458,11461,11464,11467,11470,11473,11476],{"class":5236,"line":5291},[5234,11455,7638],{"class":6379},[5234,11457,11421],{"class":6379},[5234,11459,11460],{"class":6375}," === ",[5234,11462,11463],{"class":6400},"'A'",[5234,11465,11466],{"class":6375}," ? ",[5234,11468,11469],{"class":6400},"'\u002Flanding-a'",[5234,11471,11472],{"class":6375}," : ",[5234,11474,11475],{"class":6400},"'\u002Flanding-b'",[5234,11477,7077],{"class":6375},[5234,11479,11480,11482,11484,11486,11489,11491],{"class":5236,"line":5297},[5234,11481,7647],{"class":6379},[5234,11483,7085],{"class":6379},[5234,11485,6058],{"class":6375},[5234,11487,11488],{"class":6661},"TEMPORARY_REDIRECT",[5234,11490,6383],{"class":6375},[5234,11492,11493],{"class":6482},"\u002F\u002F 307\n",[5234,11495,11496],{"class":5236,"line":5303},[5234,11497,7660],{"class":6375},[5234,11499,11500],{"class":5236,"line":5309},[5234,11501,6493],{"class":6375},[5234,11503,11504],{"class":5236,"line":5315},[5234,11505,6498],{"class":6375},[5215,11507,11509],{"id":11508},"кешування-перенаправлень","Кешування перенаправлень",[5196,11511,11512,11515,11516,11519],{},[5127,11513,11514],{},"301 та 308"," перенаправлення ",[5127,11517,11518],{},"кешуються браузерами"," за замовчуванням, що може створити проблеми:",[5224,11521,11523],{"className":6362,"code":11522,"language":6364,"meta":5229,"style":5229},"\u002F\u002F ❌ ПОГАНО: 301 для динамічних посилань\n@Get('promo')\n@Redirect()\nasync promoRedirect() {\n  const activePromo = await this.promosService.getActive();\n  \n  return {\n    url: `\u002Fpromos\u002F${activePromo.id}`,\n    statusCode: 301, \u002F\u002F Браузер закешує і не побачить зміни промо!\n  };\n}\n\n\u002F\u002F ✅ ДОБРЕ: 302 для динамічних посилань\n@Get('promo')\n@Redirect()\nasync promoRedirect() {\n  const activePromo = await this.promosService.getActive();\n  \n  return {\n    url: `\u002Fpromos\u002F${activePromo.id}`,\n    statusCode: 302, \u002F\u002F Браузер перевірятиме сервер при кожному запиті\n  };\n}\n",[5231,11524,11525,11530,11543,11551,11561,11588,11593,11600,11623,11636,11641,11645,11649,11654,11666,11674,11682,11704,11708,11714,11734,11746,11750],{"__ignoreMap":5229},[5234,11526,11527],{"class":5236,"line":5237},[5234,11528,11529],{"class":6482},"\u002F\u002F ❌ ПОГАНО: 301 для динамічних посилань\n",[5234,11531,11532,11534,11536,11538,11541],{"class":5236,"line":5243},[5234,11533,6413],{"class":6375},[5234,11535,6386],{"class":6416},[5234,11537,6445],{"class":6375},[5234,11539,11540],{"class":6400},"'promo'",[5234,11542,6451],{"class":6375},[5234,11544,11545,11547,11549],{"class":5236,"line":5249},[5234,11546,6413],{"class":6375},[5234,11548,6391],{"class":6416},[5234,11550,6419],{"class":6375},[5234,11552,11553,11556,11559],{"class":5236,"line":5255},[5234,11554,11555],{"class":6379},"async",[5234,11557,11558],{"class":6416}," promoRedirect",[5234,11560,6477],{"class":6375},[5234,11562,11563,11566,11569,11571,11573,11575,11577,11580,11582,11585],{"class":5236,"line":5262},[5234,11564,11565],{"class":6427},"  const",[5234,11567,11568],{"class":6661}," activePromo",[5234,11570,6925],{"class":6375},[5234,11572,7560],{"class":6371},[5234,11574,7563],{"class":6427},[5234,11576,6058],{"class":6375},[5234,11578,11579],{"class":6379},"promosService",[5234,11581,6058],{"class":6375},[5234,11583,11584],{"class":6416},"getActive",[5234,11586,11587],{"class":6375},"();\n",[5234,11589,11590],{"class":5236,"line":5268},[5234,11591,11592],{"class":6375},"  \n",[5234,11594,11595,11598],{"class":5236,"line":5274},[5234,11596,11597],{"class":6371},"  return",[5234,11599,6435],{"class":6375},[5234,11601,11602,11605,11608,11610,11613,11615,11617,11619,11621],{"class":5236,"line":5280},[5234,11603,11604],{"class":6379},"    url:",[5234,11606,11607],{"class":6400}," `\u002Fpromos\u002F",[5234,11609,7020],{"class":6427},[5234,11611,11612],{"class":6379},"activePromo",[5234,11614,6058],{"class":7025},[5234,11616,9510],{"class":6379},[5234,11618,7031],{"class":6427},[5234,11620,7017],{"class":6400},[5234,11622,7077],{"class":6375},[5234,11624,11625,11628,11631,11633],{"class":5236,"line":5285},[5234,11626,11627],{"class":6379},"    statusCode:",[5234,11629,11630],{"class":6467}," 301",[5234,11632,6383],{"class":6375},[5234,11634,11635],{"class":6482},"\u002F\u002F Браузер закешує і не побачить зміни промо!\n",[5234,11637,11638],{"class":5236,"line":5291},[5234,11639,11640],{"class":6375},"  };\n",[5234,11642,11643],{"class":5236,"line":5297},[5234,11644,6498],{"class":6375},[5234,11646,11647],{"class":5236,"line":5303},[5234,11648,5259],{"emptyLinePlaceholder":5258},[5234,11650,11651],{"class":5236,"line":5309},[5234,11652,11653],{"class":6482},"\u002F\u002F ✅ ДОБРЕ: 302 для динамічних посилань\n",[5234,11655,11656,11658,11660,11662,11664],{"class":5236,"line":5315},[5234,11657,6413],{"class":6375},[5234,11659,6386],{"class":6416},[5234,11661,6445],{"class":6375},[5234,11663,11540],{"class":6400},[5234,11665,6451],{"class":6375},[5234,11667,11668,11670,11672],{"class":5236,"line":5320},[5234,11669,6413],{"class":6375},[5234,11671,6391],{"class":6416},[5234,11673,6419],{"class":6375},[5234,11675,11676,11678,11680],{"class":5236,"line":5326},[5234,11677,11555],{"class":6379},[5234,11679,11558],{"class":6416},[5234,11681,6477],{"class":6375},[5234,11683,11684,11686,11688,11690,11692,11694,11696,11698,11700,11702],{"class":5236,"line":5332},[5234,11685,11565],{"class":6427},[5234,11687,11568],{"class":6661},[5234,11689,6925],{"class":6375},[5234,11691,7560],{"class":6371},[5234,11693,7563],{"class":6427},[5234,11695,6058],{"class":6375},[5234,11697,11579],{"class":6379},[5234,11699,6058],{"class":6375},[5234,11701,11584],{"class":6416},[5234,11703,11587],{"class":6375},[5234,11705,11706],{"class":5236,"line":5338},[5234,11707,11592],{"class":6375},[5234,11709,11710,11712],{"class":5236,"line":5344},[5234,11711,11597],{"class":6371},[5234,11713,6435],{"class":6375},[5234,11715,11716,11718,11720,11722,11724,11726,11728,11730,11732],{"class":5236,"line":5349},[5234,11717,11604],{"class":6379},[5234,11719,11607],{"class":6400},[5234,11721,7020],{"class":6427},[5234,11723,11612],{"class":6379},[5234,11725,6058],{"class":7025},[5234,11727,9510],{"class":6379},[5234,11729,7031],{"class":6427},[5234,11731,7017],{"class":6400},[5234,11733,7077],{"class":6375},[5234,11735,11736,11738,11741,11743],{"class":5236,"line":5354},[5234,11737,11627],{"class":6379},[5234,11739,11740],{"class":6467}," 302",[5234,11742,6383],{"class":6375},[5234,11744,11745],{"class":6482},"\u002F\u002F Браузер перевірятиме сервер при кожному запиті\n",[5234,11747,11748],{"class":5236,"line":5360},[5234,11749,11640],{"class":6375},[5234,11751,11752],{"class":5236,"line":5365},[5234,11753,6498],{"class":6375},[5196,11755,11756,11757,10593],{},"Для явного контролю кешування додайте заголовок ",[5231,11758,11759],{},"Cache-Control",[5224,11761,11763],{"className":6362,"code":11762,"language":6364,"meta":5229,"style":5229},"@Get('promo')\nasync promoRedirect(@Res({ passthrough: true }) res: Response) {\n  const activePromo = await this.promosService.getActive();\n  \n  \u002F\u002F Заборона кешування навіть для 301\n  res.set('Cache-Control', 'no-cache, no-store, must-revalidate');\n  \n  return {\n    url: `\u002Fpromos\u002F${activePromo.id}`,\n    statusCode: 301,\n  };\n}\n",[5231,11764,11765,11777,11806,11828,11832,11837,11858,11862,11868,11888,11896,11900],{"__ignoreMap":5229},[5234,11766,11767,11769,11771,11773,11775],{"class":5236,"line":5237},[5234,11768,6413],{"class":6375},[5234,11770,6386],{"class":6416},[5234,11772,6445],{"class":6375},[5234,11774,11540],{"class":6400},[5234,11776,6451],{"class":6375},[5234,11778,11779,11781,11783,11785,11787,11789,11792,11795,11798,11800,11802,11804],{"class":5236,"line":5243},[5234,11780,11555],{"class":6379},[5234,11782,11558],{"class":6416},[5234,11784,6899],{"class":6375},[5234,11786,10125],{"class":6416},[5234,11788,8871],{"class":6375},[5234,11790,11791],{"class":6379},"passthrough:",[5234,11793,11794],{"class":6427}," true",[5234,11796,11797],{"class":6375}," }) ",[5234,11799,10204],{"class":6379},[5234,11801,6786],{"class":6375},[5234,11803,10090],{"class":6379},[5234,11805,6914],{"class":6375},[5234,11807,11808,11810,11812,11814,11816,11818,11820,11822,11824,11826],{"class":5236,"line":5249},[5234,11809,11565],{"class":6427},[5234,11811,11568],{"class":6661},[5234,11813,6925],{"class":6375},[5234,11815,7560],{"class":6371},[5234,11817,7563],{"class":6427},[5234,11819,6058],{"class":6375},[5234,11821,11579],{"class":6379},[5234,11823,6058],{"class":6375},[5234,11825,11584],{"class":6416},[5234,11827,11587],{"class":6375},[5234,11829,11830],{"class":5236,"line":5255},[5234,11831,11592],{"class":6375},[5234,11833,11834],{"class":5236,"line":5262},[5234,11835,11836],{"class":6482},"  \u002F\u002F Заборона кешування навіть для 301\n",[5234,11838,11839,11842,11844,11846,11848,11851,11853,11856],{"class":5236,"line":5268},[5234,11840,11841],{"class":6379},"  res",[5234,11843,6058],{"class":6375},[5234,11845,10583],{"class":6416},[5234,11847,6445],{"class":6375},[5234,11849,11850],{"class":6400},"'Cache-Control'",[5234,11852,6383],{"class":6375},[5234,11854,11855],{"class":6400},"'no-cache, no-store, must-revalidate'",[5234,11857,6940],{"class":6375},[5234,11859,11860],{"class":5236,"line":5274},[5234,11861,11592],{"class":6375},[5234,11863,11864,11866],{"class":5236,"line":5280},[5234,11865,11597],{"class":6371},[5234,11867,6435],{"class":6375},[5234,11869,11870,11872,11874,11876,11878,11880,11882,11884,11886],{"class":5236,"line":5285},[5234,11871,11604],{"class":6379},[5234,11873,11607],{"class":6400},[5234,11875,7020],{"class":6427},[5234,11877,11612],{"class":6379},[5234,11879,6058],{"class":7025},[5234,11881,9510],{"class":6379},[5234,11883,7031],{"class":6427},[5234,11885,7017],{"class":6400},[5234,11887,7077],{"class":6375},[5234,11889,11890,11892,11894],{"class":5236,"line":5291},[5234,11891,11627],{"class":6379},[5234,11893,11630],{"class":6467},[5234,11895,7077],{"class":6375},[5234,11897,11898],{"class":5236,"line":5297},[5234,11899,11640],{"class":6375},[5234,11901,11902],{"class":5236,"line":5303},[5234,11903,6498],{"class":6375},[5191,11905,11907],{"id":11906},"порівняння-підходів-redirect-vs-динамічне-vs-res","Порівняння підходів: @Redirect vs Динамічне vs @Res",[5220,11909,11911],{"alt":11910},"Три способи реалізації перенаправлень у NestJS",[5224,11912,11914],{"className":5226,"code":11913,"language":5228,"meta":5229,"style":5229},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nrectangle M1 #DCFCE7 [\n\u003Cb>Механізм 1: @Redirect статичний\u003C\u002Fb>\n--\nСтатичний URL і код\n--\n@Get('old')\n@Redirect('\u002Fnew', 301)\nhandler() { }\n]\n\nrectangle M2 #DBEAFE [\n\u003Cb>Механізм 2: Динамічне повернення\u003C\u002Fb>\n--\nURL і код з логіки\n--\n@Get(':code')\n@Redirect()\nhandler() {\n  return { url, statusCode };\n}\n]\n\nrectangle M3 #FED7AA [\n\u003Cb>Механізм 3: @Res().redirect()\u003C\u002Fb>\n--\nПрямий виклик Express\n--\n@Get('old')\nhandler(@Res() res) {\n  res.redirect(301, '\u002Fnew');\n}\n]\n\nrectangle SIMPLE #E2E8F0 [\nЧитабельність +++\n--\nГнучкість -\n]\n\nrectangle BALANCED #E2E8F0 [\nЧитабельність ++\n--\nГнучкість +++\n]\n\nrectangle COMPLEX #E2E8F0 [\nЧитабельність +\n--\nГнучкість ++\n]\n\nM1 --> SIMPLE : Найпростіший\nM2 --> BALANCED : Рекомендований\nM3 --> COMPLEX : Складний\n\n@enduml\n",[5231,11915,11916,11920,11924,11928,11932,11937,11942,11947,11952,11956,11961,11966,11971,11976,11980,11985,11990,11994,11999,12003,12008,12013,12018,12023,12027,12031,12035,12040,12045,12049,12054,12058,12062,12067,12072,12076,12080,12084,12089,12094,12098,12103,12107,12111,12116,12121,12125,12130,12134,12138,12143,12148,12152,12157,12161,12165,12170,12175,12180,12184],{"__ignoreMap":5229},[5234,11917,11918],{"class":5236,"line":5237},[5234,11919,5240],{},[5234,11921,11922],{"class":5236,"line":5243},[5234,11923,5246],{},[5234,11925,11926],{"class":5236,"line":5249},[5234,11927,5252],{},[5234,11929,11930],{"class":5236,"line":5255},[5234,11931,5259],{"emptyLinePlaceholder":5258},[5234,11933,11934],{"class":5236,"line":5262},[5234,11935,11936],{},"rectangle M1 #DCFCE7 [\n",[5234,11938,11939],{"class":5236,"line":5268},[5234,11940,11941],{},"\u003Cb>Механізм 1: @Redirect статичний\u003C\u002Fb>\n",[5234,11943,11944],{"class":5236,"line":5274},[5234,11945,11946],{},"--\n",[5234,11948,11949],{"class":5236,"line":5280},[5234,11950,11951],{},"Статичний URL і код\n",[5234,11953,11954],{"class":5236,"line":5285},[5234,11955,11946],{},[5234,11957,11958],{"class":5236,"line":5291},[5234,11959,11960],{},"@Get('old')\n",[5234,11962,11963],{"class":5236,"line":5297},[5234,11964,11965],{},"@Redirect('\u002Fnew', 301)\n",[5234,11967,11968],{"class":5236,"line":5303},[5234,11969,11970],{},"handler() { }\n",[5234,11972,11973],{"class":5236,"line":5309},[5234,11974,11975],{},"]\n",[5234,11977,11978],{"class":5236,"line":5315},[5234,11979,5259],{"emptyLinePlaceholder":5258},[5234,11981,11982],{"class":5236,"line":5320},[5234,11983,11984],{},"rectangle M2 #DBEAFE [\n",[5234,11986,11987],{"class":5236,"line":5326},[5234,11988,11989],{},"\u003Cb>Механізм 2: Динамічне повернення\u003C\u002Fb>\n",[5234,11991,11992],{"class":5236,"line":5332},[5234,11993,11946],{},[5234,11995,11996],{"class":5236,"line":5338},[5234,11997,11998],{},"URL і код з логіки\n",[5234,12000,12001],{"class":5236,"line":5344},[5234,12002,11946],{},[5234,12004,12005],{"class":5236,"line":5349},[5234,12006,12007],{},"@Get(':code')\n",[5234,12009,12010],{"class":5236,"line":5354},[5234,12011,12012],{},"@Redirect()\n",[5234,12014,12015],{"class":5236,"line":5360},[5234,12016,12017],{},"handler() {\n",[5234,12019,12020],{"class":5236,"line":5365},[5234,12021,12022],{},"  return { url, statusCode };\n",[5234,12024,12025],{"class":5236,"line":5371},[5234,12026,6498],{},[5234,12028,12029],{"class":5236,"line":5377},[5234,12030,11975],{},[5234,12032,12033],{"class":5236,"line":5382},[5234,12034,5259],{"emptyLinePlaceholder":5258},[5234,12036,12037],{"class":5236,"line":5387},[5234,12038,12039],{},"rectangle M3 #FED7AA [\n",[5234,12041,12042],{"class":5236,"line":5393},[5234,12043,12044],{},"\u003Cb>Механізм 3: @Res().redirect()\u003C\u002Fb>\n",[5234,12046,12047],{"class":5236,"line":5399},[5234,12048,11946],{},[5234,12050,12051],{"class":5236,"line":5405},[5234,12052,12053],{},"Прямий виклик Express\n",[5234,12055,12056],{"class":5236,"line":5411},[5234,12057,11946],{},[5234,12059,12060],{"class":5236,"line":5416},[5234,12061,11960],{},[5234,12063,12064],{"class":5236,"line":5421},[5234,12065,12066],{},"handler(@Res() res) {\n",[5234,12068,12069],{"class":5236,"line":5427},[5234,12070,12071],{},"  res.redirect(301, '\u002Fnew');\n",[5234,12073,12074],{"class":5236,"line":5433},[5234,12075,6498],{},[5234,12077,12078],{"class":5236,"line":5439},[5234,12079,11975],{},[5234,12081,12082],{"class":5236,"line":5445},[5234,12083,5259],{"emptyLinePlaceholder":5258},[5234,12085,12086],{"class":5236,"line":5450},[5234,12087,12088],{},"rectangle SIMPLE #E2E8F0 [\n",[5234,12090,12091],{"class":5236,"line":5455},[5234,12092,12093],{},"Читабельність +++\n",[5234,12095,12096],{"class":5236,"line":8173},[5234,12097,11946],{},[5234,12099,12100],{"class":5236,"line":8178},[5234,12101,12102],{},"Гнучкість -\n",[5234,12104,12105],{"class":5236,"line":8184},[5234,12106,11975],{},[5234,12108,12109],{"class":5236,"line":8218},[5234,12110,5259],{"emptyLinePlaceholder":5258},[5234,12112,12113],{"class":5236,"line":8240},[5234,12114,12115],{},"rectangle BALANCED #E2E8F0 [\n",[5234,12117,12118],{"class":5236,"line":8246},[5234,12119,12120],{},"Читабельність ++\n",[5234,12122,12123],{"class":5236,"line":8251},[5234,12124,11946],{},[5234,12126,12127],{"class":5236,"line":8257},[5234,12128,12129],{},"Гнучкість +++\n",[5234,12131,12132],{"class":5236,"line":8264},[5234,12133,11975],{},[5234,12135,12136],{"class":5236,"line":8277},[5234,12137,5259],{"emptyLinePlaceholder":5258},[5234,12139,12140],{"class":5236,"line":8292},[5234,12141,12142],{},"rectangle COMPLEX #E2E8F0 [\n",[5234,12144,12145],{"class":5236,"line":8307},[5234,12146,12147],{},"Читабельність +\n",[5234,12149,12150],{"class":5236,"line":8326},[5234,12151,11946],{},[5234,12153,12154],{"class":5236,"line":8331},[5234,12155,12156],{},"Гнучкість ++\n",[5234,12158,12159],{"class":5236,"line":8336},[5234,12160,11975],{},[5234,12162,12163],{"class":5236,"line":8341},[5234,12164,5259],{"emptyLinePlaceholder":5258},[5234,12166,12167],{"class":5236,"line":8347},[5234,12168,12169],{},"M1 --> SIMPLE : Найпростіший\n",[5234,12171,12172],{"class":5236,"line":8361},[5234,12173,12174],{},"M2 --> BALANCED : Рекомендований\n",[5234,12176,12177],{"class":5236,"line":8387},[5234,12178,12179],{},"M3 --> COMPLEX : Складний\n",[5234,12181,12182],{"class":5236,"line":8416},[5234,12183,5259],{"emptyLinePlaceholder":5258},[5234,12185,12186],{"class":5236,"line":8421},[5234,12187,5458],{},[6119,12189,12190,12206],{},[6122,12191,12192],{},[6125,12193,12194,12197,12200,12203],{},[6128,12195,12196],{},"Аспект",[6128,12198,12199],{},"@Redirect (статичний)",[6128,12201,12202],{},"Динамічне повернення",[6128,12204,12205],{},"@Res().redirect()",[6146,12207,12208,12224,12238,12253,12267,12281,12296],{},[6125,12209,12210,12215,12218,12221],{},[6151,12211,12212],{},[5127,12213,12214],{},"Складність",[6151,12216,12217],{},"Найпростіший",[6151,12219,12220],{},"Середня",[6151,12222,12223],{},"Висока",[6125,12225,12226,12231,12234,12236],{},[6151,12227,12228],{},[5127,12229,12230],{},"Гнучкість",[6151,12232,12233],{},"Низька",[6151,12235,12223],{},[6151,12237,12223],{},[6125,12239,12240,12245,12248,12250],{},[6151,12241,12242],{},[5127,12243,12244],{},"Читабельність",[6151,12246,12247],{},"Відмінна",[6151,12249,12247],{},[6151,12251,12252],{},"Задовільна",[6125,12254,12255,12260,12262,12264],{},[6151,12256,12257],{},[5127,12258,12259],{},"Платформо-незалежність",[6151,12261,6167],{},[6151,12263,6167],{},[6151,12265,12266],{},"❌ Ні (Express\u002FFastify)",[6125,12268,12269,12273,12276,12278],{},[6151,12270,12271],{},[5127,12272,968],{},[6151,12274,12275],{},"Легко",[6151,12277,12275],{},[6151,12279,12280],{},"Складно",[6125,12282,12283,12288,12291,12293],{},[6151,12284,12285],{},[5127,12286,12287],{},"Interceptors",[6151,12289,12290],{},"✅ Працюють",[6151,12292,12290],{},[6151,12294,12295],{},"⚠️ Обмежено",[6125,12297,12298,12303,12306,12309],{},[6151,12299,12300],{},[5127,12301,12302],{},"Типові сценарії",[6151,12304,12305],{},"Міграція URL",[6151,12307,12308],{},"Скорочувачі, POST-Redirect-GET",[6151,12310,12311],{},"Рідкісні edge cases",[5553,12313,12314,12319,12338],{},[5196,12315,12316],{},[5127,12317,12318],{},"Рекомендація використання:",[5465,12320,12321,12327,12333],{},[5095,12322,12323,12326],{},[5127,12324,12325],{},"@Redirect(url, code)"," — для простих статичних перенаправлень (міграція, канонізація)",[5095,12328,12329,12332],{},[5127,12330,12331],{},"return { url, statusCode }"," — для всіх динамічних сценаріїв (скорочувачі, умовні редиректи)",[5095,12334,12335,12337],{},[5127,12336,10361],{}," — лише коли потрібен абсолютний контроль над заголовками (рідкісні випадки)",[5196,12339,12340],{},"У 95% випадків перші два підходи покривають всі потреби.",[5191,12342,12344],{"id":12343},"підсумки-та-ключові-висновки","Підсумки та ключові висновки",[5084,12346,12347,12406],{},[5087,12348,12351],{"icon":12349,"title":12350},"i-lucide-check-circle","✅ Ключові моменти",[5092,12352,12353,12362,12368,12373,12378,12383,12389,12394,12400],{},[5095,12354,12355,12356,12359,12360],{},"HTTP-перенаправлення реалізується через ",[5127,12357,12358],{},"статус коди 3xx"," та заголовок ",[5127,12361,5212],{},[5095,12363,12364,12367],{},[5127,12365,12366],{},"301 Moved Permanently"," — для остаточної міграції (передає SEO-сигнали)",[5095,12369,12370,12372],{},[5127,12371,6530],{}," — застарілий, використовуйте 303 або 307 замість нього",[5095,12374,12375,12377],{},[5127,12376,6263],{}," — для POST-Redirect-GET (завжди змінює метод на GET)",[5095,12379,12380,12382],{},[5127,12381,6269],{}," — тимчасове перенаправлення зі збереженням методу",[5095,12384,12385,12388],{},[5127,12386,12387],{},"308 Permanent Redirect"," — постійне перенаправлення зі збереженням методу",[5095,12390,7279,12391,12393],{},[5127,12392,12325],{}," для статичних перенаправлень",[5095,12395,12396,12397,12399],{},"Динамічне повернення ",[5127,12398,10357],{}," для бізнес-логіки",[5095,12401,12402,12403,12405],{},"Уникайте прямого використання ",[5127,12404,12205],{}," без необхідності",[5087,12407,12410],{"icon":12408,"title":12409},"i-lucide-graduation-cap","🎓 Практичні рекомендації",[5092,12411,12412,12418,12423,12428,12434,12440,12443,12446,12449],{},[5095,12413,12414,12415,12417],{},"Використовуйте ",[5127,12416,6155],{}," для постійної міграції сторінок та сайтів",[5095,12419,12414,12420,12422],{},[5127,12421,5893],{}," для POST-Redirect-GET після форм",[5095,12424,12414,12425,12427],{},[5127,12426,6177],{}," для динамічних посилань (скорочувачі, tracking)",[5095,12429,12430,12431,12433],{},"Завжди вказуйте ",[5127,12432,5614],{}," у Location для міжсайтових редиректів",[5095,12435,12436,12437,12439],{},"Додавайте ",[5127,12438,11759],{}," для керування кешуванням 301\u002F308 редиректів",[5095,12441,12442],{},"Логуйте перенаправлення для моніторингу та аналітики",[5095,12444,12445],{},"Тестуйте ланцюжки редиректів (уникайте циклів!)",[5095,12447,12448],{},"Документуйте причини використання конкретних кодів перенаправлення",[5095,12450,12451],{},"Перевіряйте SEO-наслідки постійних перенаправлень через Google Search Console",[5215,12453,12455],{"id":12454},"подальше-вивчення","Подальше вивчення",[5196,12457,12458],{},"У наступних лекціях ми розглянемо:",[5092,12460,12461,12467,12473,12479,12485],{},[5095,12462,12463,12466],{},[5127,12464,12465],{},"Асинхронні обробники та Promise"," — async\u002Fawait у контролерах",[5095,12468,12469,12472],{},[5127,12470,12471],{},"Sub-domain routing"," — маршрутизація на основі субдоменів",[5095,12474,12475,12478],{},[5127,12476,12477],{},"Controller scopes"," — життєвий цикл та ін'єкція залежностей",[5095,12480,12481,12484],{},[5127,12482,12483],{},"Guards та автентифікація"," — захист маршрутів від несанкціонованого доступу",[5095,12486,12487,12489],{},[5127,12488,12287],{}," — трансформація запитів та відповідей",[5553,12491,12492],{},"Практикуйте реалізацію перенаправлень на реальних проєктах. Спробуйте створити власний скорочувач URL з аналітикою кліків, систему відстеження маркетингових кампаній або механізм канонізації URL для SEO. Це найкращий спосіб засвоїти нюанси різних кодів перенаправлення.",[12494,12495,12496],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8xlr, html code.shiki .s8xlr{--shiki-light:#AF00DB;--shiki-default:#C586C0;--shiki-dark:#C586C0}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .s-QsJ, html code.shiki .s-QsJ{--shiki-light:#0070C1;--shiki-default:#4FC1FF;--shiki-dark:#4FC1FF}html pre.shiki code .sD7JJ, html code.shiki .sD7JJ{--shiki-light:#000000FF;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .s5IvJ, html code.shiki .s5IvJ{--shiki-light:#000000;--shiki-default:#C8C8C8;--shiki-dark:#C8C8C8}",{"title":5229,"searchDepth":5243,"depth":5243,"links":12498},[12499,12504,12512,12519,12525,12529,12539,12540],{"id":5193,"depth":5243,"text":5194,"children":12500},[12501,12502,12503],{"id":5217,"depth":5249,"text":5218},{"id":5514,"depth":5249,"text":5515},{"id":5558,"depth":5249,"text":5559},{"id":5618,"depth":5243,"text":5619,"children":12505},[12506,12507,12508,12509,12510,12511],{"id":5774,"depth":5249,"text":5775},{"id":5869,"depth":5249,"text":5870},{"id":5915,"depth":5249,"text":5916},{"id":5985,"depth":5249,"text":5986},{"id":6048,"depth":5249,"text":6049},{"id":6116,"depth":5249,"text":6117},{"id":6347,"depth":5243,"text":6348,"children":12513},[12514,12515,12516,12517,12518],{"id":6358,"depth":5249,"text":6359},{"id":6560,"depth":5249,"text":6561},{"id":6794,"depth":5249,"text":6795},{"id":7137,"depth":5249,"text":7138},{"id":7275,"depth":5249,"text":7276},{"id":7409,"depth":5243,"text":7410,"children":12520},[12521,12522,12523,12524],{"id":7428,"depth":5249,"text":7429},{"id":7733,"depth":5249,"text":7734},{"id":9302,"depth":5249,"text":9303},{"id":9657,"depth":5249,"text":9658},{"id":10083,"depth":5243,"text":10084,"children":12526},[12527,12528],{"id":10102,"depth":5249,"text":10103},{"id":10364,"depth":5249,"text":10365},{"id":10659,"depth":5243,"text":10660,"children":12530},[12531,12532,12533,12534,12535,12536,12537,12538],{"id":10666,"depth":5249,"text":10667},{"id":10673,"depth":5249,"text":10674},{"id":10697,"depth":5249,"text":10698},{"id":10719,"depth":5249,"text":10720},{"id":10740,"depth":5249,"text":10741},{"id":10894,"depth":5249,"text":10895},{"id":10955,"depth":5249,"text":10956},{"id":11508,"depth":5249,"text":11509},{"id":11906,"depth":5243,"text":11907},{"id":12343,"depth":5243,"text":12344,"children":12541},[12542],{"id":12454,"depth":5249,"text":12455},"HTTP-редиректи, статичні та динамічні перенаправлення","md",null,{},{"title":4332,"description":12543},"chBQdoqMXffkCfe2NeglqkQisVAr2wOIK5zVghp-tsc",[12550,12552],{"title":4328,"path":4329,"stem":4330,"description":12551,"children":-1},"Встановлення кодів відповіді, стандартні коди за замовчуванням",{"title":4336,"path":4337,"stem":4338,"description":12553,"children":-1},"Async\u002Fawait у контролерах, підтримка Promise та RxJS Observable",1790366079543]