4.4 KiB
4.4 KiB
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
ControlFlowBlocko polealiasVariable - Dodano metodę
parseConditionWithAlias()do parsowania składni z aliasem - Przepisano
transform()itransformIfBlocks()aby obsługiwać zagnieżdżone nawiasy - Dodano metody
findIfBlock()ifindIfBlockEnd()dla precyzyjnego parsowania - Zaktualizowano
buildNgContainers()aby generować*ngIf="condition; let variable"
Przykład transformacji:
Input: @if (device(); as dev) { <div>{{ dev.name }}</div> }
Output: <ng-container *ngIf="device(); let dev"> <div>{{ dev.name }}</div> </ng-container>
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łaniemControlFlowTransformer.transform() - Usunięto zduplikowane metody
parseIfBlock()ibuildIfDirectives()
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:
- Parser wyodrębnia warunek i nazwę aliasu z
*ngIf="condition; let variable" - Ewaluuje warunek w kontekście komponentu
- Jeśli truthy - tworzy kontekst
{ [variable]: value }i przypisuje do__quarcContext - Propaguje kontekst do wszystkich elementów potomnych
- 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
// Przed (wielokrotne wywołanie)
@if (device()) {
<div>{{ device().name }}</div>
<span>{{ device().model }}</span>
<p>{{ device().version }}</p>
}
// Po (jedno wywołanie)
@if (device(); as dev) {
<div>{{ dev.name }}</div>
<span>{{ dev.model }}</span>
<p>{{ dev.version }}</p>
}
Korzyści
- Wydajność - metoda/signal wywoływana tylko raz
- Czytelność - krótsze wyrażenia w template
- Bezpieczeństwo - spójna wartość w całym bloku
- Zgodność - składnia podobna do Angular
Znane ograniczenia
- Testy runtime wymagają środowiska przeglądarki (DOM API)
- Alias jest dostępny tylko w bloku @if, nie w @else
- 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})