====== Architecture Overview ====== This document describes the overall architecture of the WvdS FPC RAD Studio Suite. ===== Design Decisions ===== ==== Why Pascal for VS Code Extensions? ==== **Motivation:** * Unified codebase for all targets (GUI, TUI, Web, Extensions) * Strong typing reduces runtime errors * Leverage developer expertise from existing Pascal projects * pas2js enables high-quality JavaScript output **Alternatives considered:** ^ Alternative ^ Decision ^ Rationale ^ | TypeScript | Rejected | Two languages, more complexity | | Rust + WASM | Rejected | Complex interop with VSCode API | | Delphi | Rejected | Commercial, no pas2js alternative | ==== Why PXAML Instead of LFM? ==== **Motivation:** * Version control: XML is diff-friendly * Multi-target: Same markup for GUI, TUI, Web * Tooling: Standard XML parsers available * Familiar: WPF/XAML syntax for developers transitioning ===== Layered Architecture ===== ┌─────────────────────────────────────────────────────────────────────┐ │ Extension Layer │ │ (extension_main.pas - Entry Point, Command Handler, UI Integration) │ ├─────────────────────────────────────────────────────────────────────┤ │ Service Layer │ │ (*.Service.pas - Business logic, validation, operations) │ ├─────────────────────────────────────────────────────────────────────┤ │ Model Layer │ │ (*.Models.pas - Records, types, enums, no logic) │ ├─────────────────────────────────────────────────────────────────────┤ │ Infrastructure Layer │ │ (WvdS.VSCode.*, WvdS.Node.* - API Wrapper, Platform Abstraction) │ └─────────────────────────────────────────────────────────────────────┘ ==== Responsibilities ==== ^ Layer ^ Content ^ Dependencies ^ | Extension | UI interaction, command registration | Service, Model, Infrastructure | | Service | Business logic, validation | Model | | Model | Data structures | None | | Infrastructure | VSCode/Node APIs | Only external APIs | ==== Rules ==== ALLOWED: Extension -> Service -> Model FORBIDDEN: Service -> Extension (inversion) FORBIDDEN: Model -> Service (logic in Model) ===== Dependency Graph ===== 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) ==== Extension Dependencies in Detail ==== ^ Extension ^ Dependencies ^ Role ^ | core | - | Base: Toolchain, Logging, Shared Services | | build | core | Compilation, Uses Formatter | | projects | core | Project management, templates | | ui.meta | core | Component registry | | ui.designer | core | PXAML Editor | | ui.preview | core, ui.designer | Live preview | | packaging | core, build | VSIX creation | ===== Monorepo Structure ===== ==== sources/ - Single Source of Truth ==== sources/ ├── common/ # Shared Code │ ├── core/ # Base units (no dependencies) │ │ ├── WvdS.System.pas │ │ ├── WvdS.Collections.pas │ │ └── WvdS.Strings.pas │ │ │ ├── ui/ # UI Framework │ │ ├── controls/ # Base controls │ │ ├── components/ # Composite components │ │ ├── runtime/ # PXAML Runtime │ │ └── targets/ # Renderers │ │ ├── tui/ # Terminal UI │ │ ├── gui/ # Desktop GUI │ │ └── web/ # Browser │ │ │ └── web/ # Host Bridges │ ├── nodejs/ # Node.js APIs │ └── vscode/ # VSCode APIs │ ├── extensions/ # VSIX packages │ └── wvds.vscode.{name}/ │ ├── pas/ # Pascal source code │ ├── dist/ # Compiled JS │ ├── templates/ # HTML templates │ ├── images/ # Icons, graphics │ ├── package.json # Extension manifest │ └── build.cfg # Build configuration │ ├── applications/ # Standalone apps ├── tools/ # CLI tools └── packages/ # IDE Packages ==== binaries/ - Build Output ==== binaries/ ├── out/{app}/{target}/{mode}/ # Build artifacts │ ├── gen/ # Generated code │ ├── bin/ # Executables │ └── assets/ # Resources │ ├── cache/ # Compiler cache (.ppu, .o) ├── dist/ # Release artifacts (.vsix) └── logs/ # Build logs ===== Extension Anatomy ===== ==== Directory Structure ==== wvds.vscode.{name}/ ├── pas/ │ ├── extension_main.pas # Entry Point (REQUIRED) │ ├── {Feature}.Models.pas # Data structures │ ├── {Feature}.Service.pas # Business logic │ └── {Feature}.Dialog.pas # UI components (optional) │ ├── dist/ │ ├── extension_main.js # Compiled JS │ └── extension_main.js.map # Source Map │ ├── templates/ │ └── *.html # WebView templates │ ├── images/ │ └── icon.png # Extension icon │ ├── package.json # VSCode manifest ├── build.cfg # Build configuration └── README.md # Documentation ==== 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 // Initialize services Initialize{Feature}Service; // Register commands RegisterCommand('wvds.{feature}.{action}', @Handle{Action}); // Output Channel ShowInfoMessage('WvdS {Name} activated'); 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. ===== Communication Between Extensions ===== ==== Via Shared Services ==== Extensions communicate through the Core extension: // In Extension A CoreService.PublishEvent('build.completed', BuildResult); // In Extension B CoreService.SubscribeEvent('build.completed', @OnBuildCompleted); ==== Via VSCode API ==== For loose coupling: // Call commands ExecuteCommand('wvds.build.run'); // Events OnDidChangeConfiguration(@HandleConfigChange); ===== Build Pipeline ===== ┌──────────────────────────────────────────────────────────────┐ │ BUILD PIPELINE │ ├──────────────────────────────────────────────────────────────┤ │ │ │ 1. Policy Check (wvds-lint) │ │ - No .ts files? │ │ - No duplicates? │ │ - Wrappers only in common? │ │ │ │ 2. pas2js Compilation │ │ - Unit resolution │ │ - Type checking │ │ - JavaScript generation │ │ │ │ 3. Asset Processing │ │ - Copy HTML templates │ │ - Optimize images │ │ - Validate package.json │ │ │ │ 4. Output │ │ - dist/extension_main.js │ │ - dist/extension_main.js.map │ │ │ │ 5. VSIX Packaging (optional) │ │ - vsce package │ │ - binaries/dist/*.vsix │ │ │ └──────────────────────────────────────────────────────────────┘ ===== See Also ===== * [[.:pxaml-pipeline|PXAML Pipeline]] * [[.:extension-architektur|Extension Architecture in Detail]] * [[.:targets|Build Targets]] * [[.:extension-entwicklung|Extension Development]]