# Changelog - Obsługa aliasów w @if directive ## Data: 2026-01-18 ### Dodane funkcjonalności #### 1. Compile-time: Parsowanie składni `@if (condition; as variable)` **Zmodyfikowane pliki:** - `/web/quarc/cli/helpers/control-flow-transformer.ts` **Zmiany:** - Rozszerzono interfejs `ControlFlowBlock` o pole `aliasVariable` - Dodano metodę `parseConditionWithAlias()` do parsowania składni z aliasem - Przepisano `transform()` i `transformIfBlocks()` aby obsługiwać zagnieżdżone nawiasy - Dodano metody `findIfBlock()` i `findIfBlockEnd()` dla precyzyjnego parsowania - Zaktualizowano `buildNgContainers()` aby generować `*ngIf="condition; let variable"` **Przykład transformacji:** ``` Input: @if (device(); as dev) {
{{ dev.name }}
} Output:
{{ dev.name }}
``` #### 2. Compile-time: Integracja z TemplateTransformer **Zmodyfikowane pliki:** - `/web/quarc/cli/processors/template/template-transformer.ts` **Zmiany:** - Dodano import `ControlFlowTransformer` - Zastąpiono własną implementację `transformControlFlowIf()` wywołaniem `ControlFlowTransformer.transform()` - Usunięto zduplikowane metody `parseIfBlock()` i `buildIfDirectives()` **Korzyści:** - Jedna spójna implementacja parsowania @if - Automatyczna obsługa aliasów w całym pipeline - Łatwiejsze utrzymanie kodu #### 3. Runtime: Obsługa `*ngIf="condition; let variable"` **Zmodyfikowane pliki:** - `/web/quarc/core/module/template-renderer.ts` **Zmiany:** - Dodano metodę `processNgIfDirective()` do obsługi dyrektywy *ngIf z aliasem - Dodano metodę `parseNgIfExpression()` do parsowania wyrażenia runtime - Dodano metodę `propagateContextToChildren()` do propagacji kontekstu - Zaktualizowano `processNgContainer()` aby używać nowej metody **Działanie:** 1. Parser wyodrębnia warunek i nazwę aliasu z `*ngIf="condition; let variable"` 2. Ewaluuje warunek w kontekście komponentu 3. Jeśli truthy - tworzy kontekst `{ [variable]: value }` i przypisuje do `__quarcContext` 4. Propaguje kontekst do wszystkich elementów potomnych 5. Elementy mają dostęp do aliasu poprzez `__quarcContext` ### Testy #### Nowe testy compile-time **Plik:** `/web/quarc/tests/unit/test-functionality.ts` Dodano 4 nowe testy: - Test 22: @if z zagnieżdżonymi nawiasami w warunku - Test 23: @if z aliasem i białymi znakami - Test 24: @if @else if oba z aliasem - Wszystkie istniejące testy (20-21) również przeszły **Wyniki:** ✅ 24/24 testy (100%) #### Nowe testy runtime **Plik:** `/web/quarc/tests/unit/test-ngif-alias.ts` Utworzono 10 testów runtime (wymagają środowiska przeglądarki): - Prosty przypadek z aliasem - Wartości falsy (null, undefined, false) - Zagnieżdżone elementy z dostępem do aliasu - Parsowanie wyrażeń - Propagacja kontekstu **Uwaga:** Testy runtime nie są uruchamiane automatycznie w Node.js #### Test manualny **Plik:** `/web/quarc/tests/manual/test-ngif-alias-example.html` Utworzono stronę HTML do manualnego testowania w przeglądarce. ### Dokumentacja **Nowe pliki:** - `/web/quarc/NGIF_ALIAS_FEATURE.md` - pełna dokumentacja funkcjonalności - `/web/quarc/CHANGELOG_NGIF_ALIAS.md` - ten plik ### Kompatybilność wstecz ✅ Pełna kompatybilność - składnia bez aliasu działa jak dotychczas: - `@if (condition)` - bez zmian - `@if (condition; as variable)` - nowa funkcjonalność ### Przykłady użycia ```typescript // Przed (wielokrotne wywołanie) @if (device()) {
{{ device().name }}
{{ device().model }}

{{ device().version }}

} // Po (jedno wywołanie) @if (device(); as dev) {
{{ dev.name }}
{{ dev.model }}

{{ dev.version }}

} ``` ### Korzyści 1. **Wydajność** - metoda/signal wywoływana tylko raz 2. **Czytelność** - krótsze wyrażenia w template 3. **Bezpieczeństwo** - spójna wartość w całym bloku 4. **Zgodność** - składnia podobna do Angular ### Znane ograniczenia 1. Testy runtime wymagają środowiska przeglądarki (DOM API) 2. Alias jest dostępny tylko w bloku @if, nie w @else 3. Wartości falsy nie renderują zawartości (zgodnie z semantyką @if) ### Następne kroki - [ ] Dodać testy E2E w rzeczywistej aplikacji - [ ] Rozważyć wsparcie dla aliasów w @else if - [ ] Dodać przykłady do dokumentacji głównej - [ ] Rozważyć wsparcie dla destrukturyzacji: `@if (user(); as {name, email})`