feat(client): output parameters with defaults as optional and include their default value in docs

This commit is contained in:
teidesu 2021-04-10 18:33:05 +03:00
parent 383f133292
commit f4907639b5
3 changed files with 65 additions and 21 deletions

View file

@ -284,6 +284,8 @@ async function main() {
output.untab() output.untab()
output.write('}\n') output.write('}\n')
const printer = ts.createPrinter()
state.methods.list.forEach(({ name, isPrivate, func, comment }) => { state.methods.list.forEach(({ name, isPrivate, func, comment }) => {
// create method that calls that function and passes `this` // create method that calls that function and passes `this`
// first let's determine the signature // first let's determine the signature
@ -296,10 +298,55 @@ async function main() {
const rawParams = (func.parameters || []).filter( const rawParams = (func.parameters || []).filter(
(it) => !it.type || it.type.getText() !== 'TelegramClient' (it) => !it.type || it.type.getText() !== 'TelegramClient'
) )
const parameters = rawParams.map((it) => it.getFullText()).join(', ') const parameters = rawParams
.map((it) => {
if (it.initializer) {
// has default value
it._savedDefault = it.initializer.getFullText()
if (!it.type) {
// no explicit type.
// infer from initializer
if (
it.initializer.kind === ts.SyntaxKind.TrueKeyword ||
it.initializer.kind === ts.SyntaxKind.FalseKeyword
) {
it.type = { kind: ts.SyntaxKind.BooleanKeyword }
} else if (
it.initializer.kind === ts.SyntaxKind.StringLiteral
) {
it.type = { kind: ts.SyntaxKind.StringKeyword }
} else if (
it.initializer.kind ===
ts.SyntaxKind.NumericLiteral ||
(it.initializer.kind === ts.SyntaxKind.Identifier &&
it.initializer.escapedText === 'NaN')
) {
it.type = { kind: ts.SyntaxKind.NumberKeyword }
} else {
throwError(
it,
state.methods.used[name],
'Cannot infer parameter type'
)
}
}
it.initializer = undefined
it.questionToken = { kind: ts.SyntaxKind.QuestionToken }
return printer.printNode(ts.EmitHint.Unspecified, it)
}
// write comment, but remove @internal mark return it.getFullText()
comment = comment.replace(/(\n^|\/\*)\s*\*\s*@internal.*/m, '') }).join(', ')
// write comment, but remove @internal mark and set default values for parameters
comment = comment
.replace(/(\n^|\/\*)\s*\*\s*@internal.*/m, '')
.replace(/((?:\n^|\/\*)\s*\*\s*@param )([^\s]+?)($|\s+)/gm, (_, pref, arg, post) => {
const param = rawParams.find(it => it.name.escapedText === arg)
if (!param) return _
if (!param._savedDefault) return _
return `${pref}${arg}${post}(default: \`${param._savedDefault.trim()}\`) `
})
if (!comment.match(/\/\*\*?\s*\*\//)) if (!comment.match(/\/\*\*?\s*\*\//))
// empty comment, no need to write it // empty comment, no need to write it
output.write(comment) output.write(comment)

View file

@ -137,10 +137,10 @@ export class TelegramClient extends BaseTelegramClient {
* When you log out, you can immediately log back in using * When you log out, you can immediately log back in using
* the same {@link TelegramClient} instance. * the same {@link TelegramClient} instance.
* *
* @param resetSession Whether to reset the session * @param resetSession (default: `false`) Whether to reset the session
* @returns On success, `true` is returned * @returns On success, `true` is returned
*/ */
logOut(resetSession = false): Promise<true> { logOut(resetSession?: boolean): Promise<true> {
return logOut.apply(this, arguments) return logOut.apply(this, arguments)
} }
/** /**
@ -219,13 +219,13 @@ export class TelegramClient extends BaseTelegramClient {
* @param phone Phone number in international format * @param phone Phone number in international format
* @param phoneCodeHash Code identifier from {@link TelegramClient.sendCode} * @param phoneCodeHash Code identifier from {@link TelegramClient.sendCode}
* @param firstName New user's first name * @param firstName New user's first name
* @param lastName New user's last name * @param lastName (default: `''`) New user's last name
*/ */
signUp( signUp(
phone: string, phone: string,
phoneCodeHash: string, phoneCodeHash: string,
firstName: string, firstName: string,
lastName = '' lastName?: string
): Promise<User> { ): Promise<User> {
return signUp.apply(this, arguments) return signUp.apply(this, arguments)
} }
@ -479,12 +479,12 @@ export class TelegramClient extends BaseTelegramClient {
* *
* @param chatId Chat's marked ID, its username, phone or `"me"` or `"self"`. * @param chatId Chat's marked ID, its username, phone or `"me"` or `"self"`.
* @param ids Message(s) ID(s) to delete. * @param ids Message(s) ID(s) to delete.
* @param revoke Whether to "revoke" (i.e. delete for both sides). Only used for chats and private chats. * @param revoke (default: `true`) Whether to "revoke" (i.e. delete for both sides). Only used for chats and private chats.
*/ */
deleteMessages( deleteMessages(
chatId: InputPeerLike, chatId: InputPeerLike,
ids: MaybeArray<number>, ids: MaybeArray<number>,
revoke = true revoke?: boolean
): Promise<boolean> { ): Promise<boolean> {
return deleteMessages.apply(this, arguments) return deleteMessages.apply(this, arguments)
} }
@ -537,7 +537,7 @@ export class TelegramClient extends BaseTelegramClient {
protected _findMessageInUpdate( protected _findMessageInUpdate(
res: tl.TypeUpdates, res: tl.TypeUpdates,
isEdit = false isEdit?: boolean
): Message { ): Message {
return _findMessageInUpdate.apply(this, arguments) return _findMessageInUpdate.apply(this, arguments)
} }
@ -625,7 +625,7 @@ export class TelegramClient extends BaseTelegramClient {
getMessages( getMessages(
chatId: InputPeerLike, chatId: InputPeerLike,
messageIds: MaybeArray<number>, messageIds: MaybeArray<number>,
fromReply = false fromReply?: boolean
): Promise<MaybeArray<Message>> { ): Promise<MaybeArray<Message>> {
return getMessages.apply(this, arguments) return getMessages.apply(this, arguments)
} }
@ -1062,13 +1062,10 @@ export class TelegramClient extends BaseTelegramClient {
* mode is also set as default. * mode is also set as default.
* *
* @param parseMode Parse mode to register * @param parseMode Parse mode to register
* @param name Parse mode name. By default is taken from the object. * @param name (default: `parseMode.name`) Parse mode name. By default is taken from the object.
* @throws MtCuteError When the parse mode with a given name is already registered. * @throws MtCuteError When the parse mode with a given name is already registered.
*/ */
registerParseMode( registerParseMode(parseMode: IMessageEntityParser, name?: string): void {
parseMode: IMessageEntityParser,
name = parseMode.name
): void {
return registerParseMode.apply(this, arguments) return registerParseMode.apply(this, arguments)
} }
/** /**
@ -1119,9 +1116,9 @@ export class TelegramClient extends BaseTelegramClient {
* Add an update handler to a given handlers group * Add an update handler to a given handlers group
* *
* @param handler Update handler * @param handler Update handler
* @param group Handler group index * @param group (default: `0`) Handler group index
*/ */
addUpdateHandler(handler: UpdateHandler, group = 0): void { addUpdateHandler(handler: UpdateHandler, group?: number): void {
return addUpdateHandler.apply(this, arguments) return addUpdateHandler.apply(this, arguments)
} }
/** /**
@ -1129,11 +1126,11 @@ export class TelegramClient extends BaseTelegramClient {
* handler group. * handler group.
* *
* @param handler Update handler to remove, its type or `'all'` to remove all * @param handler Update handler to remove, its type or `'all'` to remove all
* @param group Handler group index * @param group (default: `0`) Handler group index
*/ */
removeUpdateHandler( removeUpdateHandler(
handler: UpdateHandler | UpdateHandler['type'] | 'all', handler: UpdateHandler | UpdateHandler['type'] | 'all',
group = 0 group?: number
): void { ): void {
return removeUpdateHandler.apply(this, arguments) return removeUpdateHandler.apply(this, arguments)
} }

View file

@ -15,7 +15,7 @@ import { MtCuteError } from '../../types'
export function registerParseMode( export function registerParseMode(
this: TelegramClient, this: TelegramClient,
parseMode: IMessageEntityParser, parseMode: IMessageEntityParser,
name = parseMode.name name: string = parseMode.name
): void { ): void {
if (name in this._parseModes) { if (name in this._parseModes) {
throw new MtCuteError( throw new MtCuteError(