diff options
Diffstat (limited to 'src/misc/schema.ts')
| -rw-r--r-- | src/misc/schema.ts | 70 |
1 files changed, 58 insertions, 12 deletions
diff --git a/src/misc/schema.ts b/src/misc/schema.ts index e14e6e0dd7..d27c9eff99 100644 --- a/src/misc/schema.ts +++ b/src/misc/schema.ts @@ -1,15 +1,57 @@ -export type Schema = { - type: 'boolean' | 'number' | 'string' | 'array' | 'object' | 'any'; - nullable: boolean; - optional: boolean; +import { SimpleObj, SimpleSchema } from './simple-schema'; +import { packedUserSchema } from '@/models/repositories/user'; +import { packedNoteSchema } from '@/models/repositories/note'; +import { packedUserListSchema } from '@/models/repositories/user-list'; +import { packedAppSchema } from '@/models/repositories/app'; +import { packedMessagingMessageSchema } from '@/models/repositories/messaging-message'; +import { packedNotificationSchema } from '@/models/repositories/notification'; +import { packedDriveFileSchema } from '@/models/repositories/drive-file'; +import { packedDriveFolderSchema } from '@/models/repositories/drive-folder'; +import { packedFollowingSchema } from '@/models/repositories/following'; +import { packedMutingSchema } from '@/models/repositories/muting'; +import { packedBlockingSchema } from '@/models/repositories/blocking'; +import { packedNoteReactionSchema } from '@/models/repositories/note-reaction'; +import { packedHashtagSchema } from '@/models/repositories/hashtag'; +import { packedPageSchema } from '@/models/repositories/page'; +import { packedUserGroupSchema } from '@/models/repositories/user-group'; +import { packedNoteFavoriteSchema } from '@/models/repositories/note-favorite'; +import { packedChannelSchema } from '@/models/repositories/channel'; +import { packedAntennaSchema } from '@/models/repositories/antenna'; +import { packedClipSchema } from '@/models/repositories/clip'; +import { packedFederationInstanceSchema } from '@/models/repositories/federation-instance'; +import { packedQueueCountSchema } from '@/models/repositories/queue'; +import { packedGalleryPostSchema } from '@/models/repositories/gallery-post'; + +export const refs = { + User: packedUserSchema, + UserList: packedUserListSchema, + UserGroup: packedUserGroupSchema, + App: packedAppSchema, + MessagingMessage: packedMessagingMessageSchema, + Note: packedNoteSchema, + NoteReaction: packedNoteReactionSchema, + NoteFavorite: packedNoteFavoriteSchema, + Notification: packedNotificationSchema, + DriveFile: packedDriveFileSchema, + DriveFolder: packedDriveFolderSchema, + Following: packedFollowingSchema, + Muting: packedMutingSchema, + Blocking: packedBlockingSchema, + Hashtag: packedHashtagSchema, + Page: packedPageSchema, + Channel: packedChannelSchema, + QueueCount: packedQueueCountSchema, + Antenna: packedAntennaSchema, + Clip: packedClipSchema, + FederationInstance: packedFederationInstanceSchema, + GalleryPost: packedGalleryPostSchema, +}; + +export interface Schema extends SimpleSchema { items?: Schema; properties?: Obj; - description?: string; - example?: any; - format?: string; - ref?: string; - enum?: string[]; -}; + ref?: keyof typeof refs; +} type NonUndefinedPropertyNames<T extends Obj> = { [K in keyof T]: T[K]['optional'] extends true ? never : K @@ -22,7 +64,7 @@ type UndefinedPropertyNames<T extends Obj> = { type OnlyRequired<T extends Obj> = Pick<T, NonUndefinedPropertyNames<T>>; type OnlyOptional<T extends Obj> = Pick<T, UndefinedPropertyNames<T>>; -export type Obj = { [key: string]: Schema }; +export interface Obj extends SimpleObj { [key: string]: Schema; } export type ObjType<s extends Obj> = { [P in keyof OnlyOptional<s>]?: SchemaType<s[P]> } & @@ -48,6 +90,10 @@ export type SchemaType<p extends Schema> = p['type'] extends 'string' ? NullOrUndefined<p, string> : p['type'] extends 'boolean' ? NullOrUndefined<p, boolean> : p['type'] extends 'array' ? NullOrUndefined<p, MyType<NonNullable<p['items']>>[]> : - p['type'] extends 'object' ? NullOrUndefined<p, ObjType<NonNullable<p['properties']>>> : + p['type'] extends 'object' ? ( + p['ref'] extends keyof typeof refs + ? NullOrUndefined<p, SchemaType<typeof refs[p['ref']]>> + : NullOrUndefined<p, ObjType<NonNullable<p['properties']>>> + ) : p['type'] extends 'any' ? NullOrUndefined<p, any> : any; |