====== Pregled arhitekture ====== Ta dokument opisuje celotno arhitekturo paketa WvdS FPC RAD Studio. ===== Oblikovalske odločitve ===== ==== Zakaj Pascal za razširitve VS Code? ==== **Motivacija:** * Enotna kodna baza za vse cilje (GUI, TUI, Web, razširitve) * Močna tipizacija zmanjšuje napake med izvajanjem * Izkoriščanje znanja razvijalcev iz obstoječih projektov Pascal * pas2js omogoča visokokakovosten izhod JavaScript **Obravnavane alternative:** ^ Alternativa ^ Odločitev ^ Utemeljitev ^ | TypeScript | Zavrnjeno | Dva jezika, več kompleksnosti | | Rust + WASM | Zavrnjeno | Kompleksna interoperabilnost z VSCode API | | Delphi | Zavrnjeno | Komercialno, brez alternative pas2js | ==== Zakaj PXAML namesto LFM? ==== **Motivacija:** * Nadzor različic: XML je prijazen do diff * Več ciljev: Enako označevanje za GUI, TUI, Web * Orodja: Na voljo standardni razčlenjevalniki XML * Znano: Sintaksa WPF/XAML za prehajanje ===== 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 - Zapisi, tipi, enumeracije, brez logike) │ ├─────────────────────────────────────────────────────────────────────┤ │ Infrastructure Layer │ │ (WvdS.VSCode.*, WvdS.Node.* - API Wrapper, Platform Abstraction) │ └─────────────────────────────────────────────────────────────────────┘ ==== Odgovornosti ==== ^ Sloj ^ Vsebina ^ Odvisnosti ^ | Extension | Interakcija z UI, registracija ukazov | Service, Model, Infrastructure | | Service | Poslovna logika, validacija | Model | | Model | Podatkovne strukture | Brez | | Infrastructure | VSCode/Node API | Samo zunanji API | ==== Pravila ==== DOVOLJENO: Extension -> Service -> Model PREPOVEDANO: Service -> Extension (obrat) PREPOVEDANO: Model -> Service (logika v Model) ===== Graf odvisnosti ===== wvds.vscode.packaging │ ▼ wvds.vscode.ui.preview ─► wvds.vscode.build │ │ ▼ │ wvds.vscode.ui.designer │ │ │ └───────┬──────────────┘ ▼ wvds.vscode.projects │ ▼ wvds.vscode.ui.meta │ ▼ wvds.vscode.core (Osnova) ==== Podrobnosti odvisnosti razširitev ==== ^ Razširitev ^ Odvisnosti ^ Vloga ^ | core | - | Osnova: Toolchain, beleženje, skupne storitve | | build | core | Prevajanje, formater Uses | | projects | core | Upravljanje projektov, predloge | | ui.meta | core | Register komponent | | ui.designer | core | Urejevalnik PXAML | | ui.preview | core, ui.designer | Živi predogled | | packaging | core, build | Ustvarjanje VSIX | ===== Struktura Monorepo ===== ==== sources/ - Enoten vir resnice ==== sources/ ├── common/ # Skupna koda │ ├── core/ # Osnovne enote (brez odvisnosti) │ │ ├── WvdS.System.pas │ │ ├── WvdS.Collections.pas │ │ └── WvdS.Strings.pas │ │ │ ├── ui/ # UI ogrodje │ │ ├── controls/ # Osnovni kontrolniki │ │ ├── components/ # Sestavljene komponente │ │ ├── runtime/ # PXAML Runtime │ │ └── targets/ # Upodabljalniki │ │ ├── tui/ # Terminal UI │ │ ├── gui/ # Desktop GUI │ │ └── web/ # Brskalnik │ │ │ └── web/ # Host Bridges │ ├── nodejs/ # Node.js API │ └── vscode/ # VSCode API │ ├── extensions/ # Paketi VSIX │ └── wvds.vscode.{name}/ │ ├── pas/ # Izvorna koda Pascal │ ├── dist/ # Prevedeni JS │ ├── templates/ # Predloge HTML │ ├── images/ # Ikone, grafike │ ├── package.json # Manifest razširitve │ └── build.cfg # Konfiguracija gradnje │ ├── applications/ # Samostojne aplikacije ├── tools/ # CLI orodja └── packages/ # Paketi IDE ==== binaries/ - Izhod gradnje ==== binaries/ ├── out/{app}/{target}/{mode}/ # Artefakti gradnje │ ├── gen/ # Generirana koda │ ├── bin/ # Izvršljive datoteke │ └── assets/ # Viri │ ├── cache/ # Predpomnilnik prevajalnika (.ppu, .o) ├── dist/ # Artefakti izdaje (.vsix) └── logs/ # Dnevniki gradnje ===== Anatomija razširitve ===== ==== Struktura map ==== wvds.vscode.{name}/ ├── pas/ │ ├── extension_main.pas # Vstopna točka (OBVEZNO) │ ├── {Feature}.Models.pas # Podatkovne strukture │ ├── {Feature}.Service.pas # Poslovna logika │ └── {Feature}.Dialog.pas # UI komponente (opcijsko) │ ├── dist/ │ ├── extension_main.js # Prevedeni JS │ └── extension_main.js.map # Source Map │ ├── templates/ │ └── *.html # Predloge WebView │ ├── images/ │ └── icon.png # Ikona razširitve │ ├── package.json # Manifest VSCode ├── build.cfg # Konfiguracija gradnje └── README.md # Dokumentacija ==== Vzorec extension_main.pas ==== 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 // Inicializacija storitev Initialize{Feature}Service; // Registracija ukazov RegisterCommand('wvds.{feature}.{action}', @Handle{Action}); // Izhodni kanal 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 // Čiščenje end; initialization ExportActivateDeactivate(@Activate, @Deactivate); end. ===== Komunikacija med razširitvami ===== ==== Preko skupnih storitev ==== Razširitve komunicirajo preko razširitve Core: // V razširitvi A CoreService.PublishEvent('build.completed', BuildResult); // V razširitvi B CoreService.SubscribeEvent('build.completed', @OnBuildCompleted); ==== Preko VSCode API ==== Za šibko sklopljenost: // Klic ukazov ExecuteCommand('wvds.build.run'); // Dogodki OnDidChangeConfiguration(@HandleConfigChange); ===== Cevovod gradnje ===== ┌──────────────────────────────────────────────────────────────┐ │ CEVOVOD GRADNJE │ ├──────────────────────────────────────────────────────────────┤ │ │ │ 1. Preverjanje politike (wvds-lint) │ │ - Brez datotek .ts? │ │ - Brez dvojnikov? │ │ - Wrapperji samo v common? │ │ │ │ 2. Prevajanje pas2js │ │ - Razreševanje enot │ │ - Preverjanje tipov │ │ - Generiranje JavaScript │ │ │ │ 3. Obdelava sredstev │ │ - Kopiranje predlog HTML │ │ - Optimizacija slik │ │ - Validacija package.json │ │ │ │ 4. Izhod │ │ - dist/extension_main.js │ │ - dist/extension_main.js.map │ │ │ │ 5. Pakiranje VSIX (opcijsko) │ │ - vsce package │ │ - binaries/dist/*.vsix │ │ │ └──────────────────────────────────────────────────────────────┘ ===== Glejte tudi ===== * [[.:pxaml-pipeline|Cevovod PXAML]] * [[.:extension-architektur|Podrobna arhitektura razširitev]] * [[.:targets|Cilji gradnje]] * [[.:extension-entwicklung|Razvoj razširitev]]