-export declare type SomeJSONSchema = JSONSchemaType<Known, true>;
-export declare type PartialSchema<T> = Partial<JSONSchemaType<T, true>>;
-declare type JSONType<T extends string, _partial extends boolean> = _partial extends true ? T | undefined : T;
+declare type StrictNullChecksWrapper<Name extends string, Type> = undefined extends null ? `strictNullChecks must be true in tsconfig to use ${Name}` : Type;
+declare type UnionToIntersection<U> = (U extends any ? (_: U) => void : never) extends (_: infer I) => void ? I : never;
+export declare type SomeJSONSchema = UncheckedJSONSchemaType<Known, true>;
+declare type UncheckedPartialSchema<T> = Partial<UncheckedJSONSchemaType<T, true>>;
+export declare type PartialSchema<T> = StrictNullChecksWrapper<"PartialSchema", UncheckedPartialSchema<T>>;
+declare type JSONType<T extends string, IsPartial extends boolean> = IsPartial extends true ? T | undefined : T;
interface NumberKeywords {
minimum?: number;
maximum?: number;
pattern?: string;
format?: string;
}
-export declare type JSONSchemaType<T, _partial extends boolean = false> = (((T extends number ? {
- type: JSONType<"number" | "integer", _partial>;
+declare type UncheckedJSONSchemaType<T, IsPartial extends boolean> = (// these two unions allow arbitrary unions of types
+{
+ anyOf: readonly UncheckedJSONSchemaType<T, IsPartial>[];
+} | {
+ oneOf: readonly UncheckedJSONSchemaType<T, IsPartial>[];
+} | ({
+ type: readonly (T extends number ? JSONType<"number" | "integer", IsPartial> : T extends string ? JSONType<"string", IsPartial> : T extends boolean ? JSONType<"boolean", IsPartial> : never)[];
+} & UnionToIntersection<T extends number ? NumberKeywords : T extends string ? StringKeywords : T extends boolean ? {} : never>) | ((T extends number ? {
+ type: JSONType<"number" | "integer", IsPartial>;
} & NumberKeywords : T extends string ? {
- type: JSONType<"string", _partial>;
+ type: JSONType<"string", IsPartial>;
} & StringKeywords : T extends boolean ? {
- type: "boolean";
-} : T extends [any, ...any[]] ? {
- type: JSONType<"array", _partial>;
+ type: JSONType<"boolean", IsPartial>;
+} : T extends readonly [any, ...any[]] ? {
+ type: JSONType<"array", IsPartial>;
items: {
- readonly [K in keyof T]-?: JSONSchemaType<T[K]> & Nullable<T[K]>;
+ readonly [K in keyof T]-?: UncheckedJSONSchemaType<T[K], false> & Nullable<T[K]>;
} & {
length: T["length"];
};
} | {
additionalItems: false;
}) : T extends readonly any[] ? {
- type: JSONType<"array", _partial>;
- items: JSONSchemaType<T[0]>;
- contains?: PartialSchema<T[0]>;
+ type: JSONType<"array", IsPartial>;
+ items: UncheckedJSONSchemaType<T[0], false>;
+ contains?: UncheckedPartialSchema<T[0]>;
minItems?: number;
maxItems?: number;
minContains?: number;
uniqueItems?: true;
additionalItems?: never;
} : T extends Record<string, any> ? {
- type: JSONType<"object", _partial>;
- required: _partial extends true ? Readonly<(keyof T)[]> : Readonly<RequiredMembers<T>[]>;
- additionalProperties?: boolean | JSONSchemaType<T[string]>;
- unevaluatedProperties?: boolean | JSONSchemaType<T[string]>;
- properties?: _partial extends true ? Partial<PropertiesSchema<T>> : PropertiesSchema<T>;
- patternProperties?: {
- [Pattern in string]?: JSONSchemaType<T[string]>;
+ type: JSONType<"object", IsPartial>;
+ additionalProperties?: boolean | UncheckedJSONSchemaType<T[string], false>;
+ unevaluatedProperties?: boolean | UncheckedJSONSchemaType<T[string], false>;
+ properties?: IsPartial extends true ? Partial<UncheckedPropertiesSchema<T>> : UncheckedPropertiesSchema<T>;
+ patternProperties?: Record<string, UncheckedJSONSchemaType<T[string], false>>;
+ propertyNames?: Omit<UncheckedJSONSchemaType<string, false>, "type"> & {
+ type?: "string";
};
- propertyNames?: JSONSchemaType<string>;
dependencies?: {
- [K in keyof T]?: Readonly<(keyof T)[]> | PartialSchema<T>;
+ [K in keyof T]?: Readonly<(keyof T)[]> | UncheckedPartialSchema<T>;
};
dependentRequired?: {
[K in keyof T]?: Readonly<(keyof T)[]>;
};
dependentSchemas?: {
- [K in keyof T]?: PartialSchema<T>;
+ [K in keyof T]?: UncheckedPartialSchema<T>;
};
minProperties?: number;
maxProperties?: number;
-} : T extends null ? {
+} & (IsPartial extends true ? {
+ required: Readonly<(keyof T)[]>;
+} : [UncheckedRequiredMembers<T>] extends [never] ? {
+ required?: Readonly<UncheckedRequiredMembers<T>[]>;
+} : {
+ required: Readonly<UncheckedRequiredMembers<T>[]>;
+}) : T extends null ? {
+ type: JSONType<"null", IsPartial>;
nullable: true;
} : never) & {
- allOf?: Readonly<PartialSchema<T>[]>;
- anyOf?: Readonly<PartialSchema<T>[]>;
- oneOf?: Readonly<PartialSchema<T>[]>;
- if?: PartialSchema<T>;
- then?: PartialSchema<T>;
- else?: PartialSchema<T>;
- not?: PartialSchema<T>;
-}) | {
- anyOf: readonly JSONSchemaType<T, _partial>[];
-} | {
- oneOf: readonly JSONSchemaType<T, _partial>[];
-} | ({
- type: (T extends number ? JSONType<"number" | "integer", _partial> : T extends string ? JSONType<"string", _partial> : T extends boolean ? JSONType<"boolean", _partial> : never)[];
-} & (T extends number ? NumberKeywords : T extends string ? StringKeywords : T extends boolean ? unknown : never))) & {
+ allOf?: Readonly<UncheckedPartialSchema<T>[]>;
+ anyOf?: Readonly<UncheckedPartialSchema<T>[]>;
+ oneOf?: Readonly<UncheckedPartialSchema<T>[]>;
+ if?: UncheckedPartialSchema<T>;
+ then?: UncheckedPartialSchema<T>;
+ else?: UncheckedPartialSchema<T>;
+ not?: UncheckedPartialSchema<T>;
+})) & {
[keyword: string]: any;
$id?: string;
$ref?: string;
- $defs?: {
- [Key in string]?: JSONSchemaType<Known, true>;
- };
- definitions?: {
- [Key in string]?: JSONSchemaType<Known, true>;
- };
+ $defs?: Record<string, UncheckedJSONSchemaType<Known, true>>;
+ definitions?: Record<string, UncheckedJSONSchemaType<Known, true>>;
};
-declare type Known = KnownRecord | [Known, ...Known[]] | Known[] | number | string | boolean | null;
-interface KnownRecord extends Record<string, Known> {
-}
-export declare type PropertiesSchema<T> = {
- [K in keyof T]-?: (JSONSchemaType<T[K]> & Nullable<T[K]>) | {
+export declare type JSONSchemaType<T> = StrictNullChecksWrapper<"JSONSchemaType", UncheckedJSONSchemaType<T, false>>;
+declare type Known = {
+ [key: string]: Known;
+} | [Known, ...Known[]] | Known[] | number | string | boolean | null;
+declare type UncheckedPropertiesSchema<T> = {
+ [K in keyof T]-?: (UncheckedJSONSchemaType<T[K], false> & Nullable<T[K]>) | {
$ref: string;
};
};
-export declare type RequiredMembers<T> = {
+export declare type PropertiesSchema<T> = StrictNullChecksWrapper<"PropertiesSchema", UncheckedPropertiesSchema<T>>;
+declare type UncheckedRequiredMembers<T> = {
[K in keyof T]-?: undefined extends T[K] ? never : K;
}[keyof T];
+export declare type RequiredMembers<T> = StrictNullChecksWrapper<"RequiredMembers", UncheckedRequiredMembers<T>>;
declare type Nullable<T> = undefined extends T ? {
nullable: true;
- const?: never;
+ const?: null;
enum?: Readonly<(T | null)[]>;
default?: T | null;
} : {