This commit is contained in:
tamaina 2023-05-02 17:31:17 +00:00
parent abefddb90e
commit ef15b9c0d3
6 changed files with 106 additions and 8 deletions

View file

@ -41,6 +41,7 @@
"@swc/cli": "0.1.62", "@swc/cli": "0.1.62",
"@swc/core": "1.3.56", "@swc/core": "1.3.56",
"eventemitter3": "5.0.1", "eventemitter3": "5.0.1",
"json-schema-to-ts": "^2.8.0",
"reconnecting-websocket": "4.4.0" "reconnecting-websocket": "4.4.0"
} }
} }

View file

@ -1,4 +1,5 @@
import { localUsernameSchema, passwordSchema } from "./schemas/user"; import { localUsernameSchema, passwordSchema } from "./schemas/user";
import type { JSONSchema7 } from 'json-schema-to-ts';
export type RolePolicies = { export type RolePolicies = {
gtlAvailable: boolean; gtlAvailable: boolean;
@ -33,7 +34,7 @@ export interface IEndpointMeta {
}; };
}; };
readonly defines: { req: Schema | undefined; res: Schema | undefined; }[]; readonly defines: ReadonlyArray<{ req: JSONSchema7 | undefined; res: JSONSchema7 | undefined; }>;
/** /**
* *
@ -132,14 +133,13 @@ export const endpoints = {
required: ['username', 'password'], required: ['username', 'password'],
}, },
res: { res: {
type: 'object', $ref: '/schemas/User',
ref: 'User',
properties: { properties: {
token: { token: {
type: 'string', type: 'string',
}, },
required: ['token'],
}, },
required: ['token'],
}, },
}], }],
}, },
@ -159,4 +159,4 @@ export const endpoints = {
res: undefined, res: undefined,
}], }],
}, },
} as const; } as const satisfies { [x: string]: IEndpointMeta; };

View file

@ -0,0 +1,78 @@
import type { FromSchema, JSONSchema7Reference } from 'json-schema-to-ts';
import { IdSchema } from './schemas/id.js';
import {
packedUserLiteSchema,
packedUserDetailedNotMeOnlySchema,
packedMeDetailedOnlySchema,
packedUserDetailedNotMeSchema,
packedMeDetailedSchema,
packedUserDetailedSchema,
packedUserSchema,
} from './schemas/user.js';
import { packedNoteSchema } from './schemas/note.js';
import { packedUserListSchema } from './schemas/user-list.js';
import { packedAppSchema } from './schemas/app.js';
import { packedNotificationSchema } from './schemas/notification.js';
import { packedDriveFileSchema } from './schemas/drive-file.js';
import { packedDriveFolderSchema } from './schemas/drive-folder.js';
import { packedFollowingSchema } from './schemas/following.js';
import { packedMutingSchema } from './schemas/muting.js';
import { packedRenoteMutingSchema } from './schemas/renote-muting.js';
import { packedBlockingSchema } from './schemas/blocking.js';
import { packedNoteReactionSchema } from './schemas/note-reaction.js';
import { packedHashtagSchema } from './schemas/hashtag.js';
import { packedPageSchema } from './schemas/page.js';
import { packedNoteFavoriteSchema } from './schemas/note-favorite.js';
import { packedChannelSchema } from './schemas/channel.js';
import { packedAntennaSchema } from './schemas/antenna.js';
import { packedClipSchema } from './schemas/clip.js';
import { packedFederationInstanceSchema } from './schemas/federation-instance.js';
import { packedQueueCountSchema } from './schemas/queue.js';
import { packedGalleryPostSchema } from './schemas/gallery-post.js';
import { packedEmojiDetailedSchema, packedEmojiSimpleSchema } from './schemas/emoji.js';
import { packedFlashSchema } from './schemas/flash.js';
export const refs = {
UserLite: packedUserLiteSchema,
UserDetailedNotMeOnly: packedUserDetailedNotMeOnlySchema,
MeDetailedOnly: packedMeDetailedOnlySchema,
UserDetailedNotMe: packedUserDetailedNotMeSchema,
MeDetailed: packedMeDetailedSchema,
UserDetailed: packedUserDetailedSchema,
User: packedUserSchema,
UserList: packedUserListSchema,
App: packedAppSchema,
Note: packedNoteSchema,
NoteReaction: packedNoteReactionSchema,
NoteFavorite: packedNoteFavoriteSchema,
Notification: packedNotificationSchema,
DriveFile: packedDriveFileSchema,
DriveFolder: packedDriveFolderSchema,
Following: packedFollowingSchema,
Muting: packedMutingSchema,
RenoteMuting: packedRenoteMutingSchema,
Blocking: packedBlockingSchema,
Hashtag: packedHashtagSchema,
Page: packedPageSchema,
Channel: packedChannelSchema,
QueueCount: packedQueueCountSchema,
Antenna: packedAntennaSchema,
Clip: packedClipSchema,
FederationInstance: packedFederationInstanceSchema,
GalleryPost: packedGalleryPostSchema,
EmojiSimple: packedEmojiSimpleSchema,
EmojiDetailed: packedEmojiDetailedSchema,
Flash: packedFlashSchema,
} as const satisfies { [x: string]: JSONSchema7Reference };
type Refs = typeof packedAntennaSchema | typeof packedNoteSchema; // TODO: typeof refs[keyof typeof refs];
type UnionToArray<T, A extends unknown[] = []> = T extends any ? [T, ...A] : never;
export type References = [
typeof IdSchema,
...UnionToArray<Refs>
];
export type Packed<T extends keyof typeof refs> = FromSchema<typeof refs[T], { references: References }>

View file

@ -1,3 +1,5 @@
import type { JSONSchema7Reference } from 'json-schema-to-ts';
export const packedAntennaSchema = { export const packedAntennaSchema = {
$id: '/schemas/Antenna', $id: '/schemas/Antenna',
@ -88,4 +90,4 @@ export const packedAntennaSchema = {
'isActive', 'isActive',
'hasUnreadNote', 'hasUnreadNote',
], ],
} as const; } as const satisfies JSONSchema7Reference;

View file

@ -1,3 +1,5 @@
import type { JSONSchema7Reference } from 'json-schema-to-ts';
export const packedNoteSchema = { export const packedNoteSchema = {
$id: '/schemas/Note', $id: '/schemas/Note',
@ -156,4 +158,4 @@ export const packedNoteSchema = {
'renoteCount', 'renoteCount',
'repliesCount', 'repliesCount',
], ],
} as const; } as const satisfies JSONSchema7Reference;

View file

@ -973,6 +973,9 @@ importers:
eventemitter3: eventemitter3:
specifier: 5.0.1 specifier: 5.0.1
version: 5.0.1 version: 5.0.1
json-schema-to-ts:
specifier: ^2.8.0
version: 2.8.0
reconnecting-websocket: reconnecting-websocket:
specifier: 4.4.0 specifier: 4.4.0
version: 4.4.0 version: 4.4.0
@ -6590,7 +6593,6 @@ packages:
/@types/json-schema@7.0.11: /@types/json-schema@7.0.11:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
dev: true
/@types/json5@0.0.29: /@types/json5@0.0.29:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
@ -13800,6 +13802,15 @@ packages:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
dev: true dev: true
/json-schema-to-ts@2.8.0:
resolution: {integrity: sha512-fNAnQ6N0a/0rJlqkzKBdb+5EnMgcKTlrAwMLg3adlKRTT1uNNT4ziqwBzMhj4vp768pO9PoQzZcUyv3QWmD0pQ==}
engines: {node: '>=16'}
dependencies:
'@babel/runtime': 7.21.0
'@types/json-schema': 7.0.11
ts-algebra: 1.2.0
dev: false
/json-schema-traverse@0.4.1: /json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
@ -18762,6 +18773,10 @@ packages:
escape-string-regexp: 5.0.0 escape-string-regexp: 5.0.0
dev: false dev: false
/ts-algebra@1.2.0:
resolution: {integrity: sha512-kMuJJd8B2N/swCvIvn1hIFcIOrLGbWl9m/J6O3kHx9VRaevh00nvgjPiEGaRee7DRaAczMYR2uwWvXU22VFltw==}
dev: false
/ts-dedent@2.2.0: /ts-dedent@2.2.0:
resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
engines: {node: '>=6.10'} engines: {node: '>=6.10'}