@dbs-portal/tool-mock
Version:
API mocking toolkit using MSW for DBS Portal development workflows
261 lines • 6.38 kB
TypeScript
/**
* Factory and data generation types
*/
import type { ApiError } from '@dbs-portal/core-shared';
/**
* Mock data factory function type
*/
export type MockDataFactory<T = any> = (overrides?: Partial<T>) => T;
/**
* Mock list factory function type
*/
export type MockListFactory<T = any> = (count?: number, overrides?: Partial<T>) => T[];
/**
* Data generator options
*/
export interface DataGeneratorOptions {
/** Seed for reproducible random generation */
seed?: number;
/** Locale for localized data */
locale?: string;
/** Custom patterns */
patterns?: Record<string, string | RegExp>;
}
/**
* Pagination response structure
*/
export interface PaginatedResponse<T = any> {
data: T[];
meta: {
page: number;
pageSize: number;
total: number;
totalPages: number;
hasNextPage: boolean;
hasPreviousPage: boolean;
};
}
/**
* Paginated mock options
*/
export interface PaginatedMockOptions<T = any> {
/** Items to paginate */
items: T[];
/** Current page (1-based) */
page: number;
/** Page size */
pageSize: number;
/** Total items (optional, defaults to items.length) */
total?: number;
}
/**
* Response builder options
*/
export interface ResponseBuilderOptions<T = any> {
/** Response data */
data?: T;
/** Success status */
success?: boolean;
/** HTTP status code */
status?: number;
/** Response headers */
headers?: Record<string, string>;
/** Response delay */
delay?: number | [number, number];
/** Error information */
error?: ApiError;
/** Additional metadata */
meta?: Record<string, any>;
}
/**
* Validation result
*/
export interface ValidationResult {
/** Whether validation passed */
valid: boolean;
/** Validation errors */
errors: string[];
/** Field-specific errors */
fieldErrors?: Record<string, string[]>;
}
/**
* Validation rule
*/
export interface ValidationRule<T = any> {
/** Rule name */
name: string;
/** Validation function */
validate: (value: any, data: T) => boolean | string;
/** Error message */
message?: string;
}
/**
* Field validation configuration
*/
export interface FieldValidation<T = any> {
/** Field name */
field: keyof T;
/** Validation rules */
rules: ValidationRule<T>[];
/** Whether field is required */
required?: boolean;
/** Custom error message for required validation */
requiredMessage?: string;
}
/**
* Schema validation configuration
*/
export interface SchemaValidation<T = any> {
/** Field validations */
fields: FieldValidation<T>[];
/** Custom validation function */
customValidation?: (data: T) => string[] | null;
}
/**
* File mock options
*/
export interface FileMockOptions {
/** File name */
name: string;
/** File size in bytes */
size: number;
/** MIME type */
type: string;
/** File content (for small files) */
content?: string | ArrayBuffer;
/** Last modified date */
lastModified?: Date;
}
/**
* Image mock options
*/
export interface ImageMockOptions extends FileMockOptions {
/** Image width */
width?: number;
/** Image height */
height?: number;
/** Image format */
format?: 'jpeg' | 'png' | 'gif' | 'webp';
}
/**
* Address mock options
*/
export interface AddressMockOptions {
/** Country code */
country?: string;
/** State/province */
state?: string;
/** City */
city?: string;
/** Include coordinates */
includeCoordinates?: boolean;
}
/**
* Person mock options
*/
export interface PersonMockOptions {
/** Gender */
gender?: 'male' | 'female' | 'other';
/** Age range */
ageRange?: [number, number];
/** Nationality */
nationality?: string;
/** Include avatar */
includeAvatar?: boolean;
}
/**
* Company mock options
*/
export interface CompanyMockOptions {
/** Industry */
industry?: string;
/** Company size */
size?: 'startup' | 'small' | 'medium' | 'large' | 'enterprise';
/** Include logo */
includeLogo?: boolean;
}
/**
* Date range options
*/
export interface DateRangeOptions {
/** Start date */
start: Date | string;
/** End date */
end: Date | string;
/** Date format */
format?: 'iso' | 'timestamp' | 'date';
}
/**
* Number range options
*/
export interface NumberRangeOptions {
/** Minimum value */
min: number;
/** Maximum value */
max: number;
/** Number of decimal places */
decimals?: number;
}
/**
* String generation options
*/
export interface StringGenerationOptions {
/** Minimum length */
minLength: number;
/** Maximum length */
maxLength: number;
/** Character set */
charset?: 'alphanumeric' | 'alpha' | 'numeric' | 'ascii' | 'custom';
/** Custom characters (when charset is 'custom') */
customChars?: string;
/** Include spaces */
includeSpaces?: boolean;
}
/**
* Array generation options
*/
export interface ArrayGenerationOptions<T = any> {
/** Minimum array length */
minLength: number;
/** Maximum array length */
maxLength: number;
/** Item generator function */
itemGenerator: () => T;
/** Ensure unique items */
unique?: boolean;
}
/**
* Mock response metadata
*/
export interface MockResponseMetadata {
/** Generation timestamp */
generatedAt: string;
/** Generator version */
version?: string;
/** Seed used for generation */
seed?: number;
/** Generation time in milliseconds */
generationTime?: number;
}
/**
* Mock response builder interface
*/
export interface MockResponseBuilder<T = any> {
/** Set response data */
data(data: T): MockResponseBuilder<T>;
/** Set status code */
status(code: number): MockResponseBuilder<T>;
/** Set headers */
headers(headers: Record<string, string>): MockResponseBuilder<T>;
/** Set delay */
delay(ms: number | [number, number]): MockResponseBuilder<T>;
/** Add error */
error(error: any): MockResponseBuilder<T>;
/** Set metadata */
meta(metadata: Partial<MockResponseMetadata>): MockResponseBuilder<T>;
/** Build the response */
build(): Response;
/** Build with async delay */
buildAsync(): Promise<Response>;
}
//# sourceMappingURL=types.d.ts.map