import type { JsonValue } from 'type-fest';
declare const __jsonSchemaType: unique symbol;
export type TypedJsonSchema<T> = JsonSchema & {
    [__jsonSchemaType]?: T;
};
export type JsonSchema = JsonSchemaBoolean | JsonSchemaNumber | JsonSchemaInteger | JsonSchemaString | JsonSchemaArray | JsonSchemaTuple | JsonSchemaObject | JsonSchemaReference | JsonSchemaOneOf | JsonSchemaAnyOf | JsonSchemaEnum | JsonSchemaConst | JsonSchemaNull | JsonSchemaUnknown;
export interface JsonSchemaBase {
    title?: string;
    description?: string;
    /**
     * Normal JSON schemas use either 'definitions' (older versions) or '$defs' (newer versions).
     * However, OpenAPI and Typia instead uses 'components'. Since we use typia to generate JSON schemas,
     * we use 'components' as well.
     *
     * In the case of OpenAPI and Typia the 'components' schemas are supplied outside the actual
     * JSON schema. For better compatibility with other JSON schema tooling, we instead include it
     * inside the JSON schema itself.
     */
    components?: {
        schemas?: Record<string, JsonSchema>;
    };
}
export interface JsonSchemaBoolean extends JsonSchemaBase {
    type: "boolean";
    default?: boolean;
}
export interface JsonSchemaInteger extends JsonSchemaBase {
    type: "integer";
    default?: number;
    minimum?: number;
    maximum?: number;
    exclusiveMinimum?: number;
    exclusiveMaximum?: number;
    multipleOf?: number;
}
export interface JsonSchemaNumber extends JsonSchemaBase {
    type: "number";
    default?: number;
    minimum?: number;
    maximum?: number;
    exclusiveMinimum?: number;
    exclusiveMaximum?: number;
    multipleOf?: number;
}
export interface JsonSchemaString extends JsonSchemaBase {
    type: "string";
    default?: string;
    format?: string;
    pattern?: string;
    minLength?: number;
    maxLength?: number;
}
export interface JsonSchemaArray extends JsonSchemaBase {
    type: "array";
    items: JsonSchema;
    minItems?: number;
    maxItems?: number;
    uniqueItems?: boolean;
}
export interface JsonSchemaTuple extends JsonSchemaBase {
    type: "array";
    prefixItems: JsonSchema[];
    additionalItems?: boolean | JsonSchema;
    minItems?: number;
    maxItems?: number;
    uniqueItems?: boolean;
}
export interface JsonSchemaObject extends JsonSchemaBase {
    type: "object";
    properties?: Record<string, JsonSchema>;
    additionalProperties?: boolean | JsonSchema;
    required?: string[];
}
export interface JsonSchemaReference extends JsonSchemaBase {
    $ref: string;
}
export interface JsonSchemaOneOf extends JsonSchemaBase {
    oneOf: JsonSchema[];
}
export interface JsonSchemaAnyOf extends JsonSchemaBase {
    anyOf: JsonSchema[];
}
export interface JsonSchemaEnum extends JsonSchemaBase {
    enum: JsonValue[];
}
export interface JsonSchemaConst extends JsonSchemaBase {
    const: JsonValue;
}
export interface JsonSchemaNull extends JsonSchemaBase {
    type: "null";
}
export interface JsonSchemaUnknown extends JsonSchemaBase {
    type?: undefined;
}
export {};
