view data fixes

This commit is contained in:
2026-01-24 00:52:27 +01:00
parent 62e8b768ce
commit ae59df61eb
321 changed files with 1157 additions and 2234 deletions

View File

@@ -12,17 +12,22 @@
* - Must be named *ViewDataBuilder
* - Must have 'use client' directive
* - Must implement static build() method
* - Must use 'satisfies' for static type enforcement
*/
import { JsonValue } from '../types/primitives';
import { ViewData } from '../view-data/ViewData';
export interface ViewDataBuilder<TDTO extends JsonValue, TViewData extends ViewData> {
/**
* Transform DTO into ViewData
*
* @param dto - API Transport DTO (JSON-serializable)
* @returns ViewData for template
*/
build(dto: TDTO): TViewData;
/**
* ViewData Builder Contract (Static)
*
* TDTO is constrained to object to ensure it is a serializable API DTO.
*
* Usage:
* export class MyViewDataBuilder {
* static build(apiDto: MyDTO): MyViewData { ... }
* }
* MyViewDataBuilder satisfies ViewDataBuilder<MyDTO, MyViewData>;
*/
export interface ViewDataBuilder<TDTO extends object, TViewData extends ViewData> {
build(apiDto: TDTO): TViewData;
}

View File

@@ -12,17 +12,21 @@
* - Must be named *ViewModelBuilder
* - Must have 'use client' directive
* - Must implement static build() method
* - Must use 'satisfies' for static type enforcement
*/
import { ViewData } from '../view-data/ViewData';
import { ViewModel } from '../view-models/ViewModel';
/**
* ViewModel Builder Contract (Static)
*
* Usage:
* export class MyViewModelBuilder {
* static build(viewData: MyViewData): MyViewModel { ... }
* }
* MyViewModelBuilder satisfies ViewModelBuilder<MyViewData, MyViewModel>;
*/
export interface ViewModelBuilder<TViewData extends ViewData, TViewModel extends ViewModel> {
/**
* Transform ViewData into ViewModel
*
* @param viewData - ViewData (JSON-serializable template-ready data)
* @returns ViewModel
*/
build(viewData: TViewData): TViewModel;
}

View File

@@ -1,3 +1,5 @@
import { JsonValue } from "../types/primitives";
/**
* Base interface for ViewData objects
*
@@ -8,9 +10,8 @@
* architectural rule is that these must be plain JSON objects.
*/
export interface ViewData {
[key: string]: any;
[key: string]: JsonValue;
}
/**
* Helper type to ensure a type is ViewData-compatible
*

View File

@@ -29,9 +29,9 @@
export abstract class ViewModel {
/**
* Optional: Validate the ViewModel state
*
*
* Can be used to ensure the ViewModel is in a valid state
* before a Presenter converts it to ViewData.
* before it is used by the UI.
*/
validate?(): boolean;
}