UNPKG

typia

Version:

Superfast runtime validators with only one line

237 lines (236 loc) 11.4 kB
import { OpenApi, OpenApiV3 } from "@samchon/openapi"; /** * Single unit of JSON schema representation. * * `IJsonSchemaUnit` represents a self-contained JSON schema unit that encapsulates * a single schema definition along with its associated reusable components. This is * typically used when generating a JSON schema for a single TypeScript type, as * opposed to a collection of multiple types. * * Unlike {@link IJsonSchemaCollection} which handles multiple schemas, `IJsonSchemaUnit` * focuses on representing a single schema with its dependencies. This makes it ideal * for scenarios where you need to work with individual type definitions or when * integrating with systems that expect single schema documents. * * The unit contains: * - A single JSON schema definition for the specified TypeScript type * - All necessary reusable components that the schema may reference * - Version-specific formatting for either OpenAPI v3.0 or v3.1 compatibility * - Optional type metadata for compile-time type safety * * Key differences from collection: * - Contains only one schema instead of an array of schemas * - More lightweight for single-type use cases * - Simpler structure for direct schema consumption * - Still maintains full component reference support * * @template Version The OpenAPI specification version to target ("3.0" or "3.1"). * Defaults to "3.1" for enhanced JSON Schema Draft 2020-12 compatibility. * This determines the schema format, validation capabilities, and * available features like tuple support and null type handling. * @template Type The original TypeScript type that was analyzed to generate this * JSON schema unit. This provides compile-time type safety and * enables IDEs to provide better intellisense and validation. * * @example * ```typescript * interface User { * id: string; * name: string; * email?: string; * } * * // Generate a single schema unit for OpenAPI v3.1 (default) * const userSchema = typia.json.schema<User>(); * // Type: IJsonSchemaUnit<"3.1", User> * * // Generate a single schema unit for OpenAPI v3.0 (Swagger compatibility) * const swaggerUserSchema = typia.json.schema<User, "3.0">(); * // Type: IJsonSchemaUnit<"3.0", User> * ``` * * @see {@link IJsonSchemaCollection} For handling multiple schemas at once * @author Jeongho Nam - https://github.com/samchon */ export type IJsonSchemaUnit<Version extends "3.0" | "3.1" = "3.1", Type = unknown> = Version extends "3.0" ? IJsonSchemaUnit.IV3_0<Type> : IJsonSchemaUnit.IV3_1<Type>; export declare namespace IJsonSchemaUnit { /** * JSON Schema unit formatted for OpenAPI v3.0 specification. * * This interface represents a single JSON schema unit that complies with * OpenAPI v3.0 standards. It contains one schema definition along with * any reusable components that the schema references, formatted according * to OpenAPI v3.0 constraints and limitations. * * OpenAPI v3.0 characteristics affecting this unit: * - Schema follows OpenAPI v3.0 JSON Schema subset * - Limited support for advanced JSON Schema features * - Uses nullable property for optional null values * - Cannot natively express tuple types or pattern properties * - Based on JSON Schema Draft 4 with OpenAPI-specific extensions * * Use cases for v3.0: * - Integration with legacy Swagger tooling * - Compatibility with older OpenAPI implementations * - Systems that specifically require OpenAPI v3.0 format * - Code generation tools that expect v3.0 schemas * * @template Type The original TypeScript type represented by this schema unit. * Provides compile-time type information and enables type-safe * operations on the schema. */ interface IV3_0<Type> { /** * OpenAPI specification version identifier. * * Always set to "3.0" to indicate this schema unit uses OpenAPI v3.0 * format and adheres to its specific constraints and limitations. */ version: "3.0"; /** * The primary JSON schema definition. * * Contains the main JSON schema that represents the TypeScript type specified * in the `Type` template parameter. This schema follows OpenAPI v3.0 format * and may contain references to reusable components defined in the * {@link components} property. * * The schema structure includes: * - Type definitions following OpenAPI v3.0 constraints * - Property definitions with v3.0-compatible validation rules * - References to shared components using $ref syntax * - Nullable properties for optional fields that can be null * * Example schema reference: `{ "$ref": "#/components/schemas/NestedType" }` */ schema: OpenApiV3.IJsonSchema; /** * Reusable schema components for OpenAPI v3.0. * * Contains all reusable schema definitions and components that may be * referenced by the main schema. This enables schema modularity and * prevents duplication when the same types are used in multiple places * within the schema definition. * * Component categories include: * - schemas: Named type definitions for complex objects, arrays, and unions * - securitySchemes: Authentication and authorization definitions * - parameters: Reusable parameter specifications * - requestBodies: Reusable request body definitions * - responses: Reusable response specifications * - headers: Reusable header definitions * - examples: Reusable example values * * All components follow OpenAPI v3.0 format restrictions and capabilities. */ components: OpenApiV3.IComponents; /** * Type metadata for compile-time type safety. * * This optional property maintains a reference to the original TypeScript * type that was used to generate this schema unit. It provides compile-time * type information without affecting the runtime JSON representation. * * Benefits of type metadata: * - Enables type-safe schema validation and usage * - Provides IDE intellisense and autocompletion * - Allows compile-time checking of schema operations * - Maintains traceability to original TypeScript definitions * * The property is intentionally marked as optional and undefined to ensure * it doesn't appear in serialized JSON output while preserving type information * at compile time. */ __type?: Type | undefined; } /** * JSON Schema unit formatted for OpenAPI v3.1 specification. * * This interface represents a single JSON schema unit that takes advantage * of OpenAPI v3.1's enhanced capabilities and improved JSON Schema compatibility. * It provides a more feature-rich and accurate representation of TypeScript * types compared to the v3.0 format. * * OpenAPI v3.1 advantages for this unit: * - Full JSON Schema Draft 2020-12 compatibility * - Native tuple type support using prefixItems * - Proper null type handling via union types * - Pattern properties for dynamic object keys * - Enhanced const, enum, and validation capabilities * - Better support for complex nested structures * * Use cases for v3.1: * - Modern OpenAPI implementations and tooling * - Systems requiring accurate TypeScript type representation * - Applications needing advanced JSON Schema features * - New projects without legacy compatibility requirements * * @template Type The original TypeScript type represented by this schema unit. * Enables compile-time type safety and provides enhanced * development experience with better IDE support. */ interface IV3_1<Type> { /** * OpenAPI specification version identifier. * * Always set to "3.1" to indicate this schema unit uses OpenAPI v3.1 * format with enhanced JSON Schema compatibility and modern features. */ version: "3.1"; /** * The primary JSON schema definition with v3.1 enhancements. * * Contains the main JSON schema that accurately represents the TypeScript * type using OpenAPI v3.1's enhanced capabilities. This schema can express * complex TypeScript constructs that were not possible or accurate in v3.0. * * Enhanced schema features include: * - Tuple types using prefixItems for exact array structure * - Union types with proper null handling via oneOf * - Const values for literal types * - Pattern properties for Record<string, T> types * - Advanced validation constraints and metadata * - Recursive type definitions with proper $ref handling * * The schema follows the emended OpenAPI v3.1 format used by typia, * which removes ambiguous expressions while maintaining full compatibility. */ schema: OpenApi.IJsonSchema; /** * Reusable schema components for OpenAPI v3.1. * * Contains reusable schema definitions and components that leverage * OpenAPI v3.1's enhanced capabilities. These components provide better * type representation and more accurate schema definitions compared to v3.0. * * Enhanced component features: * - schemas: More accurate type definitions with v3.1 JSON Schema features * - securitySchemes: Enhanced authentication scheme definitions * - Better support for complex nested references * - Improved handling of recursive and circular type dependencies * * The components structure follows the emended OpenAPI v3.1 specification * that simplifies certain patterns while maintaining full expressiveness. */ components: OpenApi.IComponents; /** * Type metadata for enhanced compile-time type safety. * * This optional property preserves the original TypeScript type information * for compile-time type checking and enhanced development experience. It * enables type-safe operations and better IDE support without affecting * the runtime JSON schema representation. * * Enhanced type safety features: * - Strong typing connection to original TypeScript definitions * - Better IDE intellisense and error detection * - Compile-time validation of schema usage patterns * - Type-safe integration with validation and serialization libraries * - Enhanced debugging and development experience * * The property remains optional and undefined to maintain clean JSON * serialization while preserving valuable compile-time information. */ __type?: Type | undefined; } }