import * as IO from "../../helpers/io.js";
import { AnyRecordLink } from "../links/recordLink.js";
export type ObjectPropertySchema = Schema & {
    optional?: boolean;
    removed?: boolean;
};
interface ObjectSchema {
    type: "object";
    properties: {
        [K: string]: ObjectPropertySchema;
    };
    strict?: boolean;
}
interface ArraySchema {
    type: "array";
    items: Schema;
    minItems?: number;
    maxItems?: number;
    distinctItems?: boolean;
}
interface RefSchema {
    type: "ref";
    ref: string;
}
interface RefNameSchema {
    type: "ref_name";
}
interface SelfSchema {
    type: "self";
}
interface SchemaSchema {
    type: "schema";
}
interface NeverSchema {
    type: "never";
}
interface UnionSchema {
    type: "union";
    schemas: ReadonlyArray<Schema>;
    strict?: boolean;
}
interface IntersectionSchema {
    type: "intersection";
    schemas: ReadonlyArray<Schema>;
}
interface MapSchema {
    type: "map";
    values: Schema;
}
interface BooleanSchema {
    type: "boolean";
    enum?: ReadonlyArray<boolean>;
}
interface StringSchema {
    type: "string";
    enum?: ReadonlyArray<string>;
    minLength?: number;
    maxLength?: number;
}
interface IntSchema {
    type: "int";
    enum?: ReadonlyArray<number>;
    min?: number;
    max?: number;
}
interface NumberSchema {
    type: "number";
    enum?: ReadonlyArray<number>;
    min?: number;
    max?: number;
}
interface TagLinkSchema {
    type: "tag_link";
    enum?: ReadonlyArray<string>;
    sortProperty?: boolean;
    minLength?: number;
    maxLength?: number;
}
interface BlobLinkSchema {
    type: "blob_link";
    maxSize?: number;
    contentTypes?: ReadonlyArray<string>;
}
type PermissionType = "read" | "write" | "notify";
interface EntityLinkSchema {
    type: "entity_link";
    minPermissions?: ReadonlyArray<PermissionType>;
}
interface RecordLinkSchema {
    type: "record_link";
    existential?: boolean;
    recordTypes?: ReadonlyArray<AnyRecordLink>;
}
interface VersionLinkSchema {
    type: "version_link";
    recordTypes?: ReadonlyArray<AnyRecordLink>;
}
type SchemaType = ObjectSchema | ArraySchema | RefSchema | RefNameSchema | SelfSchema | SchemaSchema | NeverSchema | UnionSchema | IntersectionSchema | MapSchema | BooleanSchema | StringSchema | IntSchema | NumberSchema | TagLinkSchema | BlobLinkSchema | EntityLinkSchema | RecordLinkSchema | VersionLinkSchema;
export type Schema = SchemaType & {
    definitions?: {
        [K: string]: Schema;
    };
    default?: unknown;
    description?: string;
};
export declare const RSchema: IO.Type<Schema>;
export {};
