From f4907639b5ced2cd407feae8e1880c72bded9a9c Mon Sep 17 00:00:00 2001 From: teidesu Date: Sat, 10 Apr 2021 18:33:05 +0300 Subject: [PATCH] feat(client): output parameters with defaults as optional and include their default value in docs --- packages/client/scripts/generate-client.js | 53 +++++++++++++++++-- packages/client/src/client.ts | 31 +++++------ .../src/methods/parse-modes/parse-modes.ts | 2 +- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/packages/client/scripts/generate-client.js b/packages/client/scripts/generate-client.js index 24ddb8a7..8f0f67c7 100644 --- a/packages/client/scripts/generate-client.js +++ b/packages/client/scripts/generate-client.js @@ -284,6 +284,8 @@ async function main() { output.untab() output.write('}\n') + const printer = ts.createPrinter() + state.methods.list.forEach(({ name, isPrivate, func, comment }) => { // create method that calls that function and passes `this` // first let's determine the signature @@ -296,10 +298,55 @@ async function main() { const rawParams = (func.parameters || []).filter( (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 - comment = comment.replace(/(\n^|\/\*)\s*\*\s*@internal.*/m, '') + return it.getFullText() + }).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*\*\//)) // empty comment, no need to write it output.write(comment) diff --git a/packages/client/src/client.ts b/packages/client/src/client.ts index 3b76060d..45ddb3c3 100644 --- a/packages/client/src/client.ts +++ b/packages/client/src/client.ts @@ -137,10 +137,10 @@ export class TelegramClient extends BaseTelegramClient { * When you log out, you can immediately log back in using * 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 */ - logOut(resetSession = false): Promise { + logOut(resetSession?: boolean): Promise { return logOut.apply(this, arguments) } /** @@ -219,13 +219,13 @@ export class TelegramClient extends BaseTelegramClient { * @param phone Phone number in international format * @param phoneCodeHash Code identifier from {@link TelegramClient.sendCode} * @param firstName New user's first name - * @param lastName New user's last name + * @param lastName (default: `''`) New user's last name */ signUp( phone: string, phoneCodeHash: string, firstName: string, - lastName = '' + lastName?: string ): Promise { 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 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( chatId: InputPeerLike, ids: MaybeArray, - revoke = true + revoke?: boolean ): Promise { return deleteMessages.apply(this, arguments) } @@ -537,7 +537,7 @@ export class TelegramClient extends BaseTelegramClient { protected _findMessageInUpdate( res: tl.TypeUpdates, - isEdit = false + isEdit?: boolean ): Message { return _findMessageInUpdate.apply(this, arguments) } @@ -625,7 +625,7 @@ export class TelegramClient extends BaseTelegramClient { getMessages( chatId: InputPeerLike, messageIds: MaybeArray, - fromReply = false + fromReply?: boolean ): Promise> { return getMessages.apply(this, arguments) } @@ -1062,13 +1062,10 @@ export class TelegramClient extends BaseTelegramClient { * mode is also set as default. * * @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. */ - registerParseMode( - parseMode: IMessageEntityParser, - name = parseMode.name - ): void { + registerParseMode(parseMode: IMessageEntityParser, name?: string): void { return registerParseMode.apply(this, arguments) } /** @@ -1119,9 +1116,9 @@ export class TelegramClient extends BaseTelegramClient { * Add an update handler to a given handlers group * * @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) } /** @@ -1129,11 +1126,11 @@ export class TelegramClient extends BaseTelegramClient { * handler group. * * @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( handler: UpdateHandler | UpdateHandler['type'] | 'all', - group = 0 + group?: number ): void { return removeUpdateHandler.apply(this, arguments) } diff --git a/packages/client/src/methods/parse-modes/parse-modes.ts b/packages/client/src/methods/parse-modes/parse-modes.ts index 0dab23d9..42a051a0 100644 --- a/packages/client/src/methods/parse-modes/parse-modes.ts +++ b/packages/client/src/methods/parse-modes/parse-modes.ts @@ -15,7 +15,7 @@ import { MtCuteError } from '../../types' export function registerParseMode( this: TelegramClient, parseMode: IMessageEntityParser, - name = parseMode.name + name: string = parseMode.name ): void { if (name in this._parseModes) { throw new MtCuteError(