diff --git a/README.md b/README.md index c8edc0d..a4e667d 100644 --- a/README.md +++ b/README.md @@ -215,15 +215,18 @@ on (event: 'blocklist-update', listener: (update: BlocklistUpdate) => void): thi ## Sending Messages -Send like, all types of messages with a single function: +**Send all types of messages with a single function:** + +### Non-Media Messages + ``` ts import { MessageType, MessageOptions, Mimetype } from '@adiwajshing/baileys' const id = 'abcd@s.whatsapp.net' // the WhatsApp ID // send a simple text! -conn.sendMessage (id, 'oh hello there', MessageType.text) +const sentMsg = await conn.sendMessage (id, 'oh hello there', MessageType.text) // send a location! -conn.sendMessage(id, {degreesLatitude: 24.121231, degreesLongitude: 55.1121221}, MessageType.location) +const sentMsg = await conn.sendMessage(id, {degreesLatitude: 24.121231, degreesLongitude: 55.1121221}, MessageType.location) // send a contact! const vcard = 'BEGIN:VCARD\n' // metadata of the contact card + 'VERSION:3.0\n' @@ -231,18 +234,50 @@ const vcard = 'BEGIN:VCARD\n' // metadata of the contact card + 'ORG:Ashoka Uni;\n' // the organization of the contact + 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890\n' // WhatsApp ID + phone number + 'END:VCARD' -conn.sendMessage(id, {displayname: "Jeff", vcard: vcard}, MessageType.contact) -// send a gif -const buffer = fs.readFileSync("Media/ma_gif.mp4") // load some gif -const options: MessageOptions = {mimetype: Mimetype.gif, caption: "hello!"} // some metadata & caption -conn.sendMessage(id, buffer, MessageType.video, options) -// send an audio file -const buffer = fs.readFileSync("Media/audio.mp3") // can send mp3, mp4, & ogg -const options: MessageOptions = {mimetype: Mimetype.mp4Audio} // some metadata (can't have caption in audio) -conn.sendMessage(id, buffer, MessageType.audio, options) +const sentMsg = await conn.sendMessage(id, {displayname: "Jeff", vcard: vcard}, MessageType.contact) ``` -To note: +### Media Messages + +Sending media (video, stickers, images) is easier & more efficient than ever. +- You can specify a buffer, a local url or even a remote url. +- When specifying a media url, Baileys never loads the entire buffer into memory, it even encrypts the media as a readable stream. + +``` ts +import { MessageType, MessageOptions, Mimetype } from '@adiwajshing/baileys' +// Sending gifs +await conn.sendMessage( + id, + fs.readFileSync("Media/ma_gif.mp4"), // load a gif and send it + MessageType.video, + { mimetype: Mimetype.gif, caption: "hello!" } +) +await conn.sendMessage( + id, + { url: 'Media/ma_gif.mp4' }, // send directly from local file + MessageType.video, + { mimetype: Mimetype.gif, caption: "hello!" } +) + +await conn.sendMessage( + id, + { url: 'https://giphy.com/gifs/11JTxkrmq4bGE0/html5' }, // send directly from remote url! + MessageType.video, + { mimetype: Mimetype.gif, caption: "hello!" } +) + +// send an audio file +await conn.sendMessage( + id, + { url: "Media/audio.mp3" }, // can send mp3, mp4, & ogg + MessageType.audio, + { mimetype: Mimetype.mp4Audio } // some metadata (can't have caption in audio) +) +``` + + +### Notes + - `id` is the WhatsApp ID of the person or group you're sending the message to. - It must be in the format ```[country code][phone number]@s.whatsapp.net```, for example ```+19999999999@s.whatsapp.net``` for people. For groups, it must be in the format ``` 123456789-123345@g.us ```. - For broadcast lists it's `[timestamp of creation]@broadcast`. diff --git a/src/Tests/Tests.Messages.ts b/src/Tests/Tests.Messages.ts index 4df90b2..7f0dcdc 100644 --- a/src/Tests/Tests.Messages.ts +++ b/src/Tests/Tests.Messages.ts @@ -2,7 +2,6 @@ import { MessageType, Mimetype, delay, promiseTimeout, WA_MESSAGE_STATUS_TYPE, g import { promises as fs } from 'fs' import * as assert from 'assert' import { WAConnectionTest, testJid, sendAndRetreiveMessage } from './Common' -import { resolve } from 'path' WAConnectionTest('Messages', conn => { @@ -83,7 +82,7 @@ WAConnectionTest('Messages', conn => { }) it('should send a jpeg image', async () => { const message = await sendAndRetreiveMessage(conn, { url: './Media/meme.jpeg' }, MessageType.image) - assert.ok (message.message?.imageMessage?.jpegThumbnail) + assert.ok(message.message.imageMessage.jpegThumbnail.length > 0) const msg = await conn.downloadMediaMessage(message) assert.deepStrictEqual(msg, await fs.readFile('./Media/meme.jpeg')) }) diff --git a/src/WAConnection/6.MessagesSend.ts b/src/WAConnection/6.MessagesSend.ts index 4fb570a..f75b483 100644 --- a/src/WAConnection/6.MessagesSend.ts +++ b/src/WAConnection/6.MessagesSend.ts @@ -132,6 +132,9 @@ export class WAConnection extends Base { isGIF = true options.mimetype = MimetypeMap[MessageType.video] } + const requiresDurationComputation = mediaType === MessageType.audio && !options.duration + const requiresThumbnailComputation = (mediaType === MessageType.image || mediaType === MessageType.video) && !('thumbnail' in options) + const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation const { mediaKey, encBodyPath, @@ -139,7 +142,7 @@ export class WAConnection extends Base { fileEncSha256, fileSha256, fileLength - } = await encryptedStream(media, mediaType) + } = await encryptedStream(media, mediaType, requiresOriginalForSomeProcessing) // url safe Base64 encode the SHA256 hash of the body const fileEncSha256B64 = encodeURIComponent( fileEncSha256.toString('base64') @@ -147,8 +150,10 @@ export class WAConnection extends Base { .replace(/\//g, '_') .replace(/\=+$/, '') ) - await generateThumbnail(bodyPath, mediaType, options) - if (mediaType === MessageType.audio && !options.duration) { + if(requiresThumbnailComputation) { + await generateThumbnail(bodyPath, mediaType, options) + } + if (requiresDurationComputation) { try { options.duration = await getAudioDuration(bodyPath) } catch (error) { @@ -176,7 +181,7 @@ export class WAConnection extends Base { if (mediaUrl) break else { - json = await this.refreshMediaConn (true) + json = await this.refreshMediaConn(true) throw new Error (`upload failed, reason: ${JSON.stringify(result)}`) } } catch (error) { @@ -187,7 +192,7 @@ export class WAConnection extends Base { if (!mediaUrl) throw new Error('Media upload failed on all hosts') const message = { - [mediaType]: MessageTypeProto[mediaType].fromObject ( + [mediaType]: MessageTypeProto[mediaType].fromObject( { url: mediaUrl, mediaKey: mediaKey, @@ -202,7 +207,7 @@ export class WAConnection extends Base { ptt: options.ptt } ) - } + } return WAMessageProto.Message.fromObject(message)// as WAMessageContent } /** prepares a WAMessage for sending from the given content & options */ diff --git a/src/WAConnection/Utils.ts b/src/WAConnection/Utils.ts index f461c98..51b9e88 100644 --- a/src/WAConnection/Utils.ts +++ b/src/WAConnection/Utils.ts @@ -310,7 +310,7 @@ export const getGotStream = async(url: string | URL, options: Options & { isStre }) return fetched } -export const encryptedStream = async(media: WAMediaUpload, mediaType: MessageType) => { +export const encryptedStream = async(media: WAMediaUpload, mediaType: MessageType, saveOriginalFileIfRequired = true) => { const { stream, type } = await getStream(media) const mediaKey = randomBytes(32) @@ -322,7 +322,7 @@ export const encryptedStream = async(media: WAMediaUpload, mediaType: MessageTyp let writeStream: WriteStream if(type === 'file') { bodyPath = (media as any).url - } else { + } else if(saveOriginalFileIfRequired) { bodyPath = join(tmpdir(), mediaType + generateMessageID()) writeStream = createWriteStream(bodyPath) } diff --git a/yarn.lock b/yarn.lock index 6c5acbc..d191b79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -374,7 +374,7 @@ dependencies: defer-to-connect "^2.0.0" -"@tokenizer/token@^0.1.0", "@tokenizer/token@^0.1.1": +"@tokenizer/token@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.1.1.tgz#f0d92c12f87079ddfd1b29f614758b9696bc29e3" integrity sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w== @@ -426,14 +426,14 @@ integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w== "@types/node@*", "@types/node@^14.6.2": - version "14.14.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.17.tgz#29fab92f3986c0e379968ad3c2043683d8020dbb" - integrity sha512-G0lD1/7qD60TJ/mZmhog76k7NcpLWkPVGgzkRy3CTlnFu4LUQh5v2Wa661z6vnXmD8EQrnALUyf0VRtrACYztw== + version "14.14.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.21.tgz#d934aacc22424fe9622ebf6857370c052eae464e" + integrity sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A== "@types/node@^13.7.0": - version "13.13.38" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.38.tgz#66a7c068305dbd64cf167d0f6b6b6be71dd453e1" - integrity sha512-oxo8j9doh7ab9NwDA9bCeFfjHRF/uzk+fTljCy8lMjZ3YzZGAXNDKhTE3Byso/oy32UTUQIXB3HCVHu3d2T3xg== + version "13.13.40" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.40.tgz#f655ef327362cc83912f2e69336ddc62a24a9f88" + integrity sha512-eKaRo87lu1yAXrzEJl0zcJxfUMDT5/mZalFyOkT44rnQps41eS2pfWzbaulSPpQLFNy29bFqn+Y5lOTL8ATlEQ== "@types/pino-std-serializers@*": version "2.4.1" @@ -443,9 +443,9 @@ "@types/node" "*" "@types/pino@^6.3.2": - version "6.3.4" - resolved "https://registry.yarnpkg.com/@types/pino/-/pino-6.3.4.tgz#f22524c33a7e21f45f5cc7fc2c570ccae0be98fa" - integrity sha512-03MpZ/HP6GlG0oo5dcb8NBpI21zNESswTbaA0VB4uuigXfVy+XLmzh39CY6VCAahPMxCPtuqSEdhwGeA3AOYXg== + version "6.3.5" + resolved "https://registry.yarnpkg.com/@types/pino/-/pino-6.3.5.tgz#758734942f9234a6057fe66d0f7cd7e309d617f7" + integrity sha512-l3MXskUBef0KnHtEaOMq0OdPDG5+9nRNP3AmeuW+RJCIbOPRuVaEhJUCe5xE9LGPqgU4psF0okb38h1tp2ZVZw== dependencies: "@types/node" "*" "@types/pino-std-serializers" "*" @@ -624,9 +624,9 @@ base64-js@^1.3.1: integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bmp-js@^0.1.0: version "0.1.0" @@ -690,12 +690,12 @@ cacheable-request@^7.0.1: responselike "^2.0.0" call-bind@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" - integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" - get-intrinsic "^1.0.0" + get-intrinsic "^1.0.2" camelcase-keys@^2.0.0: version "2.1.0" @@ -742,7 +742,7 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.4.3, chokidar@^3.4.0: +chokidar@3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== @@ -757,6 +757,21 @@ chokidar@3.4.3, chokidar@^3.4.0: optionalDependencies: fsevents "~2.1.2" +chokidar@^3.4.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.0.tgz#458a4816a415e9d3b3caa4faec2b96a6935a9e65" + integrity sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -1001,9 +1016,9 @@ fast-safe-stringify@^2.0.7: integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== file-type@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.1.0.tgz#1c8a4458b2103e07d2b49ae7f76384abafe86529" - integrity sha512-G4Klqf6tuprtG0pC4r9kni4Wv8XhAAsfHphVqsQGA+YiOlPAO40BZduDqKfv0RFsu9q9ZbFObWfwszY/NqhEZw== + version "16.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.2.0.tgz#d4f1da71ddda758db7f15f93adfaed09ce9e2715" + integrity sha512-1Wwww3mmZCMmLjBfslCluwt2mxH80GsAXYrvPnfQ42G1EGWag336kB1iyCgyn7UXiKY3cJrNykXPrCwA7xb5Ag== dependencies: readable-web-to-node-stream "^3.0.0" strtok3 "^6.0.3" @@ -1089,6 +1104,11 @@ fsevents@~2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" + integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -1104,7 +1124,7 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.0: +get-intrinsic@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== @@ -1252,7 +1272,7 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -1703,16 +1723,16 @@ ms@2.1.2: integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== music-metadata@^7.4.1: - version "7.5.3" - resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-7.5.3.tgz#72e652ccbeeb38b3670924deeb9f1a33ab47d3ce" - integrity sha512-bpUw17MFTUHWoRaox//daurXZNMs0pn0lkwEJ2iJovMpY1uFFLRofqCKyw+XLtRlp/Lp53JuIQCw1fFTLrVg+Q== + version "7.6.4" + resolved "https://registry.yarnpkg.com/music-metadata/-/music-metadata-7.6.4.tgz#7ba314251afac6c7ea71fb58ed3c462d07dc8107" + integrity sha512-9tio3Cj/M8xmuVClaJhhPcks5ioLxDgstB+iiLG8xLmAbwm39PtferpoHNURYTpZAEN1/OHshlk9LQ5PuUPFwQ== dependencies: content-type "^1.0.4" debug "^4.3.1" file-type "^16.1.0" media-typer "^1.1.0" - strtok3 "^6.0.4" - token-types "^2.0.0" + strtok3 "^6.0.8" + token-types "^2.1.1" nanoid@3.1.12: version "3.1.12" @@ -1905,10 +1925,10 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -peek-readable@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-3.1.0.tgz#250b08b7de09db8573d7fd8ea475215bbff14348" - integrity sha512-KGuODSTV6hcgdZvDrIDBUkN0utcAVj1LL7FfGbM0viKTtCHmtZcuEJ+lGqsp0fTFkGqesdtemV2yUSMeyy3ddA== +peek-readable@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-3.1.3.tgz#932480d46cf6aa553c46c68566c4fb69a82cd2b1" + integrity sha512-mpAcysyRJxmICBcBa5IXH7SZPvWkcghm6Fk8RekoS3v+BpbSzlZzuWbMx+GXrlUwESi9qHar4nVEZNMKylIHvg== phin@^2.9.1: version "2.9.3" @@ -1954,20 +1974,20 @@ pino-pretty@^4.3.0: split2 "^3.1.1" strip-json-comments "^3.1.1" -pino-std-serializers@^2.4.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz#40ead781c65a0ce7ecd9c1c33f409d31fe712315" - integrity sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg== +pino-std-serializers@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.1.1.tgz#5a9a00715c9ff3428d5555d4b023a3f8a5893e54" + integrity sha512-Ud4+WzgEr/swOlfQdkxqKP2hlwuQlIqQ5YwYpo9MczNg2mpsKKyKgwQXW5KnP5tgH3/Cy9QRhAhLM8k1K+gfnA== pino@^6.7.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.8.0.tgz#d242f9936f2e65217fde75c0af5d5d8b4d3d3fde" - integrity sha512-nxq+6Jr7m0cMjYFBoTRw3bco14omZ/SQCheAHz9GVwdkbUrzKhgT+gSI/ql2Mnsca0QQKgpB/ACWhjxE4JsX3Q== + version "6.10.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-6.10.0.tgz#0dc4c701aef9e6f1ab276c7c1fbfcbebeba720db" + integrity sha512-ZFGE/Wq930gFb1h0RI6S/QOfkyzNj94Xubwlyo4XpxNUgrG1C0iEqnlooG5Fymx6yrUUtEJ8j/u8NCGwgwTXaQ== dependencies: fast-redact "^3.0.0" fast-safe-stringify "^2.0.7" flatstr "^1.0.12" - pino-std-serializers "^2.4.2" + pino-std-serializers "^3.1.0" quick-format-unescaped "^4.0.1" sonic-boom "^1.0.2" @@ -2069,9 +2089,9 @@ readable-stream@^3.0.0, readable-stream@^3.6.0: util-deprecate "^1.0.1" readable-web-to-node-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.0.tgz#4ca5408e70471069119d691934141a52de413955" - integrity sha512-HNmLb3n0SteGAs8HQlErYPGeO+y7cvL/mVUKtXeUkl0iCZ/2GIgKGrCFHyS7UXFnO8uc9U+0y3pYIzAPsjFfvA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.1.tgz#3f619b1bc5dd73a4cfe5c5f9b4f6faba55dff845" + integrity sha512-4zDC6CvjUyusN7V0QLsXVB7pJCD9+vtrM9bYDRv6uBQ+SKfx36rp5AFNPRgh9auKRul/a1iFZJYXcCbwRL+SaA== dependencies: "@types/readable-stream" "^2.3.9" readable-stream "^3.6.0" @@ -2355,14 +2375,14 @@ strip-json-comments@^2.0.0: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strtok3@^6.0.3, strtok3@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.0.4.tgz#ede0d20fde5aa9fda56417c3558eaafccc724694" - integrity sha512-rqWMKwsbN9APU47bQTMEYTPcwdpKDtmf1jVhHzNW2cL1WqAxaM9iBb9t5P2fj+RV2YsErUWgQzHD5JwV0uCTEQ== +strtok3@^6.0.3, strtok3@^6.0.8: + version "6.0.8" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.0.8.tgz#c839157f615c10ba0f4ae35067dad9959eeca346" + integrity sha512-QLgv+oiXwXgCgp2PdPPa+Jpp4D9imK9e/0BsyfeFMr6QL6wMVqoVn9+OXQ9I7MZbmUzN6lmitTJ09uwS2OmGcw== dependencies: "@tokenizer/token" "^0.1.1" "@types/debug" "^4.1.5" - peek-readable "^3.1.0" + peek-readable "^3.1.3" supports-color@7.2.0, supports-color@^7.1.0: version "7.2.0" @@ -2395,13 +2415,13 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -token-types@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/token-types/-/token-types-2.0.0.tgz#b23618af744818299c6fbf125e0fdad98bab7e85" - integrity sha512-WWvu8sGK8/ZmGusekZJJ5NM6rRVTTDO7/bahz4NGiSDb/XsmdYBn6a1N/bymUHuWYTWeuLUg98wUzvE4jPdCZw== +token-types@^2.0.0, token-types@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-2.1.1.tgz#bd585d64902aaf720b8979d257b4b850b4d45c45" + integrity sha512-wnQcqlreS6VjthyHO3Y/kpK/emflxDBNhlNUPfh7wE39KnuDdOituXomIbyI79vBtF0Ninpkh72mcuRHo+RG3Q== dependencies: - "@tokenizer/token" "^0.1.0" - ieee754 "^1.1.13" + "@tokenizer/token" "^0.1.1" + ieee754 "^1.2.1" tree-kill@^1.2.2: version "1.2.2" @@ -2459,15 +2479,15 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typedoc-default-themes@0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.12.0.tgz#42451948e55a148c1350eb2aa68829be5c2b06b3" - integrity sha512-0hHBxwmfxE0rkIslOiO39fJyYwaScQEhUIxcpqx3uS1BL3zhFW5oQfUaPx2cv2XLL/GXhYFxhdFLoVmNptbxEQ== +typedoc-default-themes@0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.12.1.tgz#6c4a759f9dc365b4021579587b3773deb6fb6eeb" + integrity sha512-6PEvV+/kWAJeUwEtrKgIsZQSbybW5DGCr6s2mMjHsDplpgN8iBHI52UbA+2C+c2TMCxBNMK9TMS6pdeIdwsLSw== typedoc@^0.20.0-beta.27: - version "0.20.5" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.20.5.tgz#09f76d6b7d7ae647e44cdfa0ed4a507836d70b22" - integrity sha512-gx9DHzdRz+b7jZvVXx6+RTrf8HssL3DcZjCEShgMhYttXuZ/6gkQWF2gYmBQ/65L33eS9Bgzwi2RR4bN2h7elg== + version "0.20.14" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.20.14.tgz#894ff71841a4abbe8f46cf52f3cc96c9d68328dc" + integrity sha512-9bsZp5/qkl+gDSv9DRvHbfbY8Sr0tD8fKx7hNIvcluxeAFzBCEo9o0qDCdLUZw+/axbfd9TaqHvSuCVRu+YH6Q== dependencies: colors "^1.4.0" fs-extra "^9.0.1" @@ -2479,7 +2499,7 @@ typedoc@^0.20.0-beta.27: progress "^2.0.3" shelljs "^0.8.4" shiki "^0.2.7" - typedoc-default-themes "0.12.0" + typedoc-default-themes "0.12.1" typescript@^4.0.0: version "4.1.3" @@ -2487,9 +2507,9 @@ typescript@^4.0.0: integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== uglify-js@^3.1.4: - version "3.12.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.3.tgz#bb26c4abe0e68c55e9776bca9bed99a4df73facf" - integrity sha512-feZzR+kIcSVuLi3s/0x0b2Tx4Iokwqt+8PJM7yRHKuldg4MLdam4TCFeICv+lgDtuYiCtdmrtIP+uN9LWvDasw== + version "3.12.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.4.tgz#93de48bb76bb3ec0fc36563f871ba46e2ee5c7ee" + integrity sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A== universalify@^1.0.0: version "1.0.0"