====== 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]]