Inhaltsverzeichnis
Pregled arhitekture
Ovaj dokument opisuje cjelokupnu arhitekturu WvdS FPC RAD Studio Suite.
Dizajnerske odluke
Zašto Pascal za VS Code Extensions?
Motivacija:
- Jedinstvena baza koda za sve targete (GUI, TUI, Web, Extensions)
- Striktna tipizacija smanjuje runtime-greške
- Korištenje know-howa razvojnih programera iz postojećih Pascal-projekata
- pas2js omogućuje visokokvalitetni JavaScript-izlaz
Razmatrane alternative:
| Alternativa | Odluka | Obrazloženje |
|---|---|---|
| TypeScript | Odbijeno | Dva jezika, veća složenost |
| Rust + WASM | Odbijeno | Složen Interop s VSCode API |
| Delphi | Odbijeno | Komercijalno, nema pas2js-alternative |
Zašto PXAML umjesto LFM?
Motivacija:
- Kontrola verzija: XML je diff-prijateljski
- Multi-Target: Isti markup za GUI, TUI, Web
- Tooling: Standardni XML-parseri dostupni
- Poznato: WPF/XAML-sintaksa za one koji prelaze
Slojevita arhitektura
┌─────────────────────────────────────────────────────────────────────┐ │ Extension Layer │ │ (extension_main.pas - Entry Point, Command Handler, UI Integration) │ ├─────────────────────────────────────────────────────────────────────┤ │ Service Layer │ │ (*.Service.pas - Poslovna logika, validacija, operacije) │ ├─────────────────────────────────────────────────────────────────────┤ │ Model Layer │ │ (*.Models.pas - Records, tipovi, enumi, bez logike) │ ├─────────────────────────────────────────────────────────────────────┤ │ Infrastructure Layer │ │ (WvdS.VSCode.*, WvdS.Node.* - API Wrapper, Platform Abstraction) │ └─────────────────────────────────────────────────────────────────────┘
Odgovornosti
| Sloj | Sadržaj | Ovisnosti |
|---|---|---|
| Extension | UI-Interakcija, Command-Registracija | Service, Model, Infrastructure |
| Service | Poslovna logika, validacija | Model |
| Model | Strukture podataka | Nema |
| Infrastructure | VSCode/Node APIs | Samo vanjski APIs |
Pravila
DOZVOLJENO: Extension -> Service -> Model ZABRANJENO: Service -> Extension (Obrnuto) ZABRANJENO: Model -> Service (Logika u Modelu)
Graf ovisnosti
wvds.vscode.packaging
│
▼
wvds.vscode.ui.preview ─► wvds.vscode.build
│ │
▼ │
wvds.vscode.ui.designer │
│ │
└───────┬──────────────┘
▼
wvds.vscode.projects
│
▼
wvds.vscode.ui.meta
│
▼
wvds.vscode.core (Baza)
Extension-ovisnosti u detalje
| Extension | Ovisnosti | Uloga |
|---|---|---|
| core | - | Baza: Toolchain, Logging, Shared Services |
| build | core | Kompilacija, Uses-Formatter |
| projects | core | Upravljanje projektima, Templates |
| ui.meta | core | Komponenten-Registry |
| ui.designer | core | PXAML-Editor |
| ui.preview | core, ui.designer | Live-Preview |
| packaging | core, build | VSIX-kreiranje |
Monorepo-Struktura
sources/ - Single Source of Truth
sources/
├── common/ # Shared Code
│ ├── core/ # Bazne Units (bez ovisnosti)
│ │ ├── WvdS.System.pas
│ │ ├── WvdS.Collections.pas
│ │ └── WvdS.Strings.pas
│ │
│ ├── ui/ # UI Framework
│ │ ├── controls/ # Bazni Controls
│ │ ├── components/ # Composite Components
│ │ ├── runtime/ # PXAML Runtime
│ │ └── targets/ # Renderer
│ │ ├── tui/ # Terminal UI
│ │ ├── gui/ # Desktop GUI
│ │ └── web/ # Browser
│ │
│ └── web/ # Host Bridges
│ ├── nodejs/ # Node.js APIs
│ └── vscode/ # VSCode APIs
│
├── extensions/ # VSIX-paketi
│ └── wvds.vscode.{name}/
│ ├── pas/ # Pascal-izvorni kod
│ ├── dist/ # Kompilirani JS
│ ├── templates/ # HTML-Templates
│ ├── images/ # Icons, grafike
│ ├── package.json # Extension-Manifest
│ └── build.cfg # Build-Konfiguracija
│
├── applications/ # Standalone-Apps
├── tools/ # CLI-Tools
└── packages/ # IDE-Packages
binaries/ - Build-Output
binaries/
├── out/{app}/{target}/{mode}/ # Build-artefakti
│ ├── gen/ # Generirani kod
│ ├── bin/ # Izvršne datoteke
│ └── assets/ # Resursi
│
├── cache/ # Compiler-Cache (.ppu, .o)
├── dist/ # Release-artefakti (.vsix)
└── logs/ # Build-protokoli
Extension-Anatomija
Struktura direktorija
wvds.vscode.{name}/
├── pas/
│ ├── extension_main.pas # Entry Point (OBAVEZNO)
│ ├── {Feature}.Models.pas # Strukture podataka
│ ├── {Feature}.Service.pas # Poslovna logika
│ └── {Feature}.Dialog.pas # UI-Komponente (opcionalno)
│
├── dist/
│ ├── extension_main.js # Kompilirani JS
│ └── extension_main.js.map # Source Map
│
├── templates/
│ └── *.html # WebView-Templates
│
├── images/
│ └── icon.png # Extension-Icon
│
├── package.json # VSCode-Manifest
├── build.cfg # Build-Konfiguracija
└── README.md # Dokumentacija
extension_main.pas Pattern
unit extension_main; {$mode objfpc}{$H+} interface uses JS, VSCode.API, VSCode.Commands, VSCode.ExtensionExports, {Feature}.Service, {Feature}.Models; procedure Activate(AContext: TExtensionContext); procedure Deactivate; implementation procedure DoActivate(AContext: TExtensionContext); begin // Inicijalizacija servisa Initialize{Feature}Service; // Registracija naredbi RegisterCommand('wvds.{feature}.{action}', @Handle{Action}); // Output Channel ShowInfoMessage('WvdS {Name} aktiviran'); end; procedure Activate(AContext: TExtensionContext); begin try DoActivate(AContext); except on E: Exception do ShowErrorMessage(Format(rsActivationFailed, [E.Message])); end; end; procedure Deactivate; begin // Cleanup end; initialization ExportActivateDeactivate(@Activate, @Deactivate); end.
Komunikacija između Extensiona
Via Shared Services
Extensioni komuniciraju preko Core-Extensiona:
// U Extension A CoreService.PublishEvent('build.completed', BuildResult); // U Extension B CoreService.SubscribeEvent('build.completed', @OnBuildCompleted);
Via VSCode API
Za labavu povezanost:
// Pozivanje naredbi ExecuteCommand('wvds.build.run'); // Events OnDidChangeConfiguration(@HandleConfigChange);
Build-Pipeline
┌──────────────────────────────────────────────────────────────┐ │ BUILD PIPELINE │ ├──────────────────────────────────────────────────────────────┤ │ │ │ 1. Policy-Check (wvds-lint) │ │ - Nema .ts datoteka? │ │ - Nema duplikata? │ │ - Wrapperi samo u common? │ │ │ │ 2. pas2js Kompilacija │ │ - Unit-razlučivanje │ │ - Type-Checking │ │ - JavaScript-generiranje │ │ │ │ 3. Obrada asseta │ │ - Kopiranje HTML-Templates │ │ - Optimizacija slika │ │ - Validacija package.json │ │ │ │ 4. Output │ │ - dist/extension_main.js │ │ - dist/extension_main.js.map │ │ │ │ 5. VSIX-Packaging (opcionalno) │ │ - vsce package │ │ - binaries/dist/*.vsix │ │ │ └──────────────────────────────────────────────────────────────┘
Vidi također
Zuletzt geändert: 29.01.2026. u 22:28