From 591c98f3e6b3985379e0dd0db968d896953a1ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas=20de=20Oliveira=20Lopes?= <55464917+jlucaso1@users.noreply.github.com> Date: Mon, 30 Jun 2025 16:02:40 -0300 Subject: [PATCH 01/12] fix: validate media URL before downloading content from message (#1560) --- src/Utils/messages-media.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Utils/messages-media.ts b/src/Utils/messages-media.ts index 3a6b37d..ebfe3a3 100644 --- a/src/Utils/messages-media.ts +++ b/src/Utils/messages-media.ts @@ -448,7 +448,12 @@ export const downloadContentFromMessage = async ( type: MediaType, opts: MediaDownloadOptions = {} ) => { - const downloadUrl = url || getUrlFromDirectPath(directPath!) + const isValidMediaUrl = url?.startsWith('https://mmg.whatsapp.net/') + const downloadUrl = isValidMediaUrl ? url : getUrlFromDirectPath(directPath!) + if (!downloadUrl) { + throw new Boom('No valid media URL or directPath present in message', { statusCode: 400 }) + } + const keys = await getMediaKeys(mediaKey, type) return downloadEncryptedContent(downloadUrl, keys, opts) From a4b96ed37e119569101e6ec326e853c511f2d20f Mon Sep 17 00:00:00 2001 From: DevAstro Date: Mon, 30 Jun 2025 20:04:37 +0100 Subject: [PATCH 02/12] [READY FOR MERGE] Add support for custom profile picture dimensions (#1563) * Add support for custom profile picture dimensions The updateProfilePicture and generateProfilePicture functions now accept an optional dimensions parameter, allowing custom width and height for profile pictures. This provides more flexibility for image resizing beyond the default 640x640 size. * minor corrections Replaces 'w' and 'h' with 'width' and 'height' in profile picture related functions for improved clarity and consistency. * fix lint --- src/Socket/chats.ts | 8 ++++++-- src/Utils/messages-media.ts | 11 ++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Socket/chats.ts b/src/Socket/chats.ts index bed2f79..856d8cb 100644 --- a/src/Socket/chats.ts +++ b/src/Socket/chats.ts @@ -257,7 +257,11 @@ export const makeChatsSocket = (config: SocketConfig) => { } /** update the profile picture for yourself or a group */ - const updateProfilePicture = async (jid: string, content: WAMediaUpload) => { + const updateProfilePicture = async ( + jid: string, + content: WAMediaUpload, + dimensions?: { width: number; height: number } + ) => { let targetJid if (!jid) { throw new Boom( @@ -269,7 +273,7 @@ export const makeChatsSocket = (config: SocketConfig) => { targetJid = jidNormalizedUser(jid) // in case it is someone other than us } - const { img } = await generateProfilePicture(content) + const { img } = await generateProfilePicture(content, dimensions) await query({ tag: 'iq', attrs: { diff --git a/src/Utils/messages-media.ts b/src/Utils/messages-media.ts index ebfe3a3..6bbf072 100644 --- a/src/Utils/messages-media.ts +++ b/src/Utils/messages-media.ts @@ -139,7 +139,12 @@ export const extractImageThumb = async (bufferOrFilePath: Readable | Buffer | st export const encodeBase64EncodedStringForUpload = (b64: string) => encodeURIComponent(b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '')) -export const generateProfilePicture = async (mediaUpload: WAMediaUpload) => { +export const generateProfilePicture = async ( + mediaUpload: WAMediaUpload, + dimensions?: { width: number; height: number } +) => { + const { width: w = 640, height: h = 640 } = dimensions || {} + let bufferOrFilePath: Buffer | string if (Buffer.isBuffer(mediaUpload)) { bufferOrFilePath = mediaUpload @@ -154,7 +159,7 @@ export const generateProfilePicture = async (mediaUpload: WAMediaUpload) => { if ('sharp' in lib && typeof lib.sharp?.default === 'function') { img = lib.sharp .default(bufferOrFilePath) - .resize(640, 640) + .resize(w, h) .jpeg({ quality: 50 }) @@ -165,7 +170,7 @@ export const generateProfilePicture = async (mediaUpload: WAMediaUpload) => { const min = Math.min(jimp.getWidth(), jimp.getHeight()) const cropped = jimp.crop(0, 0, min, min) - img = cropped.quality(50).resize(640, 640, RESIZE_BILINEAR).getBufferAsync(MIME_JPEG) + img = cropped.quality(50).resize(w, h, RESIZE_BILINEAR).getBufferAsync(MIME_JPEG) } else { throw new Boom('No image processing library available') } From 5ffb19120d0fd7162bf163164a222f3ecb7864f4 Mon Sep 17 00:00:00 2001 From: devlikeapro <155617407+devlikepro@users.noreply.github.com> Date: Tue, 1 Jul 2025 02:15:11 +0700 Subject: [PATCH 03/12] Show poll on the sender device (#1567) fix #675 --- src/Socket/messages-send.ts | 3 ++- src/Utils/messages.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Socket/messages-send.ts b/src/Socket/messages-send.ts index 4d4af65..85fbfc2 100644 --- a/src/Socket/messages-send.ts +++ b/src/Socket/messages-send.ts @@ -387,7 +387,8 @@ export const makeMessagesSocket = (config: SocketConfig) => { deviceSentMessage: { destinationJid, message - } + }, + messageContextInfo: message.messageContextInfo } const extraAttrs = {} diff --git a/src/Utils/messages.ts b/src/Utils/messages.ts index 0b6657a..1c618bf 100644 --- a/src/Utils/messages.ts +++ b/src/Utils/messages.ts @@ -475,11 +475,11 @@ export const generateWAMessageContent = async ( // poll v2 is for community announcement groups (single select and multiple) m.pollCreationMessageV2 = pollCreationMessage } else { - if (message.poll.selectableCount > 0) { + if (message.poll.selectableCount === 1) { //poll v3 is for single select polls m.pollCreationMessageV3 = pollCreationMessage } else { - // poll v3 for multiple choice polls + // poll for multiple choice polls m.pollCreationMessage = pollCreationMessage } } From 8391c02e0b010ac6c6f6261350c0ef190ab74e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas=20de=20Oliveira=20Lopes?= <55464917+jlucaso1@users.noreply.github.com> Date: Mon, 30 Jun 2025 23:22:09 -0300 Subject: [PATCH 04/12] [READY FOR MERGE] Implement newsletter (#1532) * feat: implement basic newsletter functionality with socket integration and event handling * feat: enhance media handling for newsletters with raw media upload support * feat: working updatePicture, removePicure, adminCount, mute, Unmute * fix: fetchMessages * chore: cleanup * fix: update newsletter metadata path and query ID for consistency. newsletterMetadata works now * chore: enhance newsletter metadata parsing and error handling * fix: correct DELETE QueryId value in Newsletter.ts * chore: split mex stuffs to own file * chore: remove as any --- src/Socket/groups.ts | 2 + src/Socket/messages-recv.ts | 159 +++++++++++++++++++++++ src/Socket/messages-send.ts | 29 ++++- src/Socket/mex.ts | 58 +++++++++ src/Socket/newsletter.ts | 227 +++++++++++++++++++++++++++++++++ src/Types/Events.ts | 10 ++ src/Types/Message.ts | 2 + src/Types/Newsletter.ts | 98 ++++++++++++++ src/Types/index.ts | 1 + src/Utils/decode-wa-message.ts | 3 +- src/Utils/generics.ts | 4 + src/Utils/messages-media.ts | 57 ++++++++- src/Utils/messages.ts | 66 ++++++++-- 13 files changed, 697 insertions(+), 19 deletions(-) create mode 100644 src/Socket/mex.ts create mode 100644 src/Socket/newsletter.ts create mode 100644 src/Types/Newsletter.ts diff --git a/src/Socket/groups.ts b/src/Socket/groups.ts index c001779..e979a51 100644 --- a/src/Socket/groups.ts +++ b/src/Socket/groups.ts @@ -359,3 +359,5 @@ export const extractGroupMetadata = (result: BinaryNode) => { } return metadata } + +export type GroupsSocket = ReturnType diff --git a/src/Socket/messages-recv.ts b/src/Socket/messages-recv.ts index e13bc7c..4115bde 100644 --- a/src/Socket/messages-recv.ts +++ b/src/Socket/messages-recv.ts @@ -47,6 +47,7 @@ import { getBinaryNodeChild, getBinaryNodeChildBuffer, getBinaryNodeChildren, + getBinaryNodeChildString, isJidGroup, isJidStatusBroadcast, isJidUser, @@ -403,6 +404,12 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { logger.debug({ jid }, 'got privacy token update') } + break + case 'newsletter': + await handleNewsletterNotification(node) + break + case 'mex': + await handleMexNewsletterNotification(node) break case 'w:gp2': handleGroupNotification(node.attrs.participant, child, result) @@ -1083,6 +1090,158 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { } } + // Handles newsletter notifications + async function handleNewsletterNotification(node: BinaryNode) { + const from = node.attrs.from + const [child] = getAllBinaryNodeChildren(node) + const author = node.attrs.participant + + logger.info({ from, child }, 'got newsletter notification') + + switch (child.tag) { + case 'reaction': + const reactionUpdate = { + id: from, + server_id: child.attrs.message_id, + reaction: { + code: getBinaryNodeChildString(child, 'reaction'), + count: 1 + } + } + ev.emit('newsletter.reaction', reactionUpdate) + break + + case 'view': + const viewUpdate = { + id: from, + server_id: child.attrs.message_id, + count: parseInt(child.content?.toString() || '0', 10) + } + ev.emit('newsletter.view', viewUpdate) + break + + case 'participant': + const participantUpdate = { + id: from, + author, + user: child.attrs.jid, + action: child.attrs.action, + new_role: child.attrs.role + } + ev.emit('newsletter-participants.update', participantUpdate) + break + + case 'update': + const settingsNode = getBinaryNodeChild(child, 'settings') + if (settingsNode) { + const update: Record = {} + const nameNode = getBinaryNodeChild(settingsNode, 'name') + if (nameNode?.content) update.name = nameNode.content.toString() + + const descriptionNode = getBinaryNodeChild(settingsNode, 'description') + if (descriptionNode?.content) update.description = descriptionNode.content.toString() + + ev.emit('newsletter-settings.update', { + id: from, + update + }) + } + + break + + case 'message': + const plaintextNode = getBinaryNodeChild(child, 'plaintext') + if (plaintextNode?.content) { + try { + const contentBuf = + typeof plaintextNode.content === 'string' + ? Buffer.from(plaintextNode.content, 'binary') + : Buffer.from(plaintextNode.content as Uint8Array) + const messageProto = proto.Message.decode(contentBuf) + const fullMessage = proto.WebMessageInfo.fromObject({ + key: { + remoteJid: from, + id: child.attrs.message_id || child.attrs.server_id, + fromMe: false + }, + message: messageProto, + messageTimestamp: +child.attrs.t + }) + await upsertMessage(fullMessage, 'append') + logger.info('Processed plaintext newsletter message') + } catch (error) { + logger.error({ error }, 'Failed to decode plaintext newsletter message') + } + } + + break + + default: + logger.warn({ node }, 'Unknown newsletter notification') + break + } + } + + // Handles mex newsletter notifications + async function handleMexNewsletterNotification(node: BinaryNode) { + const mexNode = getBinaryNodeChild(node, 'mex') + if (!mexNode?.content) { + logger.warn({ node }, 'Invalid mex newsletter notification') + return + } + + let data: any + try { + data = JSON.parse(mexNode.content.toString()) + } catch (error) { + logger.error({ err: error, node }, 'Failed to parse mex newsletter notification') + return + } + + const operation = data?.operation + const updates = data?.updates + + if (!updates || !operation) { + logger.warn({ data }, 'Invalid mex newsletter notification content') + return + } + + logger.info({ operation, updates }, 'got mex newsletter notification') + + switch (operation) { + case 'NotificationNewsletterUpdate': + for (const update of updates) { + if (update.jid && update.settings && Object.keys(update.settings).length > 0) { + ev.emit('newsletter-settings.update', { + id: update.jid, + update: update.settings + }) + } + } + + break + + case 'NotificationNewsletterAdminPromote': + for (const update of updates) { + if (update.jid && update.user) { + ev.emit('newsletter-participants.update', { + id: update.jid, + author: node.attrs.from, + user: update.user, + new_role: 'ADMIN', + action: 'promote' + }) + } + } + + break + + default: + logger.info({ operation, data }, 'Unhandled mex newsletter notification') + break + } + } + // recv a message ws.on('CB:message', (node: BinaryNode) => { processNode('message', node, 'processing message', handleMessage) diff --git a/src/Socket/messages-send.ts b/src/Socket/messages-send.ts index 85fbfc2..f266955 100644 --- a/src/Socket/messages-send.ts +++ b/src/Socket/messages-send.ts @@ -16,6 +16,7 @@ import { assertMediaContent, bindWaitForEvent, decryptMediaRetryData, + encodeNewsletterMessage, encodeSignedDeviceIdentity, encodeWAMessage, encryptMediaRetryRequest, @@ -46,6 +47,7 @@ import { } from '../WABinary' import { USyncQuery, USyncUser } from '../WAUSync' import { makeGroupsSocket } from './groups' +import { makeNewsletterSocket, NewsletterSocket } from './newsletter' export const makeMessagesSocket = (config: SocketConfig) => { const { @@ -56,7 +58,7 @@ export const makeMessagesSocket = (config: SocketConfig) => { patchMessageBeforeSending, cachedGroupMetadata } = config - const sock = makeGroupsSocket(config) + const sock: NewsletterSocket = makeNewsletterSocket(makeGroupsSocket(config)) const { ev, authState, @@ -373,6 +375,7 @@ export const makeMessagesSocket = (config: SocketConfig) => { const isGroup = server === 'g.us' const isStatus = jid === statusJid const isLid = server === 'lid' + const isNewsletter = server === 'newsletter' msgId = msgId || generateMessageIDV2(sock.user?.id) useUserDevicesCache = useUserDevicesCache !== false @@ -411,6 +414,30 @@ export const makeMessagesSocket = (config: SocketConfig) => { extraAttrs['mediatype'] = mediaType } + if (isNewsletter) { + // Patch message if needed, then encode as plaintext + const patched = patchMessageBeforeSending ? await patchMessageBeforeSending(message, []) : message + const bytes = encodeNewsletterMessage(patched as proto.IMessage) + binaryNodeContent.push({ + tag: 'plaintext', + attrs: {}, + content: bytes + }) + const stanza: BinaryNode = { + tag: 'message', + attrs: { + to: jid, + id: msgId, + type: getMessageType(message), + ...(additionalAttributes || {}) + }, + content: binaryNodeContent + } + logger.debug({ msgId }, `sending newsletter message to ${jid}`) + await sendNode(stanza) + return + } + if (normalizeMessageContent(message)?.pinInChatMessage) { extraAttrs['decrypt-fail'] = 'hide' } diff --git a/src/Socket/mex.ts b/src/Socket/mex.ts new file mode 100644 index 0000000..ae976f1 --- /dev/null +++ b/src/Socket/mex.ts @@ -0,0 +1,58 @@ +import { Boom } from '@hapi/boom' +import { BinaryNode } from '../WABinary' +import { getBinaryNodeChild, S_WHATSAPP_NET } from '../WABinary' + +const wMexQuery = ( + variables: Record, + queryId: string, + query: (node: BinaryNode) => Promise, + generateMessageTag: () => string +) => { + return query({ + tag: 'iq', + attrs: { + id: generateMessageTag(), + type: 'get', + to: S_WHATSAPP_NET, + xmlns: 'w:mex' + }, + content: [ + { + tag: 'query', + attrs: { query_id: queryId }, + content: Buffer.from(JSON.stringify({ variables }), 'utf-8') + } + ] + }) +} + +export const executeWMexQuery = async ( + variables: Record, + queryId: string, + dataPath: string, + query: (node: BinaryNode) => Promise, + generateMessageTag: () => string +): Promise => { + const result = await wMexQuery(variables, queryId, query, generateMessageTag) + const child = getBinaryNodeChild(result, 'result') + if (child?.content) { + const data = JSON.parse(child.content.toString()) + + if (data.errors && data.errors.length > 0) { + const errorMessages = data.errors.map((err: Error) => err.message || 'Unknown error').join(', ') + const firstError = data.errors[0] + const errorCode = firstError.extensions?.error_code || 400 + throw new Boom(`GraphQL server error: ${errorMessages}`, { statusCode: errorCode, data: firstError }) + } + + const response = dataPath ? data?.data?.[dataPath] : data?.data + if (typeof response !== 'undefined') { + return response as T + } + } + + const action = (dataPath || '').startsWith('xwa2_') + ? dataPath.substring(5).replace(/_/g, ' ') + : dataPath?.replace(/_/g, ' ') + throw new Boom(`Failed to ${action}, unexpected response structure.`, { statusCode: 400, data: result }) +} diff --git a/src/Socket/newsletter.ts b/src/Socket/newsletter.ts new file mode 100644 index 0000000..c0457e8 --- /dev/null +++ b/src/Socket/newsletter.ts @@ -0,0 +1,227 @@ +import type { NewsletterCreateResponse, WAMediaUpload } from '../Types' +import { NewsletterMetadata, NewsletterUpdate, QueryIds, XWAPaths } from '../Types' +import { generateProfilePicture } from '../Utils/messages-media' +import { getBinaryNodeChild } from '../WABinary' +import { GroupsSocket } from './groups' +import { executeWMexQuery as genericExecuteWMexQuery } from './mex' + +const parseNewsletterCreateResponse = (response: NewsletterCreateResponse): NewsletterMetadata => { + const { id, thread_metadata: thread, viewer_metadata: viewer } = response + return { + id: id, + owner: undefined, + name: thread.name.text, + creation_time: parseInt(thread.creation_time, 10), + description: thread.description.text, + invite: thread.invite, + subscribers: parseInt(thread.subscribers_count, 10), + verification: thread.verification, + picture: { + id: thread.picture.id, + directPath: thread.picture.direct_path + }, + mute_state: viewer.mute + } +} + +const parseNewsletterMetadata = (result: unknown): NewsletterMetadata | null => { + if (typeof result !== 'object' || result === null) { + return null + } + + if ('id' in result && typeof result.id === 'string') { + return result as NewsletterMetadata + } + + if ('result' in result && typeof result.result === 'object' && result.result !== null && 'id' in result.result) { + return result.result as NewsletterMetadata + } + + return null +} + +export const makeNewsletterSocket = (sock: GroupsSocket) => { + const { query, generateMessageTag } = sock + + const executeWMexQuery = (variables: Record, queryId: string, dataPath: string): Promise => { + return genericExecuteWMexQuery(variables, queryId, dataPath, query, generateMessageTag) + } + + const newsletterUpdate = async (jid: string, updates: NewsletterUpdate) => { + const variables = { + newsletter_id: jid, + updates: { + ...updates, + settings: null + } + } + return executeWMexQuery(variables, QueryIds.UPDATE_METADATA, 'xwa2_newsletter_update') + } + + return { + ...sock, + newsletterCreate: async (name: string, description?: string): Promise => { + const variables = { + input: { + name, + description: description ?? null + } + } + const rawResponse = await executeWMexQuery( + variables, + QueryIds.CREATE, + XWAPaths.xwa2_newsletter_create + ) + return parseNewsletterCreateResponse(rawResponse) + }, + + newsletterUpdate, + + newsletterSubscribers: async (jid: string) => { + return executeWMexQuery<{ subscribers: number }>( + { newsletter_id: jid }, + QueryIds.SUBSCRIBERS, + XWAPaths.xwa2_newsletter_subscribers + ) + }, + + newsletterMetadata: async (type: 'invite' | 'jid', key: string) => { + const variables = { + fetch_creation_time: true, + fetch_full_image: true, + fetch_viewer_metadata: true, + input: { + key, + type: type.toUpperCase() + } + } + const result = await executeWMexQuery(variables, QueryIds.METADATA, XWAPaths.xwa2_newsletter_metadata) + return parseNewsletterMetadata(result) + }, + + newsletterFollow: (jid: string) => { + return executeWMexQuery({ newsletter_id: jid }, QueryIds.FOLLOW, XWAPaths.xwa2_newsletter_follow) + }, + + newsletterUnfollow: (jid: string) => { + return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNFOLLOW, XWAPaths.xwa2_newsletter_unfollow) + }, + + newsletterMute: (jid: string) => { + return executeWMexQuery({ newsletter_id: jid }, QueryIds.MUTE, XWAPaths.xwa2_newsletter_mute_v2) + }, + + newsletterUnmute: (jid: string) => { + return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNMUTE, XWAPaths.xwa2_newsletter_unmute_v2) + }, + + newsletterUpdateName: async (jid: string, name: string) => { + return await newsletterUpdate(jid, { name }) + }, + + newsletterUpdateDescription: async (jid: string, description: string) => { + return await newsletterUpdate(jid, { description }) + }, + + newsletterUpdatePicture: async (jid: string, content: WAMediaUpload) => { + const { img } = await generateProfilePicture(content) + return await newsletterUpdate(jid, { picture: img.toString('base64') }) + }, + + newsletterRemovePicture: async (jid: string) => { + return await newsletterUpdate(jid, { picture: '' }) + }, + + newsletterReactMessage: async (jid: string, serverId: string, reaction?: string) => { + await query({ + tag: 'message', + attrs: { + to: jid, + ...(reaction ? {} : { edit: '7' }), + type: 'reaction', + server_id: serverId, + id: generateMessageTag() + }, + content: [ + { + tag: 'reaction', + attrs: reaction ? { code: reaction } : {} + } + ] + }) + }, + + newsletterFetchMessages: async (jid: string, count: number, since: number, after: number) => { + const messageUpdateAttrs: { count: string; since?: string; after?: string } = { + count: count.toString() + } + if (typeof since === 'number') { + messageUpdateAttrs.since = since.toString() + } + + if (after) { + messageUpdateAttrs.after = after.toString() + } + + const result = await query({ + tag: 'iq', + attrs: { + id: generateMessageTag(), + type: 'get', + xmlns: 'newsletter', + to: jid + }, + content: [ + { + tag: 'message_updates', + attrs: messageUpdateAttrs + } + ] + }) + return result + }, + + subscribeNewsletterUpdates: async (jid: string): Promise<{ duration: string } | null> => { + const result = await query({ + tag: 'iq', + attrs: { + id: generateMessageTag(), + type: 'set', + xmlns: 'newsletter', + to: jid + }, + content: [{ tag: 'live_updates', attrs: {}, content: [] }] + }) + const liveUpdatesNode = getBinaryNodeChild(result, 'live_updates') + const duration = liveUpdatesNode?.attrs?.duration + return duration ? { duration: duration } : null + }, + + newsletterAdminCount: async (jid: string): Promise => { + const response = await executeWMexQuery<{ admin_count: number }>( + { newsletter_id: jid }, + QueryIds.ADMIN_COUNT, + XWAPaths.xwa2_newsletter_admin_count + ) + return response.admin_count + }, + + newsletterChangeOwner: async (jid: string, newOwnerJid: string) => { + await executeWMexQuery( + { newsletter_id: jid, user_id: newOwnerJid }, + QueryIds.CHANGE_OWNER, + XWAPaths.xwa2_newsletter_change_owner + ) + }, + + newsletterDemote: async (jid: string, userJid: string) => { + await executeWMexQuery({ newsletter_id: jid, user_id: userJid }, QueryIds.DEMOTE, XWAPaths.xwa2_newsletter_demote) + }, + + newsletterDelete: async (jid: string) => { + await executeWMexQuery({ newsletter_id: jid }, QueryIds.DELETE, XWAPaths.xwa2_newsletter_delete_v2) + } + } +} + +export type NewsletterSocket = ReturnType diff --git a/src/Types/Events.ts b/src/Types/Events.ts index 813e5d0..f7d7ff4 100644 --- a/src/Types/Events.ts +++ b/src/Types/Events.ts @@ -71,6 +71,16 @@ export type BaileysEventMap = { call: WACallEvent[] 'labels.edit': Label 'labels.association': { association: LabelAssociation; type: 'add' | 'remove' } + + /** Newsletter-related events */ + 'newsletter.reaction': { + id: string + server_id: string + reaction: { code?: string; count?: number; removed?: boolean } + } + 'newsletter.view': { id: string; server_id: string; count: number } + 'newsletter-participants.update': { id: string; author: string; user: string; new_role: string; action: string } + 'newsletter-settings.update': { id: string; update: any } } export type BufferedEventData = { diff --git a/src/Types/Message.ts b/src/Types/Message.ts index 5c91419..2ef4b34 100644 --- a/src/Types/Message.ts +++ b/src/Types/Message.ts @@ -15,6 +15,7 @@ export type WAContactMessage = proto.Message.IContactMessage export type WAContactsArrayMessage = proto.Message.IContactsArrayMessage export type WAMessageKey = proto.IMessageKey & { senderLid?: string + server_id?: string senderPn?: string participantLid?: string participantPn?: string @@ -292,6 +293,7 @@ export type MediaGenerationOptions = { export type MessageContentGenerationOptions = MediaGenerationOptions & { getUrlInfo?: (text: string) => Promise getProfilePicUrl?: (jid: string, type: 'image' | 'preview') => Promise + jid?: string } export type MessageGenerationOptions = MessageContentGenerationOptions & MessageGenerationOptionsFromContent diff --git a/src/Types/Newsletter.ts b/src/Types/Newsletter.ts new file mode 100644 index 0000000..4355eca --- /dev/null +++ b/src/Types/Newsletter.ts @@ -0,0 +1,98 @@ +export enum XWAPaths { + xwa2_newsletter_create = 'xwa2_newsletter_create', + xwa2_newsletter_subscribers = 'xwa2_newsletter_subscribers', + xwa2_newsletter_view = 'xwa2_newsletter_view', + xwa2_newsletter_metadata = 'xwa2_newsletter', + xwa2_newsletter_admin_count = 'xwa2_newsletter_admin', + xwa2_newsletter_mute_v2 = 'xwa2_newsletter_mute_v2', + xwa2_newsletter_unmute_v2 = 'xwa2_newsletter_unmute_v2', + xwa2_newsletter_follow = 'xwa2_newsletter_follow', + xwa2_newsletter_unfollow = 'xwa2_newsletter_unfollow', + xwa2_newsletter_change_owner = 'xwa2_newsletter_change_owner', + xwa2_newsletter_demote = 'xwa2_newsletter_demote', + xwa2_newsletter_delete_v2 = 'xwa2_newsletter_delete_v2' +} +export enum QueryIds { + CREATE = '8823471724422422', + UPDATE_METADATA = '24250201037901610', + METADATA = '6563316087068696', + SUBSCRIBERS = '9783111038412085', + FOLLOW = '7871414976211147', + UNFOLLOW = '7238632346214362', + MUTE = '29766401636284406', + UNMUTE = '9864994326891137', + ADMIN_COUNT = '7130823597031706', + CHANGE_OWNER = '7341777602580933', + DEMOTE = '6551828931592903', + DELETE = '30062808666639665' +} +export type NewsletterUpdate = { + name?: string + description?: string + picture?: string +} +export interface NewsletterCreateResponse { + id: string + state: { type: string } + thread_metadata: { + creation_time: string + description: { id: string; text: string; update_time: string } + handle: string | null + invite: string + name: { id: string; text: string; update_time: string } + picture: { direct_path: string; id: string; type: string } + preview: { direct_path: string; id: string; type: string } + subscribers_count: string + verification: 'VERIFIED' | 'UNVERIFIED' + } + viewer_metadata: { + mute: 'ON' | 'OFF' + role: NewsletterViewRole + } +} +export interface NewsletterCreateResponse { + id: string + state: { type: string } + thread_metadata: { + creation_time: string + description: { id: string; text: string; update_time: string } + handle: string | null + invite: string + name: { id: string; text: string; update_time: string } + picture: { direct_path: string; id: string; type: string } + preview: { direct_path: string; id: string; type: string } + subscribers_count: string + verification: 'VERIFIED' | 'UNVERIFIED' + } + viewer_metadata: { + mute: 'ON' | 'OFF' + role: NewsletterViewRole + } +} +export type NewsletterViewRole = 'ADMIN' | 'GUEST' | 'OWNER' | 'SUBSCRIBER' +export interface NewsletterMetadata { + id: string + owner?: string + name: string + description?: string + invite?: string + creation_time?: number + subscribers?: number + picture?: { + url?: string + directPath?: string + mediaKey?: string + id?: string + } + verification?: 'VERIFIED' | 'UNVERIFIED' + reaction_codes?: { + code: string + count: number + }[] + mute_state?: 'ON' | 'OFF' + thread_metadata?: { + creation_time?: number + name?: string + description?: string + } +} diff --git a/src/Types/index.ts b/src/Types/index.ts index 1a22e82..079658d 100644 --- a/src/Types/index.ts +++ b/src/Types/index.ts @@ -9,6 +9,7 @@ export * from './Events' export * from './Product' export * from './Call' export * from './Signal' +export * from './Newsletter' import { AuthenticationState } from './Auth' import { SocketConfig } from './Socket' diff --git a/src/Utils/decode-wa-message.ts b/src/Utils/decode-wa-message.ts index 37e6f4a..3a470f7 100644 --- a/src/Utils/decode-wa-message.ts +++ b/src/Utils/decode-wa-message.ts @@ -114,7 +114,8 @@ export function decodeMessageNode(stanza: BinaryNode, meId: string, meLid: strin senderPn: stanza?.attrs?.sender_pn, participant, participantPn: stanza?.attrs?.participant_pn, - participantLid: stanza?.attrs?.participant_lid + participantLid: stanza?.attrs?.participant_lid, + ...(msgType === 'newsletter' && stanza.attrs.server_id ? { server_id: stanza.attrs.server_id } : {}) } const fullMessage: proto.IWebMessageInfo = { diff --git a/src/Utils/generics.ts b/src/Utils/generics.ts index 37d3bf7..c2b5192 100644 --- a/src/Utils/generics.ts +++ b/src/Utils/generics.ts @@ -443,3 +443,7 @@ export function bytesToCrockford(buffer: Buffer): string { return crockford.join('') } + +export function encodeNewsletterMessage(message: proto.IMessage): Uint8Array { + return proto.Message.encode(message).finish() +} diff --git a/src/Utils/messages-media.ts b/src/Utils/messages-media.ts index 6bbf072..61d94f8 100644 --- a/src/Utils/messages-media.ts +++ b/src/Utils/messages-media.ts @@ -60,6 +60,47 @@ export const hkdfInfoKey = (type: MediaType) => { return `WhatsApp ${hkdfInfo} Keys` } +export const getRawMediaUploadData = async (media: WAMediaUpload, mediaType: MediaType, logger?: ILogger) => { + const { stream } = await getStream(media) + logger?.debug('got stream for raw upload') + + const hasher = Crypto.createHash('sha256') + const filePath = join(tmpdir(), mediaType + generateMessageIDV2()) + const fileWriteStream = createWriteStream(filePath) + + let fileLength = 0 + try { + for await (const data of stream) { + fileLength += data.length + hasher.update(data) + if (!fileWriteStream.write(data)) { + await once(fileWriteStream, 'drain') + } + } + + fileWriteStream.end() + await once(fileWriteStream, 'finish') + stream.destroy() + const fileSha256 = hasher.digest() + logger?.debug('hashed data for raw upload') + return { + filePath: filePath, + fileSha256, + fileLength + } + } catch (error) { + fileWriteStream.destroy() + stream.destroy() + try { + await fs.unlink(filePath) + } catch { + // + } + + throw error + } +} + /** generates all the keys required to encrypt/decrypt & sign a media message */ export async function getMediaKeys( buffer: Uint8Array | string | null | undefined, @@ -143,22 +184,24 @@ export const generateProfilePicture = async ( mediaUpload: WAMediaUpload, dimensions?: { width: number; height: number } ) => { + let buffer: Buffer + const { width: w = 640, height: h = 640 } = dimensions || {} - let bufferOrFilePath: Buffer | string if (Buffer.isBuffer(mediaUpload)) { - bufferOrFilePath = mediaUpload - } else if ('url' in mediaUpload) { - bufferOrFilePath = mediaUpload.url.toString() + buffer = mediaUpload } else { - bufferOrFilePath = await toBuffer(mediaUpload.stream) + // Use getStream to handle all WAMediaUpload types (Buffer, Stream, URL) + const { stream } = await getStream(mediaUpload) + // Convert the resulting stream to a buffer + buffer = await toBuffer(stream) } const lib = await getImageProcessingLibrary() let img: Promise if ('sharp' in lib && typeof lib.sharp?.default === 'function') { img = lib.sharp - .default(bufferOrFilePath) + .default(buffer) .resize(w, h) .jpeg({ quality: 50 @@ -166,7 +209,7 @@ export const generateProfilePicture = async ( .toBuffer() } else if ('jimp' in lib && typeof lib.jimp?.read === 'function') { const { read, MIME_JPEG, RESIZE_BILINEAR } = lib.jimp - const jimp = await read(bufferOrFilePath as string) + const jimp = await read(buffer) const min = Math.min(jimp.getWidth(), jimp.getHeight()) const cropped = jimp.crop(0, 0, min, min) diff --git a/src/Utils/messages.ts b/src/Utils/messages.ts index 1c618bf..8c69c2d 100644 --- a/src/Utils/messages.ts +++ b/src/Utils/messages.ts @@ -9,7 +9,6 @@ import { AnyMediaMessageContent, AnyMessageContent, DownloadableMessage, - MediaGenerationOptions, MediaType, MessageContentGenerationOptions, MessageGenerationOptions, @@ -23,7 +22,7 @@ import { WAProto, WATextMessage } from '../Types' -import { isJidGroup, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary' +import { isJidGroup, isJidNewsletter, isJidStatusBroadcast, jidNormalizedUser } from '../WABinary' import { sha256 } from './crypto' import { generateMessageIDV2, getKeyAuthor, unixTimestampSeconds } from './generics' import { ILogger } from './logger' @@ -33,6 +32,7 @@ import { generateThumbnail, getAudioDuration, getAudioWaveform, + getRawMediaUploadData, MediaDownloadOptions } from './messages-media' @@ -108,7 +108,10 @@ const assertColor = async color => { } } -export const prepareWAMessageMedia = async (message: AnyMediaMessageContent, options: MediaGenerationOptions) => { +export const prepareWAMessageMedia = async ( + message: AnyMediaMessageContent, + options: MessageContentGenerationOptions +) => { const logger = options.logger let mediaType: (typeof MEDIA_KEYS)[number] | undefined @@ -127,13 +130,12 @@ export const prepareWAMessageMedia = async (message: AnyMediaMessageContent, opt media: message[mediaType] } delete uploadData[mediaType] - // check if cacheable + generate cache key + const cacheableKey = typeof uploadData.media === 'object' && 'url' in uploadData.media && !!uploadData.media.url && !!options.mediaCache && - // generate the key mediaType + ':' + uploadData.media.url.toString() if (mediaType === 'document' && !uploadData.fileName) { @@ -144,7 +146,6 @@ export const prepareWAMessageMedia = async (message: AnyMediaMessageContent, opt uploadData.mimetype = MIMETYPE_MAP[mediaType] } - // check for cache hit if (cacheableKey) { const mediaBuff = options.mediaCache!.get(cacheableKey) if (mediaBuff) { @@ -159,6 +160,48 @@ export const prepareWAMessageMedia = async (message: AnyMediaMessageContent, opt } } + const isNewsletter = !!options.jid && isJidNewsletter(options.jid) + if (isNewsletter) { + logger?.info({ key: cacheableKey }, 'Preparing raw media for newsletter') + const { filePath, fileSha256, fileLength } = await getRawMediaUploadData( + uploadData.media, + options.mediaTypeOverride || mediaType, + logger + ) + + const fileSha256B64 = fileSha256.toString('base64') + const { mediaUrl, directPath } = await options.upload(filePath, { + fileEncSha256B64: fileSha256B64, + mediaType: mediaType, + timeoutMs: options.mediaUploadTimeoutMs + }) + + await fs.unlink(filePath) + + const obj = WAProto.Message.fromObject({ + [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject({ + url: mediaUrl, + directPath, + fileSha256, + fileLength, + ...uploadData, + media: undefined + }) + }) + + if (uploadData.ptv) { + obj.ptvMessage = obj.videoMessage + delete obj.videoMessage + } + + if (cacheableKey) { + logger?.debug({ cacheableKey }, 'set cache') + options.mediaCache!.set(cacheableKey, WAProto.Message.encode(obj).finish()) + } + + return obj + } + const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined' const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && typeof uploadData['jpegThumbnail'] === 'undefined' @@ -174,7 +217,7 @@ export const prepareWAMessageMedia = async (message: AnyMediaMessageContent, opt opts: options.options } ) - // url safe Base64 encode the SHA256 hash of the body + const fileEncSha256B64 = fileEncSha256.toString('base64') const [{ mediaUrl, directPath }] = await Promise.all([ (async () => { @@ -539,7 +582,7 @@ export const generateWAMessageFromContent = ( const timestamp = unixTimestampSeconds(options.timestamp) const { quoted, userJid } = options - if (quoted) { + if (quoted && !isJidNewsletter(jid)) { const participant = quoted.key.fromMe ? userJid : quoted.participant || quoted.key.participant || quoted.key.remoteJid @@ -574,7 +617,9 @@ export const generateWAMessageFromContent = ( // and it's not a protocol message -- delete, toggle disappear message key !== 'protocolMessage' && // already not converted to disappearing message - key !== 'ephemeralMessage' + key !== 'ephemeralMessage' && + // newsletters don't support ephemeral messages + !isJidNewsletter(jid) ) { innerMessage[key].contextInfo = { ...(innerMessage[key].contextInfo || {}), @@ -603,7 +648,8 @@ export const generateWAMessageFromContent = ( export const generateWAMessage = async (jid: string, content: AnyMessageContent, options: MessageGenerationOptions) => { // ensure msg ID is with every log options.logger = options?.logger?.child({ msgId: options.messageId }) - return generateWAMessageFromContent(jid, await generateWAMessageContent(content, options), options) + // Pass jid in the options to generateWAMessageContent + return generateWAMessageFromContent(jid, await generateWAMessageContent(content, { ...options, jid }), options) } /** Get the key to access the true type of content */ From 9b5afc8c6b4c7ec7ebe240285f728144c4490d1c Mon Sep 17 00:00:00 2001 From: Cassio Santos Date: Thu, 3 Jul 2025 17:08:58 -0300 Subject: [PATCH 05/12] fix: add lid sutff to message.key type (#1586) * fix: add lid sutff to message.key type * feat: add view once information to msg key --- src/Types/Message.ts | 3 ++- src/Utils/decode-wa-message.ts | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Types/Message.ts b/src/Types/Message.ts index 2ef4b34..ec86db7 100644 --- a/src/Types/Message.ts +++ b/src/Types/Message.ts @@ -9,7 +9,7 @@ import { CacheStore } from './Socket' // export the WAMessage Prototypes export { proto as WAProto } -export type WAMessage = proto.IWebMessageInfo +export type WAMessage = proto.IWebMessageInfo & { key: WAMessageKey } export type WAMessageContent = proto.IMessage export type WAContactMessage = proto.Message.IContactMessage export type WAContactsArrayMessage = proto.Message.IContactsArrayMessage @@ -19,6 +19,7 @@ export type WAMessageKey = proto.IMessageKey & { senderPn?: string participantLid?: string participantPn?: string + isViewOnce?: boolean } export type WATextMessage = proto.Message.IExtendedTextMessage export type WAContextInfo = proto.IContextInfo diff --git a/src/Utils/decode-wa-message.ts b/src/Utils/decode-wa-message.ts index 3a470f7..c7f71af 100644 --- a/src/Utils/decode-wa-message.ts +++ b/src/Utils/decode-wa-message.ts @@ -1,6 +1,6 @@ import { Boom } from '@hapi/boom' import { proto } from '../../WAProto' -import { SignalRepository, WAMessageKey } from '../Types' +import { SignalRepository, WAMessage, WAMessageKey } from '../Types' import { areJidsSameUser, BinaryNode, @@ -118,7 +118,7 @@ export function decodeMessageNode(stanza: BinaryNode, meId: string, meLid: strin ...(msgType === 'newsletter' && stanza.attrs.server_id ? { server_id: stanza.attrs.server_id } : {}) } - const fullMessage: proto.IWebMessageInfo = { + const fullMessage: WAMessage = { key, messageTimestamp: +stanza.attrs.t, pushName: pushname, @@ -158,6 +158,10 @@ export const decryptMessageNode = ( fullMessage.verifiedBizName = details.verifiedName } + if (tag === 'unavailable' && attrs.type === 'view_once') { + fullMessage.key.isViewOnce = true + } + if (tag !== 'enc' && tag !== 'plaintext') { continue } From 691b40a8f76dd7884379d0d67e0daa2c199e1028 Mon Sep 17 00:00:00 2001 From: Pedro Dias Date: Fri, 4 Jul 2025 17:28:52 -0300 Subject: [PATCH 06/12] uSync error for disappear_mode (#1589) Fixed the problem that occurred when pushing the disappear_mode. --- src/WAUSync/Protocols/USyncDisappearingModeProtocol.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WAUSync/Protocols/USyncDisappearingModeProtocol.ts b/src/WAUSync/Protocols/USyncDisappearingModeProtocol.ts index 6568f17..8b5d24b 100644 --- a/src/WAUSync/Protocols/USyncDisappearingModeProtocol.ts +++ b/src/WAUSync/Protocols/USyncDisappearingModeProtocol.ts @@ -21,7 +21,7 @@ export class USyncDisappearingModeProtocol implements USyncQueryProtocol { } parser(node: BinaryNode): DisappearingModeData | undefined { - if (node.tag === 'status') { + if (node.tag === 'disappearing_mode') { assertNodeErrorFree(node) const duration: number = +node?.attrs.duration const setAt = new Date(+(node?.attrs.t || 0) * 1000) From 34188a3a22f060cdbb38af6dc960c3d519c742ac Mon Sep 17 00:00:00 2001 From: fwidjaja94 Date: Sat, 5 Jul 2025 03:29:04 +0700 Subject: [PATCH 07/12] fix: remove chat attribute deletions in history.ts (#1590) --- src/Utils/history.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/Utils/history.ts b/src/Utils/history.ts index 20461c7..eedbdff 100644 --- a/src/Utils/history.ts +++ b/src/Utils/history.ts @@ -46,9 +46,6 @@ export const processHistoryMessage = (item: proto.IHistorySync) => { const msgs = chat.messages || [] delete chat.messages - delete chat.archived - delete chat.muteEndTime - delete chat.pinned for (const item of msgs) { const message = item.message! @@ -75,10 +72,6 @@ export const processHistoryMessage = (item: proto.IHistorySync) => { } } - if (isJidUser(chat.id) && chat.readOnly && chat.archived) { - delete chat.readOnly - } - chats.push({ ...chat }) } From 4ccec1f6cec44a870b8dcfee1786b6670a123bee Mon Sep 17 00:00:00 2001 From: Cassio Santos Date: Fri, 4 Jul 2025 17:31:46 -0300 Subject: [PATCH 08/12] fix: do not throw error on socket closed while opening (#1576) --- src/Socket/socket.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Socket/socket.ts b/src/Socket/socket.ts index 763513a..e487c0d 100644 --- a/src/Socket/socket.ts +++ b/src/Socket/socket.ts @@ -345,7 +345,6 @@ export const makeSocket = (config: SocketConfig) => { clearTimeout(qrTimer) ws.removeAllListeners('close') - ws.removeAllListeners('error') ws.removeAllListeners('open') ws.removeAllListeners('message') From 92b4c68de0d1e640108d7d840e080c069e975bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas=20de=20Oliveira=20Lopes?= <55464917+jlucaso1@users.noreply.github.com> Date: Fri, 4 Jul 2025 19:25:19 -0300 Subject: [PATCH 09/12] fix: Handle data: URIs in getStream to prevent server crash (#1524) --- src/Utils/messages-media.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Utils/messages-media.ts b/src/Utils/messages-media.ts index 61d94f8..fd78e94 100644 --- a/src/Utils/messages-media.ts +++ b/src/Utils/messages-media.ts @@ -317,7 +317,14 @@ export const getStream = async (item: WAMediaUpload, opts?: AxiosRequestConfig) return { stream: item.stream, type: 'readable' } as const } - if (item.url.toString().startsWith('http://') || item.url.toString().startsWith('https://')) { + const urlStr = item.url.toString() + + if (urlStr.startsWith('data:')) { + const buffer = Buffer.from(urlStr.split(',')[1], 'base64') + return { stream: toReadable(buffer), type: 'buffer' } as const + } + + if (urlStr.startsWith('http://') || urlStr.startsWith('https://')) { return { stream: await getHttpStream(item.url, opts), type: 'remote' } as const } From 719a57b2757c89a7bcf5abcf0f37292f3da59a1f Mon Sep 17 00:00:00 2001 From: Rajeh Taher Date: Sat, 5 Jul 2025 23:58:44 +0300 Subject: [PATCH 10/12] Added message range to the clear chat action (#1534) * chat-utils: Added message range to the clear chat action * Chat: add field to type (thanks @Kiss from discord) * Update src/Utils/chat-utils.ts --- src/Types/Chat.ts | 1 + src/Utils/chat-utils.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Types/Chat.ts b/src/Types/Chat.ts index f5d008a..c3542dd 100644 --- a/src/Types/Chat.ts +++ b/src/Types/Chat.ts @@ -94,6 +94,7 @@ export type ChatModification = } | { clear: boolean + lastMessages: LastMessageList } | { deleteForMe: { deleteMedia: boolean; key: WAMessageKey; timestamp: number } diff --git a/src/Utils/chat-utils.ts b/src/Utils/chat-utils.ts index 3556591..2a1f0b6 100644 --- a/src/Utils/chat-utils.ts +++ b/src/Utils/chat-utils.ts @@ -584,7 +584,9 @@ export const chatModificationToAppPatch = (mod: ChatModification, jid: string) = } else if ('clear' in mod) { patch = { syncAction: { - clearChatAction: {} // add message range later + clearChatAction: { + messageRange: getMessageRange(mod.lastMessages) + } }, index: ['clearChat', jid, '1' /*the option here is 0 when keep starred messages is enabled*/, '0'], type: 'regular_high', From 3cdb0f4dd9042e4f1a6ec07468d218edac76f88c Mon Sep 17 00:00:00 2001 From: DevAstro Date: Sat, 5 Jul 2025 21:58:57 +0100 Subject: [PATCH 11/12] Bump Jimp && Sharp (#1575) * Bump Jimp && Sharp Upgrade and use the latest version of jimp and sharp libraries * lint --- package.json | 8 +- src/Utils/messages-media.ts | 38 +- yarn.lock | 1096 +++++++++++++++-------------------- 3 files changed, 494 insertions(+), 648 deletions(-) diff --git a/package.json b/package.json index 1a43d5e..311da64 100644 --- a/package.json +++ b/package.json @@ -61,14 +61,14 @@ "eslint-config-prettier": "^10.1.2", "eslint-plugin-prettier": "^5.4.0", "jest": "^29.7.0", - "jimp": "^0.16.1", + "jimp": "^1.6.0", "json": "^11.0.0", "link-preview-js": "^3.0.0", "open": "^8.4.2", "prettier": "^3.5.3", "protobufjs-cli": "^1.1.3", "release-it": "^15.10.3", - "sharp": "^0.32.6", + "sharp": "^0.34.2", "ts-jest": "^29.3.2", "ts-node": "^10.8.1", "typedoc": "^0.27.9", @@ -77,9 +77,9 @@ }, "peerDependencies": { "audio-decode": "^2.1.3", - "jimp": "^0.16.1", + "jimp": "^1.6.0", "link-preview-js": "^3.0.0", - "sharp": "^0.32.6" + "sharp": "^0.34.2" }, "peerDependenciesMeta": { "audio-decode": { diff --git a/src/Utils/messages-media.ts b/src/Utils/messages-media.ts index fd78e94..5a70c55 100644 --- a/src/Utils/messages-media.ts +++ b/src/Utils/messages-media.ts @@ -4,6 +4,7 @@ import { exec } from 'child_process' import * as Crypto from 'crypto' import { once } from 'events' import { createReadStream, createWriteStream, promises as fs, WriteStream } from 'fs' +import { ResizeStrategy } from 'jimp' import type { IAudioMetadata } from 'music-metadata' import { tmpdir } from 'os' import { join } from 'path' @@ -32,22 +33,12 @@ import { ILogger } from './logger' const getTmpFilesDirectory = () => tmpdir() const getImageProcessingLibrary = async () => { - const [_jimp, sharp] = await Promise.all([ - (async () => { - const jimp = await import('jimp').catch(() => {}) - return jimp - })(), - (async () => { - const sharp = await import('sharp').catch(() => {}) - return sharp - })() - ]) + const [jimp, sharp] = await Promise.all([import('jimp').catch(() => {}), import('sharp').catch(() => {})]) if (sharp) { return { sharp } } - const jimp = _jimp?.default || _jimp if (jimp) { return { jimp } } @@ -159,15 +150,15 @@ export const extractImageThumb = async (bufferOrFilePath: Readable | Buffer | st height: dimensions.height } } - } else if ('jimp' in lib && typeof lib.jimp?.read === 'function') { - const { read, MIME_JPEG, RESIZE_BILINEAR, AUTO } = lib.jimp - - const jimp = await read(bufferOrFilePath as string) + } else if ('jimp' in lib && typeof lib.jimp?.Jimp === 'object') { + const jimp = await lib.jimp.default.Jimp.read(bufferOrFilePath) const dimensions = { - width: jimp.getWidth(), - height: jimp.getHeight() + width: jimp.width, + height: jimp.height } - const buffer = await jimp.quality(50).resize(width, AUTO, RESIZE_BILINEAR).getBufferAsync(MIME_JPEG) + const buffer = await jimp + .resize({ w: width, mode: ResizeStrategy.BILINEAR }) + .getBuffer('image/jpeg', { quality: 50 }) return { buffer, original: dimensions @@ -207,13 +198,12 @@ export const generateProfilePicture = async ( quality: 50 }) .toBuffer() - } else if ('jimp' in lib && typeof lib.jimp?.read === 'function') { - const { read, MIME_JPEG, RESIZE_BILINEAR } = lib.jimp - const jimp = await read(buffer) - const min = Math.min(jimp.getWidth(), jimp.getHeight()) - const cropped = jimp.crop(0, 0, min, min) + } else if ('jimp' in lib && typeof lib.jimp?.Jimp === 'object') { + const jimp = await lib.jimp.default.Jimp.read(buffer) + const min = Math.min(jimp.width, jimp.height) + const cropped = jimp.crop({ x: 0, y: 0, w: min, h: min }) - img = cropped.quality(50).resize(w, h, RESIZE_BILINEAR).getBufferAsync(MIME_JPEG) + img = cropped.resize({ w, h, mode: ResizeStrategy.BILINEAR }).getBuffer('image/jpeg', { quality: 50 }) } else { throw new Boom('No image processing library available') } diff --git a/yarn.lock b/yarn.lock index f4d32b8..95f9820 100644 --- a/yarn.lock +++ b/yarn.lock @@ -371,13 +371,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" -"@babel/runtime@^7.7.2": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" - integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== - dependencies: - regenerator-runtime "^0.14.0" - "@babel/template@^7.25.7", "@babel/template@^7.3.3": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" @@ -468,6 +461,13 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@emnapi/runtime@^1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.3.tgz#c0564665c80dc81c448adac23f9dfbed6c838f7d" + integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ== + dependencies: + tslib "^2.4.0" + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -557,6 +557,129 @@ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== +"@img/sharp-darwin-arm64@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz#65049ef7c6be7857da742cd028f97602ce209635" + integrity sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.1.0" + +"@img/sharp-darwin-x64@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz#d37ff7c75c46d5a68a3756e3f1924ef7ca7b285e" + integrity sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.1.0" + +"@img/sharp-libvips-darwin-arm64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz#843f7c09c7245dc0d3cfec2b3c83bb08799a704f" + integrity sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA== + +"@img/sharp-libvips-darwin-x64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz#1239c24426c06a8e833815562f78047a3bfbaaf8" + integrity sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ== + +"@img/sharp-libvips-linux-arm64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz#20d276cefd903ee483f0441ba35961679c286315" + integrity sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew== + +"@img/sharp-libvips-linux-arm@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz#067c0b566eae8063738cf1b1db8f8a8573b5465c" + integrity sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA== + +"@img/sharp-libvips-linux-ppc64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz#682334595f2ca00e0a07a675ba170af165162802" + integrity sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ== + +"@img/sharp-libvips-linux-s390x@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz#82fcd68444b3666384235279c145c2b28d8ee302" + integrity sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA== + +"@img/sharp-libvips-linux-x64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz#65b2b908bf47156b0724fde9095676c83a18cf5a" + integrity sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q== + +"@img/sharp-libvips-linuxmusl-arm64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz#72accf924e80b081c8db83b900b444a67c203f01" + integrity sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w== + +"@img/sharp-libvips-linuxmusl-x64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz#1fa052737e203f46bf44192acd01f9faf11522d7" + integrity sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A== + +"@img/sharp-linux-arm64@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz#c9690fac5f3137eaab3f7ad6065390d10f66f1fa" + integrity sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.1.0" + +"@img/sharp-linux-arm@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz#771dd2ec645f85f98441359bfc118afaf38cbd8b" + integrity sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.1.0" + +"@img/sharp-linux-s390x@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz#82132d158abff57bd90b53574f2865f72f94e6c8" + integrity sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.1.0" + +"@img/sharp-linux-x64@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz#d815fb87899d462b28b62a9252ad127f02fe0740" + integrity sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.1.0" + +"@img/sharp-linuxmusl-arm64@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz#cfac45b2abbc04628f676e123bfe3aeb300266c7" + integrity sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.1.0" + +"@img/sharp-linuxmusl-x64@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz#b876c23ff51d0fb6d9f3b0a07e2f4d1436c203ad" + integrity sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.1.0" + +"@img/sharp-wasm32@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz#b1dd0bab547dccf517586eb1fa5852160bba3b82" + integrity sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ== + dependencies: + "@emnapi/runtime" "^1.4.3" + +"@img/sharp-win32-arm64@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz#f37bee0f60c167f825a09d2b8de6849b823e8b30" + integrity sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ== + +"@img/sharp-win32-ia32@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz#8fc30b6655bc6ff8910344a2020d334aa6361672" + integrity sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw== + +"@img/sharp-win32-x64@0.34.2": + version "0.34.2" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz#ecf19250f8fe35de684aa2b0ec6f773b3447247b" + integrity sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -765,295 +888,278 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jimp/bmp@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.16.13.tgz#57ffa5b17417b5a181f6f184bdabc8218e8448ef" - integrity sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ== +"@jimp/core@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-1.6.0.tgz#3ef241bf02f40431bb382aea665e5187a2c05eef" + integrity sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" - bmp-js "^0.1.0" - -"@jimp/core@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.16.13.tgz#7171745a912b5b847f8bf53e70b0672c5ca92744" - integrity sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" - any-base "^1.1.0" - buffer "^5.2.0" + "@jimp/file-ops" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + await-to-js "^3.0.0" exif-parser "^0.1.12" - file-type "^16.5.4" - load-bmfont "^1.3.1" - mkdirp "^0.5.1" - phin "^2.9.1" - pixelmatch "^4.0.2" - tinycolor2 "^1.4.1" + file-type "^16.0.0" + mime "3" -"@jimp/custom@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.16.13.tgz#2e4ed447b7410b81fe9103682b4166af904daf84" - integrity sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA== +"@jimp/diff@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/diff/-/diff-1.6.0.tgz#f8d058bfad64751c5e5c135499d1a784f797c5c8" + integrity sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/core" "^0.16.13" + "@jimp/plugin-resize" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + pixelmatch "^5.3.0" -"@jimp/gif@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.16.13.tgz#fa72f35d8ad67d6ce3a3d7ef6c8d04a462afaaf9" - integrity sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" - gifwrap "^0.9.2" - omggif "^1.0.9" +"@jimp/file-ops@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/file-ops/-/file-ops-1.6.0.tgz#ae9c6aa65b2c9a5a16515a8fdf83b55f51100087" + integrity sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ== -"@jimp/jpeg@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.16.13.tgz#e1c128a591bd7f8a26c8731fd0bc65d32d4ba32a" - integrity sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA== +"@jimp/js-bmp@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/js-bmp/-/js-bmp-1.6.0.tgz#ff7c4306e764745063e249ee926d0dd807924abf" + integrity sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" - jpeg-js "^0.4.2" + "@jimp/core" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + bmp-ts "^1.0.9" -"@jimp/plugin-blit@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz#370303edef02b75aa3e316726c5a3aac3e92f5d0" - integrity sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g== +"@jimp/js-gif@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/js-gif/-/js-gif-1.6.0.tgz#0efa5d83317a89d6eda936e2ae1df2b7d122a38d" + integrity sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/types" "1.6.0" + gifwrap "^0.10.1" + omggif "^1.0.10" -"@jimp/plugin-blur@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz#27b82295a3dee88d6e029d4d62f5de8118b845e6" - integrity sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg== +"@jimp/js-jpeg@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/js-jpeg/-/js-jpeg-1.6.0.tgz#e47da6758346548079f0ac8ff215d0d9d1ec435e" + integrity sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/types" "1.6.0" + jpeg-js "^0.4.4" -"@jimp/plugin-circle@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz#d7af61a95b17e67c7fd4361cd1d588e00b58b6b6" - integrity sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA== +"@jimp/js-png@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/js-png/-/js-png-1.6.0.tgz#c857adfdbfcb7107a6511c3b2939ffbad0fefedc" + integrity sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/types" "1.6.0" + pngjs "^7.0.0" -"@jimp/plugin-color@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.16.13.tgz#825227e7e6f32d227740ad1bd97c389083c1d0d1" - integrity sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ== +"@jimp/js-tiff@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/js-tiff/-/js-tiff-1.6.0.tgz#f18fa3d59f52fda339acfdcadbe7363bed912e81" + integrity sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" - tinycolor2 "^1.4.1" + "@jimp/core" "1.6.0" + "@jimp/types" "1.6.0" + utif2 "^4.1.0" -"@jimp/plugin-contain@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz#7a42ed1ce580bf910f812ba2f35e0fa2cfe501ac" - integrity sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg== +"@jimp/plugin-blit@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-1.6.0.tgz#fed35aefbb5757599a4299a9ff6c06cc3466f46f" + integrity sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-cover@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz#9c964be05b163e0f0e06866a9afcebe775dff246" - integrity sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA== +"@jimp/plugin-blur@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-1.6.0.tgz#781b3be9de2744e5eb6ab86ec05ee7d2ce5092e8" + integrity sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/utils" "1.6.0" -"@jimp/plugin-crop@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz#80c6ae4d401a8de6cc11b265f3cdecd80425b9a9" - integrity sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA== +"@jimp/plugin-circle@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-1.6.0.tgz#2314dc7955068cb4a000de4eceb02890eb131c88" + integrity sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/types" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-displace@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz#fd72aa93b3fe97a1c3da729e6b26399661ce8ce5" - integrity sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA== +"@jimp/plugin-color@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-1.6.0.tgz#927c83ee932070ad285266840728c21ac39bf27b" + integrity sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + tinycolor2 "^1.6.0" + zod "^3.23.8" -"@jimp/plugin-dither@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz#430750f73d528df7ebe21bb508fb80f9f515305d" - integrity sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ== +"@jimp/plugin-contain@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-1.6.0.tgz#d08900ecf85ac564a6f9f3fc0d61cc8d5e43626e" + integrity sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/plugin-blit" "1.6.0" + "@jimp/plugin-resize" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-fisheye@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz#caf69851ab25c44d13c952880a8e43c928abd3f1" - integrity sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA== +"@jimp/plugin-cover@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-1.6.0.tgz#07ffb2f3d6ac53616c66f1131cd66ced17e3ca3e" + integrity sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/plugin-crop" "1.6.0" + "@jimp/plugin-resize" "1.6.0" + "@jimp/types" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-flip@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz#3dd167e14d03d62410c519990728ac3c247c0692" - integrity sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA== +"@jimp/plugin-crop@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-1.6.0.tgz#59f2b20869330fd768d1743d845b8ba9ed9bc52a" + integrity sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-gaussian@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz#79879d9371aff3e1714c54be0771418573ac2954" - integrity sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w== +"@jimp/plugin-displace@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-1.6.0.tgz#41b3257a6c0f64c749c29c1a2e64ba7df31a7a25" + integrity sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-invert@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz#7449283d5b0f405ce2cd1b93a6d79169c970e431" - integrity sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ== +"@jimp/plugin-dither@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-1.6.0.tgz#10c17070dcbec565904f11b7986e90ae20850b6f" + integrity sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/types" "1.6.0" -"@jimp/plugin-mask@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz#70b4bef4a598e41571f9a3e0c33fcc730eeae24d" - integrity sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ== +"@jimp/plugin-fisheye@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-1.6.0.tgz#2831c0060598b27bf004bf8a70adfeec003d4fcc" + integrity sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-normalize@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz#fd7c802c3f6be8d34abf0dbeadfe1d783e531d67" - integrity sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ== +"@jimp/plugin-flip@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-1.6.0.tgz#75c87bdb0f0ca9db44b320cc9671aa201e52b5c3" + integrity sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/types" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-print@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.16.13.tgz#595fb6db6677ac3d2b6bfe7144658019791bf288" - integrity sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw== +"@jimp/plugin-hash@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-hash/-/plugin-hash-1.6.0.tgz#8de89dfbbb6be671f9cdb2b59816acf3f07c4298" + integrity sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" - load-bmfont "^1.4.0" + "@jimp/core" "1.6.0" + "@jimp/js-bmp" "1.6.0" + "@jimp/js-jpeg" "1.6.0" + "@jimp/js-png" "1.6.0" + "@jimp/js-tiff" "1.6.0" + "@jimp/plugin-color" "1.6.0" + "@jimp/plugin-resize" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + any-base "^1.1.0" -"@jimp/plugin-resize@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz#6267087f724d47e7bb8824c5b842d9315f50b8e7" - integrity sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ== +"@jimp/plugin-mask@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-1.6.0.tgz#2b5a437e5d9a9906dcabb7a7baf4d5cd7d2361b1" + integrity sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/types" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-rotate@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz#9981f24631b1a0ad486d2b75a0163918ff912491" - integrity sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw== +"@jimp/plugin-print@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-1.6.0.tgz#ccef327f53afb47617aa66ca65435447380faf34" + integrity sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/js-jpeg" "1.6.0" + "@jimp/js-png" "1.6.0" + "@jimp/plugin-blit" "1.6.0" + "@jimp/types" "1.6.0" + parse-bmfont-ascii "^1.0.6" + parse-bmfont-binary "^1.0.6" + parse-bmfont-xml "^1.1.6" + simple-xml-to-json "^1.2.2" + zod "^3.23.8" -"@jimp/plugin-scale@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz#36b1b7d70819591901339926a91dae4864cc1b92" - integrity sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A== +"@jimp/plugin-quantize@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-quantize/-/plugin-quantize-1.6.0.tgz#880095fc0ead41321d94bf54895e366dd7d079d6" + integrity sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + image-q "^4.0.0" + zod "^3.23.8" -"@jimp/plugin-shadow@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz#f5b58122c0a6e1307efcddfc165ce1291415d553" - integrity sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw== +"@jimp/plugin-resize@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-1.6.0.tgz#331e8912ed68746846145019bc6e2ea057e6f175" + integrity sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/types" "1.6.0" + zod "^3.23.8" -"@jimp/plugin-threshold@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz#8de7500b03342b251201bc0feb84955dd3e410f0" - integrity sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA== +"@jimp/plugin-rotate@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-1.6.0.tgz#de271f39a3ac9e853b02e01d3d44ab086d12e099" + integrity sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" + "@jimp/core" "1.6.0" + "@jimp/plugin-crop" "1.6.0" + "@jimp/plugin-resize" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + zod "^3.23.8" -"@jimp/plugins@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.16.13.tgz#cf441ee13204dd9474bc0e67e41c50afc910de4f" - integrity sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ== +"@jimp/plugin-threshold@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-1.6.0.tgz#11479cf59131ea95dcaff6a1403af1964593a3fa" + integrity sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/plugin-blit" "^0.16.13" - "@jimp/plugin-blur" "^0.16.13" - "@jimp/plugin-circle" "^0.16.13" - "@jimp/plugin-color" "^0.16.13" - "@jimp/plugin-contain" "^0.16.13" - "@jimp/plugin-cover" "^0.16.13" - "@jimp/plugin-crop" "^0.16.13" - "@jimp/plugin-displace" "^0.16.13" - "@jimp/plugin-dither" "^0.16.13" - "@jimp/plugin-fisheye" "^0.16.13" - "@jimp/plugin-flip" "^0.16.13" - "@jimp/plugin-gaussian" "^0.16.13" - "@jimp/plugin-invert" "^0.16.13" - "@jimp/plugin-mask" "^0.16.13" - "@jimp/plugin-normalize" "^0.16.13" - "@jimp/plugin-print" "^0.16.13" - "@jimp/plugin-resize" "^0.16.13" - "@jimp/plugin-rotate" "^0.16.13" - "@jimp/plugin-scale" "^0.16.13" - "@jimp/plugin-shadow" "^0.16.13" - "@jimp/plugin-threshold" "^0.16.13" - timm "^1.6.1" + "@jimp/core" "1.6.0" + "@jimp/plugin-color" "1.6.0" + "@jimp/plugin-hash" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" + zod "^3.23.8" -"@jimp/png@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.16.13.tgz#8b130cc5e1e754c074c42fa3fe2609897cefdf7c" - integrity sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg== +"@jimp/types@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-1.6.0.tgz#27022730fd673653e1430e6bd8ac6f6de1596f89" + integrity sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.16.13" - pngjs "^3.3.3" + zod "^3.23.8" -"@jimp/tiff@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.16.13.tgz#9cf8d19f2b0b0c46758e81acfc7d656835ee6da1" - integrity sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q== +"@jimp/utils@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-1.6.0.tgz#e196f3953ea1ebc88f50cf0d490adb24aeffe596" + integrity sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA== dependencies: - "@babel/runtime" "^7.7.2" - utif "^2.0.1" - -"@jimp/types@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.16.13.tgz#39be1886cbfa4fb5e77e17441a046a1f961d3046" - integrity sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg== - dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/bmp" "^0.16.13" - "@jimp/gif" "^0.16.13" - "@jimp/jpeg" "^0.16.13" - "@jimp/png" "^0.16.13" - "@jimp/tiff" "^0.16.13" - timm "^1.6.1" - -"@jimp/utils@^0.16.13": - version "0.16.13" - resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.16.13.tgz#afde41b9c6cdadfb45d83cb5e16deb65f369bf99" - integrity sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA== - dependencies: - "@babel/runtime" "^7.7.2" - regenerator-runtime "^0.13.3" + "@jimp/types" "1.6.0" + tinycolor2 "^1.6.0" "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" @@ -1940,6 +2046,11 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +await-to-js@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/await-to-js/-/await-to-js-3.0.0.tgz#70929994185616f4675a91af6167eb61cc92868f" + integrity sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g== + axios@^1.6.0: version "1.7.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" @@ -1949,11 +2060,6 @@ axios@^1.6.0: form-data "^4.0.0" proxy-from-env "^1.1.0" -b4a@^1.6.4, b4a@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" - integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== - babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -2022,40 +2128,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bare-events@^2.0.0, bare-events@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.0.tgz#305b511e262ffd8b9d5616b056464f8e1b3329cc" - integrity sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A== - -bare-fs@^2.1.1: - version "2.3.5" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.5.tgz#05daa8e8206aeb46d13c2fe25a2cd3797b0d284a" - integrity sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw== - dependencies: - bare-events "^2.0.0" - bare-path "^2.0.0" - bare-stream "^2.0.0" - -bare-os@^2.1.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.4.tgz#01243392eb0a6e947177bb7c8a45123d45c9b1a9" - integrity sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ== - -bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e" - integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== - dependencies: - bare-os "^2.1.0" - -bare-stream@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.3.0.tgz#5bef1cab8222517315fca1385bd7f08dff57f435" - integrity sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA== - dependencies: - b4a "^1.6.6" - streamx "^2.20.0" - base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -2076,7 +2148,7 @@ big-integer@^1.6.44: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== -bl@^4.0.3, bl@^4.1.0: +bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -2099,10 +2171,10 @@ bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bmp-js@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" - integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== +bmp-ts@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bmp-ts/-/bmp-ts-1.0.9.tgz#0fd124ba812be9b786b29e5b186ee76d74ff5538" + integrity sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw== boolbase@^1.0.0: version "1.0.0" @@ -2176,17 +2248,12 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-equal@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" - integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.2.0, buffer@^5.5.0: +buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2287,13 +2354,6 @@ catharsis@^0.9.0: dependencies: lodash "^4.17.15" -centra@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/centra/-/centra-2.7.0.tgz#4c8312a58436e8a718302011561db7e6a2b0ec18" - integrity sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg== - dependencies: - follow-redirects "^1.15.6" - chalk@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" @@ -2357,11 +2417,6 @@ cheerio@1.0.0-rc.11: parse5-htmlparser2-tree-adapter "^7.0.0" tslib "^2.4.0" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -2927,10 +2982,10 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -detect-libc@^2.0.0, detect-libc@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== +detect-libc@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8" + integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA== detect-newline@^3.0.0: version "3.1.0" @@ -2975,11 +3030,6 @@ dom-serializer@^2.0.0: domhandler "^5.0.2" entities "^4.2.0" -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" @@ -3047,13 +3097,6 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - entities@^4.2.0, entities@^4.4.0, entities@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" @@ -3405,11 +3448,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -3440,11 +3478,6 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-fifo@^1.2.0, fast-fifo@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - fast-glob@^3.2.11: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -3519,7 +3552,7 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-type@^16.5.4: +file-type@^16.0.0, file-type@^16.5.4: version "16.5.4" resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz#474fb4f704bee427681f98dd390058a172a6c2fd" integrity sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw== @@ -3612,11 +3645,6 @@ formdata-polyfill@^4.0.10: dependencies: fetch-blob "^3.1.2" -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@^11.2.0: version "11.2.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" @@ -3716,10 +3744,10 @@ get-uri@^6.0.1: debug "^4.3.4" fs-extra "^11.2.0" -gifwrap@^0.9.2: - version "0.9.4" - resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.9.4.tgz#f4eb6169ba027d61df64aafbdcb1f8ae58ccc0c5" - integrity sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ== +gifwrap@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.10.1.tgz#9ed46a5d51913b482d4221ce9c727080260b681e" + integrity sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw== dependencies: image-q "^4.0.0" omggif "^1.0.10" @@ -3773,11 +3801,6 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3822,14 +3845,6 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4264,11 +4279,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -4937,18 +4947,40 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -jimp@^0.16.1: - version "0.16.13" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.16.13.tgz#944b6368183235afc5d077429e2a7f34834acb18" - integrity sha512-Bxz8q7V4rnCky9A0ktTNGA9SkNFVWRHodddI/DaAWZJzF7sVUlFYKQ60y9JGqrKpi48ECA/TnfMzzc5C70VByA== +jimp@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-1.6.0.tgz#7c7e5133c8dc06706e1ed35e771c685af393bfd2" + integrity sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg== dependencies: - "@babel/runtime" "^7.7.2" - "@jimp/custom" "^0.16.13" - "@jimp/plugins" "^0.16.13" - "@jimp/types" "^0.16.13" - regenerator-runtime "^0.13.3" + "@jimp/core" "1.6.0" + "@jimp/diff" "1.6.0" + "@jimp/js-bmp" "1.6.0" + "@jimp/js-gif" "1.6.0" + "@jimp/js-jpeg" "1.6.0" + "@jimp/js-png" "1.6.0" + "@jimp/js-tiff" "1.6.0" + "@jimp/plugin-blit" "1.6.0" + "@jimp/plugin-blur" "1.6.0" + "@jimp/plugin-circle" "1.6.0" + "@jimp/plugin-color" "1.6.0" + "@jimp/plugin-contain" "1.6.0" + "@jimp/plugin-cover" "1.6.0" + "@jimp/plugin-crop" "1.6.0" + "@jimp/plugin-displace" "1.6.0" + "@jimp/plugin-dither" "1.6.0" + "@jimp/plugin-fisheye" "1.6.0" + "@jimp/plugin-flip" "1.6.0" + "@jimp/plugin-hash" "1.6.0" + "@jimp/plugin-mask" "1.6.0" + "@jimp/plugin-print" "1.6.0" + "@jimp/plugin-quantize" "1.6.0" + "@jimp/plugin-resize" "1.6.0" + "@jimp/plugin-rotate" "1.6.0" + "@jimp/plugin-threshold" "1.6.0" + "@jimp/types" "1.6.0" + "@jimp/utils" "1.6.0" -jpeg-js@^0.4.2: +jpeg-js@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== @@ -5153,20 +5185,6 @@ linkify-it@^5.0.0: dependencies: uc.micro "^2.0.0" -load-bmfont@^1.3.1, load-bmfont@^1.4.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.2.tgz#e0f4516064fa5be8439f9c3696c01423a64e8717" - integrity sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog== - dependencies: - buffer-equal "0.0.1" - mime "^1.3.4" - parse-bmfont-ascii "^1.0.3" - parse-bmfont-binary "^1.0.5" - parse-bmfont-xml "^1.1.4" - phin "^3.7.1" - xhr "^2.0.1" - xtend "^4.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -5412,10 +5430,10 @@ mime-types@2.1.35, mime-types@^2.1.12: dependencies: mime-db "1.52.0" -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== mimic-fn@^2.1.0: version "2.1.0" @@ -5437,13 +5455,6 @@ mimic-response@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -5479,23 +5490,11 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -5529,11 +5528,6 @@ mute-stream@1.0.0: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5556,18 +5550,6 @@ new-github-release-url@2.0.0: dependencies: type-fest "^2.5.1" -node-abi@^3.3.0: - version "3.68.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.68.0.tgz#8f37fb02ecf4f43ebe694090dcb52e0c4cc4ba25" - integrity sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A== - dependencies: - semver "^7.3.5" - -node-addon-api@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" - integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== - node-domexception@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" @@ -5677,7 +5659,7 @@ object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -omggif@^1.0.10, omggif@^1.0.9: +omggif@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== @@ -5687,7 +5669,7 @@ on-exit-leak-free@^2.1.0: resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -5883,7 +5865,7 @@ package-json@^8.1.0: registry-url "^6.0.0" semver "^7.3.7" -pako@^1.0.5: +pako@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== @@ -5895,17 +5877,17 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-bmfont-ascii@^1.0.3: +parse-bmfont-ascii@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" integrity sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA== -parse-bmfont-binary@^1.0.5: +parse-bmfont-binary@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" integrity sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA== -parse-bmfont-xml@^1.1.4: +parse-bmfont-xml@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz#016b655da7aebe6da38c906aca16bf0415773767" integrity sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA== @@ -5913,11 +5895,6 @@ parse-bmfont-xml@^1.1.4: xml-parse-from-string "^1.0.0" xml2js "^0.5.0" -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" - integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -6012,18 +5989,6 @@ peek-readable@^4.1.0: resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72" integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg== -phin@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" - integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== - -phin@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/phin/-/phin-3.7.1.tgz#bf841da75ee91286691b10e41522a662aa628fd6" - integrity sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ== - dependencies: - centra "^2.7.0" - picocolors@^1.0.0, picocolors@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" @@ -6083,12 +6048,12 @@ pirates@^4.0.4: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== -pixelmatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" - integrity sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA== +pixelmatch@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.3.0.tgz#5e5321a7abedfb7962d60dbf345deda87cb9560a" + integrity sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q== dependencies: - pngjs "^3.0.0" + pngjs "^6.0.0" pkg-dir@^4.2.0: version "4.2.0" @@ -6097,34 +6062,21 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pngjs@^3.0.0, pngjs@^3.3.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== +pngjs@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" + integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== + +pngjs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-7.0.0.tgz#a8b7446020ebbc6ac739db6c5415a65d17090e26" + integrity sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow== possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -prebuild-install@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" - integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -6175,11 +6127,6 @@ process-warning@^4.0.0: resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-4.0.1.tgz#5c1db66007c67c756e4e09eb170cdece15da32fb" integrity sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - promise.allsettled@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.6.tgz#8dc8ba8edf429feb60f8e81335b920e109c94b6e" @@ -6282,14 +6229,6 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode.js@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" @@ -6332,11 +6271,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - quick-format-unescaped@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" @@ -6352,7 +6286,7 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== -rc@1.2.8, rc@^1.2.7: +rc@1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6408,7 +6342,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -6457,16 +6391,6 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regenerator-runtime@^0.13.3: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - regexp.prototype.flags@^1.5.2: version "1.5.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" @@ -6648,16 +6572,16 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -6738,19 +6662,36 @@ set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" -sharp@^0.32.6: - version "0.32.6" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" - integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== +sharp@^0.34.2: + version "0.34.2" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.2.tgz#648bd639854dbe48047b0b420213c186d036b32d" + integrity sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg== dependencies: color "^4.2.3" - detect-libc "^2.0.2" - node-addon-api "^6.1.0" - prebuild-install "^7.1.1" - semver "^7.5.4" - simple-get "^4.0.1" - tar-fs "^3.0.4" - tunnel-agent "^0.6.0" + detect-libc "^2.0.4" + semver "^7.7.2" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.34.2" + "@img/sharp-darwin-x64" "0.34.2" + "@img/sharp-libvips-darwin-arm64" "1.1.0" + "@img/sharp-libvips-darwin-x64" "1.1.0" + "@img/sharp-libvips-linux-arm" "1.1.0" + "@img/sharp-libvips-linux-arm64" "1.1.0" + "@img/sharp-libvips-linux-ppc64" "1.1.0" + "@img/sharp-libvips-linux-s390x" "1.1.0" + "@img/sharp-libvips-linux-x64" "1.1.0" + "@img/sharp-libvips-linuxmusl-arm64" "1.1.0" + "@img/sharp-libvips-linuxmusl-x64" "1.1.0" + "@img/sharp-linux-arm" "0.34.2" + "@img/sharp-linux-arm64" "0.34.2" + "@img/sharp-linux-s390x" "0.34.2" + "@img/sharp-linux-x64" "0.34.2" + "@img/sharp-linuxmusl-arm64" "0.34.2" + "@img/sharp-linuxmusl-x64" "0.34.2" + "@img/sharp-wasm32" "0.34.2" + "@img/sharp-win32-arm64" "0.34.2" + "@img/sharp-win32-ia32" "0.34.2" + "@img/sharp-win32-x64" "0.34.2" shebang-command@^2.0.0: version "2.0.0" @@ -6788,20 +6729,6 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0, simple-get@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -6809,6 +6736,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simple-xml-to-json@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/simple-xml-to-json/-/simple-xml-to-json-1.2.3.tgz#79c7188ff99ae209a267b70ee0db06b0e4597787" + integrity sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -6942,17 +6874,6 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" -streamx@^2.15.0, streamx@^2.20.0: - version "2.20.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.20.1.tgz#471c4f8b860f7b696feb83d5b125caab2fdbb93c" - integrity sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA== - dependencies: - fast-fifo "^1.3.2" - queue-tick "^1.0.1" - text-decoder "^1.1.0" - optionalDependencies: - bare-events "^2.2.0" - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -7113,47 +7034,6 @@ synckit@^0.11.0: dependencies: "@pkgr/core" "^0.2.4" -tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-fs@^3.0.4: - version "3.0.6" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" - integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== - dependencies: - pump "^3.0.0" - tar-stream "^3.1.5" - optionalDependencies: - bare-fs "^2.1.1" - bare-path "^2.1.0" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar-stream@^3.1.5: - version "3.1.7" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" - integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" @@ -7176,13 +7056,6 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-decoder@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.0.tgz#85f19d4d5088e0b45cd841bdfaeac458dbffeefc" - integrity sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg== - dependencies: - b4a "^1.6.4" - text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -7220,12 +7093,7 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -timm@^1.6.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/timm/-/timm-1.7.1.tgz#96bab60c7d45b5a10a8a4d0f0117c6b7e5aff76f" - integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== - -tinycolor2@^1.4.1: +tinycolor2@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== @@ -7327,13 +7195,6 @@ tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -7565,12 +7426,12 @@ url@0.11.0: punycode "1.3.2" querystring "0.2.0" -utif@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/utif/-/utif-2.0.1.tgz#9e1582d9bbd20011a6588548ed3266298e711759" - integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== +utif2@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/utif2/-/utif2-4.1.0.tgz#e768d37bd619b995d56d9780b5d2b4611a3d932b" + integrity sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w== dependencies: - pako "^1.0.5" + pako "^1.0.11" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" @@ -7762,16 +7623,6 @@ xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== -xhr@^2.0.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - xml-parse-from-string@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" @@ -7795,7 +7646,7 @@ xmlcreate@^2.0.4: resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== -xtend@^4.0.0, xtend@~4.0.1: +xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -7865,3 +7716,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.23.8: + version "3.25.67" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.67.tgz#62987e4078e2ab0f63b491ef0c4f33df24236da8" + integrity sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw== From 44c5e16c05aab727d80d65af3f7179f0206c3ef0 Mon Sep 17 00:00:00 2001 From: DevAstro Date: Sat, 5 Jul 2025 21:59:24 +0100 Subject: [PATCH 12/12] add owner country code attribute (#1565) name says it all --- src/Socket/groups.ts | 1 + src/Types/GroupMetadata.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Socket/groups.ts b/src/Socket/groups.ts index e979a51..98db53e 100644 --- a/src/Socket/groups.ts +++ b/src/Socket/groups.ts @@ -335,6 +335,7 @@ export const extractGroupMetadata = (result: BinaryNode) => { creation: +group.attrs.creation, owner: group.attrs.creator ? jidNormalizedUser(group.attrs.creator) : undefined, ownerJid: group.attrs.creator_pn ? jidNormalizedUser(group.attrs.creator_pn) : undefined, + owner_country_code: group.attrs.creator_country_code, desc, descId, descOwner, diff --git a/src/Types/GroupMetadata.ts b/src/Types/GroupMetadata.ts index 543922d..20fbf26 100644 --- a/src/Types/GroupMetadata.ts +++ b/src/Types/GroupMetadata.ts @@ -18,6 +18,7 @@ export interface GroupMetadata { addressingMode: 'pn' | 'lid' owner: string | undefined ownerJid?: string | undefined + owner_country_code: string subject: string /** group subject owner */ subjectOwner?: string