Inhaltsverzeichnis

Pack Structure

Structure and rules for WvdS Control/Component Packs - both internal and third-party.

Overview

Packs are the distribution format for:

Packs enable installing controls without modifying the WvdS core.

Directory Structure

Internal WvdS Packs

Path: ~/packs/

~/packs/
├── controls/
│   ├── button/
│   │   └── pack.wvds.json
│   ├── textbox/
│   │   └── pack.wvds.json
│   └── dateedit/
│       └── pack.wvds.json
└── components/
    ├── timer/
    │   └── pack.wvds.json
    └── datasource/
        └── pack.wvds.json

Third-Party Packs

Path: ~/vendor-packs/

~/vendor-packs/
├── index.json                          # Installation index
├── oss/                                 # Open-Source Packs
│   └── {vendor}/
│       └── {pack}/
│           ├── pack.wvds.json          # Pack manifest (REQUIRED)
│           ├── src/                    # Pascal units
│           │   ├── Model.pas
│           │   └── Renderers/
│           │       ├── TUI.pas
│           │       ├── Desktop.pas
│           │       └── Web.pas
│           ├── vsix/                   # Design-time resources
│           ├── docs/                   # API documentation
│           └── license/                # OSS license
│               └── LICENSE.txt
└── proprietary/                        # Proprietary Packs
    └── {vendor}/
        └── {pack}/
            ├── pack.wvds.json
            ├── src/ or bin/            # Source code or binaries
            ├── vsix/
            ├── docs/
            ├── license/
            │   ├── LICENSE.txt
            │   └── EULA.txt
            └── integrity/              # Integrity verification
                ├── SHA256SUMS
                └── SIGNATURE.asc       # Optional

Pack Manifest

Every pack requires a pack.wvds.json file:

{
  "id": "dateedit",
  "vendor": "wvds",
  "version": "0.1.0",
  "license": "MIT",
  "description": "Date input field with calendar popup",
 
  "xml": {
    "namespace": "wvds",
    "tag": "DateEdit"
  },
 
  "model": {
    "unit": "WvdS.UI.Controls.Editors.DateEdit",
    "class": "TWvdSDateEdit"
  },
 
  "renderers": {
    "tui": {
      "unit": "WvdS.UI.TUI.Renderers.DateEdit",
      "class": "TWvdSTUIDateEditRenderer"
    },
    "desktop": {
      "unit": "WvdS.UI.Desktop.Renderers.DateEdit",
      "class": "TWvdSDesktopDateEditRenderer"
    },
    "web": {
      "unit": "WvdS.UI.Web.Renderers.DateEdit",
      "class": "TWvdSWebDateEditRenderer"
    }
  },
 
  "targetCaps": {
    "requires": ["keyboard"],
    "optional": ["mouse", "popup", "touch"]
  },
 
  "dependencies": [],
 
  "compatibility": {
    "wvds": ">=0.1.0"
  }
}

Manifest Fields

Field Required Description
id Yes Unique pack identifier
vendor Yes Vendor ID (e.g., „wvds“, „dx“, „ms“)
version Yes Semantic Version
license Yes License identifier (SPDX)
xml.namespace Yes PXAML namespace
xml.tag Yes PXAML tag name
model.unit Yes Pascal unit for Model
model.class Yes Model class name
renderers Yes Renderer per target
targetCaps No Required/optional capabilities
dependencies No Dependencies on other packs
compatibility No WvdS version requirement

Installation Index

Path: ~/vendor-packs/index.json

{
  "version": "1.0",
  "installed": [
    {
      "vendor": "dx",
      "pack": "dateedit-pro",
      "version": "2.1.0",
      "license": "proprietary",
      "location": "proprietary/dx/dateedit-pro",
      "enabledTargets": ["desktop", "web"],
      "installedAt": "2026-01-13T10:30:00Z",
      "integrity": {
        "sha256": "abc123..."
      }
    },
    {
      "vendor": "jw",
      "pack": "charts",
      "version": "1.0.0",
      "license": "oss",
      "location": "oss/jw/charts",
      "enabledTargets": ["desktop", "web"],
      "installedAt": "2026-01-12T14:00:00Z"
    }
  ]
}

CLI Commands

Install Pack

wvds-build pack install \
  --from /path/to/packdir \
  --to ~/vendor-packs \
  --enable tui,desktop,web

Uninstall Pack

wvds-build pack uninstall \
  --vendor dx \
  --pack dateedit-pro

List Installed Packs

wvds-build pack list

Output:

Installed Packs:
  dx/dateedit-pro  2.1.0  [desktop, web]  proprietary
  jw/charts        1.0.0  [desktop, web]  oss

Naming Conventions

Third-party packs MUST NOT use the TWvdS* prefix!
Vendor Class Prefix Example
WvdS (internal) TWvdS* TWvdSDateEdit
DevExpress TDx* TDxDateEdit
Microsoft TMs* TMsFluentButton
JWorks TJw* TJwChartView

Integrity Verification

Proprietary packs must support integrity verification:

SHA256SUMS:

a1b2c3d4... src/Model.pas
e5f6g7h8... src/Renderers/Desktop.pas
i9j0k1l2... src/Renderers/Web.pas

Optional Signature:

# Create signature
gpg --armor --detach-sign SHA256SUMS
 
# Verify signature
gpg --verify SHA256SUMS.asc SHA256SUMS

Important Rules

NO changes to WvdS core during installation:
  ✗ ~/sources/common/WvdS/** MUST NOT be edited
  ✗ No manual "uses" changes in core units

Pack Isolation:
  ✓ Every pack is self-contained
  ✓ Uninstallation removes all pack files
  ✓ Index.json is updated atomically

Backward Compatibility:
  ✓ Pack manifest format is versioned
  ✓ Older packs work with newer WvdS versions
  ✓ Breaking changes are signaled through manifest version

Creating a Third-Party Pack

Step 1: Create Skeleton

mkdir -p ~/vendor-packs/oss/myvendor/mycontrol/{src,docs,license}

Step 2: Write Manifest

cat > ~/vendor-packs/oss/myvendor/mycontrol/pack.wvds.json << 'EOF'
{
  "id": "mycontrol",
  "vendor": "myvendor",
  "version": "1.0.0",
  "license": "MIT",
  "xml": {
    "namespace": "mv",
    "tag": "MyControl"
  },
  "model": {
    "unit": "MyVendor.Controls.MyControl",
    "class": "TMvMyControl"
  },
  "renderers": {
    "web": {
      "unit": "MyVendor.Web.Renderers.MyControl",
      "class": "TMvWebMyControlRenderer"
    }
  }
}
EOF

Step 3: Create Pascal Units

Step 4: Add License

cp LICENSE.txt ~/vendor-packs/oss/myvendor/mycontrol/license/

Step 5: Register

wvds-build pack install \
  --from ~/vendor-packs/oss/myvendor/mycontrol \
  --enable web

See also