@tsed/schema
Version:
JsonSchema module for Ts.ED Framework
113 lines (112 loc) • 2.63 kB
JavaScript
import { JsonEntityFn } from "./jsonEntityFn.js";
/**
* Specifies a default value for a property in the JSON Schema.
*
* The `@Default()` decorator sets the default value that should be used when a property
* is not provided in the input. This is primarily used for documentation in OpenAPI specs
* and can be used by validation libraries that support default value insertion.
*
* ### Basic Usage
*
* ```typescript
* class UserModel {
* @Default("guest")
* role: string = "guest";
*
* @Default(0)
* loginCount: number = 0;
*
* @Default(true)
* active: boolean = true;
* }
* ```
*
* Generated schema:
* ```json
* {
* "type": "object",
* "properties": {
* "role": {
* "type": "string",
* "default": "guest"
* },
* "loginCount": {
* "type": "integer",
* "default": 0
* },
* "active": {
* "type": "boolean",
* "default": true
* }
* }
* }
* ```
*
* ### With Objects
*
* ```typescript
* class ConfigModel {
* @Default({ theme: "light", lang: "en" })
* preferences: object = { theme: "light", lang: "en" };
* }
* ```
*
* ### With Arrays
*
* ```typescript
* class ListModel {
* @Default([])
* items: string[] = [];
* }
* ```
*
* ### Dynamic Defaults with Functions
*
* ```typescript
* class TimestampModel {
* @Default(() => new Date().toISOString())
* createdAt: string;
* // Default value computed at schema generation time
* }
* ```
*
* ### Use Cases
*
* - **Optional Configuration**: Provide sensible defaults for config properties
* - **API Documentation**: Show default values in OpenAPI/Swagger docs
* - **Form Generation**: Pre-populate form fields with default values
* - **Database Models**: Document default column values
*
* ### Important Notes
*
* - The decorator adds default info to the schema but doesn't set TypeScript property initializers
* - Recommended to match TypeScript initializer with decorator value for consistency
* - Default value should be valid according to the property's schema
* - Not all validation libraries automatically apply defaults
*
* ### With Validation
*
* ```typescript
* class PaginationParams {
* @Default(10)
* @Minimum(1)
* @Maximum(100)
* limit: number = 10;
*
* @Default(0)
* @Minimum(0)
* offset: number = 0;
* }
* ```
*
* @param defaultValue - The default value (or function returning the value)
*
* @decorator
* @validation
* @public
*/
export function Default(defaultValue) {
return JsonEntityFn((store) => {
store.itemSchema.default(defaultValue);
});
}