====== Panoramica dell'architettura ====== Questo documento descrive l'architettura complessiva della suite WvdS FPC RAD Studio. ===== Decisioni di design ===== ==== Perché Pascal per le estensioni VS Code? ==== **Motivazione:** * Base di codice unificata per tutti i target (GUI, TUI, Web, estensioni) * Tipizzazione forte riduce gli errori a runtime * Sfruttare il know-how degli sviluppatori da progetti Pascal esistenti * pas2js permette output JavaScript di alta qualità **Alternative considerate:** ^ Alternativa ^ Decisione ^ Motivazione ^ | TypeScript | Rifiutato | Due linguaggi, maggiore complessità | | Rust + WASM | Rifiutato | Interop complessa con API VSCode | | Delphi | Rifiutato | Commerciale, nessuna alternativa pas2js | ==== Perché PXAML invece di LFM? ==== **Motivazione:** * Controllo versione: XML e diff-friendly * Multi-target: stesso markup per GUI, TUI, Web * Tooling: parser XML standard disponibili * Familiare: sintassi WPF/XAML per chi migra ===== Architettura a strati ===== ┌─────────────────────────────────────────────────────────────────────┐ │ Extension Layer │ │ (extension_main.pas - Entry Point, Command Handler, UI Integration) │ ├─────────────────────────────────────────────────────────────────────┤ │ Service Layer │ │ (*.Service.pas - Logica di business, validazione, operazioni) │ ├─────────────────────────────────────────────────────────────────────┤ │ Model Layer │ │ (*.Models.pas - Record, tipi, enum, nessuna logica) │ ├─────────────────────────────────────────────────────────────────────┤ │ Infrastructure Layer │ │ (WvdS.VSCode.*, WvdS.Node.* - API Wrapper, Platform Abstraction) │ └─────────────────────────────────────────────────────────────────────┘ ==== Responsabilita ==== ^ Strato ^ Contenuto ^ Dipendenze ^ | Extension | Interazione UI, registrazione comandi | Service, Model, Infrastructure | | Service | Logica di business, validazione | Model | | Model | Strutture dati | Nessuna | | Infrastructure | API VSCode/Node | Solo API esterne | ==== Regole ==== CONSENTITO: Extension -> Service -> Model VIETATO: Service -> Extension (inversione) VIETATO: Model -> Service (logica nel Model) ===== Grafo delle dipendenze ===== wvds.vscode.packaging │ ▼ wvds.vscode.ui.preview ─► wvds.vscode.build │ │ ▼ │ wvds.vscode.ui.designer │ │ │ └───────┬──────────────┘ ▼ wvds.vscode.projects │ ▼ wvds.vscode.ui.meta │ ▼ wvds.vscode.core (Base) ==== Dettaglio dipendenze estensioni ==== ^ Estensione ^ Dipendenze ^ Ruolo ^ | core | - | Base: toolchain, logging, servizi condivisi | | build | core | Compilazione, formattatore uses | | projects | core | Gestione progetti, template | | ui.meta | core | Registry componenti | | ui.designer | core | Editor PXAML | | ui.preview | core, ui.designer | Anteprima live | | packaging | core, build | Creazione VSIX | ===== Struttura monorepo ===== ==== sources/ - Single Source of Truth ==== sources/ ├── common/ # Codice condiviso │ ├── core/ # Unit base (nessuna dipendenza) │ │ ├── WvdS.System.pas │ │ ├── WvdS.Collections.pas │ │ └── WvdS.Strings.pas │ │ │ ├── ui/ # UI Framework │ │ ├── controls/ # Controlli base │ │ ├── components/ # Componenti compositi │ │ ├── runtime/ # Runtime PXAML │ │ └── targets/ # Renderer │ │ ├── tui/ # Terminal UI │ │ ├── gui/ # Desktop GUI │ │ └── web/ # Browser │ │ │ └── web/ # Host Bridges │ ├── nodejs/ # API Node.js │ └── vscode/ # API VSCode │ ├── extensions/ # Pacchetti VSIX │ └── wvds.vscode.{name}/ │ ├── pas/ # Sorgente Pascal │ ├── dist/ # JS compilato │ ├── templates/ # Template HTML │ ├── images/ # Icone, grafica │ ├── package.json # Manifesto estensione │ └── build.cfg # Configurazione build │ ├── applications/ # App standalone ├── tools/ # Strumenti CLI └── packages/ # Pacchetti IDE ==== binaries/ - Output build ==== binaries/ ├── out/{app}/{target}/{mode}/ # Artefatti build │ ├── gen/ # Codice generato │ ├── bin/ # File eseguibili │ └── assets/ # Risorse │ ├── cache/ # Cache compilatore (.ppu, .o) ├── dist/ # Artefatti release (.vsix) └── logs/ # Protocolli build ===== Anatomia di un'estensione ===== ==== Struttura directory ==== wvds.vscode.{name}/ ├── pas/ │ ├── extension_main.pas # Entry Point (OBBLIGATORIO) │ ├── {Feature}.Models.pas # Strutture dati │ ├── {Feature}.Service.pas # Logica di business │ └── {Feature}.Dialog.pas # Componenti UI (opzionale) │ ├── dist/ │ ├── extension_main.js # JS compilato │ └── extension_main.js.map # Source Map │ ├── templates/ │ └── *.html # Template WebView │ ├── images/ │ └── icon.png # Icona estensione │ ├── package.json # Manifesto VSCode ├── build.cfg # Configurazione build └── README.md # Documentazione ==== Pattern 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 // Inizializzare i servizi Initialize{Feature}Service; // Registrare i comandi RegisterCommand('wvds.{feature}.{action}', @Handle{Action}); // Output Channel ShowInfoMessage('WvdS {Name} attivato'); 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. ===== Comunicazione tra estensioni ===== ==== Tramite servizi condivisi ==== Le estensioni comunicano tramite l'estensione Core: // Nell'estensione A CoreService.PublishEvent('build.completed', BuildResult); // Nell'estensione B CoreService.SubscribeEvent('build.completed', @OnBuildCompleted); ==== Tramite API VSCode ==== Per accoppiamento lasco: // Chiamare comandi ExecuteCommand('wvds.build.run'); // Eventi OnDidChangeConfiguration(@HandleConfigChange); ===== Pipeline di build ===== ┌──────────────────────────────────────────────────────────────┐ │ BUILD PIPELINE │ ├──────────────────────────────────────────────────────────────┤ │ │ │ 1. Controllo policy (wvds-lint) │ │ - Nessun file .ts? │ │ - Nessun duplicato? │ │ - Wrapper solo in common? │ │ │ │ 2. Compilazione pas2js │ │ - Risoluzione unit │ │ - Type checking │ │ - Generazione JavaScript │ │ │ │ 3. Elaborazione asset │ │ - Copiare template HTML │ │ - Ottimizzare immagini │ │ - Validare package.json │ │ │ │ 4. Output │ │ - dist/extension_main.js │ │ - dist/extension_main.js.map │ │ │ │ 5. Packaging VSIX (opzionale) │ │ - vsce package │ │ - binaries/dist/*.vsix │ │ │ └──────────────────────────────────────────────────────────────┘ ===== Vedi anche ===== * [[.:pxaml-pipeline|Pipeline PXAML]] * [[.:extension-architektur|Architettura estensioni in dettaglio]] * [[.:targets|Target di build]] * [[.:extension-entwicklung|Sviluppo estensioni]]