UNPKG

5.02 kBTypeScriptView Raw
1declare type StrictNullChecksWrapper<Name extends string, Type> = undefined extends null ? `strictNullChecks must be true in tsconfig to use ${Name}` : Type;
2export declare type SomeJSONSchema = UncheckedJSONSchemaType<Known, true>;
3declare type UncheckedPartialSchema<T> = Partial<UncheckedJSONSchemaType<T, true>>;
4export declare type PartialSchema<T> = StrictNullChecksWrapper<"PartialSchema", UncheckedPartialSchema<T>>;
5declare type JSONType<T extends string, IsPartial extends boolean> = IsPartial extends true ? T | undefined : T;
6interface NumberKeywords {
7 minimum?: number;
8 maximum?: number;
9 exclusiveMinimum?: number;
10 exclusiveMaximum?: number;
11 multipleOf?: number;
12 format?: string;
13}
14interface StringKeywords {
15 minLength?: number;
16 maxLength?: number;
17 pattern?: string;
18 format?: string;
19}
20declare type UncheckedJSONSchemaType<T, IsPartial extends boolean> = (// these two unions allow arbitrary unions of types
21{
22 anyOf: readonly UncheckedJSONSchemaType<T, IsPartial>[];
23} | {
24 oneOf: readonly UncheckedJSONSchemaType<T, IsPartial>[];
25} | ({
26 type: (T extends number ? JSONType<"number" | "integer", IsPartial> : T extends string ? JSONType<"string", IsPartial> : T extends boolean ? JSONType<"boolean", IsPartial> : never)[];
27} & (T extends number ? NumberKeywords : T extends string ? StringKeywords : T extends boolean ? unknown : never)) | ((T extends number ? {
28 type: JSONType<"number" | "integer", IsPartial>;
29} & NumberKeywords : T extends string ? {
30 type: JSONType<"string", IsPartial>;
31} & StringKeywords : T extends boolean ? {
32 type: "boolean";
33} : T extends [any, ...any[]] ? {
34 type: JSONType<"array", IsPartial>;
35 items: {
36 readonly [K in keyof T]-?: UncheckedJSONSchemaType<T[K], false> & Nullable<T[K]>;
37 } & {
38 length: T["length"];
39 };
40 minItems: T["length"];
41} & ({
42 maxItems: T["length"];
43} | {
44 additionalItems: false;
45}) : T extends readonly any[] ? {
46 type: JSONType<"array", IsPartial>;
47 items: UncheckedJSONSchemaType<T[0], false>;
48 contains?: UncheckedPartialSchema<T[0]>;
49 minItems?: number;
50 maxItems?: number;
51 minContains?: number;
52 maxContains?: number;
53 uniqueItems?: true;
54 additionalItems?: never;
55} : T extends Record<string, any> ? {
56 type: JSONType<"object", IsPartial>;
57 additionalProperties?: boolean | UncheckedJSONSchemaType<T[string], false>;
58 unevaluatedProperties?: boolean | UncheckedJSONSchemaType<T[string], false>;
59 properties?: IsPartial extends true ? Partial<UncheckedPropertiesSchema<T>> : UncheckedPropertiesSchema<T>;
60 patternProperties?: {
61 [Pattern in string]?: UncheckedJSONSchemaType<T[string], false>;
62 };
63 propertyNames?: Omit<UncheckedJSONSchemaType<string, false>, "type"> & {
64 type?: "string";
65 };
66 dependencies?: {
67 [K in keyof T]?: Readonly<(keyof T)[]> | UncheckedPartialSchema<T>;
68 };
69 dependentRequired?: {
70 [K in keyof T]?: Readonly<(keyof T)[]>;
71 };
72 dependentSchemas?: {
73 [K in keyof T]?: UncheckedPartialSchema<T>;
74 };
75 minProperties?: number;
76 maxProperties?: number;
77} & (IsPartial extends true ? {
78 required: Readonly<(keyof T)[]>;
79} : [UncheckedRequiredMembers<T>] extends [never] ? {
80 required?: Readonly<UncheckedRequiredMembers<T>[]>;
81} : {
82 required: Readonly<UncheckedRequiredMembers<T>[]>;
83}) : T extends null ? {
84 nullable: true;
85} : never) & {
86 allOf?: Readonly<UncheckedPartialSchema<T>[]>;
87 anyOf?: Readonly<UncheckedPartialSchema<T>[]>;
88 oneOf?: Readonly<UncheckedPartialSchema<T>[]>;
89 if?: UncheckedPartialSchema<T>;
90 then?: UncheckedPartialSchema<T>;
91 else?: UncheckedPartialSchema<T>;
92 not?: UncheckedPartialSchema<T>;
93})) & {
94 [keyword: string]: any;
95 $id?: string;
96 $ref?: string;
97 $defs?: {
98 [Key in string]?: UncheckedJSONSchemaType<Known, true>;
99 };
100 definitions?: {
101 [Key in string]?: UncheckedJSONSchemaType<Known, true>;
102 };
103};
104export declare type JSONSchemaType<T> = StrictNullChecksWrapper<"JSONSchemaType", UncheckedJSONSchemaType<T, false>>;
105declare type Known = KnownRecord | [Known, ...Known[]] | Known[] | number | string | boolean | null;
106interface KnownRecord extends Record<string, Known> {
107}
108declare type UncheckedPropertiesSchema<T> = {
109 [K in keyof T]-?: (UncheckedJSONSchemaType<T[K], false> & Nullable<T[K]>) | {
110 $ref: string;
111 };
112};
113export declare type PropertiesSchema<T> = StrictNullChecksWrapper<"PropertiesSchema", UncheckedPropertiesSchema<T>>;
114declare type UncheckedRequiredMembers<T> = {
115 [K in keyof T]-?: undefined extends T[K] ? never : K;
116}[keyof T];
117export declare type RequiredMembers<T> = StrictNullChecksWrapper<"RequiredMembers", UncheckedRequiredMembers<T>>;
118declare type Nullable<T> = undefined extends T ? {
119 nullable: true;
120 const?: never;
121 enum?: Readonly<(T | null)[]>;
122 default?: T | null;
123} : {
124 const?: T;
125 enum?: Readonly<T[]>;
126 default?: T;
127};
128export {};