====== Pack Structure ======
Structure and rules for WvdS Control/Component Packs - both internal and third-party.
===== Overview =====
Packs are the distribution format for:
* **Controls** - UI elements (Button, TextBox, DateEdit, ...)
* **Components** - Non-visual components (Timer, DataSource, ...)
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 ====
* Model unit in ''src/''
* Renderer units in ''src/Renderers/''
==== 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 =====
* [[.:control-entwicklung|Control Development]]
* [[.:build-pipeline|Build Pipeline]]
* [[.:architektur|Architecture Overview]]