diff --git a/packages/core/package.json b/packages/core/package.json index f82bf1d7..d5958af0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -12,6 +12,7 @@ "docs": "npx typedoc" }, "dependencies": { + "@types/node": "^15.12.1", "@types/events": "^3.0.0", "@mtcute/tl": "~1.129.0", "leemon": "6.2.0", @@ -23,8 +24,5 @@ "devDependencies": { "@types/ws": "^7.4.1", "ws": "^7.4.4" - }, - "peerDependencies": { - "@types/node": "^15.12.1" } } diff --git a/packages/node/index.ts b/packages/node/index.ts index ff4eb92c..1fcac47f 100644 --- a/packages/node/index.ts +++ b/packages/node/index.ts @@ -1,11 +1,13 @@ -import { TelegramClient } from '@mtcute/client' +import { TelegramClient, User } from '@mtcute/client' import { BaseTelegramClient } from '@mtcute/core' import { NodeNativeCryptoProvider } from '@mtcute/crypto-node' import { HtmlMessageEntityParser } from '@mtcute/html-parser' import { MarkdownMessageEntityParser } from '@mtcute/markdown-parser' import { SqliteStorage } from '@mtcute/sqlite' +import { createInterface, Interface as RlInterface } from 'readline' export * from '@mtcute/dispatcher' +export { SqliteStorage } export namespace NodeTelegramClient { export interface Options @@ -33,6 +35,25 @@ export namespace NodeTelegramClient { } } +let rl: RlInterface | null = null + +/** + * Tiny wrapper over Node `readline` package + * for simpler user input for `.run()` method + * + * @param text Text of the question + */ +export const input = (text: string): Promise => { + if (!rl) { + rl = createInterface({ + input: process.stdin, + output: process.stdout, + }) + } + + return new Promise((res) => rl!.question(text, res)) +} + /** * Tiny wrapper over `TelegramClient` for usage inside Node JS. * @@ -55,4 +76,15 @@ export class NodeTelegramClient extends TelegramClient { if (opts.defaultParseMode) this.setDefaultParseMode(opts.defaultParseMode) } + + run( + params: Parameters[0], + then?: (user: User) => void | Promise + ): void { + if (!params.phone) params.phone = () => input('Phone > ') + if (!params.code) params.code = () => input('Code > ') + if (!params.password) params.password = () => input('2FA password > ') + + return super.run(params, then) + } } diff --git a/scripts/publish.js b/scripts/publish.js index 6bda22ba..8e60edb9 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -85,18 +85,50 @@ function publishSinglePackage(name) { if (name === 'client') { // make TelegramClient a class, not an interface - const content = fs.readFileSync( + const dTsContent = fs.readFileSync( path.join(dir, 'dist/client.d.ts'), 'utf8' ) fs.writeFileSync( path.join(dir, 'dist/client.d.ts'), - content.replace( + dTsContent.replace( 'export interface TelegramClient', 'export class TelegramClient' ) ) + + // make methods prototype methods, not properties + let jsContent = fs.readFileSync( + path.join(dir, 'dist/client.js'), + 'utf8' + ) + + let methods = [] + jsContent = jsContent.replace( + /^\s*this\.([a-zA-Z0-9_]+) = ([a-zA-Z0-9_]+\.[a-zA-Z0-9_]+);\r?\n/gm, + (_, name, imported) => { + methods.push( + `TelegramClient.prototype.${name} = ${imported};` + ) + + return '' + } + ) + + const idx = jsContent.indexOf( + 'exports.TelegramClient = TelegramClient;' + ) + if (idx === -1) + throw new Error('client.js exports.TelegramClient not found') + + jsContent = + jsContent.substr(0, idx) + + methods.join('\n') + + '\n' + + jsContent.substr(idx) + + fs.writeFileSync(path.join(dir, 'dist/client.js'), jsContent) } if (name === 'crypto-node') {