2022-01-18 06:27:10 -07:00
|
|
|
|
import {
|
|
|
|
|
packedUserLiteSchema,
|
|
|
|
|
packedUserDetailedNotMeOnlySchema,
|
|
|
|
|
packedMeDetailedOnlySchema,
|
|
|
|
|
packedUserDetailedNotMeSchema,
|
|
|
|
|
packedMeDetailedSchema,
|
|
|
|
|
packedUserDetailedSchema,
|
|
|
|
|
packedUserSchema,
|
2023-01-12 21:40:33 -07:00
|
|
|
|
} from "@/models/schema/user.js";
|
|
|
|
|
import { packedNoteSchema } from "@/models/schema/note.js";
|
|
|
|
|
import { packedUserListSchema } from "@/models/schema/user-list.js";
|
|
|
|
|
import { packedAppSchema } from "@/models/schema/app.js";
|
|
|
|
|
import { packedMessagingMessageSchema } from "@/models/schema/messaging-message.js";
|
|
|
|
|
import { packedNotificationSchema } from "@/models/schema/notification.js";
|
|
|
|
|
import { packedDriveFileSchema } from "@/models/schema/drive-file.js";
|
|
|
|
|
import { packedDriveFolderSchema } from "@/models/schema/drive-folder.js";
|
|
|
|
|
import { packedFollowingSchema } from "@/models/schema/following.js";
|
|
|
|
|
import { packedMutingSchema } from "@/models/schema/muting.js";
|
2023-04-07 23:44:36 -06:00
|
|
|
|
import { packedRenoteMutingSchema } from "@/models/schema/renote-muting.js";
|
2023-01-12 21:40:33 -07:00
|
|
|
|
import { packedBlockingSchema } from "@/models/schema/blocking.js";
|
|
|
|
|
import { packedNoteReactionSchema } from "@/models/schema/note-reaction.js";
|
|
|
|
|
import { packedHashtagSchema } from "@/models/schema/hashtag.js";
|
|
|
|
|
import { packedPageSchema } from "@/models/schema/page.js";
|
|
|
|
|
import { packedUserGroupSchema } from "@/models/schema/user-group.js";
|
|
|
|
|
import { packedNoteFavoriteSchema } from "@/models/schema/note-favorite.js";
|
|
|
|
|
import { packedChannelSchema } from "@/models/schema/channel.js";
|
|
|
|
|
import { packedAntennaSchema } from "@/models/schema/antenna.js";
|
|
|
|
|
import { packedClipSchema } from "@/models/schema/clip.js";
|
|
|
|
|
import { packedFederationInstanceSchema } from "@/models/schema/federation-instance.js";
|
|
|
|
|
import { packedQueueCountSchema } from "@/models/schema/queue.js";
|
|
|
|
|
import { packedGalleryPostSchema } from "@/models/schema/gallery-post.js";
|
|
|
|
|
import { packedEmojiSchema } from "@/models/schema/emoji.js";
|
2021-09-11 10:12:23 -06:00
|
|
|
|
|
|
|
|
|
export const refs = {
|
2022-01-18 06:27:10 -07:00
|
|
|
|
UserLite: packedUserLiteSchema,
|
|
|
|
|
UserDetailedNotMeOnly: packedUserDetailedNotMeOnlySchema,
|
|
|
|
|
MeDetailedOnly: packedMeDetailedOnlySchema,
|
|
|
|
|
UserDetailedNotMe: packedUserDetailedNotMeSchema,
|
|
|
|
|
MeDetailed: packedMeDetailedSchema,
|
|
|
|
|
UserDetailed: packedUserDetailedSchema,
|
2021-09-11 10:12:23 -06:00
|
|
|
|
User: packedUserSchema,
|
2022-01-18 06:27:10 -07:00
|
|
|
|
|
2021-09-11 10:12:23 -06:00
|
|
|
|
UserList: packedUserListSchema,
|
|
|
|
|
UserGroup: packedUserGroupSchema,
|
|
|
|
|
App: packedAppSchema,
|
|
|
|
|
MessagingMessage: packedMessagingMessageSchema,
|
|
|
|
|
Note: packedNoteSchema,
|
|
|
|
|
NoteReaction: packedNoteReactionSchema,
|
|
|
|
|
NoteFavorite: packedNoteFavoriteSchema,
|
|
|
|
|
Notification: packedNotificationSchema,
|
|
|
|
|
DriveFile: packedDriveFileSchema,
|
|
|
|
|
DriveFolder: packedDriveFolderSchema,
|
|
|
|
|
Following: packedFollowingSchema,
|
|
|
|
|
Muting: packedMutingSchema,
|
2023-04-07 23:44:36 -06:00
|
|
|
|
RenoteMuting: packedRenoteMutingSchema,
|
2021-09-11 10:12:23 -06:00
|
|
|
|
Blocking: packedBlockingSchema,
|
|
|
|
|
Hashtag: packedHashtagSchema,
|
|
|
|
|
Page: packedPageSchema,
|
|
|
|
|
Channel: packedChannelSchema,
|
|
|
|
|
QueueCount: packedQueueCountSchema,
|
|
|
|
|
Antenna: packedAntennaSchema,
|
|
|
|
|
Clip: packedClipSchema,
|
|
|
|
|
FederationInstance: packedFederationInstanceSchema,
|
|
|
|
|
GalleryPost: packedGalleryPostSchema,
|
2021-09-22 07:35:55 -06:00
|
|
|
|
Emoji: packedEmojiSchema,
|
2021-09-11 10:12:23 -06:00
|
|
|
|
};
|
|
|
|
|
|
2022-02-19 07:21:28 -07:00
|
|
|
|
export type Packed<x extends keyof typeof refs> = SchemaType<typeof refs[x]>;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
|
2023-01-12 21:40:33 -07:00
|
|
|
|
type TypeStringef =
|
|
|
|
|
| "null"
|
|
|
|
|
| "boolean"
|
|
|
|
|
| "integer"
|
|
|
|
|
| "number"
|
|
|
|
|
| "string"
|
|
|
|
|
| "array"
|
|
|
|
|
| "object"
|
|
|
|
|
| "any";
|
|
|
|
|
type StringDefToType<T extends TypeStringef> = T extends "null"
|
|
|
|
|
? null
|
|
|
|
|
: T extends "boolean"
|
|
|
|
|
? boolean
|
|
|
|
|
: T extends "integer"
|
|
|
|
|
? number
|
|
|
|
|
: T extends "number"
|
|
|
|
|
? number
|
|
|
|
|
: T extends "string"
|
|
|
|
|
? string | Date
|
|
|
|
|
: T extends "array"
|
|
|
|
|
? ReadonlyArray<any>
|
|
|
|
|
: T extends "object"
|
|
|
|
|
? Record<string, any>
|
|
|
|
|
: any;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
|
|
|
|
|
// https://swagger.io/specification/?sbsearch=optional#schema-object
|
|
|
|
|
type OfSchema = {
|
2022-02-18 22:05:32 -07:00
|
|
|
|
readonly anyOf?: ReadonlyArray<Schema>;
|
|
|
|
|
readonly oneOf?: ReadonlyArray<Schema>;
|
|
|
|
|
readonly allOf?: ReadonlyArray<Schema>;
|
2023-01-12 21:40:33 -07:00
|
|
|
|
};
|
2022-01-18 06:27:10 -07:00
|
|
|
|
|
2022-02-18 22:05:32 -07:00
|
|
|
|
export interface Schema extends OfSchema {
|
2022-01-18 06:27:10 -07:00
|
|
|
|
readonly type?: TypeStringef;
|
|
|
|
|
readonly nullable?: boolean;
|
|
|
|
|
readonly optional?: boolean;
|
2022-02-18 22:05:32 -07:00
|
|
|
|
readonly items?: Schema;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
readonly properties?: Obj;
|
2023-01-12 21:40:33 -07:00
|
|
|
|
readonly required?: ReadonlyArray<
|
|
|
|
|
Extract<keyof NonNullable<this["properties"]>, string>
|
|
|
|
|
>;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
readonly description?: string;
|
|
|
|
|
readonly example?: any;
|
|
|
|
|
readonly format?: string;
|
|
|
|
|
readonly ref?: keyof typeof refs;
|
|
|
|
|
readonly enum?: ReadonlyArray<string>;
|
2023-01-12 21:40:33 -07:00
|
|
|
|
readonly default?:
|
|
|
|
|
| (this["type"] extends TypeStringef ? StringDefToType<this["type"]> : any)
|
|
|
|
|
| null;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
readonly maxLength?: number;
|
|
|
|
|
readonly minLength?: number;
|
2022-04-26 19:49:00 -06:00
|
|
|
|
readonly maximum?: number;
|
|
|
|
|
readonly minimum?: number;
|
|
|
|
|
readonly pattern?: string;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
}
|
2021-09-22 07:35:55 -06:00
|
|
|
|
|
2022-02-19 07:21:28 -07:00
|
|
|
|
type RequiredPropertyNames<s extends Obj> = {
|
2023-01-12 21:40:33 -07:00
|
|
|
|
[K in keyof s]: // K is not optional
|
|
|
|
|
s[K]["optional"] extends false
|
|
|
|
|
? K
|
|
|
|
|
: // K has default value
|
|
|
|
|
s[K]["default"] extends
|
|
|
|
|
| null
|
|
|
|
|
| string
|
|
|
|
|
| number
|
|
|
|
|
| boolean
|
|
|
|
|
| Record<string, unknown>
|
|
|
|
|
? K
|
|
|
|
|
: never;
|
2022-02-19 07:21:28 -07:00
|
|
|
|
}[keyof s];
|
2019-04-23 07:35:26 -06:00
|
|
|
|
|
2022-04-26 19:49:00 -06:00
|
|
|
|
export type Obj = Record<string, Schema>;
|
2019-02-23 17:45:27 -07:00
|
|
|
|
|
2022-04-26 19:49:00 -06:00
|
|
|
|
// https://github.com/misskey-dev/misskey/issues/8535
|
|
|
|
|
// To avoid excessive stack depth error,
|
|
|
|
|
// deceive TypeScript with UnionToIntersection (or more precisely, `infer` expression within it).
|
2023-01-12 21:40:33 -07:00
|
|
|
|
export type ObjType<
|
|
|
|
|
s extends Obj,
|
|
|
|
|
RequiredProps extends keyof s,
|
|
|
|
|
> = UnionToIntersection<
|
|
|
|
|
{
|
|
|
|
|
-readonly [R in RequiredPropertyNames<s>]-?: SchemaType<s[R]>;
|
|
|
|
|
} & {
|
|
|
|
|
-readonly [R in RequiredProps]-?: SchemaType<s[R]>;
|
|
|
|
|
} & {
|
|
|
|
|
-readonly [P in keyof s]?: SchemaType<s[P]>;
|
|
|
|
|
}
|
|
|
|
|
>;
|
2019-02-23 17:45:27 -07:00
|
|
|
|
|
2022-02-18 22:05:32 -07:00
|
|
|
|
type NullOrUndefined<p extends Schema, T> =
|
2023-01-12 21:40:33 -07:00
|
|
|
|
| (p["nullable"] extends true ? null : never)
|
|
|
|
|
| (p["optional"] extends true ? undefined : never)
|
2022-04-26 19:49:00 -06:00
|
|
|
|
| T;
|
2019-04-23 07:35:26 -06:00
|
|
|
|
|
2022-02-19 07:21:28 -07:00
|
|
|
|
// https://stackoverflow.com/questions/54938141/typescript-convert-union-to-intersection
|
2023-01-12 21:40:33 -07:00
|
|
|
|
// Get intersection from union
|
|
|
|
|
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
|
|
|
k: infer I,
|
|
|
|
|
) => void
|
|
|
|
|
? I
|
|
|
|
|
: never;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
|
|
|
|
|
// https://github.com/misskey-dev/misskey/pull/8144#discussion_r785287552
|
2022-02-19 07:21:28 -07:00
|
|
|
|
// To get union, we use `Foo extends any ? Hoge<Foo> : never`
|
2023-01-12 21:40:33 -07:00
|
|
|
|
type UnionSchemaType<
|
|
|
|
|
a extends readonly any[],
|
|
|
|
|
X extends Schema = a[number],
|
|
|
|
|
> = X extends any ? SchemaType<X> : never;
|
|
|
|
|
type ArrayUnion<T> = T extends any ? Array<T> : never;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
|
2023-01-12 21:40:33 -07:00
|
|
|
|
export type SchemaTypeDef<p extends Schema> = p["type"] extends "null"
|
|
|
|
|
? null
|
|
|
|
|
: p["type"] extends "integer"
|
|
|
|
|
? number
|
|
|
|
|
: p["type"] extends "number"
|
|
|
|
|
? number
|
|
|
|
|
: p["type"] extends "string"
|
|
|
|
|
? p["enum"] extends readonly string[]
|
|
|
|
|
? p["enum"][number]
|
|
|
|
|
: p["format"] extends "date-time"
|
|
|
|
|
? string
|
|
|
|
|
: // Dateにする??
|
|
|
|
|
string
|
|
|
|
|
: p["type"] extends "boolean"
|
|
|
|
|
? boolean
|
|
|
|
|
: p["type"] extends "object"
|
|
|
|
|
? p["ref"] extends keyof typeof refs
|
|
|
|
|
? Packed<p["ref"]>
|
|
|
|
|
: p["properties"] extends NonNullable<Obj>
|
|
|
|
|
? ObjType<p["properties"], NonNullable<p["required"]>[number]>
|
|
|
|
|
: p["anyOf"] extends ReadonlyArray<Schema>
|
|
|
|
|
? UnionSchemaType<p["anyOf"]> &
|
|
|
|
|
Partial<UnionToIntersection<UnionSchemaType<p["anyOf"]>>>
|
|
|
|
|
: p["allOf"] extends ReadonlyArray<Schema>
|
|
|
|
|
? UnionToIntersection<UnionSchemaType<p["allOf"]>>
|
|
|
|
|
: any
|
|
|
|
|
: p["type"] extends "array"
|
|
|
|
|
? p["items"] extends OfSchema
|
|
|
|
|
? p["items"]["anyOf"] extends ReadonlyArray<Schema>
|
|
|
|
|
? UnionSchemaType<NonNullable<p["items"]["anyOf"]>>[]
|
|
|
|
|
: p["items"]["oneOf"] extends ReadonlyArray<Schema>
|
|
|
|
|
? ArrayUnion<UnionSchemaType<NonNullable<p["items"]["oneOf"]>>>
|
|
|
|
|
: p["items"]["allOf"] extends ReadonlyArray<Schema>
|
|
|
|
|
? UnionToIntersection<UnionSchemaType<NonNullable<p["items"]["allOf"]>>>[]
|
|
|
|
|
: never
|
|
|
|
|
: p["items"] extends NonNullable<Schema>
|
|
|
|
|
? SchemaTypeDef<p["items"]>[]
|
|
|
|
|
: any[]
|
|
|
|
|
: p["oneOf"] extends ReadonlyArray<Schema>
|
|
|
|
|
? UnionSchemaType<p["oneOf"]>
|
|
|
|
|
: any;
|
2022-01-18 06:27:10 -07:00
|
|
|
|
|
2022-02-18 22:05:32 -07:00
|
|
|
|
export type SchemaType<p extends Schema> = NullOrUndefined<p, SchemaTypeDef<p>>;
|